Skip to content

Commit bfb7718

Browse files
committed
Make ExportAsyncTask.moveExportToGoogleDrive() synchronous as expected by its caller.
Otherwise we might end up reporting the export as successful when it's not even finished yet.
1 parent 3784e02 commit bfb7718

1 file changed

Lines changed: 40 additions & 51 deletions

File tree

app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
import java.util.ArrayList;
8181
import java.util.Date;
8282
import java.util.List;
83+
import java.util.concurrent.TimeUnit;
8384

8485
/**
8586
* Asynchronous task for exporting transactions.
@@ -276,62 +277,50 @@ protected void onPostExecute(Boolean exportResult) {
276277

277278
private void moveExportToGoogleDrive(){
278279
Log.i(TAG, "Moving exported file to Google Drive");
280+
final long TIMEOUT = 5; // seconds
279281
final GoogleApiClient googleApiClient = BackupPreferenceFragment.getGoogleApiClient(GnuCashApplication.getAppContext());
280282
googleApiClient.blockingConnect();
281-
final ResultCallback<DriveFolder.DriveFileResult> fileCallback = new
282-
ResultCallback<DriveFolder.DriveFileResult>() {
283-
@Override
284-
public void onResult(DriveFolder.DriveFileResult result) {
285-
if (!result.getStatus().isSuccess())
286-
Log.e(TAG, "Error while trying to sync to Google Drive");
287-
else
288-
Log.i(TAG, "Created a file with content: " + result.getDriveFile().getDriveId());
289-
}
290-
};
291-
292-
Drive.DriveApi.newDriveContents(googleApiClient).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
293-
@Override
294-
public void onResult(DriveApi.DriveContentsResult result) {
295-
if (!result.getStatus().isSuccess()) {
296-
Log.e(TAG, "Error while trying to create new file contents");
297-
return;
298-
}
299-
final DriveContents driveContents = result.getDriveContents();
300-
try {
301-
// write content to DriveContents
302-
OutputStream outputStream = driveContents.getOutputStream();
303-
for (String exportedFilePath : mExportedFiles) {
304-
File exportedFile = new File(exportedFilePath);
305-
FileInputStream fileInputStream = new FileInputStream(exportedFile);
306-
byte[] buffer = new byte[1024];
307-
int count;
308-
309-
while ((count = fileInputStream.read(buffer)) >= 0) {
310-
outputStream.write(buffer, 0, count);
311-
}
312-
fileInputStream.close();
313-
outputStream.flush();
314-
exportedFile.delete();
315-
316-
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
317-
.setTitle(exportedFile.getName())
318-
.setMimeType(mExporter.getExportMimeType())
319-
.build();
320-
321-
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
322-
String folderId = sharedPreferences.getString(mContext.getString(R.string.key_google_drive_app_folder_id), "");
323-
DriveFolder folder = Drive.DriveApi.getFolder(googleApiClient, DriveId.decodeFromString(folderId));
324-
// create a file on root folder
325-
folder.createFile(googleApiClient, changeSet, driveContents)
326-
.setResultCallback(fileCallback);
327-
}
328283

329-
} catch (IOException e) {
330-
Crashlytics.logException(e);
331-
Log.e(TAG, e.getMessage());
284+
DriveApi.DriveContentsResult driveContentsResult =
285+
Drive.DriveApi.newDriveContents(googleApiClient).await(TIMEOUT, TimeUnit.SECONDS);
286+
if (!driveContentsResult.getStatus().isSuccess()) {
287+
Log.e(TAG, "Error while trying to create new file contents");
288+
return;
289+
}
290+
final DriveContents driveContents = driveContentsResult.getDriveContents();
291+
DriveFolder.DriveFileResult driveFileResult = null;
292+
try {
293+
// write content to DriveContents
294+
OutputStream outputStream = driveContents.getOutputStream();
295+
for (String exportedFilePath : mExportedFiles) {
296+
File exportedFile = new File(exportedFilePath);
297+
FileInputStream fileInputStream = new FileInputStream(exportedFile);
298+
byte[] buffer = new byte[1024];
299+
int count;
300+
301+
while ((count = fileInputStream.read(buffer)) >= 0) {
302+
outputStream.write(buffer, 0, count);
332303
}
304+
fileInputStream.close();
305+
outputStream.flush();
306+
exportedFile.delete();
307+
308+
MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
309+
.setTitle(exportedFile.getName())
310+
.setMimeType(mExporter.getExportMimeType())
311+
.build();
312+
313+
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
314+
String folderId = sharedPreferences.getString(mContext.getString(R.string.key_google_drive_app_folder_id), "");
315+
DriveFolder folder = Drive.DriveApi.getFolder(googleApiClient, DriveId.decodeFromString(folderId));
316+
// create a file on root folder
317+
driveFileResult = folder.createFile(googleApiClient, changeSet, driveContents)
318+
.await(TIMEOUT, TimeUnit.SECONDS);
333319
}
334-
});
320+
} catch (IOException e) {
321+
Crashlytics.logException(e);
322+
Log.e(TAG, e.getMessage());
323+
}
335324
}
336325

337326
private void moveExportToDropbox() {

0 commit comments

Comments
 (0)