Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-02 11:14:57 +08:00
parent ddb8de4964
commit 128f3b8d43
6 changed files with 75 additions and 32 deletions

View file

@ -5,6 +5,7 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.AppScreen
import com.tangem.core.navigation.NavigationAction import com.tangem.core.navigation.NavigationAction
import com.tangem.domain.settings.repositories.SettingsRepository
import com.tangem.domain.wallets.legacy.asLockable import com.tangem.domain.wallets.legacy.asLockable
import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.extensions.dispatchOnMain
import kotlinx.coroutines.* import kotlinx.coroutines.*
@ -13,6 +14,7 @@ import kotlin.time.Duration
internal class LockUserWalletsTimer( internal class LockUserWalletsTimer(
owner: LifecycleOwner, owner: LifecycleOwner,
private val settingsRepository: SettingsRepository,
private val duration: Duration = with(Duration) { 10.minutes }, private val duration: Duration = with(Duration) { 10.minutes },
) : LifecycleOwner by owner, ) : LifecycleOwner by owner,
DefaultLifecycleObserver { DefaultLifecycleObserver {
@ -28,24 +30,35 @@ internal class LockUserWalletsTimer(
} }
override fun onResume(owner: LifecycleOwner) { override fun onResume(owner: LifecycleOwner) {
Timber.d( owner.lifecycleScope.launch {
""" val wasApplicationStopped = settingsRepository.wasApplicationStopped()
val shouldOpenWelcomeScreenOnResume = settingsRepository.shouldOpenWelcomeScreenOnResume()
Timber.d(
"""
Owner resumed Owner resumed
|- Was stopped: ${preferencesStorage.wasApplicationStopped} |- Was stopped: $wasApplicationStopped
|- Need to open welcome screen: ${preferencesStorage.shouldOpenWelcomeScreenOnResume} |- Need to open welcome screen: $shouldOpenWelcomeScreenOnResume
""".trimIndent(), """.trimIndent(),
) )
preferencesStorage.wasApplicationStopped = false
start() settingsRepository.setWasApplicationStopped(value = false)
if (preferencesStorage.shouldOpenWelcomeScreenOnResume) {
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Welcome)) start()
preferencesStorage.shouldOpenWelcomeScreenOnResume = false
if (shouldOpenWelcomeScreenOnResume) {
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Welcome))
settingsRepository.setShouldOpenWelcomeScreenOnResume(value = false)
}
} }
} }
override fun onStop(owner: LifecycleOwner) { override fun onStop(owner: LifecycleOwner) {
Timber.d("Owner stopped") Timber.d("Owner stopped")
preferencesStorage.wasApplicationStopped = true
owner.lifecycleScope.launch {
settingsRepository.setWasApplicationStopped(value = true)
}
} }
override fun onDestroy(owner: LifecycleOwner) { override fun onDestroy(owner: LifecycleOwner) {
@ -90,22 +103,27 @@ internal class LockUserWalletsTimer(
private fun createDelayJob(): Job = lifecycleScope.launch(Dispatchers.Default) { private fun createDelayJob(): Job = lifecycleScope.launch(Dispatchers.Default) {
val startTime = System.currentTimeMillis() val startTime = System.currentTimeMillis()
delay(duration) delay(duration)
if (isActive) { if (isActive) {
val userWalletsListManager = userWalletsListManagerSafe?.asLockable() val userWalletsListManager = userWalletsListManagerSafe?.asLockable() ?: return@launch
?: return@launch
if (userWalletsListManager.hasUserWallets) { if (userWalletsListManager.hasUserWallets) {
val currentTime = System.currentTimeMillis() val currentTime = System.currentTimeMillis()
val wasApplicationStopped = settingsRepository.wasApplicationStopped()
Timber.d( Timber.d(
""" """
Finished Finished
|- App is stopped: ${preferencesStorage.wasApplicationStopped} |- App is stopped: $wasApplicationStopped
|- Millis passed: ${currentTime - startTime} |- Millis passed: ${currentTime - startTime}
""".trimIndent(), """.trimIndent(),
) )
userWalletsListManager.lock() userWalletsListManager.lock()
if (preferencesStorage.wasApplicationStopped) { if (wasApplicationStopped) {
preferencesStorage.shouldOpenWelcomeScreenOnResume = true settingsRepository.setShouldOpenWelcomeScreenOnResume(value = true)
} else { } else {
store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Welcome)) store.dispatchOnMain(NavigationAction.PopBackTo(AppScreen.Welcome))
} }

View file

@ -35,6 +35,7 @@ import com.tangem.data.card.sdk.CardSdkLifecycleObserver
import com.tangem.domain.apptheme.model.AppThemeMode import com.tangem.domain.apptheme.model.AppThemeMode
import com.tangem.domain.card.ScanCardUseCase import com.tangem.domain.card.ScanCardUseCase
import com.tangem.domain.card.repository.CardSdkConfigRepository import com.tangem.domain.card.repository.CardSdkConfigRepository
import com.tangem.domain.settings.repositories.SettingsRepository
import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.legacy.UserWalletsListManagerFeatureToggles import com.tangem.domain.wallets.legacy.UserWalletsListManagerFeatureToggles
import com.tangem.domain.wallets.legacy.asLockable import com.tangem.domain.wallets.legacy.asLockable
@ -141,6 +142,9 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
@Inject @Inject
lateinit var userWalletsListManagerFeatureToggles: UserWalletsListManagerFeatureToggles lateinit var userWalletsListManagerFeatureToggles: UserWalletsListManagerFeatureToggles
@Inject
lateinit var settingsRepository: SettingsRepository
internal val viewModel: MainViewModel by viewModels() internal val viewModel: MainViewModel by viewModels()
private lateinit var appThemeModeFlow: SharedFlow<AppThemeMode?> private lateinit var appThemeModeFlow: SharedFlow<AppThemeMode?>
@ -201,7 +205,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
tangemSdkManager = injectedTangemSdkManager tangemSdkManager = injectedTangemSdkManager
appStateHolder.tangemSdkManager = tangemSdkManager appStateHolder.tangemSdkManager = tangemSdkManager
backupService = BackupService.init(cardSdkConfigRepository.sdk, this) backupService = BackupService.init(cardSdkConfigRepository.sdk, this)
lockUserWalletsTimer = LockUserWalletsTimer(owner = this) lockUserWalletsTimer = LockUserWalletsTimer(owner = this, settingsRepository = settingsRepository)
initIntentHandlers() initIntentHandlers()

View file

@ -5,9 +5,11 @@ import com.tangem.datasource.local.preferences.PreferencesKeys.APP_LAUNCH_COUNT_
import com.tangem.datasource.local.preferences.PreferencesKeys.FUNDS_FOUND_DATE_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.FUNDS_FOUND_DATE_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_TANGEM_TOS_ACCEPTED_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.IS_TANGEM_TOS_ACCEPTED_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.SAVE_USER_WALLETS_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.SAVE_USER_WALLETS_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.SHOULD_OPEN_WELCOME_ON_RESUME_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.SHOW_RATING_DIALOG_AT_LAUNCH_COUNT_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.SHOW_RATING_DIALOG_AT_LAUNCH_COUNT_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.USED_CARDS_INFO_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.USED_CARDS_INFO_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.USER_WAS_INTERACT_WITH_RATING_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.USER_WAS_INTERACT_WITH_RATING_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.WAS_APPLICATION_STOPPED_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.WAS_TWINS_ONBOARDING_SHOWN import com.tangem.datasource.local.preferences.PreferencesKeys.WAS_TWINS_ONBOARDING_SHOWN
/** /**
@ -65,6 +67,10 @@ object PreferencesKeys {
val SEND_TAP_HELP_PREVIEW_KEY by lazy { booleanPreferencesKey(name = "sendTapHelpPreview") } val SEND_TAP_HELP_PREVIEW_KEY by lazy { booleanPreferencesKey(name = "sendTapHelpPreview") }
val WAS_APPLICATION_STOPPED_KEY by lazy { booleanPreferencesKey(name = "applicationStopped") }
val SHOULD_OPEN_WELCOME_ON_RESUME_KEY by lazy { booleanPreferencesKey(name = "openWelcomeOnResume") }
fun getStart2CoinTOSAcceptedKey(region: String?) = booleanPreferencesKey(name = "start2Coin_tos_accepted_$region") fun getStart2CoinTOSAcceptedKey(region: String?) = booleanPreferencesKey(name = "start2Coin_tos_accepted_$region")
} }
@ -79,6 +85,8 @@ internal fun getTapPrefKeysToMigrate(): Set<String> {
USED_CARDS_INFO_KEY, USED_CARDS_INFO_KEY,
WAS_TWINS_ONBOARDING_SHOWN, WAS_TWINS_ONBOARDING_SHOWN,
IS_TANGEM_TOS_ACCEPTED_KEY, IS_TANGEM_TOS_ACCEPTED_KEY,
WAS_APPLICATION_STOPPED_KEY,
SHOULD_OPEN_WELCOME_ON_RESUME_KEY,
) )
.map(Preferences.Key<*>::name) .map(Preferences.Key<*>::name)
.toSet() .toSet()

View file

@ -75,4 +75,23 @@ internal class DefaultSettingsRepository(
value = isEnabled, value = isEnabled,
) )
} }
override suspend fun wasApplicationStopped(): Boolean {
return appPreferencesStore.getSyncOrDefault(key = PreferencesKeys.WAS_APPLICATION_STOPPED_KEY, default = false)
}
override suspend fun setWasApplicationStopped(value: Boolean) {
appPreferencesStore.store(key = PreferencesKeys.WAS_APPLICATION_STOPPED_KEY, value = value)
}
override suspend fun shouldOpenWelcomeScreenOnResume(): Boolean {
return appPreferencesStore.getSyncOrDefault(
key = PreferencesKeys.SHOULD_OPEN_WELCOME_ON_RESUME_KEY,
default = false,
)
}
override suspend fun setShouldOpenWelcomeScreenOnResume(value: Boolean) {
appPreferencesStore.store(key = PreferencesKeys.SHOULD_OPEN_WELCOME_ON_RESUME_KEY, value = value)
}
} }

View file

@ -29,18 +29,6 @@ class PreferencesDataSource @Inject internal constructor(applicationContext: Con
putBoolean(SAVE_ACCESS_CODES_KEY, value) putBoolean(SAVE_ACCESS_CODES_KEY, value)
} }
var wasApplicationStopped: Boolean
get() = preferences.getBoolean(APPLICATION_STOPPED_KEY, false)
set(value) = preferences.edit {
putBoolean(APPLICATION_STOPPED_KEY, value)
}
var shouldOpenWelcomeScreenOnResume: Boolean
get() = preferences.getBoolean(OPEN_WELCOME_ON_RESUME_KEY, false)
set(value) = preferences.edit {
putBoolean(OPEN_WELCOME_ON_RESUME_KEY, value)
}
private fun incrementLaunchCounter() { private fun incrementLaunchCounter() {
var count = preferences.getInt(APP_LAUNCH_COUNT_KEY, 0) var count = preferences.getInt(APP_LAUNCH_COUNT_KEY, 0)
preferences.edit { putInt(APP_LAUNCH_COUNT_KEY, ++count) } preferences.edit { putInt(APP_LAUNCH_COUNT_KEY, ++count) }
@ -51,7 +39,5 @@ class PreferencesDataSource @Inject internal constructor(applicationContext: Con
private const val APP_LAUNCH_COUNT_KEY = "launchCount" private const val APP_LAUNCH_COUNT_KEY = "launchCount"
private const val SAVE_WALLET_DIALOG_SHOWN_KEY = "saveUserWalletShown" private const val SAVE_WALLET_DIALOG_SHOWN_KEY = "saveUserWalletShown"
private const val SAVE_ACCESS_CODES_KEY = "saveAccessCodes" private const val SAVE_ACCESS_CODES_KEY = "saveAccessCodes"
private const val APPLICATION_STOPPED_KEY = "applicationStopped"
private const val OPEN_WELCOME_ON_RESUME_KEY = "openWelcomeOnResume"
} }
} }

View file

@ -17,4 +17,12 @@ interface SettingsRepository {
suspend fun isSendTapHelpPreviewEnabled(): Boolean suspend fun isSendTapHelpPreviewEnabled(): Boolean
suspend fun setSendTapHelpPreviewAvailability(isEnabled: Boolean) suspend fun setSendTapHelpPreviewAvailability(isEnabled: Boolean)
suspend fun wasApplicationStopped(): Boolean
suspend fun setWasApplicationStopped(value: Boolean)
suspend fun shouldOpenWelcomeScreenOnResume(): Boolean
suspend fun setShouldOpenWelcomeScreenOnResume(value: Boolean)
} }