package com.code44.finance.data.backup; import android.content.Context; import com.code44.finance.ui.settings.data.ExportActivity; import com.code44.finance.utils.EventBus; import com.code44.finance.utils.errors.ExportError; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.drive.Contents; import com.google.android.gms.drive.Drive; import com.google.android.gms.drive.DriveApi; import com.google.android.gms.drive.DriveFolder; import com.google.android.gms.drive.DriveId; import com.google.android.gms.drive.MetadataChangeSet; public class DriveDataExporterRunnable implements Runnable { private final GoogleApiClient googleApiClient; private final DriveId driveId; private final ExportActivity.ExportType exportType; private final ExportActivity.Destination destination; private final Context context; private final EventBus eventBus; private final String fileTitle; public DriveDataExporterRunnable(GoogleApiClient googleApiClient, DriveId driveId, ExportActivity.ExportType exportType, ExportActivity.Destination destination, Context context, EventBus eventBus, String fileTitle) { this.googleApiClient = googleApiClient; this.driveId = driveId; this.exportType = exportType; this.destination = destination; this.context = context; this.eventBus = eventBus; this.fileTitle = fileTitle; } @Override public void run() { final DriveFolder driveFolder = Drive.DriveApi.getFolder(googleApiClient, driveId); final DriveApi.ContentsResult result = Drive.DriveApi.newContents(googleApiClient).await(); if (!result.getStatus().isSuccess()) { throw new ExportError("Data export has failed."); } final Contents contents = result.getContents(); final DataExporterRunnable dataExporterRunnable = new DataExporterRunnable(eventBus, exportType.getDataExporter(contents.getOutputStream(), context)); dataExporterRunnable.run(); final MetadataChangeSet changeSet = new MetadataChangeSet.Builder().setTitle(fileTitle).setMimeType(exportType.getMimeType(destination)).build(); driveFolder.createFile(googleApiClient, changeSet, contents).await(); } }