package co.smartreceipts.android.sync.widget.backups;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.widget.Toast;
import com.google.common.base.Preconditions;
import javax.inject.Inject;
import co.smartreceipts.android.R;
import co.smartreceipts.android.SmartReceiptsApplication;
import co.smartreceipts.android.analytics.Analytics;
import co.smartreceipts.android.analytics.events.ErrorEvent;
import co.smartreceipts.android.persistence.DatabaseHelper;
import co.smartreceipts.android.sync.BackupProvidersManager;
import co.smartreceipts.android.sync.model.RemoteBackupMetadata;
import co.smartreceipts.android.sync.network.NetworkManager;
import co.smartreceipts.android.utils.IntentUtils;
import co.smartreceipts.android.utils.log.Logger;
import dagger.android.support.AndroidSupportInjection;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public class DownloadRemoteBackupImagesProgressDialogFragment extends DialogFragment {
private static final String ARG_BACKUP_METADATA = "arg_backup_metadata";
private static final String ARG_DOWNLOAD_DEBUG_MODE = "arg_download_debug_mode";
@Inject
DatabaseHelper database;
@Inject
NetworkManager networkManager;
@Inject
Analytics analytics;
@Inject
BackupProvidersManager backupProvidersManager;
private RemoteBackupsDataCache remoteBackupsDataCache;
private Disposable disposable;
private RemoteBackupMetadata backupMetadata;
private boolean debugMode;
public static DownloadRemoteBackupImagesProgressDialogFragment newInstance(@NonNull RemoteBackupMetadata remoteBackupMetadata) {
return newInstance(remoteBackupMetadata, false);
}
public static DownloadRemoteBackupImagesProgressDialogFragment newInstance(@NonNull RemoteBackupMetadata remoteBackupMetadata, boolean debugMode) {
final DownloadRemoteBackupImagesProgressDialogFragment fragment = new DownloadRemoteBackupImagesProgressDialogFragment();
final Bundle args = new Bundle();
args.putParcelable(ARG_BACKUP_METADATA, remoteBackupMetadata);
args.putBoolean(ARG_DOWNLOAD_DEBUG_MODE, debugMode);
fragment.setArguments(args);
return fragment;
}
@Override
public void onAttach(Context context) {
AndroidSupportInjection.inject(this);
super.onAttach(context);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setCancelable(false);
backupMetadata = getArguments().getParcelable(ARG_BACKUP_METADATA);
debugMode = getArguments().getBoolean(ARG_DOWNLOAD_DEBUG_MODE);
Preconditions.checkNotNull(backupMetadata, "This class requires that a RemoteBackupMetadata instance be provided");
Logger.info(this, "Initializing download of [{}] in debug mode == {}", backupMetadata, debugMode);
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
ProgressDialog dialog = new ProgressDialog(getActivity(), getTheme());
dialog.setMessage(getString(R.string.dialog_remote_backup_download_progress));
dialog.setIndeterminate(true);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
return dialog;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final SmartReceiptsApplication smartReceiptsApplication = ((SmartReceiptsApplication)getActivity().getApplication());
remoteBackupsDataCache = new RemoteBackupsDataCache(getFragmentManager(), getContext(),
backupProvidersManager, networkManager,
database);
}
@Override
public void onResume() {
super.onResume();
final Observable downloadObservable;
disposable = remoteBackupsDataCache.downloadBackup(backupMetadata, debugMode)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(zippedDataFile -> {
if (zippedDataFile != null) {
final Intent intent = IntentUtils.getSendIntent(getContext(), zippedDataFile);
getActivity().startActivity(Intent.createChooser(intent, getString(R.string.export)));
} else {
Toast.makeText(getContext(), getString(R.string.EXPORT_ERROR), Toast.LENGTH_LONG).show();
}
}, throwable -> {
analytics.record(new ErrorEvent(DownloadRemoteBackupImagesProgressDialogFragment.this, throwable));
Toast.makeText(getContext(), getString(R.string.EXPORT_ERROR), Toast.LENGTH_LONG).show();
remoteBackupsDataCache.removeCachedRestoreBackupFor(backupMetadata);
dismiss();
}, () -> {
remoteBackupsDataCache.removeCachedRestoreBackupFor(backupMetadata);
dismiss();
});
}
@Override
public void onPause() {
disposable.dispose();
super.onPause();
}
}