commit ca99e52450edd424e6333367fa506a9487d3db2f parent ebefbf6207409975e6194f94a71e6b4781c296c2 Author: pollymce <pmceldowney@mozilla.com> Date: Thu, 18 Dec 2025 15:52:46 +0000 Bug 2005443 - remove MiddlewareContext stage 1. r=android-reviewers,kaya Remove the state accessor. Differential Revision: https://phabricator.services.mozilla.com/D276193 Diffstat:
64 files changed, 177 insertions(+), 181 deletions(-)
diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CreateEngineSessionMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CreateEngineSessionMiddleware.kt @@ -35,7 +35,7 @@ internal class CreateEngineSessionMiddleware( action: BrowserAction, ) { if (action is EngineAction.CreateEngineSessionAction) { - val engineState = context.state.findTabOrCustomTab(action.tabId)?.engineState + val engineState = context.store.state.findTabOrCustomTab(action.tabId)?.engineState if (engineState?.initializing == false && engineState.engineSession == null && !engineState.crashed) { context.store.dispatch(EngineAction.UpdateEngineSessionInitializingAction(action.tabId, true)) createEngineSession(context.store, action) diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/EngineDelegateMiddleware.kt @@ -45,7 +45,7 @@ internal class EngineDelegateMiddleware( is EngineAction.SaveToPdfAction -> saveToPdf(context.store, action) is EngineAction.PrintContentAction -> printContent(context.store, action) is EngineAction.ClearDataAction -> clearData(context.store, action) - is EngineAction.PurgeHistoryAction -> purgeHistory(context.state) + is EngineAction.PurgeHistoryAction -> purgeHistory(context.store.state) is EngineAction.FlushEngineSessionStateAction -> flushEngineSessionSate(context.store, action) is TranslationsAction.TranslateAction -> { next(action) diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/LinkingMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/LinkingMiddleware.kt @@ -61,7 +61,7 @@ internal class LinkingMiddleware( when (action) { is EngineAction.LinkEngineSessionAction -> { - context.state.findTabOrCustomTab(action.tabId)?.let { tab -> + context.store.state.findTabOrCustomTab(action.tabId)?.let { tab -> engineObserver = link(context, action.engineSession, tab, action.skipLoading, action.includeParent) } } @@ -97,7 +97,7 @@ internal class LinkingMiddleware( performLoadOnMainThread(engineSession, tab.content.url, loadFlags = tab.engineState.initialLoadFlags) } else { val parentEngineSession = if (includeParent && tab is TabSessionState) { - tab.parentId?.let { context.state.findTabOrCustomTab(it)?.engineState?.engineSession } + tab.parentId?.let { context.store.state.findTabOrCustomTab(it)?.engineState?.engineSession } } else { null } @@ -136,10 +136,10 @@ internal class LinkingMiddleware( } private fun unlink( - store: MiddlewareContext<BrowserState, BrowserAction>, + context: MiddlewareContext<BrowserState, BrowserAction>, action: EngineAction.UnlinkEngineSessionAction, ) { - val tab = store.state.findTabOrCustomTab(action.tabId) ?: return + val tab = context.store.state.findTabOrCustomTab(action.tabId) ?: return tab.engineState.engineObserver?.let { tab.engineState.engineSession?.unregister(it) diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/PdfStateMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/PdfStateMiddleware.kt @@ -34,8 +34,8 @@ internal class PdfStateMiddleware( if (action is ContentAction.UpdateProgressAction && action.progress == PAGE_FULLY_LOADED_PROGRESS) { scope.launch { - val newPdfRenderingStatus = isRenderingPdf(action.sessionId, context.state) - val previousRenderingStatus = previousPdfRenderingStatus(action.sessionId, context.state) + val newPdfRenderingStatus = isRenderingPdf(action.sessionId, context.store.state) + val previousRenderingStatus = previousPdfRenderingStatus(action.sessionId, context.store.state) if (newPdfRenderingStatus != previousRenderingStatus) { dispatchPdfStatusUpdate(action.sessionId, newPdfRenderingStatus, context) diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/SessionPrioritizationMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/SessionPrioritizationMiddleware.kt @@ -52,7 +52,7 @@ class SessionPrioritizationMiddleware( ) { when (action) { is EngineAction.UnlinkEngineSessionAction -> { - val activeTab = context.state.findTab(action.tabId) + val activeTab = context.store.state.findTab(action.tabId) activeTab?.engineState?.engineSession?.updateSessionPriority(DEFAULT) if (previousHighestPriorityTabId == action.tabId) { previousHighestPriorityTabId = "" @@ -61,7 +61,7 @@ class SessionPrioritizationMiddleware( } is ContentAction.UpdateHasFormDataAction -> { if (action.adjustPriority) { - val tab = context.state.findTab(action.tabId) + val tab = context.store.state.findTab(action.tabId) if (action.containsFormData) { tab?.engineState?.engineSession?.updateSessionPriority(HIGH) logger.info("Update the tab ${tab?.id} priority to ${HIGH.name}") @@ -76,7 +76,7 @@ class SessionPrioritizationMiddleware( } is ContentAction.UpdatePriorityToDefaultAfterTimeoutAction -> { // remove finished job from map - val tab = context.state.findTab(action.tabId) + val tab = context.store.state.findTab(action.tabId) tab?.engineState?.engineSession?.updateSessionPriority(DEFAULT) logger.info("Update the tab ${tab?.id} priority back to ${DEFAULT.name}") updatePriorityToDefaultJobs.remove(action.tabId) @@ -85,7 +85,9 @@ class SessionPrioritizationMiddleware( is AppLifecycleAction.PauseAction -> { // Check for form data for the selected tab when the app is backgrounded. mainScope.launch { - context.state.selectedTab?.engineState?.engineSession?.checkForFormData(adjustPriority = false) + context.store.state.selectedTab?.engineState?.engineSession?.checkForFormData( + adjustPriority = false, + ) } } else -> { @@ -100,7 +102,7 @@ class SessionPrioritizationMiddleware( is EngineAction.LinkEngineSessionAction, -> { // if it exists in the map of high priority tabs to be cleared, cancel the job and remove it - val state = context.state + val state = context.store.state updatePriorityToDefaultJobs[state.selectedTabId]?.cancel() updatePriorityToDefaultJobs.remove(state.selectedTabId) diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/SuspendMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/SuspendMiddleware.kt @@ -46,7 +46,7 @@ internal class SuspendMiddleware( context: MiddlewareContext<BrowserState, BrowserAction>, sessionId: String, ) { - val tab = context.state.findTabOrCustomTab(sessionId) ?: return + val tab = context.store.state.findTabOrCustomTab(sessionId) ?: return // First we unlink (which clearsEngineSession and state) context.store.dispatch( diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TabsRemovedMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TabsRemovedMiddleware.kt @@ -33,17 +33,17 @@ internal class TabsRemovedMiddleware( action: BrowserAction, ) { when (action) { - is TabListAction.RemoveAllNormalTabsAction -> onTabsRemoved(context, context.state.normalTabs) - is TabListAction.RemoveAllPrivateTabsAction -> onTabsRemoved(context, context.state.privateTabs) - is TabListAction.RemoveAllTabsAction -> onTabsRemoved(context, context.state.tabs) - is TabListAction.RemoveTabAction -> context.state.findTab(action.tabId)?.let { + is TabListAction.RemoveAllNormalTabsAction -> onTabsRemoved(context, context.store.state.normalTabs) + is TabListAction.RemoveAllPrivateTabsAction -> onTabsRemoved(context, context.store.state.privateTabs) + is TabListAction.RemoveAllTabsAction -> onTabsRemoved(context, context.store.state.tabs) + is TabListAction.RemoveTabAction -> context.store.state.findTab(action.tabId)?.let { onTabsRemoved(context, listOf(it)) } - is TabListAction.RemoveTabsAction -> action.tabIds.mapNotNull { context.state.findTab(it) }.let { + is TabListAction.RemoveTabsAction -> action.tabIds.mapNotNull { context.store.state.findTab(it) }.let { onTabsRemoved(context, it) } - is CustomTabListAction.RemoveAllCustomTabsAction -> onTabsRemoved(context, context.state.customTabs) - is CustomTabListAction.RemoveCustomTabAction -> context.state.findCustomTab(action.tabId)?.let { + is CustomTabListAction.RemoveAllCustomTabsAction -> onTabsRemoved(context, context.store.state.customTabs) + is CustomTabListAction.RemoveCustomTabAction -> context.store.state.findCustomTab(action.tabId)?.let { onTabsRemoved(context, listOf(it)) } else -> { diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddleware.kt @@ -93,7 +93,7 @@ class TranslationsMiddleware( } } TranslationOperation.FETCH_PAGE_SETTINGS -> { - val tabId = action.tabId ?: context.state.selectedTab?.id + val tabId = action.tabId ?: context.store.state.selectedTab?.id if (action.tabId == null) { logger.warn( "Passed null tabId to FETCH_PAGE_SETTINGS, " + @@ -102,7 +102,7 @@ class TranslationsMiddleware( } if (tabId != null) { scope.launch { - context.state.selectedTab?.let { + context.store.state.selectedTab?.let { requestPageSettings(context, it.id) } } diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TrimMemoryMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TrimMemoryMiddleware.kt @@ -45,9 +45,9 @@ internal class TrimMemoryMiddleware : Middleware<BrowserState, BrowserAction> { return } - val suspendTabs = determineTabsToSuspend(context.state) + val suspendTabs = determineTabsToSuspend(context.store.state) - logger.info("Trim memory (tabs=${context.state.allTabs.size}, suspending=${suspendTabs.size})") + logger.info("Trim memory (tabs=${context.store.state.allTabs.size}, suspending=${suspendTabs.size})") // This is not the most efficient way of doing this. We are looping over all tabs and then // dispatching a SuspendEngineSessionAction for each tab that is no longer needed. diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/WebExtensionMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/WebExtensionMiddleware.kt @@ -29,8 +29,8 @@ internal class WebExtensionMiddleware : Middleware<BrowserState, BrowserAction> ) { when (action) { is EngineAction.UnlinkEngineSessionAction -> { - if (context.state.activeWebExtensionTabId == action.tabId) { - val activeTab = context.state.findTab(action.tabId) + if (context.store.state.activeWebExtensionTabId == action.tabId) { + val activeTab = context.store.state.findTab(action.tabId) activeTab?.engineState?.engineSession?.markActiveForWebExtensions(false) } } @@ -54,7 +54,7 @@ internal class WebExtensionMiddleware : Middleware<BrowserState, BrowserAction> } private fun switchActiveStateIfNeeded(context: MiddlewareContext<BrowserState, BrowserAction>) { - val state = context.state + val state = context.store.state if (state.activeWebExtensionTabId == state.selectedTabId) { return } diff --git a/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddlewareTest.kt b/mobile/android/android-components/components/browser/state/src/test/java/mozilla/components/browser/state/engine/middleware/TranslationsMiddlewareTest.kt @@ -94,7 +94,7 @@ class TranslationsMiddlewareTest { context = mock<MiddlewareContext<BrowserState, BrowserAction>>() whenever(context.store).thenReturn(store) - whenever(context.state).thenReturn(state) + whenever(context.store.state).thenReturn(state) mockLanguageModels = mutableListOf(mockLanguageModel) } diff --git a/mobile/android/android-components/components/browser/thumbnails/src/main/java/mozilla/components/browser/thumbnails/ThumbnailsMiddleware.kt b/mobile/android/android-components/components/browser/thumbnails/src/main/java/mozilla/components/browser/thumbnails/ThumbnailsMiddleware.kt @@ -27,12 +27,12 @@ class ThumbnailsMiddleware( ) { when (action) { is TabListAction.RemoveAllNormalTabsAction -> { - context.state.tabs.filterNot { it.content.private }.forEach { tab -> + context.store.state.tabs.filterNot { it.content.private }.forEach { tab -> thumbnailStorage.deleteThumbnail(tab.id, isPrivate = false) } } is TabListAction.RemoveAllPrivateTabsAction -> { - context.state.tabs.filter { it.content.private }.forEach { tab -> + context.store.state.tabs.filter { it.content.private }.forEach { tab -> thumbnailStorage.deleteThumbnail(tab.id, isPrivate = true) } } @@ -41,12 +41,12 @@ class ThumbnailsMiddleware( } is TabListAction.RemoveTabAction -> { // Delete the tab screenshot from the storage when the tab is removed. - val isPrivate = context.state.isTabIdPrivate(action.tabId) + val isPrivate = context.store.state.isTabIdPrivate(action.tabId) thumbnailStorage.deleteThumbnail(action.tabId, isPrivate) } is TabListAction.RemoveTabsAction -> { action.tabIds.forEach { id -> - val isPrivate = context.state.isTabIdPrivate(id) + val isPrivate = context.store.state.isTabIdPrivate(id) thumbnailStorage.deleteThumbnail(id, isPrivate) } } diff --git a/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadMiddleware.kt b/mobile/android/android-components/components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadMiddleware.kt @@ -144,7 +144,7 @@ class DownloadMiddleware( private fun updateDownload(updated: DownloadState, context: MiddlewareContext<BrowserState, BrowserAction>) { if (updated.private) return - context.state.downloads[updated.id]?.let { old -> + context.store.state.downloads[updated.id]?.let { old -> // To not overwhelm the storage, we only send updates that are relevant, // we only care about properties, that we are stored on the storage. if (!DownloadStorage.isSameDownload(old, updated)) { diff --git a/mobile/android/android-components/components/feature/fxsuggest/src/main/java/mozilla/components/feature/fxsuggest/facts/FxSuggestFactsMiddleware.kt b/mobile/android/android-components/components/feature/fxsuggest/src/main/java/mozilla/components/feature/fxsuggest/facts/FxSuggestFactsMiddleware.kt @@ -44,8 +44,8 @@ class FxSuggestFactsMiddleware : Middleware<BrowserState, BrowserAction> { action: BrowserAction, ) = when (action) { is AwesomeBarAction.EngagementFinished -> emitSuggestionFacts( - awesomeBarState = context.state.awesomeBarState, - clientCountry = context.state.search.region?.home ?: RegionState.Default.home, + awesomeBarState = context.store.state.awesomeBarState, + clientCountry = context.store.state.search.region?.home ?: RegionState.Default.home, engagementAbandoned = action.abandoned, ) else -> Unit diff --git a/mobile/android/android-components/components/feature/media/src/main/java/mozilla/components/feature/media/middleware/RecordingDevicesMiddleware.kt b/mobile/android/android-components/components/feature/media/src/main/java/mozilla/components/feature/media/middleware/RecordingDevicesMiddleware.kt @@ -70,7 +70,7 @@ class RecordingDevicesMiddleware( middlewareContext: MiddlewareContext<BrowserState, BrowserAction>, isReminder: Boolean, ) { - val devices = middlewareContext.state.tabs + val devices = middlewareContext.store.state.tabs .map { tab -> tab.content.recordingDevices } .flatten() .filter { device -> device.status == RecordingDevice.Status.RECORDING } diff --git a/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/PromptMiddleware.kt b/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/PromptMiddleware.kt @@ -45,7 +45,7 @@ class PromptMiddleware : Middleware<BrowserState, BrowserAction> { context: MiddlewareContext<BrowserState, BrowserAction>, ): Boolean { if (action.promptRequest is PromptRequest.Popup) { - context.state.findTab(action.sessionId)?.let { + context.store.state.findTab(action.sessionId)?.let { if (it.content.promptRequests.lastOrNull { prompt -> prompt is PromptRequest.Popup } != null) { scope.launch { (action.promptRequest as PromptRequest.Popup).onDeny() diff --git a/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/file/FileUploadsDirCleanerMiddleware.kt b/mobile/android/android-components/components/feature/prompts/src/main/java/mozilla/components/feature/prompts/file/FileUploadsDirCleanerMiddleware.kt @@ -27,7 +27,7 @@ class FileUploadsDirCleanerMiddleware( ) { when (action) { is ContentAction.UpdateUrlAction -> { - context.state.findTab(action.sessionId)?.let { actualSession -> + context.store.state.findTab(action.sessionId)?.let { actualSession -> val actualHost = actualSession.content.url.toUri().host val newHost = action.url.toUri().host if (actualHost != newHost) { diff --git a/mobile/android/android-components/components/feature/readerview/src/main/java/mozilla/components/feature/readerview/ReaderViewMiddleware.kt b/mobile/android/android-components/components/feature/readerview/src/main/java/mozilla/components/feature/readerview/ReaderViewMiddleware.kt @@ -62,7 +62,7 @@ class ReaderViewMiddleware : Middleware<BrowserState, BrowserAction> { // (e.g. via a tabs tray fragment). In order to disconnect the port as // early as possible it's best to do it here directly. is EngineAction.UnlinkEngineSessionAction -> { - context.state.findTab(action.tabId)?.engineState?.engineSession?.let { + context.store.state.findTab(action.tabId)?.engineState?.engineSession?.let { extensionController.disconnectPort(it, READER_VIEW_EXTENSION_ID) } true @@ -80,7 +80,7 @@ class ReaderViewMiddleware : Middleware<BrowserState, BrowserAction> { // Change made to UpdateUrlAction so when the source page (not viewed in reader // mode) has the same url, we clear the reader mode status on url update. // https://bugzilla.mozilla.org/show_bug.cgi?id=1970308 - val tab = context.state.findTab(action.sessionId) + val tab = context.store.state.findTab(action.sessionId) if (isReaderUrl(tab, action.url)) { val urlReplaced = tab?.readerState?.activeUrl?.let { activeUrl -> context.store.dispatch(ContentAction.UpdateUrlAction(action.sessionId, activeUrl)) @@ -117,7 +117,7 @@ class ReaderViewMiddleware : Middleware<BrowserState, BrowserAction> { // When a tab is restored, the reader page will connect, but we won't get a // UpdateUrlAction. We still want to mask the moz-extension:// URL though // so we update the URL here. See comment on handling UpdateUrlAction. - val tab = context.state.findTab(action.tabId) + val tab = context.store.state.findTab(action.tabId) val url = tab?.content?.url if (url != null && isReaderUrl(tab, url)) { context.store.dispatch(ContentAction.UpdateUrlAction(tab.id, url)) diff --git a/mobile/android/android-components/components/feature/recentlyclosed/src/main/java/mozilla/components/feature/recentlyclosed/RecentlyClosedMiddleware.kt b/mobile/android/android-components/components/feature/recentlyclosed/src/main/java/mozilla/components/feature/recentlyclosed/RecentlyClosedMiddleware.kt @@ -37,24 +37,24 @@ class RecentlyClosedMiddleware( ) { when (action) { is UndoAction.ClearRecoverableTabs -> { - if (action.tag == context.state.undoHistory.tag) { + if (action.tag == context.store.state.undoHistory.tag) { // If the user has removed tabs and not invoked "undo" then let's save all non // private tabs. context.store.dispatch( RecentlyClosedAction.AddClosedTabsAction( - context.state.undoHistory.tabs.filter { tab -> !tab.state.private }, + context.store.state.undoHistory.tabs.filter { tab -> !tab.state.private }, ), ) } } is UndoAction.AddRecoverableTabs -> { - if (context.state.undoHistory.tabs.isNotEmpty()) { + if (context.store.state.undoHistory.tabs.isNotEmpty()) { // If new tabs get added to the undo history and there were some previously // then add them to the list of closed tabs now since they will never go through // the clear call above. context.store.dispatch( RecentlyClosedAction.AddClosedTabsAction( - context.state.undoHistory.tabs.filter { tab -> !tab.state.private }, + context.store.state.undoHistory.tabs.filter { tab -> !tab.state.private }, ), ) } diff --git a/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/middleware/AdsTelemetryMiddleware.kt b/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/middleware/AdsTelemetryMiddleware.kt @@ -34,7 +34,7 @@ class AdsTelemetryMiddleware( ) { when (action) { is ContentAction.UpdateLoadRequestAction -> { - context.state.findTab(action.sessionId)?.let { tab -> + context.store.state.findTab(action.sessionId)?.let { tab -> // Collect all load requests in between location changes if (!redirectChain.containsKey(action.sessionId) && action.loadRequest.url != tab.content.url) { redirectChain[action.sessionId] = RedirectChain(tab.content.url) diff --git a/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/middleware/SearchMiddleware.kt b/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/middleware/SearchMiddleware.kt @@ -105,9 +105,9 @@ class SearchMiddleware( when (action) { is SearchAction.ShowSearchEngineAction, is SearchAction.HideSearchEngineAction, is SearchAction.RestoreHiddenSearchEnginesAction, - -> updateHiddenSearchEngines(context.state.search.hiddenSearchEngines) + -> updateHiddenSearchEngines(context.store.state.search.hiddenSearchEngines) is SearchAction.AddAdditionalSearchEngineAction, is SearchAction.RemoveAdditionalSearchEngineAction -> - updateAdditionalSearchEngines(context.state.search.additionalSearchEngines) + updateAdditionalSearchEngines(context.store.state.search.additionalSearchEngines) is SearchAction.UpdateDisabledSearchEngineIdsAction -> updateDisabledSearchEngineIds( context.store, action, diff --git a/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/middleware/LastAccessMiddleware.kt b/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/middleware/LastAccessMiddleware.kt @@ -29,7 +29,7 @@ class LastAccessMiddleware : Middleware<BrowserState, BrowserAction> { is TabListAction.RemoveTabsAction, // NB: RemoveAllNormalTabsAction and RemoveAllPrivateTabsAction never update tab selection -> { - context.state.selectedTabId + context.store.state.selectedTabId } else -> null } @@ -43,7 +43,7 @@ class LastAccessMiddleware : Middleware<BrowserState, BrowserAction> { -> { // If the selected tab changed during removal we make sure to update // the lastAccess state of the newly selected tab. - val newSelection = context.state.selectedTabId + val newSelection = context.store.state.selectedTabId if (newSelection != null && newSelection != selectionBeforeRemoval) { context.dispatchUpdateActionForId(newSelection) } @@ -62,7 +62,7 @@ class LastAccessMiddleware : Middleware<BrowserState, BrowserAction> { } } is ContentAction.UpdateUrlAction -> { - if (action.sessionId == context.state.selectedTabId) { + if (action.sessionId == context.store.state.selectedTabId) { context.dispatchUpdateActionForId(action.sessionId) } } diff --git a/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/middleware/undo/UndoMiddleware.kt b/mobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/middleware/undo/UndoMiddleware.kt @@ -45,7 +45,7 @@ class UndoMiddleware( next: (BrowserAction) -> Unit, action: BrowserAction, ) { - val state = context.state + val state = context.store.state when (action) { // Remember removed tabs @@ -74,7 +74,7 @@ class UndoMiddleware( } // Restore - is UndoAction.RestoreRecoverableTabs -> restore(context.store, context.state) + is UndoAction.RestoreRecoverableTabs -> restore(context.store, context.store.state) // Do nothing when an action different from above is passed in. else -> { } @@ -93,7 +93,7 @@ class UndoMiddleware( val recoverableTabs = mutableListOf<RecoverableTab>() tabs.forEach { tab -> if (tab is TabSessionState) { - val index = context.state.tabs.indexOfFirst { it.id == tab.id } + val index = context.store.state.tabs.indexOfFirst { it.id == tab.id } recoverableTabs.add(tab.toRecoverableTab(index)) } } diff --git a/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/middleware/LastAccessMiddlewareTest.kt b/mobile/android/android-components/components/feature/session/src/test/java/mozilla/components/feature/session/middleware/LastAccessMiddlewareTest.kt @@ -38,7 +38,6 @@ class LastAccessMiddlewareTest { context = mock() whenever(context.store).thenReturn(store) - whenever(context.state).thenReturn(store.state) } @Test diff --git a/mobile/android/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/Middleware.kt b/mobile/android/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/Middleware.kt @@ -26,10 +26,6 @@ typealias Middleware<S, A> = (context: MiddlewareContext<S, A>, next: (A) -> Uni * access to the underlying store, can safely be used outside of the middleware. */ interface MiddlewareContext<S : State, A : Action> { - /** - * Returns the current state of the [Store]. - */ - val state: S /** * Returns a reference to the [Store] the [Middleware] is running in. diff --git a/mobile/android/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/internal/ReducerChainBuilder.kt b/mobile/android/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/internal/ReducerChainBuilder.kt @@ -35,8 +35,6 @@ internal class ReducerChainBuilder<S : State, A : Action>( private fun build(store: Store<S, A>): (A) -> Unit { val context = object : MiddlewareContext<S, A> { - override val state: S - get() = store.state override val store: Store<S, A> get() = store diff --git a/mobile/android/android-components/components/lib/state/src/test/java/mozilla/components/lib/state/StoreTest.kt b/mobile/android/android-components/components/lib/state/src/test/java/mozilla/components/lib/state/StoreTest.kt @@ -242,10 +242,10 @@ class StoreTest { var countBefore = -1 var countAfter = -1 - val observingMiddleware: Middleware<TestState, TestAction> = { store, next, action -> - countBefore = store.state.counter + val observingMiddleware: Middleware<TestState, TestAction> = { context, next, action -> + countBefore = context.store.state.counter next(action) - countAfter = store.state.counter + countAfter = context.store.state.counter } val store = Store( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksMiddleware.kt @@ -84,10 +84,10 @@ internal class BookmarksMiddleware( next: (BookmarksAction) -> Unit, action: BookmarksAction, ) { - val preReductionState = context.state + val preReductionState = context.store.state next(action) - val dialogState = context.state.bookmarksDeletionDialogState + val dialogState = context.store.state.bookmarksDeletionDialogState if (dialogState is DeletionDialogState.LoadingCount) { scope.launch { val count = bookmarksStorage.countBookmarksInTrees(dialogState.guidsToDelete) @@ -160,7 +160,7 @@ internal class BookmarksMiddleware( // non-list screen cases need to come first, since we presume if all subscreen // state is null then we are on the list screen preReductionState.bookmarksAddFolderState != null && - context.state.bookmarksAddFolderState == null -> { + context.store.state.bookmarksAddFolderState == null -> { scope.launch(ioDispatcher) { val newFolderTitle = preReductionState.bookmarksAddFolderState.folderBeingAddedTitle diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksTelemetryMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksTelemetryMiddleware.kt @@ -21,7 +21,7 @@ internal class BookmarksTelemetryMiddleware : Middleware<BookmarksState, Bookmar next: (BookmarksAction) -> Unit, action: BookmarksAction, ) { - val preReductionState = context.state + val preReductionState = context.store.state next(action) when (action) { BackClicked -> preReductionState.handleBackClick() diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BrowserToolbarSyncToBookmarksMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BrowserToolbarSyncToBookmarksMiddleware.kt @@ -32,7 +32,7 @@ internal class BrowserToolbarSyncToBookmarksMiddleware( toolbarStore.flow() .map { it.isEditMode() } .onEach { isInEditMode -> - if (context.state.isSearching && !isInEditMode) { + if (context.store.state.isSearching && !isInEditMode) { context.store.dispatch(SearchDismissed) } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/desktopmode/DesktopModeMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/desktopmode/DesktopModeMiddleware.kt @@ -48,7 +48,7 @@ class DesktopModeMiddleware( DefaultDesktopModeAction.ToggleDesktopMode -> { scope.launch { - val updatedDesktopMode = context.state.desktopMode + val updatedDesktopMode = context.store.state.desktopMode val preferenceWriteSucceeded = repository.setDesktopBrowsingEnabled(updatedDesktopMode) if (!preferenceWriteSucceeded) { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/AboutHomeMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/AboutHomeMiddleware.kt @@ -27,7 +27,7 @@ class AboutHomeMiddleware( action: BrowserAction, ) { if (action is ContentAction.UpdateTitleAction && - context.state.findTab(tabId = action.sessionId)?.content?.url == ABOUT_HOME_URL + context.store.state.findTab(tabId = action.sessionId)?.content?.url == ABOUT_HOME_URL ) { // Override the title of the homepage tab with the provided [homepageTitle] that will // appear in the [ContentState]. diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/StartupMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/StartupMiddleware.kt @@ -31,7 +31,7 @@ class StartupMiddleware( action: BrowserAction, ) { if (action is RestoreCompleteAction && - context.state.tabs.isEmpty() && + context.store.state.tabs.isEmpty() && repository.getHomepageAsANewTabEnabled() ) { // After previous sessions are restored, add a new homepage tab if diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuDialogMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuDialogMiddleware.kt @@ -104,7 +104,7 @@ class MenuDialogMiddleware( next: (MenuAction) -> Unit, action: MenuAction, ) { - val currentState = context.state + val currentState = context.store.state when (action) { is MenuAction.InitAction -> initialize(context.store) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuNavigationMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuNavigationMiddleware.kt @@ -86,7 +86,7 @@ class MenuNavigationMiddleware( // This is to ensure that any navigation action will be using correct // state properties before they are modified due to other actions being // dispatched and processes. - val currentState = context.state + val currentState = context.store.state next(action) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuTelemetryMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/menu/middleware/MenuTelemetryMiddleware.kt @@ -34,7 +34,7 @@ class MenuTelemetryMiddleware( next: (MenuAction) -> Unit, action: MenuAction, ) { - val currentState = context.state + val currentState = context.store.state next(action) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/cfrs/CfrToolsPreferencesMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/cfrs/CfrToolsPreferencesMiddleware.kt @@ -44,7 +44,7 @@ class CfrToolsPreferencesMiddleware( cfrPreferencesRepository.updateCfrPreference( CfrPreferencesRepository.CfrPreferenceUpdate( preferenceType = CfrPreferencesRepository.CfrPreference.HomepageSearchBar, - value = context.state.homepageSearchBarShown, + value = context.store.state.homepageSearchBarShown, ), ) } @@ -52,7 +52,7 @@ class CfrToolsPreferencesMiddleware( cfrPreferencesRepository.updateCfrPreference( CfrPreferencesRepository.CfrPreferenceUpdate( preferenceType = CfrPreferencesRepository.CfrPreference.TabAutoCloseBanner, - value = context.state.tabAutoCloseBannerShown, + value = context.store.state.tabAutoCloseBannerShown, ), ) } @@ -60,7 +60,7 @@ class CfrToolsPreferencesMiddleware( cfrPreferencesRepository.updateCfrPreference( CfrPreferencesRepository.CfrPreferenceUpdate( preferenceType = CfrPreferencesRepository.CfrPreference.InactiveTabs, - value = context.state.inactiveTabsShown, + value = context.store.state.inactiveTabsShown, ), ) } @@ -68,7 +68,7 @@ class CfrToolsPreferencesMiddleware( cfrPreferencesRepository.updateCfrPreference( CfrPreferencesRepository.CfrPreferenceUpdate( preferenceType = CfrPreferencesRepository.CfrPreference.OpenInApp, - value = context.state.openInAppShown, + value = context.store.state.openInAppShown, ), ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/gleandebugtools/GleanDebugToolsMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/debugsettings/gleandebugtools/GleanDebugToolsMiddleware.kt @@ -33,18 +33,18 @@ class GleanDebugToolsMiddleware( next(action) when (action) { is GleanDebugToolsAction.LogPingsToConsoleToggled -> { - gleanDebugToolsStorage.setLogPings(context.state.logPingsToConsoleEnabled) + gleanDebugToolsStorage.setLogPings(context.store.state.logPingsToConsoleEnabled) } is GleanDebugToolsAction.OpenDebugView -> { val debugViewLink = getDebugViewLink( - debugViewTag = context.state.debugViewTag, + debugViewTag = context.store.state.debugViewTag, useDebugViewTag = action.useDebugViewTag, ) openDebugView(debugViewLink) } is GleanDebugToolsAction.CopyDebugViewLink -> { val debugViewLink = getDebugViewLink( - debugViewTag = context.state.debugViewTag, + debugViewTag = context.store.state.debugViewTag, useDebugViewTag = action.useDebugViewTag, ) clipboardHandler.text = debugViewLink @@ -52,10 +52,10 @@ class GleanDebugToolsMiddleware( is GleanDebugToolsAction.DebugViewTagChanged -> {} // No-op is GleanDebugToolsAction.SendPing -> { gleanDebugToolsStorage.sendPing( - pingType = context.state.pingType, - debugViewTag = context.state.debugViewTag, + pingType = context.store.state.pingType, + debugViewTag = context.store.state.debugViewTag, ) - showToast(context.state.pingType) + showToast(context.store.state.pingType) } is GleanDebugToolsAction.ChangePingType -> {} // No-op } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/historymetadata/HistoryMetadataMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/historymetadata/HistoryMetadataMiddleware.kt @@ -47,7 +47,7 @@ class HistoryMetadataMiddleware( if (action.select) { // Before we add and select a new tab we update the metadata // of the currently selected tab, if not private. - context.state.selectedNormalTab?.let { + context.store.state.selectedNormalTab?.let { updateHistoryMetadata(it) } } @@ -55,27 +55,27 @@ class HistoryMetadataMiddleware( is TabListAction.SelectTabAction -> { // Before we select a new tab we update the metadata // of the currently selected tab, if not private. - context.state.selectedNormalTab?.let { + context.store.state.selectedNormalTab?.let { updateHistoryMetadata(it) } } is TabListAction.RemoveTabAction -> { - if (action.tabId == context.state.selectedTabId) { - context.state.findNormalTab(action.tabId)?.let { + if (action.tabId == context.store.state.selectedTabId) { + context.store.state.findNormalTab(action.tabId)?.let { updateHistoryMetadata(it) } } } is TabListAction.RemoveTabsAction -> { - action.tabIds.find { it == context.state.selectedTabId }?.let { - context.state.findNormalTab(it)?.let { tab -> + action.tabIds.find { it == context.store.state.selectedTabId }?.let { + context.store.state.findNormalTab(it)?.let { tab -> updateHistoryMetadata(tab) } } } is ContentAction.UpdateUrlAction -> { - context.state.findNormalTab(action.sessionId)?.let { tab -> - val selectedTab = tab.id == context.state.selectedTabId + context.store.state.findNormalTab(action.sessionId)?.let { tab -> + val selectedTab = tab.id == context.store.state.selectedTabId // When page url changes (e.g. user navigated away by clicking on a link) // we update metadata for the selected (i.e. previous) url of this tab. // We don't update metadata for cases or reload or restore. @@ -116,7 +116,7 @@ class HistoryMetadataMiddleware( } // NB: sometimes this fires multiple times after the page finished loading. is ContentAction.UpdateHistoryStateAction -> { - context.state.findNormalTab(action.sessionId)?.let { tab -> + context.store.state.findNormalTab(action.sessionId)?.let { tab -> createHistoryMetadataIfNeeded(context, tab) } @@ -125,7 +125,7 @@ class HistoryMetadataMiddleware( } // NB: this could be called bunch of times in quick succession. is MediaSessionAction.UpdateMediaMetadataAction -> { - context.state.findNormalTab(action.tabId)?.let { tab -> + context.store.state.findNormalTab(action.tabId)?.let { tab -> createHistoryMetadata(context, tab) } } @@ -176,7 +176,7 @@ class HistoryMetadataMiddleware( val (searchTerm, referrerUrl) = when { // Page was opened in a new tab. Look for search terms in the parent tab. tabParent != null && !tabMetadataHasSearchTerms -> { - val searchTerms = findSearchTerms(tabParent, context.state.search) + val searchTerms = findSearchTerms(tabParent, context.store.state.search) searchTerms to tabParent.content.url } // Page was navigated to via content i.e., the user followed a link. Look for search terms in tab history. @@ -187,11 +187,11 @@ class HistoryMetadataMiddleware( tab.historyMetadata?.searchTerm to previousUrl } else { // Find search terms by checking if page is a SERP or a result opened from a SERP - val searchTerms = findSearchTerms(tab, context.state.search) + val searchTerms = findSearchTerms(tab, context.store.state.search) if (searchTerms != null) { searchTerms to null } else { - context.state.search.parseSearchTerms(previousUrl) to previousUrl + context.store.state.search.parseSearchTerms(previousUrl) to previousUrl } } @@ -210,7 +210,7 @@ class HistoryMetadataMiddleware( } // In all other cases (e.g. direct load) find search terms by checking if page is a SERP else -> { - findSearchTerms(tab, context.state.search) to null + findSearchTerms(tab, context.store.state.search) to null } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/PocketMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/PocketMiddleware.kt @@ -128,7 +128,10 @@ class PocketMiddleware( -> { persistSelectedCategories( coroutineScope = coroutineScope, - currentCategoriesSelections = context.state.recommendationState.pocketStoriesCategoriesSelections, + currentCategoriesSelections = context.store + .state + .recommendationState + .pocketStoriesCategoriesSelections, selectedPocketCategoriesDataStore = selectedPocketCategoriesDataStore, ) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/blocklist/BlocklistMiddleware.kt @@ -30,7 +30,7 @@ class BlocklistMiddleware( next: (AppAction) -> Unit, action: AppAction, ) { - next(getUpdatedAction(context.state, action)) + next(getUpdatedAction(context.store.state, action)) } private fun getUpdatedAction( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/toolbar/BrowserToolbarMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/toolbar/BrowserToolbarMiddleware.kt @@ -140,7 +140,7 @@ class BrowserToolbarMiddleware( is Init -> { next(action) - if (context.state.mode == Mode.DISPLAY) { + if (context.store.state.mode == Mode.DISPLAY) { observeSearchStateUpdates(context) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/state/HistoryTelemetryMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/library/history/state/HistoryTelemetryMiddleware.kt @@ -27,7 +27,7 @@ class HistoryTelemetryMiddleware( next: (HistoryFragmentAction) -> Unit, action: HistoryFragmentAction, ) { - val currentState = context.state + val currentState = context.store.state next(action) when (action) { is HistoryFragmentAction.HistoryItemClicked -> { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/state/MessagingMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/messaging/state/MessagingMiddleware.kt @@ -47,7 +47,7 @@ class MessagingMiddleware( is Evaluate -> { val message = controller.getNextMessage( action.surface, - context.state.messaging.messages, + context.store.state.messaging.messages, ) if (message != null) { context.store.dispatch(UpdateMessageToShow(message)) @@ -187,7 +187,7 @@ class MessagingMiddleware( context: AppStoreMiddlewareContext, message: Message, ) { - val current = context.state.messaging.messageToShow[message.surface] + val current = context.store.state.messaging.messageToShow[message.surface] if (current?.id == message.id) { context.store.dispatch(ConsumeMessageToShow(message.surface)) } @@ -197,7 +197,7 @@ class MessagingMiddleware( context: AppStoreMiddlewareContext, message: Message, ): List<Message> { - return context.state.messaging.messages.filter { it.id != message.id } + return context.store.state.messaging.messages.filter { it.id != message.id } } private fun updateMessage( @@ -205,21 +205,21 @@ class MessagingMiddleware( oldMessage: Message, updatedMessage: Message, ): List<Message> { - val actualMessageToShow = context.state.messaging.messageToShow[updatedMessage.surface] + val actualMessageToShow = context.store.state.messaging.messageToShow[updatedMessage.surface] if (actualMessageToShow?.id == oldMessage.id) { context.store.dispatch(UpdateMessageToShow(updatedMessage)) } - val oldMessageIndex = context.state.messaging.messages.indexOfFirst { it.id == updatedMessage.id } + val oldMessageIndex = context.store.state.messaging.messages.indexOfFirst { it.id == updatedMessage.id } return if (oldMessageIndex != -1) { - val newList = context.state.messaging.messages.toMutableList() + val newList = context.store.state.messaging.messages.toMutableList() newList[oldMessageIndex] = updatedMessage newList } else { // No need to update the message, it was removed. This is due to a race condition, see: // https://bugzilla.mozilla.org/show_bug.cgi?id=1897485 - context.state.messaging.messages + context.store.state.messaging.messages } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptMiddleware.kt @@ -96,7 +96,7 @@ class ReviewPromptMiddleware( @Suppress("CognitiveComplexMethod") private fun handleReviewPromptCheck(context: MiddlewareContext<AppState, AppAction>) { - if (context.state.reviewPrompt != ReviewPromptState.Unknown) { + if (context.store.state.reviewPrompt != ReviewPromptState.Unknown) { // We only want to try to show it once to avoid unnecessary disk reads. return } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserToolbarSearchMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserToolbarSearchMiddleware.kt @@ -175,7 +175,7 @@ class BrowserToolbarSearchMiddleware( when (action) { is Init -> { - if (context.state.isEditMode()) { + if (context.store.state.isEditMode()) { syncCurrentSearchEngine(context) } } @@ -346,7 +346,7 @@ class BrowserToolbarSearchMiddleware( searchEngine: SearchEngine?, ) { updateSearchSelectorMenu(context, searchEngine, browserStore.state.search.searchEngineShortcuts) - updateAutocompletions(context, context.state.editState.query) + updateAutocompletions(context, context.store.state.editState.query) updateToolbarHint(context, searchEngine) } @@ -428,7 +428,7 @@ class BrowserToolbarSearchMiddleware( withContext(autocompleteDispatcher) { fetchAutocomplete( buildAutocompleteProvidersList(reconcileSelectedEngine()), - context.state.editState.query.current, + context.store.state.editState.query.current, )?.also { components.core.engine.speculativeConnect(it.url) } @@ -486,7 +486,7 @@ class BrowserToolbarSearchMiddleware( ) = context.store.dispatch( SearchActionsEndUpdated( buildSearchEndPageActions( - context.state.editState.query.current, + context.store.state.editState.query.current, selectedSearchEngine, ), ), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserToolbarToFenixSearchMapperMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserToolbarToFenixSearchMapperMiddleware.kt @@ -87,7 +87,7 @@ class BrowserToolbarToFenixSearchMapperMiddleware( .map { it.editState.query } .distinctUntilChanged() .collect { query -> - val isSearchStartedForCurrentUrl = context.state.searchStartedForCurrentUrl + val isSearchStartedForCurrentUrl = context.store.state.searchStartedForCurrentUrl val isQueryPrefilled = toolbarStore.state.editState.isQueryPrefilled context.store.dispatch( SearchFragmentAction.UpdateQuery( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/FenixSearchMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/FenixSearchMiddleware.kt @@ -143,14 +143,14 @@ class FenixSearchMiddleware( next(action) updateSearchProviders(context) - maybeShowSearchSuggestions(context, context.state.query) + maybeShowSearchSuggestions(context, context.store.state.query) } is SearchProvidersUpdated -> { next(action) if (action.providers.isNotEmpty()) { - maybeShowSearchSuggestions(context, context.state.query) + maybeShowSearchSuggestions(context, context.store.state.query) } } @@ -220,7 +220,7 @@ class FenixSearchMiddleware( true -> handleSearchShortcutEngineSelectedByUser(context, it) false -> handleSearchShortcutEngineSelected(context, it) } - } ?: context.state.defaultEngine?.let { handleSearchShortcutEngineSelected(context, it) } + } ?: context.store.state.defaultEngine?.let { handleSearchShortcutEngineSelected(context, it) } } /** @@ -230,18 +230,18 @@ class FenixSearchMiddleware( context: MiddlewareContext<SearchFragmentState, SearchFragmentAction>, query: String, ) { - val shouldShowTrendingSearches = context.state.run { + val shouldShowTrendingSearches = context.store.state.run { (showTrendingSearches || showRecentSearches) && (searchStartedForCurrentUrl || FxNimbus.features.searchSuggestionsOnHomepage.value().enabled) } - val shouldShowSearchSuggestions = with(context.state) { + val shouldShowSearchSuggestions = with(context.store.state) { ((url != query && query.isNotBlank()) || showSearchShortcuts) } val shouldShowSuggestions = shouldShowTrendingSearches || shouldShowSearchSuggestions context.store.dispatch(SearchSuggestionsVisibilityUpdated(shouldShowSuggestions)) - val showPrivatePrompt = with(context.state) { + val showPrivatePrompt = with(context.store.state) { !settings.showSearchSuggestionsInPrivateOnboardingFinished && browsingModeManager.mode.isPrivate && !isSearchSuggestionsFeatureEnabled() && !showSearchShortcuts && url != query @@ -262,10 +262,10 @@ class FenixSearchMiddleware( context.store.dispatch( SearchProvidersUpdated( buildList { - if (context.state.showSearchShortcuts) { + if (context.store.state.showSearchShortcuts) { add(suggestionsProvidersBuilder.shortcutsEnginePickerProvider) } - addAll((suggestionsProvidersBuilder.getProvidersToAdd(context.state.toSearchProviderState()))) + addAll((suggestionsProvidersBuilder.getProvidersToAdd(context.store.state.toSearchProviderState()))) }, ), ) @@ -280,7 +280,7 @@ class FenixSearchMiddleware( return SearchSuggestionsProvidersBuilder( components = uiContext.components, browsingModeManager = browsingModeManager, - includeSelectedTab = context.state.tabId == null, + includeSelectedTab = context.store.state.tabId == null, loadUrlUseCase = loadUrlUseCase(context), searchUseCase = searchUseCase(context), selectTabUseCase = selectTabUseCase(), @@ -310,7 +310,7 @@ class FenixSearchMiddleware( createNewTab = if (settings.enableHomepageAsNewTab) { false } else { - context.state.tabId == null + context.store.state.tabId == null }, usePrivateMode = browsingModeManager.mode.isPrivate, flags = flags, @@ -331,29 +331,29 @@ class FenixSearchMiddleware( searchEngine: SearchEngine?, parentSessionId: String?, ) { - val searchEngine = context.state.searchEngineSource.searchEngine + val searchEngine = context.store.state.searchEngineSource.searchEngine openToBrowserAndLoad( url = searchTerms, createNewTab = if (settings.enableHomepageAsNewTab) { false } else { - context.state.tabId == null + context.store.state.tabId == null }, usePrivateMode = browsingModeManager.mode.isPrivate, forceSearch = true, searchEngine = searchEngine, ) - val searchAccessPoint = when (context.state.searchAccessPoint) { + val searchAccessPoint = when (context.store.state.searchAccessPoint) { MetricsUtils.Source.NONE -> MetricsUtils.Source.SUGGESTION - else -> context.state.searchAccessPoint + else -> context.store.state.searchAccessPoint } if (searchEngine != null) { MetricsUtils.recordSearchMetrics( searchEngine, - searchEngine == context.state.defaultEngine, + searchEngine == context.store.state.defaultEngine, searchAccessPoint, nimbusComponents.events, ) @@ -439,7 +439,7 @@ class FenixSearchMiddleware( searchEngine.type == SearchEngine.Type.APPLICATION && searchEngine.id == TABS_SEARCH_ENGINE_ID -> { context.store.dispatch(SearchFragmentAction.SearchTabsEngineSelected(searchEngine)) } - searchEngine == context.state.defaultEngine -> { + searchEngine == context.store.state.defaultEngine -> { context.store.dispatch( SearchFragmentAction.SearchDefaultEngineSelected( engine = searchEngine, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/store/AddressMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/store/AddressMiddleware.kt @@ -36,16 +36,16 @@ class AddressMiddleware( next(action) when (action) { is SaveTapped -> runAndNavigateBack { - context.state.guidToUpdate?.let { - environment.updateAddress(it, context.state.address) + context.store.state.guidToUpdate?.let { + environment.updateAddress(it, context.store.state.address) Addresses.updated.add() } ?: run { - environment.createAddress(context.state.address) + environment.createAddress(context.store.state.address) Addresses.saved.add() } } is DeleteDialogAction.DeleteTapped -> runAndNavigateBack { - context.state.guidToUpdate?.also { + context.store.state.guidToUpdate?.also { environment.deleteAddress(it) Addresses.deleted.add() } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/store/AddressStructureMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/address/store/AddressStructureMiddleware.kt @@ -52,7 +52,7 @@ class AddressStructureMiddleware( next: (AddressAction) -> Unit, action: AddressAction, ) { - val preReductionCountry = context.state.address.country + val preReductionCountry = context.store.state.address.country next(action) when (action) { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/creditcards/ui/CreditCardEditorMiddleware.kt @@ -66,7 +66,7 @@ internal class CreditCardEditorMiddleware( when (this) { DeleteDialogAction.Confirm -> { coroutineScope.launch(ioDispatcher) { - storage.deleteCreditCard(context.state.guid) + storage.deleteCreditCard(context.store.state.guid) withContext(mainDispatcher) { navigateBack() @@ -86,7 +86,7 @@ internal class CreditCardEditorMiddleware( private fun handleSaveAction( context: MiddlewareContext<CreditCardEditorState, CreditCardEditorAction>, ) { - val state = context.state + val state = context.store.state if (!state.showCardNumberError && !state.showNameOnCardError) { addOrUpdateCard(state) @@ -160,7 +160,7 @@ internal class CreditCardEditorMiddleware( private fun initializeFromScratch( context: MiddlewareContext<CreditCardEditorState, CreditCardEditorAction>, ) { - val state = context.state + val state = context.store.state context.store.dispatch( CreditCardEditorAction.Initialization.InitCompleted( state = state.copy( @@ -180,7 +180,7 @@ internal class CreditCardEditorMiddleware( creditCard: CreditCard, ) { coroutineScope.launch(ioDispatcher) { - val state = context.state + val state = context.store.state val crypto = storage.getCreditCardCrypto() val plainTextCardNumber = crypto.decrypt( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/LoginsMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/logins/ui/LoginsMiddleware.kt @@ -52,7 +52,7 @@ internal class LoginsMiddleware( next: (LoginsAction) -> Unit, action: LoginsAction, ) { - val preReductionState = context.state + val preReductionState = context.store.state next(action) when (action) { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/trustpanel/middleware/TrustPanelMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/trustpanel/middleware/TrustPanelMiddleware.kt @@ -64,7 +64,7 @@ class TrustPanelMiddleware( next: (TrustPanelAction) -> Unit, action: TrustPanelAction, ) { - val currentState = context.state + val currentState = context.store.state val store = context.store when (action) { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/trustpanel/middleware/TrustPanelTelemetryMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/trustpanel/middleware/TrustPanelTelemetryMiddleware.kt @@ -23,7 +23,7 @@ class TrustPanelTelemetryMiddleware : Middleware<TrustPanelState, TrustPanelActi next: (TrustPanelAction) -> Unit, action: TrustPanelAction, ) { - val currentState = context.state + val currentState = context.store.state next(action) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt @@ -50,13 +50,13 @@ class SaveToPDFMiddleware( ) { when (action) { is EngineAction.SaveToPdfAction -> { - postTelemetryTapped(ctx.state.findTab(action.tabId), isPrint = false) + postTelemetryTapped(ctx.store.state.findTab(action.tabId), isPrint = false) // Continue to generate the PDF, passing through here to add telemetry next(action) } is EngineAction.SaveToPdfCompleteAction -> { - postTelemetryCompleted(ctx.state.findTab(action.tabId), isPrint = false) + postTelemetryCompleted(ctx.store.state.findTab(action.tabId), isPrint = false) } is EngineAction.SaveToPdfExceptionAction -> { @@ -67,16 +67,16 @@ class SaveToPDFMiddleware( ), ), ) - postTelemetryFailed(ctx.state.findTab(action.tabId), action.throwable, isPrint = false) + postTelemetryFailed(ctx.store.state.findTab(action.tabId), action.throwable, isPrint = false) } is EngineAction.PrintContentAction -> { - postTelemetryTapped(ctx.state.findTab(action.tabId), isPrint = true) + postTelemetryTapped(ctx.store.state.findTab(action.tabId), isPrint = true) // Continue to print, passing through here to add telemetry next(action) } is EngineAction.PrintContentCompletedAction -> { - postTelemetryCompleted(ctx.state.findTab(action.tabId), isPrint = true) + postTelemetryCompleted(ctx.store.state.findTab(action.tabId), isPrint = true) } is EngineAction.PrintContentExceptionAction -> { context.components.appStore.dispatch( @@ -86,7 +86,7 @@ class SaveToPDFMiddleware( ), ), ) - postTelemetryFailed(ctx.state.findTab(action.tabId), action.throwable, isPrint = true) + postTelemetryFailed(ctx.store.state.findTab(action.tabId), action.throwable, isPrint = true) } else -> { next(action) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/telemetry/TelemetryMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/telemetry/TelemetryMiddleware.kt @@ -64,7 +64,7 @@ class TelemetryMiddleware( when (action) { is ContentAction.UpdateLoadingStateAction -> { - context.state.findTab(action.sessionId)?.let { tab -> + context.store.state.findTab(action.sessionId)?.let { tab -> val hasFinishedLoading = tab.content.loading && !action.loading // Record UriOpened event when a non-private page finishes loading @@ -75,12 +75,12 @@ class TelemetryMiddleware( } is DownloadAction.AddDownloadAction -> { /* NOOP */ } is EngineAction.KillEngineSessionAction -> { - val tab = context.state.findTabOrCustomTab(action.tabId) - onEngineSessionKilled(context.state, tab) + val tab = context.store.state.findTabOrCustomTab(action.tabId) + onEngineSessionKilled(context.store.state, tab) } is EngineAction.CreateEngineSessionAction -> { - val tab = context.state.findTabOrCustomTab(action.tabId) - onEngineSessionCreated(context.state, tab) + val tab = context.store.state.findTabOrCustomTab(action.tabId) + onEngineSessionCreated(context.store.state, tab) } is ContentAction.CheckForFormDataExceptionAction -> { Events.formDataFailure.record(NoExtras()) @@ -109,9 +109,9 @@ class TelemetryMiddleware( is TabListAction.RestoreAction, -> { // Update/Persist tabs count whenever it changes - settings.openTabsCount = context.state.normalTabs.count() - settings.openPrivateTabsCount = context.state.privateTabs.count() - if (context.state.normalTabs.isNotEmpty()) { + settings.openTabsCount = context.store.state.normalTabs.count() + settings.openPrivateTabsCount = context.store.state.privateTabs.count() + if (context.store.state.normalTabs.isNotEmpty()) { Metrics.hasOpenTabs.set(true) } else { Metrics.hasOpenTabs.set(false) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/translations/TranslationsDialogMiddleware.kt @@ -74,8 +74,8 @@ class TranslationsDialogMiddleware( } is TranslationsDialogAction.TranslateAction -> { - context.state.initialFrom?.code?.let { fromLanguage -> - context.state.initialTo?.code?.let { toLanguage -> + context.store.state.initialFrom?.code?.let { fromLanguage -> + context.store.state.initialTo?.code?.let { toLanguage -> TranslationsAction.TranslateAction( tabId = sessionId, fromLanguage = fromLanguage, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/webcompat/middleware/WebCompatReporterSubmissionMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/webcompat/middleware/WebCompatReporterSubmissionMiddleware.kt @@ -80,11 +80,11 @@ class WebCompatReporterSubmissionMiddleware( val webCompatInfo = webCompatReporterRetrievalService.retrieveInfo() webCompatInfo?.let { - val enteredUrlMatchesTabUrl = context.state.enteredUrl == webCompatInfo.url + val enteredUrlMatchesTabUrl = context.store.state.enteredUrl == webCompatInfo.url if (enteredUrlMatchesTabUrl) { setTabAntiTrackingMetrics( antiTracking = webCompatInfo.antitracking, - sendBlockedUrls = context.state.includeEtpBlockedUrls, + sendBlockedUrls = context.store.state.includeEtpBlockedUrls, ) setTabFrameworksMetrics(frameworks = webCompatInfo.frameworks) setTabLanguageMetrics(languages = webCompatInfo.languages) @@ -94,9 +94,9 @@ class WebCompatReporterSubmissionMiddleware( setBrowserInfoMetrics(browserInfo = webCompatInfo.browser) setDevicePixelRatioMetrics(devicePixelRatio = webCompatInfo.devicePixelRatio) } - setUrlMetrics(url = context.state.enteredUrl) - setReasonMetrics(reason = context.state.reason) - setDescriptionMetrics(description = context.state.problemDescription) + setUrlMetrics(url = context.store.state.enteredUrl) + setReasonMetrics(reason = context.store.state.reason) + setDescriptionMetrics(description = context.store.state.problemDescription) setExperimentMetrics() Pings.brokenSiteReport.submit() @@ -109,7 +109,7 @@ class WebCompatReporterSubmissionMiddleware( ) { val webCompatInfo = webCompatReporterRetrievalService.retrieveInfo() - val webCompatJSON = generatePreviewJSON(context.state, webCompatInfo) + val webCompatJSON = generatePreviewJSON(context.store.state, webCompatInfo) context.store.dispatch(WebCompatReporterAction.PreviewJSONUpdated(webCompatJSON.toString())) } @@ -155,10 +155,10 @@ class WebCompatReporterSubmissionMiddleware( context: MiddlewareContext<WebCompatReporterState, WebCompatReporterAction>, ) { webCompatReporterMoreInfoSender.sendMoreWebCompatInfo( - reason = context.state.reason, - problemDescription = context.state.problemDescription, - enteredUrl = context.state.enteredUrl, - tabUrl = context.state.tabUrl, + reason = context.store.state.reason, + problemDescription = context.store.state.problemDescription, + enteredUrl = context.store.state.enteredUrl, + tabUrl = context.store.state.tabUrl, engineSession = browserStore.state.selectedTab?.engineState?.engineSession, ) diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/webcompat/middleware/WebCompatReporterTelemetryMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/webcompat/middleware/WebCompatReporterTelemetryMiddleware.kt @@ -37,7 +37,7 @@ class WebCompatReporterTelemetryMiddleware : WebCompatReporterAction.SendReportClicked -> { Webcompatreporting.send.record( - Webcompatreporting.SendExtra(sentWithBlockedTrackers = context.state.includeEtpBlockedUrls), + Webcompatreporting.SendExtra(sentWithBlockedTrackers = context.store.state.includeEtpBlockedUrls), ) } diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/PocketMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/home/PocketMiddlewareTest.kt @@ -364,7 +364,7 @@ class PocketMiddlewareTest { this, ) - pocketMiddleware.invoke(mockk(), {}, AppAction.AppLifecycleAction.StartAction) + pocketMiddleware.invoke(mockk(relaxed = true), {}, AppAction.AppLifecycleAction.StartAction) verify { pocketService.startPeriodicContentRecommendationsRefresh() diff --git a/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/FenixSearchMiddlewareTest.kt b/mobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/FenixSearchMiddlewareTest.kt @@ -560,8 +560,6 @@ class FenixSearchMiddlewareTest { private fun buildContext( store: SearchFragmentStore, ) = object : MiddlewareContext<SearchFragmentState, SearchFragmentAction> { - override val state: SearchFragmentState - get() = store.state override val store: Store<SearchFragmentState, SearchFragmentAction> = store } diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/cfr/CfrMiddleware.kt b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/cfr/CfrMiddleware.kt @@ -46,7 +46,7 @@ class CfrMiddleware( if (onboardingProvider().value().isCfrEnabled) { showCookieBannerCfr(action) - showTrackingProtectionCfr(action, context.state) + showTrackingProtectionCfr(action, context.store.state) } } diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/engine/SanityCheckMiddleware.kt b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/engine/SanityCheckMiddleware.kt @@ -24,7 +24,7 @@ class SanityCheckMiddleware : Middleware<BrowserState, BrowserAction> { next(action) if (action is TabListAction || action is InitAction) { - verifyNoNonPrivateTabs(context.state) + verifyNoNonPrivateTabs(context.store.state) } } diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/telemetry/TelemetryMiddleware.kt b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/telemetry/TelemetryMiddleware.kt @@ -42,12 +42,12 @@ class TelemetryMiddleware : Middleware<BrowserState, BrowserAction> { is CustomTabListAction.TurnCustomTabIntoNormalTabAction -> { TabCount.newTabOpened.record( - TabCount.NewTabOpenedExtra(context.state.tabs.size, "custom tab"), + TabCount.NewTabOpenedExtra(context.store.state.tabs.size, "custom tab"), ) } is ContentAction.UpdateLoadingStateAction -> { - context.state.findTab(action.sessionId)?.let { tab -> + context.store.state.findTab(action.sessionId)?.let { tab -> // Record UriOpened event when a page finishes loading if (tab.content.loading || action.loading) { // tab is still loading @@ -74,7 +74,7 @@ class TelemetryMiddleware : Middleware<BrowserState, BrowserAction> { tab: SessionState, context: MiddlewareContext<BrowserState, BrowserAction>, ) { - val tabCount = context.state.tabs.size + val tabCount = context.store.state.tabs.size when (tab.source) { is SessionState.Source.External.ActionView -> { @@ -92,7 +92,7 @@ class TelemetryMiddleware : Middleware<BrowserState, BrowserAction> { AppOpened.fromLauncherSiteShortcut.record(NoExtras()) } SessionState.Source.Internal.NewTab -> { - val parentTab = (tab as TabSessionState).parentId?.let { context.state.findTab(it) } + val parentTab = (tab as TabSessionState).parentId?.let { context.store.state.findTab(it) } if (parentTab?.content?.windowRequest?.type == WindowRequest.Type.OPEN) { TabCount.newTabOpened.record( TabCount.NewTabOpenedExtra(tabCount, "Window.open()"),