diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 0d9a3b2c0..6089fc991 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -13,7 +13,6 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.getSystemService import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.async import kotlinx.coroutines.launch @@ -67,7 +66,6 @@ open class FenixApplication : LocaleAwareApplication() { var visibilityLifecycleCallback: VisibilityLifecycleCallback? = null private set - @ExperimentalCoroutinesApi override fun onCreate() { super.onCreate() @@ -116,7 +114,6 @@ open class FenixApplication : LocaleAwareApplication() { Log.addSink(AndroidLogSink()) } - @ExperimentalCoroutinesApi @CallSuper open fun setupInMainProcessOnly() { run { diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 9f77509b1..ca06e6964 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -29,6 +29,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import kotlinx.android.synthetic.main.activity_home.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch import mozilla.components.browser.search.SearchEngine import mozilla.components.browser.session.Session @@ -104,6 +105,7 @@ import org.mozilla.fenix.utils.RunWhenReadyQueue * - home screen * - browser screen */ +@OptIn(ExperimentalCoroutinesApi::class) @SuppressWarnings("TooManyFunctions", "LargeClass") open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt index d24b62662..7f1a1450d 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlView.kt @@ -9,15 +9,14 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import kotlinx.android.extensions.LayoutContainer -import kotlinx.coroutines.ExperimentalCoroutinesApi import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.top.sites.TopSite import org.mozilla.fenix.R +import org.mozilla.fenix.components.tips.Tip import org.mozilla.fenix.home.HomeFragmentState import org.mozilla.fenix.home.HomeScreenViewModel import org.mozilla.fenix.home.Mode import org.mozilla.fenix.home.OnboardingState -import org.mozilla.fenix.components.tips.Tip // This method got a little complex with the addition of the tab tray feature flag // When we remove the tabs from the home screen this will get much simpler again. @@ -110,7 +109,6 @@ private fun collectionTabItems(collection: TabCollection) = collection.tabs.mapI AdapterItem.TabInCollectionItem(collection, tab, index == collection.tabs.lastIndex) } -@ExperimentalCoroutinesApi class SessionControlView( override val containerView: View?, interactor: SessionControlInteractor, diff --git a/app/src/main/java/org/mozilla/fenix/migration/MigrationTelemetryListener.kt b/app/src/main/java/org/mozilla/fenix/migration/MigrationTelemetryListener.kt index f792a63c1..1b5268272 100644 --- a/app/src/main/java/org/mozilla/fenix/migration/MigrationTelemetryListener.kt +++ b/app/src/main/java/org/mozilla/fenix/migration/MigrationTelemetryListener.kt @@ -2,8 +2,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -package org.mozilla.fenix +package org.mozilla.fenix.migration +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.collect import mozilla.components.lib.state.ext.flowScoped import mozilla.components.support.base.log.logger.Logger @@ -16,6 +17,8 @@ class MigrationTelemetryListener( private val metrics: MetricController, private val store: MigrationStore ) { + + @OptIn(ExperimentalCoroutinesApi::class) fun start() { // Observe for migration completed. store.flowScoped { flow -> diff --git a/app/src/main/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetry.kt b/app/src/main/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetry.kt index 7768a6423..60712a43d 100644 --- a/app/src/main/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetry.kt +++ b/app/src/main/java/org/mozilla/fenix/search/telemetry/BaseSearchTelemetry.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.search.telemetry import androidx.annotation.VisibleForTesting +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.map @@ -85,6 +86,7 @@ abstract class BaseSearchTelemetry { internal fun getProviderForUrl(url: String): SearchProviderModel? = providerList.find { provider -> provider.regexp.containsMatchIn(url) } + @OptIn(ExperimentalCoroutinesApi::class) internal fun installWebExtension( engine: Engine, store: BrowserStore, diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt index 7b1014df3..62f5cacf7 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt @@ -19,6 +19,7 @@ import kotlinx.android.synthetic.main.component_tabstray.view.* import kotlinx.android.synthetic.main.component_tabstray_fab.view.* import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.* import kotlinx.android.synthetic.main.fragment_tab_tray_dialog.view.* +import kotlinx.coroutines.ExperimentalCoroutinesApi import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager import mozilla.components.browser.state.selector.normalTabs @@ -110,6 +111,7 @@ class TabTrayDialogFragment : AppCompatDialogFragment() { } } + @OptIn(ExperimentalCoroutinesApi::class) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val isPrivate = (activity as HomeActivity).browsingModeManager.mode.isPrivate diff --git a/app/src/migration/java/org/mozilla/fenix/MigratingFenixApplication.kt b/app/src/migration/java/org/mozilla/fenix/MigratingFenixApplication.kt index f6de4e521..c903f5d3e 100644 --- a/app/src/migration/java/org/mozilla/fenix/MigratingFenixApplication.kt +++ b/app/src/migration/java/org/mozilla/fenix/MigratingFenixApplication.kt @@ -8,6 +8,7 @@ import android.content.Context import kotlinx.coroutines.runBlocking import mozilla.components.support.migration.FennecMigrator import org.mozilla.fenix.session.PerformanceActivityLifecycleCallbacks +import org.mozilla.fenix.migration.MigrationTelemetryListener /** * An application class which knows how to migrate Fennec data. diff --git a/app/src/migration/java/org/mozilla/fenix/MigrationPushRenewer.kt b/app/src/migration/java/org/mozilla/fenix/MigrationPushRenewer.kt index 7cc5fc55c..1d8e1650e 100644 --- a/app/src/migration/java/org/mozilla/fenix/MigrationPushRenewer.kt +++ b/app/src/migration/java/org/mozilla/fenix/MigrationPushRenewer.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.collect import mozilla.components.concept.push.PushProcessor import mozilla.components.lib.state.ext.flowScoped @@ -18,6 +19,8 @@ class MigrationPushRenewer( private val service: PushProcessor?, private val store: MigrationStore ) { + + @OptIn(ExperimentalCoroutinesApi::class) fun start() { // Observe for migration completed. store.flowScoped { flow -> diff --git a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt index d40da0e77..2a1cbd089 100644 --- a/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/toolbar/DefaultBrowserToolbarControllerTest.kt @@ -69,7 +69,7 @@ import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.home.Tab import org.mozilla.fenix.settings.deletebrowsingdata.deleteAndQuit -@ExperimentalCoroutinesApi +@OptIn(ExperimentalCoroutinesApi::class) @RunWith(FenixRobolectricTestRunner::class) class DefaultBrowserToolbarControllerTest { diff --git a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index c70bc2c91..2db0a9b94 100644 --- a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -9,18 +9,16 @@ import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.verify -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.MainScope -import kotlinx.coroutines.newSingleThreadContext -import kotlinx.coroutines.test.resetMain -import kotlinx.coroutines.test.setMain +import kotlinx.coroutines.test.TestCoroutineDispatcher import mozilla.components.browser.session.SessionManager import mozilla.components.concept.engine.Engine import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.tabs.TabsUseCases -import org.junit.After +import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.Before +import org.junit.Rule import org.junit.Test import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity @@ -35,10 +33,12 @@ import org.mozilla.fenix.home.sessioncontrol.DefaultSessionControlController import org.mozilla.fenix.settings.SupportUtils import mozilla.components.feature.tab.collections.Tab as ComponentTab -@ExperimentalCoroutinesApi +@OptIn(ExperimentalCoroutinesApi::class) class DefaultSessionControlControllerTest { - private val mainThreadSurrogate = newSingleThreadContext("UI thread") + @get:Rule + val coroutinesTestRule = MainCoroutineRule(TestCoroutineDispatcher()) + private val activity: HomeActivity = mockk(relaxed = true) private val fragmentStore: HomeFragmentStore = mockk(relaxed = true) private val navController: NavController = mockk(relaxed = true) @@ -62,7 +62,6 @@ class DefaultSessionControlControllerTest { @Before fun setup() { - Dispatchers.setMain(mainThreadSurrogate) mockkStatic("org.mozilla.fenix.ext.ContextKt") every { activity.components.core.engine } returns engine every { activity.components.core.sessionManager } returns sessionManager @@ -91,12 +90,6 @@ class DefaultSessionControlControllerTest { ) } - @After - fun tearDown() { - Dispatchers.resetMain() // reset main dispatcher to the original Main dispatcher - mainThreadSurrogate.close() - } - @Test fun handleCollectionAddTabTapped() { val collection: TabCollection = mockk(relaxed = true) diff --git a/app/src/test/java/org/mozilla/fenix/settings/deletebrowsingdata/DefaultDeleteBrowsingDataControllerTest.kt b/app/src/test/java/org/mozilla/fenix/settings/deletebrowsingdata/DefaultDeleteBrowsingDataControllerTest.kt index 44c8a4862..bf0cc524c 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/deletebrowsingdata/DefaultDeleteBrowsingDataControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/deletebrowsingdata/DefaultDeleteBrowsingDataControllerTest.kt @@ -10,39 +10,30 @@ import io.mockk.every import io.mockk.just import io.mockk.mockk import io.mockk.verify -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.newSingleThreadContext -import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.TestCoroutineDispatcher import kotlinx.coroutines.test.runBlockingTest -import kotlinx.coroutines.test.setMain import mozilla.components.concept.engine.Engine -import org.junit.After +import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.Before +import org.junit.Rule import org.junit.Test import org.mozilla.fenix.ext.components -@ExperimentalCoroutinesApi +@OptIn(ExperimentalCoroutinesApi::class) class DefaultDeleteBrowsingDataControllerTest { - private val mainThreadSurrogate = newSingleThreadContext("UI thread") + @get:Rule + val coroutinesTestRule = MainCoroutineRule(TestCoroutineDispatcher()) private val context: Context = mockk(relaxed = true) private lateinit var controller: DefaultDeleteBrowsingDataController @Before fun setup() { - Dispatchers.setMain(mainThreadSurrogate) - every { context.components.core.engine.clearData(any()) } just Runs } - @After - fun tearDown() { - Dispatchers.resetMain() // reset main dispatcher to the original Main dispatcher - mainThreadSurrogate.close() - } - @Test fun deleteTabs() = runBlockingTest { controller = DefaultDeleteBrowsingDataController(context, coroutineContext) diff --git a/app/src/test/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteAndQuitTest.kt b/app/src/test/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteAndQuitTest.kt index eb975b3a3..41413b743 100644 --- a/app/src/test/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteAndQuitTest.kt +++ b/app/src/test/java/org/mozilla/fenix/settings/deletebrowsingdata/DeleteAndQuitTest.kt @@ -6,24 +6,21 @@ package org.mozilla.fenix.settings.deletebrowsingdata -import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import io.mockk.every import io.mockk.mockk import io.mockk.verify import io.mockk.verifyOrder -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.newSingleThreadContext -import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.TestCoroutineDispatcher import kotlinx.coroutines.test.runBlockingTest -import kotlinx.coroutines.test.setMain import mozilla.components.browser.storage.sync.PlacesHistoryStorage import mozilla.components.concept.engine.Engine import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.support.test.robolectric.testContext -import org.junit.After +import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.Before import org.junit.Ignore +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.HomeActivity @@ -31,13 +28,15 @@ import org.mozilla.fenix.components.FenixSnackbar import org.mozilla.fenix.components.PermissionStorage import org.mozilla.fenix.ext.clearAndCommit import org.mozilla.fenix.ext.components +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.utils.Settings -@ExperimentalCoroutinesApi +@OptIn(ExperimentalCoroutinesApi::class) @RunWith(FenixRobolectricTestRunner::class) class DeleteAndQuitTest { - private val mainThreadSurrogate = newSingleThreadContext("UI thread") + @get:Rule + val coroutinesTestRule = MainCoroutineRule(TestCoroutineDispatcher()) private var activity: HomeActivity = mockk(relaxed = true) lateinit var settings: Settings @@ -54,8 +53,6 @@ class DeleteAndQuitTest { clear() } - Dispatchers.setMain(mainThreadSurrogate) - every { activity.components.core.historyStorage } returns historyStorage every { activity.components.core.permissionStorage } returns permissionStorage every { activity.components.useCases.tabsUseCases } returns tabUseCases @@ -63,12 +60,6 @@ class DeleteAndQuitTest { every { activity.components.core.engine } returns engine } - @After - fun tearDown() { - Dispatchers.resetMain() // reset main dispatcher to the original Main dispatcher - mainThreadSurrogate.close() - } - private fun Settings.clear() { preferences.clearAndCommit() } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 69f2d65e0..3c2ba184e 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object Versions { - const val kotlin = "1.3.30" + const val kotlin = "1.3.72" const val coroutines = "1.3.3" const val android_gradle_plugin = "3.5.0" const val sentry = "1.7.10"