134 lines
No EOL
4.1 KiB
Kotlin
134 lines
No EOL
4.1 KiB
Kotlin
package com.tangem.tap
|
|
|
|
import androidx.lifecycle.DefaultLifecycleObserver
|
|
import androidx.lifecycle.LifecycleOwner
|
|
import androidx.lifecycle.lifecycleScope
|
|
import com.tangem.common.routing.AppRoute
|
|
import com.tangem.domain.settings.repositories.SettingsRepository
|
|
import com.tangem.domain.wallets.legacy.UserWalletsListManager
|
|
import com.tangem.domain.wallets.legacy.asLockable
|
|
import com.tangem.tap.common.extensions.dispatchNavigationAction
|
|
import kotlinx.coroutines.*
|
|
import timber.log.Timber
|
|
import kotlin.time.Duration
|
|
|
|
internal class LockUserWalletsTimer(
|
|
owner: LifecycleOwner,
|
|
private val settingsRepository: SettingsRepository,
|
|
private val duration: Duration = with(Duration) { 10.minutes },
|
|
private val userWalletsListManager: UserWalletsListManager,
|
|
) : LifecycleOwner by owner,
|
|
DefaultLifecycleObserver {
|
|
|
|
private var delayJob: Job? = null
|
|
set(value) {
|
|
field?.cancel()
|
|
field = value
|
|
}
|
|
|
|
init {
|
|
lifecycle.addObserver(this)
|
|
}
|
|
|
|
override fun onResume(owner: LifecycleOwner) {
|
|
owner.lifecycleScope.launch {
|
|
val wasApplicationStopped = settingsRepository.wasApplicationStopped()
|
|
val shouldOpenWelcomeScreenOnResume = settingsRepository.shouldOpenWelcomeScreenOnResume()
|
|
|
|
Timber.i(
|
|
"""
|
|
Owner resumed
|
|
|- Was stopped: $wasApplicationStopped
|
|
|- Need to open welcome screen: $shouldOpenWelcomeScreenOnResume
|
|
""".trimIndent(),
|
|
)
|
|
|
|
settingsRepository.setWasApplicationStopped(value = false)
|
|
|
|
start()
|
|
|
|
if (shouldOpenWelcomeScreenOnResume) {
|
|
store.dispatchNavigationAction { replaceAll(AppRoute.Welcome()) }
|
|
settingsRepository.setShouldOpenWelcomeScreenOnResume(value = false)
|
|
}
|
|
}
|
|
}
|
|
|
|
override fun onStop(owner: LifecycleOwner) {
|
|
Timber.i("Owner stopped")
|
|
|
|
owner.lifecycleScope.launch {
|
|
settingsRepository.setWasApplicationStopped(value = true)
|
|
}
|
|
}
|
|
|
|
override fun onDestroy(owner: LifecycleOwner) {
|
|
Timber.i("Owner destroyed")
|
|
stop()
|
|
}
|
|
|
|
fun restart() {
|
|
if (delayJob == null) return
|
|
Timber.i(
|
|
"""
|
|
Timer restart
|
|
|- Duration millis: ${duration.inWholeMilliseconds}
|
|
""".trimIndent(),
|
|
)
|
|
start(log = false)
|
|
}
|
|
|
|
private fun start(log: Boolean = true) {
|
|
if (log) {
|
|
Timber.i(
|
|
"""
|
|
Timer start
|
|
|- Duration millis: ${duration.inWholeMilliseconds}
|
|
""".trimIndent(),
|
|
)
|
|
}
|
|
delayJob = createDelayJob()
|
|
}
|
|
|
|
private fun stop(log: Boolean = true) {
|
|
if (log) {
|
|
Timber.i(
|
|
"""
|
|
Timer stop
|
|
|- Was started: ${delayJob?.isActive ?: false}
|
|
""".trimIndent(),
|
|
)
|
|
}
|
|
delayJob = null
|
|
}
|
|
|
|
private fun createDelayJob(): Job = lifecycleScope.launch(Dispatchers.Default) {
|
|
val startTime = System.currentTimeMillis()
|
|
|
|
delay(duration)
|
|
|
|
if (isActive) {
|
|
val userWalletsListManager = userWalletsListManager.asLockable() ?: return@launch
|
|
|
|
if (userWalletsListManager.hasUserWallets) {
|
|
val currentTime = System.currentTimeMillis()
|
|
val wasApplicationStopped = settingsRepository.wasApplicationStopped()
|
|
|
|
Timber.i(
|
|
"""
|
|
Finished
|
|
|- App is stopped: $wasApplicationStopped
|
|
|- Millis passed: ${currentTime - startTime}
|
|
""".trimIndent(),
|
|
)
|
|
|
|
userWalletsListManager.lock()
|
|
if (wasApplicationStopped) {
|
|
settingsRepository.setShouldOpenWelcomeScreenOnResume(value = true)
|
|
} else {
|
|
store.dispatchNavigationAction { replaceAll(AppRoute.Welcome()) }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |