diff --git a/app/src/main/java/org/mozilla/fenix/perf/StartupTimeline.kt b/app/src/main/java/org/mozilla/fenix/perf/StartupTimeline.kt index 8a8f45cfa..2187d8e15 100644 --- a/app/src/main/java/org/mozilla/fenix/perf/StartupTimeline.kt +++ b/app/src/main/java/org/mozilla/fenix/perf/StartupTimeline.kt @@ -8,6 +8,7 @@ import androidx.annotation.UiThread import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.OnLifecycleEvent +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import mozilla.components.service.glean.private.NoReasonCodes @@ -75,12 +76,13 @@ object StartupTimeline { */ internal class StartupHomeActivityLifecycleObserver( private val frameworkStartMeasurement: StartupFrameworkStartMeasurement, - private val startupTimeline: PingType = Pings.startupTimeline + private val startupTimeline: PingType = Pings.startupTimeline, + private val scope: CoroutineScope = GlobalScope ) : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_STOP) fun onStop() { - GlobalScope.launch { // use background thread due to expensive metrics. + scope.launch { // use background thread due to expensive metrics. // Ensure any last metrics are set before submission. frameworkStartMeasurement.setExpensiveMetric() diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt index 16636ebfd..aa6211c8b 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsController.kt @@ -8,7 +8,6 @@ import android.content.Context import androidx.annotation.VisibleForTesting import androidx.navigation.NavController import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import mozilla.components.browser.session.Session import mozilla.components.feature.session.SessionUseCases.ReloadUrlUseCase @@ -54,7 +53,7 @@ interface QuickSettingsController { * @param context [Context] used for various Android interactions. * @param quickSettingsStore [QuickSettingsFragmentStore] holding the State for all Views displayed * in this Controller's Fragment. - * @param coroutineScope [CoroutineScope] used for structed concurrency. + * @param ioScope [CoroutineScope] with an IO dispatcher used for structured concurrency. * @param navController NavController] used for navigation. * @param session [Session]? current browser state. * @param sitePermissions [SitePermissions]? list of website permissions and their status. @@ -71,7 +70,7 @@ interface QuickSettingsController { class DefaultQuickSettingsController( private val context: Context, private val quickSettingsStore: QuickSettingsFragmentStore, - private val coroutineScope: CoroutineScope, + private val ioScope: CoroutineScope, private val navController: NavController, private val session: Session?, private var sitePermissions: SitePermissions?, @@ -143,7 +142,7 @@ class DefaultQuickSettingsController( */ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) fun handlePermissionsChange(updatedPermissions: SitePermissions) { - coroutineScope.launch(Dispatchers.IO) { + ioScope.launch { permissionStorage.updateSitePermissions(updatedPermissions) reload(session) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt index 8c70881e2..adfdbfee8 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/quicksettings/QuickSettingsSheetDialogFragment.kt @@ -27,7 +27,9 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import kotlinx.android.synthetic.main.fragment_quick_settings_dialog_sheet.* import kotlinx.android.synthetic.main.fragment_quick_settings_dialog_sheet.view.* +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.plus import mozilla.components.lib.state.ext.consumeFrom import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.HomeActivity @@ -75,7 +77,7 @@ class QuickSettingsSheetDialogFragment : AppCompatDialogFragment() { quickSettingsController = DefaultQuickSettingsController( context = context, quickSettingsStore = quickSettingsStore, - coroutineScope = viewLifecycleOwner.lifecycleScope, + ioScope = viewLifecycleOwner.lifecycleScope + Dispatchers.IO, navController = findNavController(), session = context.components.core.sessionManager.findSessionById(args.sessionId), sitePermissions = args.sitePermissions, diff --git a/app/src/test/java/org/mozilla/fenix/perf/StartupHomeActivityLifecycleObserverTest.kt b/app/src/test/java/org/mozilla/fenix/perf/StartupHomeActivityLifecycleObserverTest.kt index 7d4203c40..224b16479 100644 --- a/app/src/test/java/org/mozilla/fenix/perf/StartupHomeActivityLifecycleObserverTest.kt +++ b/app/src/test/java/org/mozilla/fenix/perf/StartupHomeActivityLifecycleObserverTest.kt @@ -17,19 +17,19 @@ import org.junit.Test @ExperimentalCoroutinesApi class StartupHomeActivityLifecycleObserverTest { - private lateinit var observer: StartupHomeActivityLifecycleObserver @MockK(relaxed = true) private lateinit var frameworkStartMeasurement: StartupFrameworkStartMeasurement @MockK(relaxed = true) private lateinit var startupTimeline: PingType @Before fun setUp() { MockKAnnotations.init(this) - observer = StartupHomeActivityLifecycleObserver(frameworkStartMeasurement, startupTimeline) } @Test fun `WHEN onStop is called THEN the metrics are set and the ping is submitted`() = runBlockingTest { + val observer = StartupHomeActivityLifecycleObserver(frameworkStartMeasurement, startupTimeline, this) observer.onStop() + verifySequence { frameworkStartMeasurement.setExpensiveMetric() startupTimeline.submit() diff --git a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/DefaultQuickSettingsControllerTest.kt b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/DefaultQuickSettingsControllerTest.kt index da88bc0fb..19e0d015d 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/quicksettings/DefaultQuickSettingsControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/quicksettings/DefaultQuickSettingsControllerTest.kt @@ -6,7 +6,6 @@ package org.mozilla.fenix.settings.quicksettings import androidx.navigation.NavController import androidx.navigation.NavDirections -import io.mockk.MockKMatcherScope import io.mockk.Runs import io.mockk.every import io.mockk.just @@ -53,7 +52,7 @@ class DefaultQuickSettingsControllerTest { private val controller = spyk(DefaultQuickSettingsController( context = context, quickSettingsStore = store, - coroutineScope = coroutinesScope, + ioScope = coroutinesScope, navController = navController, session = browserSession, sitePermissions = sitePermissions, @@ -85,7 +84,7 @@ class DefaultQuickSettingsControllerTest { controller.handlePermissionToggled(websitePermission) verify { - controller.handleAndroidPermissionRequest(eqArray(cameraFeature.androidPermissionsList)) + controller.handleAndroidPermissionRequest(cameraFeature.androidPermissionsList) } } @@ -117,7 +116,7 @@ class DefaultQuickSettingsControllerTest { val invalidSitePermissionsController = DefaultQuickSettingsController( context = context, quickSettingsStore = store, - coroutineScope = coroutinesScope, + ioScope = coroutinesScope, navController = navController, session = browserSession, sitePermissions = null, @@ -166,7 +165,7 @@ class DefaultQuickSettingsControllerTest { controller.handleAndroidPermissionRequest(testPermissions) - verify { requestPermissions(eqArray(testPermissions)) } + verify { requestPermissions(testPermissions) } } @Test @@ -175,13 +174,11 @@ class DefaultQuickSettingsControllerTest { val testPermissions = mockk() controller.handlePermissionsChange(testPermissions) + advanceUntilIdle() verifyOrder { permissionStorage.updateSitePermissions(testPermissions) reload(browserSession) } } - - private inline fun MockKMatcherScope.eqArray(value: Array): Array = - match { it contentEquals value } }