package co.smartreceipts.android.sync.widget.errors; import android.support.annotation.NonNull; import android.support.v4.app.FragmentActivity; import com.google.common.base.Preconditions; import co.smartreceipts.android.activities.NavigationHandler; import co.smartreceipts.android.analytics.Analytics; import co.smartreceipts.android.analytics.events.DataPoint; import co.smartreceipts.android.analytics.events.DefaultDataPointEvent; import co.smartreceipts.android.analytics.events.Events; import co.smartreceipts.android.sync.BackupProvidersManager; import co.smartreceipts.android.sync.errors.CriticalSyncError; import co.smartreceipts.android.sync.errors.SyncErrorType; import co.smartreceipts.android.sync.provider.SyncProvider; import co.smartreceipts.android.utils.log.Logger; import io.reactivex.Observable; public class SyncErrorInteractor { private final FragmentActivity fragmentntActivity; private final NavigationHandler navigationHandler; private final BackupProvidersManager backupProvidersManager; private final Analytics analytics; public SyncErrorInteractor(@NonNull FragmentActivity activity, @NonNull NavigationHandler navigationHandler, @NonNull BackupProvidersManager backupProvidersManager, @NonNull Analytics analytics) { this.fragmentntActivity = Preconditions.checkNotNull(activity); this.navigationHandler = Preconditions.checkNotNull(navigationHandler); this.backupProvidersManager = Preconditions.checkNotNull(backupProvidersManager); this.analytics = Preconditions.checkNotNull(analytics); } @NonNull public Observable<SyncErrorType> getErrorStream() { return backupProvidersManager.getCriticalSyncErrorStream() .map(CriticalSyncError::getSyncErrorType); } public void handleClick(@NonNull SyncErrorType syncErrorType) { final SyncProvider syncProvider = backupProvidersManager.getSyncProvider(); Preconditions.checkArgument(syncProvider == SyncProvider.GoogleDrive, "Only Google Drive clicks are supported"); analytics.record(new DefaultDataPointEvent(Events.Sync.ClickSyncError) .addDataPoint(new DataPoint(SyncErrorType.class.getName(), syncErrorType))); Logger.info(this, "Handling click for sync error: {}.", syncErrorType); if (syncErrorType == SyncErrorType.NoRemoteDiskSpace) { backupProvidersManager.markErrorResolved(syncErrorType); } else if (syncErrorType == SyncErrorType.UserDeletedRemoteData) { navigationHandler.showDialog(new DriveRecoveryDialogFragment()); } else if (syncErrorType == SyncErrorType.UserRevokedRemoteRights) { backupProvidersManager.initialize(fragmentntActivity); backupProvidersManager.markErrorResolved(syncErrorType); } else { throw new IllegalArgumentException("Unknown SyncErrorType"); } } }