/** * Helper just to avoid copy&paste'ing code. * * <p>Note: since this contains blocking Drive API calls, this will crash if you try to call it * from the main thread, it can only be called from other threads. * * @return null if the folder can not be found. */ private DriveFolder checkOrCreateRemoteFolder( GoogleApiClient googleApiClient, DriveFolder rootFolder, String folderName) { // check for STORAGE permission if (!canWriteToStorage()) return null; Query query = new Query.Builder() .addFilter( Filters.and( Filters.eq(SearchableField.TITLE, folderName), Filters.contains(SearchableField.MIME_TYPE, "folder"))) .build(); DriveApi.MetadataBufferResult result = rootFolder.queryChildren(mGoogleApiClient, query).await(); if (!result.getStatus().isSuccess()) { Log.e( mActivity.getResources().getString(R.string.app_name), "Cannot query folders in the root of Google Drive."); return null; } else { for (Metadata m : result.getMetadataBuffer()) { if (m.getTitle().equals(folderName)) { // Folder exists - we found it! DriveFolder folder = m.getDriveId().asDriveFolder(); result.getMetadataBuffer().release(); return folder; } } } result.getMetadataBuffer().release(); // Folder not found; let's create it. MetadataChangeSet changeSet = new MetadataChangeSet.Builder().setTitle(folderName).build(); DriveFolder.DriveFolderResult result1 = rootFolder.createFolder(googleApiClient, changeSet).await(); if (!result1.getStatus().isSuccess()) { Log.e( mActivity.getResources().getString(R.string.app_name), "Error while trying to create the folder \"" + folderName + "\""); return null; } return result1.getDriveFolder(); }