diff --git a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt index 224a79150..1e6ab61a5 100644 --- a/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoBeta/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -23,7 +23,7 @@ object GeckoProvider { @Synchronized fun getOrCreateRuntime( context: Context, - storage: LoginsStorage + storage: Lazy ): GeckoRuntime { if (runtime == null) { runtime = createRuntime(context, storage) @@ -34,7 +34,7 @@ object GeckoProvider { private fun createRuntime( context: Context, - storage: LoginsStorage + storage: Lazy ): GeckoRuntime { val builder = GeckoRuntimeSettings.Builder() diff --git a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt index 837a96e32..b72198260 100644 --- a/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt +++ b/app/src/geckoNightly/java/org/mozilla/fenix/engine/GeckoProvider.kt @@ -22,7 +22,7 @@ object GeckoProvider { @Synchronized fun getOrCreateRuntime( context: Context, - storage: LoginsStorage + storage: Lazy ): GeckoRuntime { if (runtime == null) { runtime = createRuntime(context, storage) @@ -33,7 +33,7 @@ object GeckoProvider { private fun createRuntime( context: Context, - storage: LoginsStorage + storage: Lazy ): GeckoRuntime { val builder = GeckoRuntimeSettings.Builder() 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 46416e907..ee56f6327 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -331,7 +331,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session customTabId = customTabSessionId, fragmentManager = parentFragmentManager, loginValidationDelegate = DefaultLoginValidationDelegate( - context.components.core.passwordsStorage + context.components.core.lazyPasswordsStorage ), isSaveLoginEnabled = { context.settings().shouldPromptToSaveLogins diff --git a/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt b/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt index cfcae0f3d..7700788e5 100644 --- a/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt +++ b/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt @@ -46,9 +46,9 @@ class BackgroundServices( private val context: Context, private val push: Push, crashReporter: CrashReporter, - historyStorage: PlacesHistoryStorage, - bookmarkStorage: PlacesBookmarksStorage, - passwordsStorage: SyncableLoginsStorage + historyStorage: Lazy, + bookmarkStorage: Lazy, + passwordsStorage: Lazy ) { fun defaultDeviceName(context: Context): String = context.getString( diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt index 29d84cac6..091405ed3 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -33,9 +33,9 @@ class Components(private val context: Context) { context, push, analytics.crashReporter, - core.historyStorage, - core.bookmarksStorage, - core.passwordsStorage + core.lazyHistoryStorage, + core.lazyBookmarksStorage, + core.lazyPasswordsStorage ) } val services by lazy { Services(context, backgroundServices.accountManager) } 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 8a6d8fb67..49ab1d226 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -38,6 +38,7 @@ import mozilla.components.feature.webnotifications.WebNotificationFeature import mozilla.components.lib.dataprotect.SecureAbove22Preferences import mozilla.components.lib.dataprotect.generateEncryptionKey import mozilla.components.service.sync.logins.SyncableLoginsStorage +import mozilla.components.support.base.log.logger.Logger import org.mozilla.fenix.AppRequestInterceptor import org.mozilla.fenix.Config import org.mozilla.fenix.FeatureFlags @@ -52,6 +53,8 @@ import java.util.concurrent.TimeUnit */ @Mockable class Core(private val context: Context) { + private val logger = Logger("Core") + /** * The browser engine component initialized based on the build * configuration (see build variants). @@ -62,7 +65,7 @@ class Core(private val context: Context) { remoteDebuggingEnabled = context.settings().isRemoteDebuggingEnabled, testingModeEnabled = false, trackingProtectionPolicy = trackingProtectionPolicyFactory.createTrackingProtectionPolicy(), - historyTrackingDelegate = HistoryDelegate(historyStorage), + historyTrackingDelegate = HistoryDelegate(lazyHistoryStorage), preferredColorScheme = getPreferredColorScheme(), automaticFontSizeAdjustment = context.settings().shouldUseAutoSize, fontInflationEnabled = context.settings().shouldUseAutoSize, @@ -73,7 +76,7 @@ class Core(private val context: Context) { GeckoEngine( context, defaultSettings, - GeckoProvider.getOrCreateRuntime(context, passwordsStorage) + GeckoProvider.getOrCreateRuntime(context, lazyPasswordsStorage) ).also { WebCompatFeature.install(it) } @@ -85,7 +88,7 @@ class Core(private val context: Context) { val client: Client by lazy { GeckoViewFetchClient( context, - GeckoProvider.getOrCreateRuntime(context, passwordsStorage) + GeckoProvider.getOrCreateRuntime(context, lazyPasswordsStorage) ) } @@ -184,15 +187,28 @@ class Core(private val context: Context) { ) } - /** - * The storage component to persist browsing history (with the exception of - * private sessions). - */ - val historyStorage by lazy { PlacesHistoryStorage(context) } + // Lazy wrappers around storage components are used to pass references to these components without + // initializing them until they're accessed. + // Use these for startup-path code, where we don't want to do any work that's not strictly necessary. + // For example, this is how the GeckoEngine delegates (history, logins) are configured. + // We can fully initialize GeckoEngine without initialized our storage. + val lazyHistoryStorage = lazy { + logger.info("Initializing history storage") + PlacesHistoryStorage(context) + } + val lazyBookmarksStorage = lazy { + logger.info("Initializing bookmarks storage") + PlacesBookmarksStorage(context) + } + val lazyPasswordsStorage = lazy { + logger.info("Initializing logins storage") + SyncableLoginsStorage(context, passwordsEncryptionKey) + } - val bookmarksStorage by lazy { PlacesBookmarksStorage(context) } - - val passwordsStorage by lazy { SyncableLoginsStorage(context, passwordsEncryptionKey) } + // For most other application code (non-startup), these wrappers are perfectly fine and more ergonomic. + val historyStorage by lazy { lazyHistoryStorage.value } + val bookmarksStorage by lazy { lazyBookmarksStorage.value } + val passwordsStorage by lazy { lazyPasswordsStorage.value } val tabCollectionStorage by lazy { TabCollectionStorage(context, sessionManager) } diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 8f3dddc3d..7dbd00887 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 = "37.0.20200318190037" + const val VERSION = "37.0.20200319130119" }