|
|
|
@ -7,6 +7,10 @@ package org.mozilla.fenix.components
|
|
|
|
|
import android.content.Context
|
|
|
|
|
import android.content.SharedPreferences
|
|
|
|
|
import android.preference.PreferenceManager
|
|
|
|
|
import kotlinx.coroutines.Dispatchers
|
|
|
|
|
import kotlinx.coroutines.GlobalScope
|
|
|
|
|
import kotlinx.coroutines.async
|
|
|
|
|
import kotlinx.coroutines.launch
|
|
|
|
|
import mozilla.components.browser.engine.gecko.GeckoEngine
|
|
|
|
|
import mozilla.components.browser.session.SessionManager
|
|
|
|
|
import mozilla.components.browser.session.storage.SessionStorage
|
|
|
|
@ -15,10 +19,12 @@ import mozilla.components.concept.engine.DefaultSettings
|
|
|
|
|
import mozilla.components.concept.engine.Engine
|
|
|
|
|
import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy
|
|
|
|
|
import mozilla.components.feature.session.HistoryDelegate
|
|
|
|
|
import mozilla.components.feature.session.bundling.SessionBundleStorage
|
|
|
|
|
import mozilla.components.lib.crash.handler.CrashHandlerService
|
|
|
|
|
import org.mozilla.fenix.AppRequestInterceptor
|
|
|
|
|
import org.mozilla.geckoview.GeckoRuntime
|
|
|
|
|
import org.mozilla.geckoview.GeckoRuntimeSettings
|
|
|
|
|
import java.util.concurrent.TimeUnit
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Component group for all core browser functionality.
|
|
|
|
@ -49,6 +55,10 @@ class Core(private val context: Context) {
|
|
|
|
|
GeckoEngine(context, defaultSettings, runtime)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
val sessionStorage by lazy {
|
|
|
|
|
SessionBundleStorage(context, bundleLifetime = Pair(1, TimeUnit.HOURS))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The session manager component provides access to a centralized registry of
|
|
|
|
|
* all browser sessions (i.e. tabs). It is initialized here to persist and restore
|
|
|
|
@ -56,7 +66,24 @@ class Core(private val context: Context) {
|
|
|
|
|
* case all sessions/tabs are closed.
|
|
|
|
|
*/
|
|
|
|
|
val sessionManager by lazy {
|
|
|
|
|
SessionManager(engine)
|
|
|
|
|
SessionManager(engine).also { sessionManager ->
|
|
|
|
|
// Restore a previous, still active bundle.
|
|
|
|
|
GlobalScope.launch(Dispatchers.Main) {
|
|
|
|
|
val snapshot = async(Dispatchers.IO) {
|
|
|
|
|
sessionStorage.restore()?.restoreSnapshot(engine)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// There's an active bundle with a snapshot: Feed it into the SessionManager.
|
|
|
|
|
snapshot.await()?.let { sessionManager.restore(it) }
|
|
|
|
|
|
|
|
|
|
// 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(sessionManager)
|
|
|
|
|
.periodicallyInForeground(interval = 30, unit = TimeUnit.SECONDS)
|
|
|
|
|
.whenGoingToBackground()
|
|
|
|
|
.whenSessionsChange()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|