Updated on 2026-08-14
This commit is contained in:
parent
bc70ed5327
commit
ccd7a7dd18
11 changed files with 98 additions and 39 deletions
|
|
@ -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
|
||||
}
|
||||
34
app/src/main/java/com/tangem/tap/LockTimerWorker.kt
Normal file
34
app/src/main/java/com/tangem/tap/LockTimerWorker.kt
Normal 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"
|
||||
}
|
||||
}
|
||||
|
|
@ -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()) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -355,7 +355,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac
|
|||
}
|
||||
|
||||
lockUserWalletsTimer = LockUserWalletsTimer(
|
||||
owner = this,
|
||||
context = this,
|
||||
settingsRepository = settingsRepository,
|
||||
userWalletsListManager = userWalletsListManager,
|
||||
coroutineScope = mainScope,
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue