package co.smartreceipts.android.ocr.widget.tooltip; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.VisibleForTesting; import com.google.common.base.Preconditions; import javax.inject.Inject; 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.di.scopes.FragmentScope; import co.smartreceipts.android.identity.IdentityManager; import co.smartreceipts.android.ocr.purchases.OcrPurchaseTracker; import co.smartreceipts.android.utils.log.Logger; import io.reactivex.Observable; import io.reactivex.schedulers.Schedulers; @FragmentScope public class OcrInformationalTooltipInteractor { private static final int SCANS_LEFT_TO_INFORM = 5; private final NavigationHandler navigationHandler; private final Analytics analytics; private final OcrInformationalTooltipStateTracker stateTracker; private final OcrPurchaseTracker ocrPurchaseTracker; private final IdentityManager identityManager; @Inject public OcrInformationalTooltipInteractor(Context context, NavigationHandler navigationHandler, Analytics analytics, OcrPurchaseTracker ocrPurchaseTracker, IdentityManager identityManager) { this(navigationHandler, analytics, new OcrInformationalTooltipStateTracker(context), ocrPurchaseTracker, identityManager); } @VisibleForTesting OcrInformationalTooltipInteractor(@NonNull NavigationHandler navigationHandler, @NonNull Analytics analytics, @NonNull OcrInformationalTooltipStateTracker stateTracker, @NonNull OcrPurchaseTracker ocrPurchaseTracker, @NonNull IdentityManager identityManager) { this.navigationHandler = Preconditions.checkNotNull(navigationHandler); this.analytics = Preconditions.checkNotNull(analytics); this.stateTracker = Preconditions.checkNotNull(stateTracker); this.ocrPurchaseTracker = Preconditions.checkNotNull(ocrPurchaseTracker); this.identityManager = Preconditions.checkNotNull(identityManager); } public Observable<OcrTooltipMessageType> getShowOcrTooltip() { return stateTracker.shouldShowOcrInfo() .subscribeOn(Schedulers.computation()) .flatMapObservable(shouldShowTooltip -> { if (ocrPurchaseTracker.getRemainingScans() > 0 && ocrPurchaseTracker.getRemainingScans() <= SCANS_LEFT_TO_INFORM) { return Observable.just(OcrTooltipMessageType.LimitedScansRemaining); } else if (shouldShowTooltip) { if (identityManager.isLoggedIn()) { if (ocrPurchaseTracker.hasAvailableScans()) { return Observable.empty(); } else { return Observable.just(OcrTooltipMessageType.NoScansRemaining); } } else { return Observable.just(OcrTooltipMessageType.NotConfigured); } } else { return Observable.empty(); } }) .doOnNext(ocrTooltipMessageType -> { analytics.record(new DefaultDataPointEvent(Events.Ocr.OcrInfoTooltipShown).addDataPoint(new DataPoint("type", ocrTooltipMessageType))); if (ocrTooltipMessageType == OcrTooltipMessageType.LimitedScansRemaining) { stateTracker.setShouldShowOcrInfo(true); } }); } public void dismissTooltip() { Logger.info(this, "Dismissing OCR Tooltip"); stateTracker.setShouldShowOcrInfo(false); analytics.record(Events.Ocr.OcrInfoTooltipDismiss); } public void showOcrConfiguration() { Logger.info(this, "Displaying OCR Configuration Fragment"); navigationHandler.navigateToOcrConfigurationFragment(); analytics.record(Events.Ocr.OcrInfoTooltipOpen); } }