From 1b6cebf4d43ac977cfae9e101c4e4b5d1ec24ef9 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Fri, 18 Dec 2020 15:34:33 +0100 Subject: [PATCH] Switch to new SessionStorage / session restore API. --- app/build.gradle | 1 + .../org/mozilla/fenix/FenixApplication.kt | 38 ++++++++++++- .../java/org/mozilla/fenix/components/Core.kt | 56 +++---------------- .../fenix/components/TabCollectionStorage.kt | 3 +- buildSrc/src/main/java/AndroidComponents.kt | 2 +- buildSrc/src/main/java/Dependencies.kt | 1 + 6 files changed, 49 insertions(+), 52 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index aff69a0e5..49a4556da 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -427,6 +427,7 @@ dependencies { implementation Deps.mozilla_browser_menu2 implementation Deps.mozilla_browser_search implementation Deps.mozilla_browser_session + implementation Deps.mozilla_browser_session_storage implementation Deps.mozilla_browser_state implementation Deps.mozilla_browser_storage_sync implementation Deps.mozilla_browser_tabstray diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 8016e5296..5b9991243 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -41,14 +41,15 @@ import mozilla.components.support.webextensions.WebExtensionSupport import org.mozilla.fenix.components.Components import org.mozilla.fenix.components.metrics.MetricServiceType import org.mozilla.fenix.ext.settings -import org.mozilla.fenix.perf.StorageStatsMetrics import org.mozilla.fenix.perf.StartupTimeline +import org.mozilla.fenix.perf.StorageStatsMetrics import org.mozilla.fenix.perf.runBlockingIncrement import org.mozilla.fenix.push.PushFxaIntegration import org.mozilla.fenix.push.WebPushEngineIntegration import org.mozilla.fenix.session.PerformanceActivityLifecycleCallbacks import org.mozilla.fenix.session.VisibilityLifecycleCallback import org.mozilla.fenix.utils.BrowsersCache +import java.util.concurrent.TimeUnit /** *The main application class for Fenix. Records data to measure initialization performance. @@ -130,6 +131,8 @@ open class FenixApplication : LocaleAwareApplication(), Provider { components.core.engine.warmUp() } initializeWebExtensionSupport() + restoreBrowserState() + removeTimedOutTabs() restoreDownloads() @@ -159,6 +162,39 @@ open class FenixApplication : LocaleAwareApplication(), Provider { components.appStartupTelemetry.onFenixApplicationOnCreate() } + private fun restoreBrowserState() = GlobalScope.launch(Dispatchers.Main) { + val store = components.core.store + val sessionStorage = components.core.sessionStorage + + components.useCases.tabsUseCases.restore(sessionStorage) + + // Now that we have restored our previous state (if there's one) let's setup auto saving the state while + // the app is used. + sessionStorage.autoSave(store) + .periodicallyInForeground(interval = 30, unit = TimeUnit.SECONDS) + .whenGoingToBackground() + .whenSessionsChange() + } + + private fun removeTimedOutTabs() { + val store = components.core.store + val tabsUseCases = components.useCases.tabsUseCases + + // Now that we have restored our previous state (if there's one) let's remove timed out tabs + if (!settings().manuallyCloseTabs) { + val now = System.currentTimeMillis() + val tabTimeout = settings().getTabTimeout() + + val tabsToRemove = store.state.tabs + .filter { tab -> now - tab.lastAccess > tabTimeout } + .map { tab -> tab.id } + + if (tabsToRemove.isNotEmpty()) { + tabsUseCases.removeTabs(tabsToRemove) + } + } + } + private fun restoreDownloads() { components.useCases.downloadUseCases.restoreDownloads() } diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index 8b04d719b..96b6b504a 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -11,10 +11,6 @@ import android.os.Build import android.os.StrictMode import androidx.core.content.ContextCompat import io.sentry.Sentry -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import mozilla.components.browser.engine.gecko.GeckoEngine import mozilla.components.browser.engine.gecko.fetch.GeckoViewFetchClient import mozilla.components.browser.icons.BrowserIcons @@ -23,7 +19,6 @@ import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.engine.EngineMiddleware import mozilla.components.browser.session.storage.SessionStorage import mozilla.components.browser.session.undo.UndoMiddleware -import mozilla.components.browser.state.action.RestoreCompleteAction import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.storage.sync.PlacesBookmarksStorage @@ -39,6 +34,8 @@ import mozilla.components.concept.fetch.Client import mozilla.components.feature.customtabs.store.CustomTabsServiceStore import mozilla.components.feature.downloads.DownloadMiddleware import mozilla.components.feature.logins.exceptions.LoginExceptionStorage +import mozilla.components.feature.media.MediaSessionFeature +import mozilla.components.feature.media.middleware.MediaMiddleware import mozilla.components.feature.media.middleware.RecordingDevicesMiddleware import mozilla.components.feature.pwa.ManifestStorage import mozilla.components.feature.pwa.WebAppShortcutManager @@ -64,14 +61,17 @@ import mozilla.components.support.locale.LocaleManager import org.mozilla.fenix.AppRequestInterceptor import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config +import org.mozilla.fenix.FeatureFlags.newMediaSessionApi import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R -import org.mozilla.fenix.perf.StrictModeManager import org.mozilla.fenix.TelemetryMiddleware import org.mozilla.fenix.components.search.SearchMigration import org.mozilla.fenix.downloads.DownloadService import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.media.MediaService +import org.mozilla.fenix.media.MediaSessionService +import org.mozilla.fenix.perf.StrictModeManager import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry import org.mozilla.fenix.search.telemetry.incontent.InContentTelemetry @@ -79,12 +79,6 @@ import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.advanced.getSelectedLocale import org.mozilla.fenix.utils.Mockable import org.mozilla.fenix.utils.getUndoDelay -import java.util.concurrent.TimeUnit -import mozilla.components.feature.media.MediaSessionFeature -import mozilla.components.feature.media.middleware.MediaMiddleware -import org.mozilla.fenix.FeatureFlags.newMediaSessionApi -import org.mozilla.fenix.media.MediaService -import org.mozilla.fenix.media.MediaSessionService /** * Component group for all core browser functionality. @@ -166,7 +160,7 @@ class Core( ) } - private val sessionStorage: SessionStorage by lazyMonitored { + val sessionStorage: SessionStorage by lazyMonitored { SessionStorage(context, engine = engine) } @@ -239,7 +233,7 @@ class Core( * case all sessions/tabs are closed. */ val sessionManager by lazyMonitored { - SessionManager(engine, store).also { sessionManager -> + SessionManager(engine, store).also { // Install the "icons" WebExtension to automatically load icons for every visited website. icons.install(engine, store) @@ -249,40 +243,6 @@ class Core( // Install the "cookies" WebExtension and tracks user interaction with SERPs. searchTelemetry.install(engine, store) - // Restore the previous state. - GlobalScope.launch(Dispatchers.Main) { - withContext(Dispatchers.IO) { - sessionStorage.restore() - }?.let { snapshot -> - sessionManager.restore( - snapshot, - updateSelection = (sessionManager.selectedSession == null) - ) - } - - // Now that we have restored our previous state (if there's one) let's setup auto saving the state while - // the app is used. - sessionStorage.autoSave(store) - .periodicallyInForeground(interval = 30, unit = TimeUnit.SECONDS) - .whenGoingToBackground() - .whenSessionsChange() - - // Now that we have restored our previous state (if there's one) let's remove timed out tabs - if (!context.settings().manuallyCloseTabs) { - store.state.tabs.filter { - (System.currentTimeMillis() - it.lastAccess) > context.settings() - .getTabTimeout() - }.forEach { - val session = sessionManager.findSessionById(it.id) - if (session != null) { - sessionManager.remove(session) - } - } - } - - store.dispatch(RestoreCompleteAction) - } - WebNotificationFeature( context, engine, icons, R.drawable.ic_status_logo, permissionStorage.permissionsStorage, HomeActivity::class.java diff --git a/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt b/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt index 2347fe706..cbd15afa4 100644 --- a/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt +++ b/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt @@ -11,7 +11,6 @@ import androidx.lifecycle.asLiveData import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import mozilla.components.browser.session.storage.BrowserStateSerializer import mozilla.components.browser.state.state.TabSessionState import mozilla.components.feature.tab.collections.Tab import mozilla.components.feature.tab.collections.TabCollection @@ -56,7 +55,7 @@ class TabCollectionStorage( private val collectionStorage by lazy { strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { - TabCollectionStorage(context, BrowserStateSerializer()) + TabCollectionStorage(context) } } diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 40160e641..bf989053a 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20210104143130" + const val VERSION = "71.0.20210105122039" } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 38b482f51..27d9d713f 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -83,6 +83,7 @@ object Deps { const val mozilla_browser_icons = "org.mozilla.components:browser-icons:${Versions.mozilla_android_components}" const val mozilla_browser_search = "org.mozilla.components:browser-search:${Versions.mozilla_android_components}" const val mozilla_browser_session = "org.mozilla.components:browser-session:${Versions.mozilla_android_components}" + const val mozilla_browser_session_storage = "org.mozilla.components:browser-session-storage:${Versions.mozilla_android_components}" const val mozilla_browser_state = "org.mozilla.components:browser-state:${Versions.mozilla_android_components}" const val mozilla_browser_tabstray = "org.mozilla.components:browser-tabstray:${Versions.mozilla_android_components}" const val mozilla_browser_thumbnails = "org.mozilla.components:browser-thumbnails:${Versions.mozilla_android_components}"