From 9478a17d367b846450a77dbff12df92d8db88022 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 26 Sep 2025 17:21:25 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tangem/tap/ForegroundActivityObserver.kt | 20 +++++++++++++------ .../main/java/com/tangem/tap/MainActivity.kt | 4 ++++ .../java/com/tangem/tap/TangemApplication.kt | 16 +++++++++------ 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/ForegroundActivityObserver.kt b/app/src/main/java/com/tangem/tap/ForegroundActivityObserver.kt index cb7805793c..98ce5cd24b 100644 --- a/app/src/main/java/com/tangem/tap/ForegroundActivityObserver.kt +++ b/app/src/main/java/com/tangem/tap/ForegroundActivityObserver.kt @@ -4,30 +4,38 @@ import android.app.Activity import android.app.Application.ActivityLifecycleCallbacks import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import java.util.WeakHashMap +import timber.log.Timber import kotlin.reflect.KClass -class ForegroundActivityObserver { +object ForegroundActivityObserver { - private val activities = WeakHashMap, AppCompatActivity>() + private val activities = HashMap, AppCompatActivity>() val foregroundActivity: AppCompatActivity? get() = activities.entries - .firstOrNull { it.value?.isDestroyed == false } + .firstOrNull { + Timber.i("foregroundActivity: ${it.key} | ${it.value.isDestroyed}") + it.value.isDestroyed == false + } ?.value internal val callbacks: ActivityLifecycleCallbacks get() = Callbacks() - internal inner class Callbacks : ActivityLifecycleCallbacks { + internal class Callbacks : ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { } override fun onActivityResumed(activity: Activity) { - activities[activity::class] = activity as? AppCompatActivity + Timber.i("onActivityResumed ${activity::class}") + (activity as? AppCompatActivity)?.let { + Timber.i("onActivityResumed store activity") + activities[activity::class] = it + } } override fun onActivityDestroyed(activity: Activity) { + Timber.i("onActivityDestroyed") activities.remove(activity::class) } diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index c047e66353..24653ac2e5 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -191,6 +191,7 @@ class MainActivity : AppCompatActivity(), ActivityResultCallbackHolder { private val onActivityResultCallbacks = mutableListOf() override fun onCreate(savedInstanceState: Bundle?) { + Timber.i("onCreate") // We need to call it before onCreate to prevent unnecessary activity recreation installAppTheme() @@ -328,15 +329,18 @@ class MainActivity : AppCompatActivity(), ActivityResultCallbackHolder { override fun onStart() { super.onStart() + Timber.i("onStart") dialogManager.onStart(this) } override fun onStop() { dialogManager.onStop() super.onStop() + Timber.i("onStop") } override fun onDestroy() { + Timber.i("onDestroy") // workaround: kill process when activity destroy to avoid state when lock() wallets // and navigation to unlock screen was skipped because system kills activity but not process if (BuildConfig.BUILD_TYPE != MOCKED_BUILD_TYPE) { diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index 9a3f617366..8adc257a55 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -85,7 +85,7 @@ import timber.log.Timber lateinit var store: Store -lateinit var foregroundActivityObserver: ForegroundActivityObserver +val foregroundActivityObserver = ForegroundActivityObserver internal lateinit var derivationsFinder: DerivationsFinder abstract class TangemApplication : Application(), ImageLoaderFactory, Configuration.Provider { @@ -246,6 +246,7 @@ abstract class TangemApplication : Application(), ImageLoaderFactory, Configurat override fun onCreate() { enableStrictModeInDebug() + preInit() super.onCreate() init() } @@ -286,22 +287,25 @@ abstract class TangemApplication : Application(), ImageLoaderFactory, Configurat // } } + /** + * Initialize components that need to be initialized before [super.onCreate] is called + */ + private fun preInit() { + tangemAppLoggerInitializer.initialize() + registerActivityLifecycleCallbacks(foregroundActivityObserver.callbacks) + } + fun init() { apiConfigsManager.initialize() store = createReduxStore() - tangemAppLoggerInitializer.initialize() - Timber.i("APP STARTED") if (BuildConfig.TESTER_MENU_ENABLED) { Timber.i(featureTogglesManager.toString()) Timber.i(excludedBlockchainsManager.toString()) } - foregroundActivityObserver = ForegroundActivityObserver() - registerActivityLifecycleCallbacks(foregroundActivityObserver.callbacks) - runBlocking { initWithConfigDependency(environmentConfig = environmentConfigStorage.initialize()) }