0

My app has the ability to save a character sheet to Google Drive. It creates a folder named "SWChars" on the root of the person's Google Drive then saves files in the folder. Each file equals one character. When the below is run it only finds folders it created. If you want some more context you can find the full source code at Github

The following is done on the GoogleApiClient's onConnected method:

public static void connect(final Activity main){
    final DriveFolder root = Drive.DriveApi.getRootFolder(((SWrpg)main.getApplication()).gac);
    root.queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
            .addFilter(Filters.eq(SearchableField.TITLE,"SWChars")).build())
            .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                @Override
                public void onResult(@NonNull final DriveApi.MetadataBufferResult metBufRes) {
                    if(metBufRes.getStatus().isSuccess()){
                        final MetadataBuffer metBuf = metBufRes.getMetadataBuffer();
                        final DriveFolder[] charsFold = {null};
                        System.out.println("Root List Size: "+String.valueOf(metBuf.getCount()));
                        for(Metadata met:metBuf){
                            if(met.isFolder() && !met.isTrashed()){
                                charsFold[0] = met.getDriveId().asDriveFolder();
                                break;
                            }
                        }
                        metBuf.release();
                        if(charsFold[0] ==null){
                            System.out.println("Creating Chars Folder");
                            root.createFolder(((SWrpg)main.getApplication()).gac,
                                    new MetadataChangeSet.Builder().setTitle("SWChars").build())
                                    .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                        @Override
                                        public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                            if(driveFolderResult.getStatus().isSuccess()){
                                                charsFold[0] = driveFolderResult.getDriveFolder();
                                                charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                                                        .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build())
                                                        .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                                                            @Override
                                                            public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) {
                                                                if(metadataBufferResult.getStatus().isSuccess()) {
                                                                    MetadataBuffer metBuffer = metadataBufferResult.getMetadataBuffer();
                                                                    final DriveFolder[] shipFold = {null};
                                                                    for (Metadata met:metBuffer){
                                                                        if(met.isFolder()&&!met.isTrashed()){
                                                                            shipFold[0] = met.getDriveId().asDriveFolder();
                                                                            break;
                                                                        }
                                                                    }
                                                                    metBuf.release();
                                                                    if(shipFold[0] ==null){
                                                                        charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,
                                                                                new MetadataChangeSet.Builder().setTitle("SWShips").build())
                                                                                .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                                                    @Override
                                                                                    public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                                                        if(driveFolderResult.getStatus().isSuccess()){
                                                                                            shipFold[0] = driveFolderResult.getDriveFolder();
                                                                                            ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                                                            ((SWrpg)main.getApplication()).vehicFold = shipFold[0];
                                                                                            System.out.println("Done");
                                                                                        }
                                                                                    }
                                                                                });
                                                                    }
                                                                }
                                                                metadataBufferResult.release();
                                                            }
                                                        });
                                            }
                                        }
                                    });
                        }else{
                            charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                                    .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build())
                                    .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                                        @Override
                                        public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) {
                                            if(metadataBufferResult.getStatus().isSuccess()){
                                                MetadataBuffer mets = metadataBufferResult.getMetadataBuffer();
                                                DriveFolder vehic = null;
                                                for (Metadata met:mets){
                                                    if(met.isFolder()&&!met.isTrashed()){
                                                        vehic = met.getDriveId().asDriveFolder();
                                                        break;
                                                    }
                                                }
                                                mets.release();
                                                if(vehic == null){
                                                    charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,new MetadataChangeSet.Builder()
                                                            .setTitle("SWShips").build())
                                                            .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                                @Override
                                                                public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                                    if(driveFolderResult.getStatus().isSuccess()){
                                                                        ((SWrpg)main.getApplication()).vehicFold = driveFolderResult.getDriveFolder();
                                                                        ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                                    }
                                                                }
                                                            });
                                                }else{
                                                    ((SWrpg)main.getApplication()).vehicFold = vehic;
                                                    ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                }
                                            }
                                            metadataBufferResult.release();
                                        }
                                    });
                        }
                        metBufRes.release();
                    }
                }
            });
}

Sorry for the messyness.

2 Answers2

0

You may want to use DriveFolder.listChildren which will provide the listing of direct children as discussed in working with folders using Google Drive Android API

Furthermore, in Querying for Files,

You can use the com.google.android.gms.drive.query package to search a user's Drive account for files whose metadata match your search criteria. You can issue a query for a specific folder or on the entire filesystem.

However, please note on this:

The Android Drive API only works with the https://www.googleapis.com/auth/drive.file scope. This means that only files which a user has opened or created with your application can be matched by a query.

Teyam
  • 7,686
  • 3
  • 15
  • 22
0

After a few more hours of browsing Google searches for different variations of my question I finally found the answer: https://stackoverflow.com/a/27927026/7180534

