diff --git a/api/src/main/java/com/getcode/model/PrefBool.kt b/api/src/main/java/com/getcode/model/PrefBool.kt index 3c6b41b71..7645b92c7 100644 --- a/api/src/main/java/com/getcode/model/PrefBool.kt +++ b/api/src/main/java/com/getcode/model/PrefBool.kt @@ -25,6 +25,7 @@ sealed class PrefsBool(val value: String) { data object IS_ELIGIBLE_GIVE_FIRST_KIN_AIRDROP: PrefsBool("is_eligible_give_first_kin_airdrop"), InternalRouting data object HAS_REMOVED_LOCAL_CURRENCY: PrefsBool("removed_local_currency"), InternalRouting data object SEEN_TIP_CARD : PrefsBool("seen_tip_card"), InternalRouting + data object STARTED_TIP_CONNECT: PrefsBool("started_tip_connect"), InternalRouting data object BUY_MODULE_AVAILABLE : PrefsBool("buy_module_available"), InternalRouting diff --git a/api/src/main/java/com/getcode/network/TipController.kt b/api/src/main/java/com/getcode/network/TipController.kt index e7b0579d9..fa8735d51 100644 --- a/api/src/main/java/com/getcode/network/TipController.kt +++ b/api/src/main/java/com/getcode/network/TipController.kt @@ -47,7 +47,7 @@ class TipController @Inject constructor( ) { companion object { - private const val POLL_FREQUENCY_SECS = 5L + private const val POLL_FREQUENCY_LOOKING_SECS = 5L } private var pollTimer: Timer? = null @@ -61,8 +61,6 @@ class TipController @Inject constructor( var userMetadata: TwitterUser? = null private set - private var confirmedConnection = false - val connectedAccount: StateFlow = prefRepository.observeOrDefault(PrefsString.KEY_TIP_ACCOUNT, "") .map { runCatching { Json.decodeFromString(it) }.getOrNull() } .distinctUntilChanged() @@ -72,6 +70,14 @@ class TipController @Inject constructor( initialValue = null ) + val verificationInProgress: StateFlow = prefRepository.observeOrDefault(PrefsBool.STARTED_TIP_CONNECT, false) + .distinctUntilChanged() + .stateIn( + scope = scope, + started = SharingStarted.Eagerly, + initialValue = false + ) + val showTwitterSplat: Flow = combine( connectedAccount, @@ -82,18 +88,22 @@ class TipController @Inject constructor( } private fun startPollTimer() { + if (connectedAccount.value != null) return + Timber.d("twitter poll start") pollTimer?.cancel() - pollTimer = fixedRateTimer("twitterPollTimer", false, 0, 1000 * POLL_FREQUENCY_SECS) { - scope.launch { - val time = System.currentTimeMillis() - val isPastThrottle = time - lastPoll > 1000 * (POLL_FREQUENCY_SECS / 2.0) || lastPoll == 0L - - if (isPastThrottle) { - callForConnectedUser() + pollTimer = + fixedRateTimer("twitterPollTimer", false, 0, 1000 * POLL_FREQUENCY_LOOKING_SECS) { + scope.launch { + val time = System.currentTimeMillis() + val isPastThrottle = + time - lastPoll > 1000 * (POLL_FREQUENCY_LOOKING_SECS / 2.0) || lastPoll == 0L + + if (isPastThrottle) { + callForConnectedUser() + } } } - } } private suspend fun callForConnectedUser() { @@ -105,8 +115,7 @@ class TipController @Inject constructor( .onSuccess { Timber.d("current user twitter connected @ ${it.username}") prefRepository.set(PrefsString.KEY_TIP_ACCOUNT, Json.encodeToString(it)) - confirmedConnection = true - stopTimerInternal() + stopTimer() } .onFailure { when (it) { @@ -127,7 +136,12 @@ class TipController @Inject constructor( } fun checkForConnection() { - if (confirmedConnection) return + if (!verificationInProgress.value) { + scope.launch { + callForConnectedUser() + } + return + } startPollTimer() } @@ -152,6 +166,7 @@ class TipController @Inject constructor( fun clearTwitterSplat() { prefRepository.set(PrefsBool.SEEN_TIP_CARD, true) + endVerification() } fun generateTipVerification(): String? { @@ -175,8 +190,15 @@ class TipController @Inject constructor( return null } + fun startVerification() { + prefRepository.set(PrefsBool.STARTED_TIP_CONNECT, true) + } + + private fun endVerification() { + prefRepository.set(PrefsBool.STARTED_TIP_CONNECT, false) + } + fun stopTimer() { - confirmedConnection = false stopTimerInternal() } diff --git a/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt b/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt index 915f091af..c629b9906 100644 --- a/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt +++ b/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt @@ -232,6 +232,7 @@ class HomeViewModel @Inject constructor( .filter { it } .onEach { delay(500) } .flatMapLatest { tipController.connectedAccount } + .filter { tipController.verificationInProgress.value } .filterNotNull() .distinctUntilChanged() .filter { uiFlow.value.isCameraScanEnabled } diff --git a/app/src/main/java/com/getcode/view/main/tip/TipConnectViewModel.kt b/app/src/main/java/com/getcode/view/main/tip/TipConnectViewModel.kt index bc32fe3d2..852e1a916 100644 --- a/app/src/main/java/com/getcode/view/main/tip/TipConnectViewModel.kt +++ b/app/src/main/java/com/getcode/view/main/tip/TipConnectViewModel.kt @@ -69,6 +69,7 @@ class TipConnectViewModel @Inject constructor( .map { IntentUtils.tweet(it) } .onEach { dispatchEvent(Event.OpenX(it)) + tipController.startVerification() }.launchIn(viewModelScope) }