package co.smartreceipts.android.sync.widget.backups;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
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.analytics.Analytics;
import co.smartreceipts.android.analytics.events.ErrorEvent;
import co.smartreceipts.android.persistence.DatabaseHelper;
import co.smartreceipts.android.persistence.database.controllers.impl.TripTableController;
import co.smartreceipts.android.persistence.database.tables.Table;
import co.smartreceipts.android.sync.BackupProvidersManager;
import co.smartreceipts.android.sync.model.RemoteBackupMetadata;
import co.smartreceipts.android.sync.network.NetworkManager;
import dagger.android.support.AndroidSupportInjection;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public class ImportRemoteBackupWorkerProgressDialogFragment extends DialogFragment {
private static final String ARG_BACKUP_METADATA = "arg_backup_metadata";
private static final String ARG_OVERWRITE = "arg_overwrite";
@Inject
DatabaseHelper database;
@Inject
NetworkManager networkManager;
@Inject
Analytics analytics;
@Inject
TripTableController tripTableController;
@Inject
BackupProvidersManager backupProvidersManager;
private RemoteBackupsDataCache remoteBackupsDataCache;
private Disposable disposable;
private RemoteBackupMetadata backupMetadata;
private boolean overwrite;
public static ImportRemoteBackupWorkerProgressDialogFragment newInstance(@NonNull RemoteBackupMetadata remoteBackupMetadata, boolean overwrite) {
final ImportRemoteBackupWorkerProgressDialogFragment fragment = new ImportRemoteBackupWorkerProgressDialogFragment();
final Bundle args = new Bundle();
args.putParcelable(ARG_BACKUP_METADATA, remoteBackupMetadata);
args.putBoolean(ARG_OVERWRITE, overwrite);
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);
overwrite = getArguments().getBoolean(ARG_OVERWRITE);
Preconditions.checkNotNull(backupMetadata, "This class requires that a RemoteBackupMetadata instance be provided");
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
ProgressDialog dialog = new ProgressDialog(getActivity(), getTheme());
dialog.setMessage(getString(R.string.progress_import));
dialog.setIndeterminate(true);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
return dialog;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
remoteBackupsDataCache = new RemoteBackupsDataCache(getFragmentManager(), getContext(),
backupProvidersManager, networkManager, database);
}
@Override
public void onResume() {
super.onResume();
disposable = remoteBackupsDataCache.restoreBackup(backupMetadata, overwrite)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(success -> {
if (success != null && success) {
Toast.makeText(getActivity(), R.string.toast_import_complete, Toast.LENGTH_LONG).show();
for (final Table table : database.getTables()) {
table.clearCache();
}
tripTableController.get();
getActivity().finishAffinity(); // TODO: Fix this hack (for the settings import)
} else {
Toast.makeText(getActivity(), getString(R.string.IMPORT_ERROR), Toast.LENGTH_LONG).show();
}
}, throwable -> {
analytics.record(new ErrorEvent(ImportRemoteBackupWorkerProgressDialogFragment.this, throwable));
Toast.makeText(getActivity(), getString(R.string.IMPORT_ERROR), Toast.LENGTH_LONG).show();
remoteBackupsDataCache.removeCachedRestoreBackupFor(backupMetadata);
dismiss();
}, () -> {
remoteBackupsDataCache.removeCachedRestoreBackupFor(backupMetadata);
dismiss();
});
}
@Override
public void onPause() {
disposable.dispose();
super.onPause();
}
}