From 5157a3f50e8078e3c539c1dd20329937da1d6d5c Mon Sep 17 00:00:00 2001 From: Christian Sadilek Date: Tue, 15 Dec 2020 11:49:45 -0500 Subject: [PATCH] Closes #17045: Crash caused by calling consumeFlow on wrong thread --- .../fenix/browser/BaseBrowserFragment.kt | 6 ++---- .../fenix/onboarding/FenixOnboarding.kt | 18 +++++++++++++----- .../fenix/onboarding/FenixOnboardingTest.kt | 6 ++++++ 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index d7d4090d3..ec2dc2fb7 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -230,10 +230,8 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, observeTabSelection(requireComponents.core.store) - lifecycleScope.launch(IO) { - if (!onboarding.userHasBeenOnboarded()) { - observeTabSource(requireComponents.core.store) - } + if (!onboarding.userHasBeenOnboarded()) { + observeTabSource(requireComponents.core.store) } requireContext().accessibilityManager.addAccessibilityStateChangeListener(this) diff --git a/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt b/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt index 0af973195..c9cfff8d9 100644 --- a/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt +++ b/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt @@ -6,6 +6,7 @@ package org.mozilla.fenix.onboarding import android.content.Context import android.content.SharedPreferences +import android.os.StrictMode import androidx.annotation.VisibleForTesting import mozilla.components.support.ktx.android.content.PreferencesHolder import mozilla.components.support.ktx.android.content.intPreference @@ -15,10 +16,13 @@ import org.mozilla.fenix.ext.components class FenixOnboarding(context: Context) : PreferencesHolder { private val metrics = context.components.analytics.metrics - override val preferences: SharedPreferences = context.getSharedPreferences( - PREF_NAME_ONBOARDING_KEY, - Context.MODE_PRIVATE - ) + private val strictMode = context.components.strictMode + override val preferences: SharedPreferences = strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { + context.getSharedPreferences( + PREF_NAME_ONBOARDING_KEY, + Context.MODE_PRIVATE + ) + } private var onboardedVersion by intPreference(LAST_VERSION_ONBOARDING_KEY, default = 0) @@ -27,7 +31,11 @@ class FenixOnboarding(context: Context) : PreferencesHolder { metrics.track(Event.DismissedOnboarding) } - fun userHasBeenOnboarded() = onboardedVersion == CURRENT_ONBOARDING_VERSION + fun userHasBeenOnboarded(): Boolean { + return strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { + onboardedVersion == CURRENT_ONBOARDING_VERSION + } + } companion object { /** diff --git a/app/src/test/java/org/mozilla/fenix/onboarding/FenixOnboardingTest.kt b/app/src/test/java/org/mozilla/fenix/onboarding/FenixOnboardingTest.kt index a62996181..577e57ad7 100644 --- a/app/src/test/java/org/mozilla/fenix/onboarding/FenixOnboardingTest.kt +++ b/app/src/test/java/org/mozilla/fenix/onboarding/FenixOnboardingTest.kt @@ -14,12 +14,17 @@ import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test +import org.junit.runner.RunWith import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.ext.components +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import org.mozilla.fenix.helpers.perf.TestStrictModeManager import org.mozilla.fenix.onboarding.FenixOnboarding.Companion.CURRENT_ONBOARDING_VERSION import org.mozilla.fenix.onboarding.FenixOnboarding.Companion.LAST_VERSION_ONBOARDING_KEY +import org.mozilla.fenix.perf.StrictModeManager +@RunWith(FenixRobolectricTestRunner::class) class FenixOnboardingTest { private lateinit var onboarding: FenixOnboarding @@ -36,6 +41,7 @@ class FenixOnboardingTest { every { preferences.edit() } returns preferencesEditor every { metrics.track(any()) } returns Unit every { context.components.analytics.metrics } returns metrics + every { context.components.strictMode } returns TestStrictModeManager() as StrictModeManager every { context.getSharedPreferences(any(), MODE_PRIVATE) } returns preferences onboarding = FenixOnboarding(context)