commit 18432accbdce21a24b475de1d8a1d97a4cb7e557
parent dcfec3072a33ee155929c2e666669c23e274b394
Author: Mugurell <Mugurell@users.noreply.github.com>
Date: Thu, 20 Nov 2025 09:12:32 +0000
Bug 1996643 - part 7 - Migrate from the LifecycleHolder idiom within saved logins r=android-reviewers,matt-tighe,nalexander
Differential Revision: https://phabricator.services.mozilla.com/D272160
Diffstat:
2 files changed, 19 insertions(+), 32 deletions(-)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/fragment/SavedLoginsFragment.kt
@@ -36,6 +36,7 @@ import mozilla.components.concept.engine.EngineSession
import mozilla.components.concept.menu.MenuController
import mozilla.components.concept.menu.Orientation
import mozilla.components.lib.state.ext.consumeFrom
+import mozilla.components.lib.state.helpers.StoreProvider.Companion.fragmentStore
import org.mozilla.fenix.BrowserDirection
import org.mozilla.fenix.Config
import org.mozilla.fenix.HomeActivity
@@ -51,7 +52,6 @@ import org.mozilla.fenix.ext.hideToolbar
import org.mozilla.fenix.ext.registerForActivityResult
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.ext.showToolbar
-import org.mozilla.fenix.lifecycle.LifecycleHolder
import org.mozilla.fenix.settings.biometric.DefaultBiometricUtils
import org.mozilla.fenix.settings.logins.LoginsAction
import org.mozilla.fenix.settings.logins.LoginsFragmentStore
@@ -154,22 +154,20 @@ class SavedLoginsFragment : SecureFragment(), MenuProvider {
if (requireContext().settings().enableComposeLogins) {
return ComposeView(requireContext()).apply {
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
- val buildStore = { navController: NavHostController ->
- val store = StoreProvider.get(this@SavedLoginsFragment) {
- val lifecycleHolder = LifecycleHolder(
- context = requireContext(),
- navController = this@SavedLoginsFragment.findNavController(),
- composeNavController = navController,
- homeActivity = (requireActivity() as HomeActivity),
- )
-
- LoginsStore(
- initialState = LoginsState.default.copy(
- sortOrder = LoginsSortOrder.fromString(
- value = requireContext().settings().loginsListSortOrder,
- default = LoginsSortOrder.Alphabetical,
- ),
+ val buildStore = { composeNavController: NavHostController ->
+ val homeActivity = (requireActivity() as HomeActivity)
+ val navController = findNavController()
+
+ val store by fragmentStore(
+ LoginsState.default.copy(
+ sortOrder = LoginsSortOrder.fromString(
+ value = requireContext().settings().loginsListSortOrder,
+ default = LoginsSortOrder.Alphabetical,
),
+ ),
+ ) {
+ LoginsStore(
+ initialState = it,
middleware = listOf(
LogMiddleware(
tag = "LoginsStore",
@@ -177,15 +175,15 @@ class SavedLoginsFragment : SecureFragment(), MenuProvider {
),
LoginsMiddleware(
loginsStorage = requireContext().components.core.passwordsStorage,
- getNavController = { lifecycleHolder.composeNavController },
- exitLogins = { lifecycleHolder.navController.popBackStack() },
+ getNavController = { composeNavController },
+ exitLogins = { navController.popBackStack() },
persistLoginsSortOrder = {
DefaultSavedLoginsStorage(
- lifecycleHolder.context.settings(),
+ context.settings(),
).savedLoginsSortOrder = it
},
openTab = { url, openInNewTab ->
- lifecycleHolder.homeActivity.openToBrowserAndLoad(
+ homeActivity.openToBrowserAndLoad(
searchTermOrURL = url,
newTab = openInNewTab,
from = BrowserDirection.FromSavedLoginsFragment,
@@ -194,20 +192,12 @@ class SavedLoginsFragment : SecureFragment(), MenuProvider {
),
)
},
- clipboardManager = lifecycleHolder.homeActivity.getSystemService(),
+ clipboardManager = homeActivity.getSystemService(),
),
),
- lifecycleHolder = lifecycleHolder,
)
}
- store.lifecycleHolder?.apply {
- this.navController = this@SavedLoginsFragment.findNavController()
- this.composeNavController = navController
- this.homeActivity = (requireActivity() as HomeActivity)
- this.context = requireContext()
- }
-
store
}
setContent {
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/LoginsStore.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/LoginsStore.kt
@@ -7,7 +7,6 @@ package org.mozilla.fenix.settings.logins.ui
import mozilla.components.lib.state.Middleware
import mozilla.components.lib.state.Reducer
import mozilla.components.lib.state.Store
-import org.mozilla.fenix.lifecycle.LifecycleHolder
/**
* A Store for handling [LoginsState] and dispatching [LoginsAction].
@@ -15,13 +14,11 @@ import org.mozilla.fenix.lifecycle.LifecycleHolder
* @param initialState The initial state for the Store.
* @param reducer Reducer to handle state updates based on dispatched actions.
* @param middleware Middleware to handle side-effects in response to dispatched actions.
- * @property lifecycleHolder a hack to box the references to objects that get recreated with the activity.
*/
internal class LoginsStore(
initialState: LoginsState = LoginsState.default,
reducer: Reducer<LoginsState, LoginsAction> = ::loginsReducer,
middleware: List<Middleware<LoginsState, LoginsAction>> = listOf(),
- val lifecycleHolder: LifecycleHolder? = null,
) : Store<LoginsState, LoginsAction>(
initialState = initialState,
reducer = reducer,