package com.ianhanniballake.contractiontimer.data;
import android.content.Intent;
import android.content.IntentSender;
import android.content.OperationApplicationException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.RemoteException;
import android.support.annotation.NonNull;
import android.text.TextUtils;
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.OpenFileActivityBuilder;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.ianhanniballake.contractiontimer.R;
import java.io.IOException;
import java.io.InputStream;
/**
* Imports contractions from a CSV file on Google Drive
*/
public class ImportActivity extends AbstractDriveApiActivity {
private static final String TAG = ImportActivity.class.getSimpleName();
private static final int REQUEST_CODE_OPEN = 2;
private final ResultCallback<DriveApi.DriveContentsResult> mOpenFileCallback =
new ResultCallback<DriveApi.DriveContentsResult>() {
@Override
public void onResult(@NonNull DriveApi.DriveContentsResult result) {
if (!result.getStatus().isSuccess()) {
finish();
return;
}
IntentSender intentSender = new OpenFileActivityBuilder()
.setActivityTitle(getString(R.string.drive_open_file_title))
.setMimeType(new String[]{"text/csv"})
.build(mGoogleApiClient);
try {
startIntentSenderForResult(intentSender, REQUEST_CODE_OPEN, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
finish();
}
}
};
@Override
public void onConnected(final Bundle connectionHint) {
super.onConnected(connectionHint);
Drive.DriveApi.newDriveContents(mGoogleApiClient).setResultCallback(mOpenFileCallback);
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_OPEN && resultCode == RESULT_OK) {
DriveId driveId = data.getParcelableExtra(CreateFileActivityBuilder.EXTRA_RESPONSE_DRIVE_ID);
new ImportContractionsAsyncTask().execute(driveId);
}
}
private class ImportContractionsAsyncTask extends AsyncTask<DriveId, Void, String> {
@Override
protected String doInBackground(DriveId... params) {
DriveFile file = params[0].asDriveFile();
DriveApi.DriveContentsResult result = file.open(mGoogleApiClient, DriveFile.MODE_READ_ONLY,
null).await();
if (!result.getStatus().isSuccess()) {
return getString(R.string.drive_error_open_file);
}
DriveContents driveContents = result.getDriveContents();
InputStream is = driveContents.getInputStream();
try {
CSVTransformer.readContractions(ImportActivity.this, is);
is.close();
} catch (IOException e) {
Log.e(TAG, "Error reading file", e);
return getString(R.string.drive_error_reading_file);
} catch (IllegalArgumentException e) {
Log.e(TAG, "Invalid file format", e);
return getString(R.string.drive_error_invalid_file_format);
} catch (RemoteException e) {
Log.e(TAG, "Error saving contractions", e);
return getString(R.string.drive_error_saving_contractions);
} catch (OperationApplicationException e) {
Log.e(TAG, "Error saving contractions", e);
return getString(R.string.drive_error_saving_contractions);
}
driveContents.commit(mGoogleApiClient, null).await();
return null;
}
@Override
protected void onPostExecute(String error) {
if (TextUtils.isEmpty(error)) {
FirebaseAnalytics.getInstance(ImportActivity.this).logEvent("import_complete", null);
Toast.makeText(ImportActivity.this, getString(R.string.drive_import_successful),
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(ImportActivity.this, getString(R.string.drive_error_import, error),
Toast.LENGTH_LONG).show();
}
finish();
}
}
}