Updated on 2026-08-14

This commit is contained in:
Tangem 2025-03-13 15:55:28 +03:00
parent bc70ed5327
commit ccd7a7dd18
11 changed files with 98 additions and 39 deletions

View file

@ -1,5 +1,6 @@
package com.tangem.tap
import androidx.hilt.work.HiltWorkerFactory
import com.tangem.TangemSdkLogger
import com.tangem.blockchainsdk.BlockchainSDKFactory
import com.tangem.data.card.TransactionSignerFactory
@ -139,4 +140,6 @@ interface ApplicationEntryPoint {
@GlobalUiMessageSender
fun getUiMessageSender(): UiMessageSender
fun getWorkerFactory(): HiltWorkerFactory
}

View file

@ -0,0 +1,34 @@
package com.tangem.tap
import android.content.Context
import androidx.hilt.work.HiltWorker
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import com.tangem.domain.settings.repositories.SettingsRepository
import com.tangem.domain.wallets.legacy.UserWalletsListManager
import com.tangem.domain.wallets.legacy.asLockable
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import timber.log.Timber
@HiltWorker
class LockTimerWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted params: WorkerParameters,
private val settingsRepository: SettingsRepository,
private val userWalletsListManager: UserWalletsListManager,
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
Timber.i("onStart job")
val userWalletsListManagerLockable = userWalletsListManager.asLockable() ?: return Result.failure()
userWalletsListManagerLockable.lock()
settingsRepository.setShouldOpenWelcomeScreenOnResume(value = true)
Timber.i("onStart job complete")
return Result.success()
}
companion object {
const val TAG = "LOCK_TIMER"
}
}

View file

@ -1,23 +1,32 @@
package com.tangem.tap
import android.app.job.JobScheduler
import android.content.Context
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager
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.LockTimerWorker.Companion.TAG
import com.tangem.tap.common.extensions.dispatchNavigationAction
import kotlinx.coroutines.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import timber.log.Timber
import java.util.concurrent.TimeUnit
import kotlin.time.Duration
internal class LockUserWalletsTimer(
owner: LifecycleOwner,
private val context: Context,
private val settingsRepository: SettingsRepository,
private val duration: Duration = with(Duration) { 10.minutes },
private val duration: Duration = with(Duration) { 5.minutes },
private val userWalletsListManager: UserWalletsListManager,
private val coroutineScope: CoroutineScope,
) : LifecycleOwner by owner,
) : LifecycleOwner by context as LifecycleOwner,
DefaultLifecycleObserver {
private var delayJob: Job? = null
@ -31,20 +40,16 @@ internal class LockUserWalletsTimer(
}
override fun onStart(owner: LifecycleOwner) {
WorkManager.getInstance(context).cancelAllWorkByTag(TAG)
coroutineScope.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)
if (shouldOpenWelcomeScreenOnResume) {
store.dispatchNavigationAction { replaceAll(AppRoute.Welcome()) }
settingsRepository.setShouldOpenWelcomeScreenOnResume(value = false)
@ -58,10 +63,9 @@ internal class LockUserWalletsTimer(
override fun onStop(owner: LifecycleOwner) {
Timber.i("Owner stopped")
delayJob = null
coroutineScope.launch {
settingsRepository.setWasApplicationStopped(value = true)
}
startTimerWorker()
}
fun restart() {
@ -75,6 +79,15 @@ internal class LockUserWalletsTimer(
start(log = false)
}
private fun startTimerWorker() {
val lockWorkRequest = OneTimeWorkRequest.Builder(LockTimerWorker::class.java)
.addTag(TAG)
.setInitialDelay(duration.inWholeSeconds, TimeUnit.SECONDS)
.build()
WorkManager.getInstance(context).enqueue(lockWorkRequest)
}
private fun start(log: Boolean = true) {
if (log) {
Timber.i(
@ -87,6 +100,9 @@ internal class LockUserWalletsTimer(
delayJob = createDelayJob()
}
/**
* This job used only when app is foreground when background use [JobScheduler]
*/
private fun createDelayJob(): Job = coroutineScope.launch {
val startTime = System.currentTimeMillis()
@ -96,22 +112,16 @@ internal class LockUserWalletsTimer(
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()) }
}
store.dispatchNavigationAction { replaceAll(AppRoute.Welcome()) }
}
}
}

View file

@ -355,7 +355,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
}
lockUserWalletsTimer = LockUserWalletsTimer(
owner = this,
context = this,
settingsRepository = settingsRepository,
userWalletsListManager = userWalletsListManager,
coroutineScope = mainScope,

View file

@ -1,6 +1,8 @@
package com.tangem.tap
import android.app.Application
import androidx.hilt.work.HiltWorkerFactory
import androidx.work.Configuration
import coil.ImageLoader
import coil.ImageLoaderFactory
import com.chuckerteam.chucker.api.ChuckerInterceptor
@ -78,7 +80,7 @@ lateinit var store: Store<AppState>
lateinit var foregroundActivityObserver: ForegroundActivityObserver
internal lateinit var derivationsFinder: DerivationsFinder
abstract class TangemApplication : Application(), ImageLoaderFactory {
abstract class TangemApplication : Application(), ImageLoaderFactory, Configuration.Provider {
// region DI
private val entryPoint: ApplicationEntryPoint
@ -210,6 +212,14 @@ abstract class TangemApplication : Application(), ImageLoaderFactory {
private val uiMessageSender: UiMessageSender
get() = entryPoint.getUiMessageSender()
private val workerFactory: HiltWorkerFactory
get() = entryPoint.getWorkerFactory()
override val workManagerConfiguration: Configuration
get() = Configuration.Builder()
.setWorkerFactory(workerFactory)
.build()
// endregion
override fun onCreate() {