The main thing that made it work was calling Drive.DriveApi.requestSync

New Code:

public static void connect(final Activity main){
    Drive.DriveApi.requestSync(((SWrpg)main.getApplication()).gac).setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            if(status.isSuccess()){
                final DriveFolder root = Drive.DriveApi.getRootFolder(((SWrpg)main.getApplication()).gac);
                root.queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                        .addFilter(Filters.eq(SearchableField.TITLE,"SWChars")).setSortOrder(new SortOrder.Builder()
                                .addSortDescending(SortableField.MODIFIED_DATE).build()).build())
                        .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                            @Override
                            public void onResult(@NonNull final DriveApi.MetadataBufferResult metBufRes) {
                                if(metBufRes.getStatus().isSuccess()){
                                    final MetadataBuffer metBuf = metBufRes.getMetadataBuffer();
                                    final DriveFolder[] charsFold = {null};
                                    for(Metadata met:metBuf){
                                        if(met.isFolder() && !met.isTrashed()){
                                            charsFold[0] = met.getDriveId().asDriveFolder();
                                            break;
                                        }
                                    }
                                    metBuf.release();
                                    if(charsFold[0] ==null){
                                        root.createFolder(((SWrpg)main.getApplication()).gac,
                                                new MetadataChangeSet.Builder().setTitle("SWChars").build())
                                                .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                    @Override
                                                    public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                        if(driveFolderResult.getStatus().isSuccess()){
                                                            charsFold[0] = driveFolderResult.getDriveFolder();
                                                            charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                                                                    .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build())
                                                                    .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                                                                        @Override
                                                                        public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) {
                                                                            if(metadataBufferResult.getStatus().isSuccess()) {
                                                                                MetadataBuffer metBuffer = metadataBufferResult.getMetadataBuffer();
                                                                                final DriveFolder[] shipFold = {null};
                                                                                for (Metadata met:metBuffer){
                                                                                    if(met.isFolder()&&!met.isTrashed()){
                                                                                        shipFold[0] = met.getDriveId().asDriveFolder();
                                                                                        break;
                                                                                    }
                                                                                }
                                                                                metBuf.release();
                                                                                if(shipFold[0] ==null){
                                                                                    charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,
                                                                                            new MetadataChangeSet.Builder().setTitle("SWShips").build())
                                                                                            .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                                                                @Override
                                                                                                public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                                                                    if(driveFolderResult.getStatus().isSuccess()){
                                                                                                        shipFold[0] = driveFolderResult.getDriveFolder();
                                                                                                        ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                                                                        ((SWrpg)main.getApplication()).vehicFold = shipFold[0];
                                                                                                        System.out.println("Done");
                                                                                                    }
                                                                                                }
                                                                                            });
                                                                                }
                                                                            }
                                                                            metadataBufferResult.release();
                                                                        }
                                                                    });
                                                        }
                                                    }
                                                });
                                    }else{
                                        charsFold[0].queryChildren(((SWrpg)main.getApplication()).gac,new Query.Builder()
                                                .addFilter(Filters.eq(SearchableField.TITLE,"SWShips")).build())
                                                .setResultCallback(new ResultCallback<DriveApi.MetadataBufferResult>() {
                                                    @Override
                                                    public void onResult(@NonNull DriveApi.MetadataBufferResult metadataBufferResult) {
                                                        if(metadataBufferResult.getStatus().isSuccess()){
                                                            MetadataBuffer mets = metadataBufferResult.getMetadataBuffer();
                                                            DriveFolder vehic = null;
                                                            for (Metadata met:mets){
                                                                if(met.isFolder()&&!met.isTrashed()){
                                                                    vehic = met.getDriveId().asDriveFolder();
                                                                    break;
                                                                }
                                                            }
                                                            mets.release();
                                                            if(vehic == null){
                                                                charsFold[0].createFolder(((SWrpg)main.getApplication()).gac,new MetadataChangeSet.Builder()
                                                                        .setTitle("SWShips").build())
                                                                        .setResultCallback(new ResultCallback<DriveFolder.DriveFolderResult>() {
                                                                            @Override
                                                                            public void onResult(@NonNull DriveFolder.DriveFolderResult driveFolderResult) {
                                                                                if(driveFolderResult.getStatus().isSuccess()){
                                                                                    ((SWrpg)main.getApplication()).vehicFold = driveFolderResult.getDriveFolder();
                                                                                    ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                                                }
                                                                            }
                                                                        });
                                                            }else{
                                                                ((SWrpg)main.getApplication()).vehicFold = vehic;
                                                                ((SWrpg)main.getApplication()).charsFold = charsFold[0];
                                                            }
                                                        }
                                                        metadataBufferResult.release();
                                                    }
                                                });
                                    }
                                    metBufRes.release();
                                }
                            }
                        });
            }
        }
    });
}
Community
  • 1
  • 1