package com.ianhanniballake.contractiontimer.data; import android.content.Intent; import android.content.IntentSender; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; import android.util.Log; import android.widget.Toast; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.drive.CreateFileActivityBuilder; import com.google.android.gms.drive.Drive; import com.google.android.gms.drive.DriveApi; import com.google.android.gms.drive.DriveContents; import com.google.android.gms.drive.DriveFile; import com.google.android.gms.drive.DriveId; import com.google.android.gms.drive.MetadataChangeSet; import com.google.firebase.analytics.FirebaseAnalytics; import com.ianhanniballake.contractiontimer.R; import java.io.IOException; import java.io.OutputStream; /** * Exports contractions to a CSV file on Google Drive */ public class ExportActivity extends AbstractDriveApiActivity { private static final String TAG = ExportActivity.class.getSimpleName(); private static final int REQUEST_CODE_CREATE = 2; private final ResultCallback<DriveApi.DriveContentsResult> mCreateFileCallback = new ResultCallback<DriveApi.DriveContentsResult>() { @Override public void onResult(@NonNull DriveApi.DriveContentsResult result) { if (!result.getStatus().isSuccess()) { finish(); return; } MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder() .setTitle(getString(R.string.drive_default_filename) + ".csv") .setMimeType("text/csv").build(); IntentSender intentSender = new CreateFileActivityBuilder() .setActivityTitle(getString(R.string.drive_create_file_title)) .setInitialMetadata(metadataChangeSet) .setInitialDriveContents(result.getDriveContents()) .build(mGoogleApiClient); try { startIntentSenderForResult(intentSender, REQUEST_CODE_CREATE, null, 0, 0, 0); } catch (IntentSender.SendIntentException e) { finish(); } } }; @Override public void onConnected(final Bundle connectionHint) { super.onConnected(connectionHint); Drive.DriveApi.newDriveContents(mGoogleApiClient).setResultCallback(mCreateFileCallback); } @Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_CREATE && resultCode == RESULT_OK) { DriveId driveId = data.getParcelableExtra(CreateFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID); new ExportContractionsAsyncTask().execute(driveId); } } private class ExportContractionsAsyncTask extends AsyncTask<DriveId, Void, Boolean> { @Override protected Boolean doInBackground(DriveId... params) { if (params[0] == null) { Log.w(TAG, "Null DriveId returned by DriveApi"); return false; } DriveFile file = params[0].asDriveFile(); DriveApi.DriveContentsResult result = file.open(mGoogleApiClient, DriveFile.MODE_WRITE_ONLY, null).await(); if (!result.getStatus().isSuccess()) { Log.w(TAG, "Failure getting file result"); return false; } DriveContents driveContents = result.getDriveContents(); OutputStream os = driveContents.getOutputStream(); try { CSVTransformer.writeContractions(ExportActivity.this, os); os.close(); } catch (IOException e) { Log.e(TAG, "Error writing contractions", e); return false; } driveContents.commit(mGoogleApiClient, null).await(); return true; } @Override protected void onPostExecute(Boolean success) { if (success) { FirebaseAnalytics.getInstance(ExportActivity.this).logEvent("export_complete", null); Toast.makeText(ExportActivity.this, getString(R.string.drive_export_successful), Toast.LENGTH_LONG).show(); } else { Toast.makeText(ExportActivity.this, getString(R.string.drive_error_export), Toast.LENGTH_LONG).show(); } finish(); } } }