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.support.v4.app.Fragment;
import android.widget.Toast;
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.errors.SyncErrorType;
import co.smartreceipts.android.sync.model.RemoteBackupMetadata;
import co.smartreceipts.android.sync.network.NetworkManager;
import co.smartreceipts.android.sync.provider.SyncProvider;
import co.smartreceipts.android.utils.log.Logger;
import dagger.android.support.AndroidSupportInjection;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
public class DeleteRemoteBackupProgressDialogFragment extends DialogFragment {
private static final String ARG_BACKUP_METADATA = "arg_backup_metadata";
@Inject
DatabaseHelper database;
@Inject
NetworkManager networkManager;
@Inject
Analytics analyticsManager;
@Inject
BackupProvidersManager backupProvidersManager;
private RemoteBackupsDataCache remoteBackupsDataCache;
private Disposable disposable;
private RemoteBackupMetadata backupMetadata;
public static DeleteRemoteBackupProgressDialogFragment newInstance() {
return newInstance(null);
}
public static DeleteRemoteBackupProgressDialogFragment newInstance(@Nullable RemoteBackupMetadata remoteBackupMetadata) {
final DeleteRemoteBackupProgressDialogFragment fragment = new DeleteRemoteBackupProgressDialogFragment();
final Bundle args = new Bundle();
args.putParcelable(ARG_BACKUP_METADATA, remoteBackupMetadata);
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);
if (backupMetadata == null) {
Logger.info(this, "Deleting the local device backup");
} else {
Logger.info(this, "Deleting the backup of another device");
}
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
ProgressDialog dialog = new ProgressDialog(getActivity(), getTheme());
if (backupMetadata != null) {
dialog.setMessage(getString(R.string.dialog_remote_backup_delete_progress, backupMetadata.getSyncDeviceName()));
} else {
dialog.setMessage(getString(R.string.dialog_remote_backup_restore_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();
disposable = remoteBackupsDataCache.deleteBackup(backupMetadata)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(deleteSuccess -> {
if (deleteSuccess) {
Logger.info(DeleteRemoteBackupProgressDialogFragment.this, "Successfully handled delete of {}", backupMetadata);
if (backupMetadata != null) {
Toast.makeText(getContext(), getString(R.string.dialog_remote_backup_delete_toast_success), Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getContext(), getString(R.string.dialog_remote_backup_restore_toast_success), Toast.LENGTH_LONG).show();
backupProvidersManager.markErrorResolved(SyncErrorType.UserDeletedRemoteData);
}
// Note: this is kind of hacky but should work
remoteBackupsDataCache.clearGetBackupsResults();;
final Fragment uncastedBackupsFragment = getFragmentManager().findFragmentByTag(BackupsFragment.class.getName());
if (uncastedBackupsFragment instanceof BackupsFragment) {
// If we're active, kick off a refresh directly in the fragment
final BackupsFragment backupsFragment = (BackupsFragment) uncastedBackupsFragment;
backupsFragment.updateViewsForProvider(SyncProvider.GoogleDrive);
} else {
// Kick off a refresh, so we catch it next time
remoteBackupsDataCache.getBackups(SyncProvider.GoogleDrive);
}
} else {
Toast.makeText(getContext(), getString(R.string.dialog_remote_backup_delete_toast_failure), Toast.LENGTH_LONG).show();
}
}, throwable -> {
analyticsManager.record(new ErrorEvent(DeleteRemoteBackupProgressDialogFragment.this, throwable));
if (backupMetadata != null) {
Toast.makeText(getContext(), getString(R.string.dialog_remote_backup_delete_toast_failure), Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getContext(), getString(R.string.dialog_remote_backup_restore_toast_failure), Toast.LENGTH_LONG).show();
}
dismiss();
}, this::dismiss);
}
@Override
public void onPause() {
disposable.dispose();
super.onPause();
}
}