diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt index f126a9aabf17a19f1bfa19240b7aa96a85e38d30..2e0864f486d06d7b5d1e81da39c526bff454f0bb 100644 --- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/ui/MainActivity.kt @@ -32,6 +32,8 @@ import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.Job +import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import org.briarproject.android.dontkillmelib.DozeUtils.needsDozeWhitelisting import org.briarproject.mailbox.NavOnboardingDirections.actionGlobalClockSkewFragment @@ -158,9 +160,15 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult> } } + // Remember last db check job so that we can cancel the current one and launch a new one in case + // of onCreate() and onNewIntent() creating two jobs in quick succession. + private var lastDbCheck: Job? = null + private fun checkForDbAsync() { - lifecycleScope.launch { + lastDbCheck?.cancel() + lastDbCheck = lifecycleScope.launch { val hasDb = viewModel.hasDb() + if (!isActive) return@launch LOG.info( "hasDb? $hasDb, hadBeenStartedOnSave? $hadBeenStartedOnSave, " + "onboarding launched? $onboardingLaunched, onboarding done? $onboardingDone" @@ -188,7 +196,8 @@ class MainActivity : AppCompatActivity(), ActivityResultCallback<ActivityResult> if (!hasDb && !onboardingDone) { // Make sure not to launch onboarding twice. In case of MainActivity being killed (due // to do-not-keep activities option enabled), onDbChecked() gets called twice when - // relaunched via app launcher (through onNewIntent()). + // relaunched via app launcher (through onNewIntent()). Even though we cancel the job + // there is a slight chance that both jobs finish. if (!onboardingLaunched.getAndSet(true)) { LOG.info("launching onboarding activity") startForResult.launch(Intent(this, OnboardingActivity::class.java))