Skip to content

Commit

Permalink
Merge branch 'bugfix-616-google-drive-export-fails' into hotfix/patches
Browse files Browse the repository at this point in the history
  • Loading branch information
rivaldi8 committed Dec 8, 2016
2 parents 3784e02 + a082531 commit 1a76361
Showing 1 changed file with 60 additions and 52 deletions.
112 changes: 60 additions & 52 deletions app/src/main/java/org/gnucash/android/export/ExportAsyncTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import com.dropbox.sync.android.DbxFileSystem;
import com.dropbox.sync.android.DbxPath;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.drive.Drive;
import com.google.android.gms.drive.DriveApi;
import com.google.android.gms.drive.DriveContents;
Expand Down Expand Up @@ -80,6 +79,7 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
* Asynchronous task for exporting transactions.
Expand Down Expand Up @@ -276,62 +276,60 @@ protected void onPostExecute(Boolean exportResult) {

private void moveExportToGoogleDrive(){
Log.i(TAG, "Moving exported file to Google Drive");
final long TIMEOUT = 5; // seconds
final GoogleApiClient googleApiClient = BackupPreferenceFragment.getGoogleApiClient(GnuCashApplication.getAppContext());
googleApiClient.blockingConnect();
final ResultCallback<DriveFolder.DriveFileResult> fileCallback = new
ResultCallback<DriveFolder.DriveFileResult>() {
@Override
public void onResult(DriveFolder.DriveFileResult result) {
if (!result.getStatus().isSuccess())
Log.e(TAG, "Error while trying to sync to Google Drive");
else
Log.i(TAG, "Created a file with content: " + result.getDriveFile().getDriveId());
}
};

Drive.DriveApi.newDriveContents(googleApiClient).setResultCallback(new ResultCallback<DriveApi.DriveContentsResult>() {
@Override
public void onResult(DriveApi.DriveContentsResult result) {
if (!result.getStatus().isSuccess()) {
Log.e(TAG, "Error while trying to create new file contents");
return;
}
final DriveContents driveContents = result.getDriveContents();
try {
// write content to DriveContents
OutputStream outputStream = driveContents.getOutputStream();
for (String exportedFilePath : mExportedFiles) {
File exportedFile = new File(exportedFilePath);
FileInputStream fileInputStream = new FileInputStream(exportedFile);
byte[] buffer = new byte[1024];
int count;

while ((count = fileInputStream.read(buffer)) >= 0) {
outputStream.write(buffer, 0, count);
}
fileInputStream.close();
outputStream.flush();
exportedFile.delete();

MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle(exportedFile.getName())
.setMimeType(mExporter.getExportMimeType())
.build();

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
String folderId = sharedPreferences.getString(mContext.getString(R.string.key_google_drive_app_folder_id), "");
DriveFolder folder = Drive.DriveApi.getFolder(googleApiClient, DriveId.decodeFromString(folderId));
// create a file on root folder
folder.createFile(googleApiClient, changeSet, driveContents)
.setResultCallback(fileCallback);
}

} catch (IOException e) {
Crashlytics.logException(e);
Log.e(TAG, e.getMessage());
DriveApi.DriveContentsResult driveContentsResult =
Drive.DriveApi.newDriveContents(googleApiClient).await(TIMEOUT, TimeUnit.SECONDS);
if (!driveContentsResult.getStatus().isSuccess()) {
Log.e(TAG, "Error while trying to create new file contents");
return;
}
final DriveContents driveContents = driveContentsResult.getDriveContents();
DriveFolder.DriveFileResult driveFileResult = null;
try {
// write content to DriveContents
OutputStream outputStream = driveContents.getOutputStream();
for (String exportedFilePath : mExportedFiles) {
File exportedFile = new File(exportedFilePath);
FileInputStream fileInputStream = new FileInputStream(exportedFile);
byte[] buffer = new byte[1024];
int count;

while ((count = fileInputStream.read(buffer)) >= 0) {
outputStream.write(buffer, 0, count);
}
fileInputStream.close();
outputStream.flush();
exportedFile.delete();

MetadataChangeSet changeSet = new MetadataChangeSet.Builder()
.setTitle(exportedFile.getName())
.setMimeType(mExporter.getExportMimeType())
.build();

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
String folderId = sharedPreferences.getString(mContext.getString(R.string.key_google_drive_app_folder_id), "");
DriveFolder folder = Drive.DriveApi.getFolder(googleApiClient, DriveId.decodeFromString(folderId));
// create a file on root folder
driveFileResult = folder.createFile(googleApiClient, changeSet, driveContents)
.await(TIMEOUT, TimeUnit.SECONDS);
}
});
} catch (IOException e) {
Crashlytics.logException(e);
Log.e(TAG, e.getMessage());
}

if (driveFileResult == null)
return;

if (!driveFileResult.getStatus().isSuccess()) {
Log.e(TAG, "Error creating file in Google Drive");
showToastFromNonUiThread("Couldn't create the file in Google Drive", Toast.LENGTH_LONG);
} else {
Log.i(TAG, "Created file with id: " + driveFileResult.getDriveFile().getDriveId());
}
}

private void moveExportToDropbox() {
Expand Down Expand Up @@ -536,4 +534,14 @@ public void moveFile(String src, String dst) throws IOException {
srcFile.delete();
}

private void showToastFromNonUiThread(final String message, final int duration) {
if (mContext instanceof Activity) {
((Activity) mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(mContext, message, duration).show();
}
});
}
}
}

0 comments on commit 1a76361

Please sign in to comment.