Updated on 2026-08-14
This commit is contained in:
parent
ddb8de4964
commit
128f3b8d43
6 changed files with 75 additions and 32 deletions
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue