tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit dfc730849184c1931a9c289f1f4937db71a537cc
parent 4a7b2a969e9126b1ed195414e6eb2ded175f61b4
Author: pollymce <pmceldowney@mozilla.com>
Date:   Thu, 11 Dec 2025 11:25:57 +0000

Bug 1989622 - remove middlewarecontext.dispatch() r=android-reviewers,matt-tighe

Differential Revision: https://phabricator.services.mozilla.com/D275199

Diffstat:
Mmobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CrashMiddleware.kt | 2+-
Mmobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CreateEngineSessionMiddleware.kt | 2+-
Mmobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/LinkingMiddleware.kt | 4++--
Mmobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/SuspendMiddleware.kt | 2+-
Mmobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TabsRemovedMiddleware.kt | 2+-
Mmobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/TrimMemoryMiddleware.kt | 2+-
Mmobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/WebExtensionMiddleware.kt | 4++--
Mmobile/android/android-components/components/feature/media/src/main/java/mozilla/components/feature/media/middleware/LastMediaAccessMiddleware.kt | 4++--
Mmobile/android/android-components/components/feature/readerview/src/main/java/mozilla/components/feature/readerview/ReaderViewMiddleware.kt | 22+++++++++++-----------
Mmobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/middleware/LastAccessMiddleware.kt | 2+-
Mmobile/android/android-components/components/feature/session/src/main/java/mozilla/components/feature/session/middleware/undo/UndoMiddleware.kt | 2+-
Mmobile/android/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/Middleware.kt | 15---------------
Mmobile/android/android-components/components/lib/state/src/main/java/mozilla/components/lib/state/internal/ReducerChainBuilder.kt | 4----
Mmobile/android/android-components/components/lib/state/src/test/java/mozilla/components/lib/state/StoreTest.kt | 12++++++------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt | 20++++++++++----------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/CustomTabBrowserToolbarMiddleware.kt | 12++++++------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/downloads/listscreen/middleware/DownloadDeleteMiddleware.kt | 2+-
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/historymetadata/HistoryMetadataMiddleware.kt | 2+-
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/toolbar/BrowserToolbarMiddleware.kt | 10+++++-----
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/iconpicker/AppIconMiddleware.kt | 4++--
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/reviewprompt/ReviewPromptMiddleware.kt | 6+++---
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserStoreToFenixSearchMapperMiddleware.kt | 2+-
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserToolbarSearchMiddleware.kt | 18+++++++++---------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserToolbarSearchStatusSyncMiddleware.kt | 4++--
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserToolbarToFenixSearchMapperMiddleware.kt | 4++--
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/FenixSearchMiddleware.kt | 20++++++++++----------
Mmobile/android/fenix/app/src/test/java/org/mozilla/fenix/search/FenixSearchMiddlewareTest.kt | 4----
Mmobile/android/focus-android/app/src/main/java/org/mozilla/focus/locale/screen/LanguageMiddleware.kt | 2+-
Mmobile/android/focus-android/app/src/main/java/org/mozilla/focus/settings/permissions/permissionoptions/SitePermissionOptionsStorageMiddleware.kt | 2+-
Mmobile/android/focus-android/app/src/test/java/org/mozilla/focus/locale/screen/LanguageMiddlewareTest.kt | 6++++--
30 files changed, 88 insertions(+), 109 deletions(-)

diff --git a/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CrashMiddleware.kt b/mobile/android/android-components/components/browser/state/src/main/java/mozilla/components/browser/state/engine/middleware/CrashMiddleware.kt @@ -40,7 +40,7 @@ internal class CrashMiddleware : Middleware<BrowserState, BrowserAction> { // We suspend the crashed session here. After that the reducer will mark it as "crashed". // That will prevent it from getting recreated until explicitly handling the crash by // restoring. - context.dispatch( + context.store.dispatch( EngineAction.SuspendEngineSessionAction(action.tabId), ) } 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 @@ -37,7 +37,7 @@ internal class CreateEngineSessionMiddleware( if (action is EngineAction.CreateEngineSessionAction) { val engineState = context.state.findTabOrCustomTab(action.tabId)?.engineState if (engineState?.initializing == false && engineState.engineSession == null && !engineState.crashed) { - context.dispatch(EngineAction.UpdateEngineSessionInitializingAction(action.tabId, true)) + context.store.dispatch(EngineAction.UpdateEngineSessionInitializingAction(action.tabId, true)) createEngineSession(context.store, action) next(action) } else { 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 @@ -71,8 +71,8 @@ internal class LinkingMiddleware( } engineObserver?.let { - context.dispatch(EngineAction.UpdateEngineSessionObserverAction(it.first, it.second)) - context.dispatch(EngineAction.UpdateEngineSessionInitializingAction(it.first, false)) + context.store.dispatch(EngineAction.UpdateEngineSessionObserverAction(it.first, it.second)) + context.store.dispatch(EngineAction.UpdateEngineSessionInitializingAction(it.first, false)) } } 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 @@ -49,7 +49,7 @@ internal class SuspendMiddleware( val tab = context.state.findTabOrCustomTab(sessionId) ?: return // First we unlink (which clearsEngineSession and state) - context.dispatch( + context.store.dispatch( EngineAction.UnlinkEngineSessionAction( tab.id, ), 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 @@ -60,7 +60,7 @@ internal class TabsRemovedMiddleware( ) { tabs.forEach { tab -> if (tab.engineState.engineSession != null) { - context.dispatch( + context.store.dispatch( EngineAction.UnlinkEngineSessionAction( tab.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 @@ -52,7 +52,7 @@ internal class TrimMemoryMiddleware : Middleware<BrowserState, BrowserAction> { // 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. suspendTabs.forEach { tab -> - context.dispatch(EngineAction.SuspendEngineSessionAction(tab.id)) + context.store.dispatch(EngineAction.SuspendEngineSessionAction(tab.id)) } } 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 @@ -67,12 +67,12 @@ internal class WebExtensionMiddleware : Middleware<BrowserState, BrowserAction> if (engineSession == null) { logger.debug("No engine session for new active tab (${nextActiveTab?.id})") - context.dispatch(WebExtensionAction.UpdateActiveWebExtensionTabAction(null)) + context.store.dispatch(WebExtensionAction.UpdateActiveWebExtensionTabAction(null)) return } else { logger.debug("New active tab (${nextActiveTab.id})") engineSession.markActiveForWebExtensions(true) - context.dispatch(WebExtensionAction.UpdateActiveWebExtensionTabAction(nextActiveTab.id)) + context.store.dispatch(WebExtensionAction.UpdateActiveWebExtensionTabAction(nextActiveTab.id)) } } } diff --git a/mobile/android/android-components/components/feature/media/src/main/java/mozilla/components/feature/media/middleware/LastMediaAccessMiddleware.kt b/mobile/android/android-components/components/feature/media/src/main/java/mozilla/components/feature/media/middleware/LastMediaAccessMiddleware.kt @@ -30,9 +30,9 @@ class LastMediaAccessMiddleware : Middleware<BrowserState, BrowserAction> { if (action is MediaSessionAction.UpdateMediaPlaybackStateAction && action.playbackState == MediaSession.PlaybackState.PLAYING ) { - context.dispatch(LastAccessAction.UpdateLastMediaAccessAction(action.tabId)) + context.store.dispatch(LastAccessAction.UpdateLastMediaAccessAction(action.tabId)) } else if (action is MediaSessionAction.DeactivatedMediaSessionAction) { - context.dispatch(LastAccessAction.ResetLastMediaSessionAction(action.tabId)) + context.store.dispatch(LastAccessAction.ResetLastMediaSessionAction(action.tabId)) } } } 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 @@ -83,16 +83,16 @@ class ReaderViewMiddleware : Middleware<BrowserState, BrowserAction> { val tab = context.state.findTab(action.sessionId) if (isReaderUrl(tab, action.url)) { val urlReplaced = tab?.readerState?.activeUrl?.let { activeUrl -> - context.dispatch(ContentAction.UpdateUrlAction(action.sessionId, activeUrl)) + context.store.dispatch(ContentAction.UpdateUrlAction(action.sessionId, activeUrl)) true } ?: false - context.dispatch(ReaderAction.UpdateReaderActiveAction(action.sessionId, true)) + context.store.dispatch(ReaderAction.UpdateReaderActiveAction(action.sessionId, true)) !urlReplaced } else { - context.dispatch(ReaderAction.UpdateReaderActiveAction(action.sessionId, false)) - context.dispatch(ReaderAction.UpdateReaderableAction(action.sessionId, false)) - context.dispatch(ReaderAction.UpdateReaderableCheckRequiredAction(action.sessionId, true)) - context.dispatch(ReaderAction.ClearReaderActiveUrlAction(action.sessionId)) + context.store.dispatch(ReaderAction.UpdateReaderActiveAction(action.sessionId, false)) + context.store.dispatch(ReaderAction.UpdateReaderableAction(action.sessionId, false)) + context.store.dispatch(ReaderAction.UpdateReaderableCheckRequiredAction(action.sessionId, true)) + context.store.dispatch(ReaderAction.ClearReaderActiveUrlAction(action.sessionId)) true } } @@ -106,12 +106,12 @@ class ReaderViewMiddleware : Middleware<BrowserState, BrowserAction> { ) { when (action) { is TabListAction.SelectTabAction -> { - context.dispatch(ReaderAction.UpdateReaderConnectRequiredAction(action.tabId, true)) - context.dispatch(ReaderAction.UpdateReaderableAction(action.tabId, false)) - context.dispatch(ReaderAction.UpdateReaderableCheckRequiredAction(action.tabId, true)) + context.store.dispatch(ReaderAction.UpdateReaderConnectRequiredAction(action.tabId, true)) + context.store.dispatch(ReaderAction.UpdateReaderableAction(action.tabId, false)) + context.store.dispatch(ReaderAction.UpdateReaderableCheckRequiredAction(action.tabId, true)) } is EngineAction.LinkEngineSessionAction -> { - context.dispatch(ReaderAction.UpdateReaderConnectRequiredAction(action.tabId, true)) + context.store.dispatch(ReaderAction.UpdateReaderConnectRequiredAction(action.tabId, true)) } is ReaderAction.UpdateReaderActiveUrlAction -> { // When a tab is restored, the reader page will connect, but we won't get a @@ -120,7 +120,7 @@ class ReaderViewMiddleware : Middleware<BrowserState, BrowserAction> { val tab = context.state.findTab(action.tabId) val url = tab?.content?.url if (url != null && isReaderUrl(tab, url)) { - context.dispatch(ContentAction.UpdateUrlAction(tab.id, url)) + context.store.dispatch(ContentAction.UpdateUrlAction(tab.id, url)) } } else -> { 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 @@ -73,6 +73,6 @@ class LastAccessMiddleware : Middleware<BrowserState, BrowserAction> { } private fun MiddlewareContext<BrowserState, BrowserAction>.dispatchUpdateActionForId(id: String) { - dispatch(LastAccessAction.UpdateLastAccessAction(id, System.currentTimeMillis())) + store.dispatch(LastAccessAction.UpdateLastAccessAction(id, System.currentTimeMillis())) } } 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 @@ -109,7 +109,7 @@ class UndoMiddleware( recoverableTabs.find { it.state.id == selectedTabId }?.state?.id } - context.dispatch( + context.store.dispatch( UndoAction.AddRecoverableTabs(tag, recoverableTabs, selectionToRestore), ) 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 @@ -32,21 +32,6 @@ interface MiddlewareContext<S : State, A : Action> { val state: S /** - * Dispatches an [Action] synchronously on the [Store]. Other than calling [Store.dispatch], this - * will block and return after all [Store] observers have been notified about the state change. - * The dispatched [Action] will go through the whole chain of middleware again. - * - * This method is particular useful if a middleware wants to dispatch an additional [Action] and - * wait until the [state] has been updated to further process it. - * - * Note that this method should only ever be called from a [Middleware] and the calling thread. - * Calling it from another thread may throw an exception. For dispatching an [Action] from - * asynchronous code in the [Middleware] or another component use [store] which returns a - * reference to the underlying [Store] that offers methods for asynchronous dispatching. - */ - fun dispatch(action: A) - - /** * Returns a reference to the [Store] the [Middleware] is running in. */ val store: Store<S, A> 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 @@ -38,10 +38,6 @@ internal class ReducerChainBuilder<S : State, A : Action>( override val state: S get() = store.state - override fun dispatch(action: A) { - get(store).invoke(action) - } - 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 @@ -125,17 +125,17 @@ class StoreTest { @Test fun `Middleware chain gets executed in order`() { - val incrementMiddleware: Middleware<TestState, TestAction> = { store, next, action -> + val incrementMiddleware: Middleware<TestState, TestAction> = { middlewareContext, next, action -> if (action == TestAction.DoNothingAction) { - store.dispatch(TestAction.IncrementAction) + middlewareContext.store.dispatch(TestAction.IncrementAction) } next(action) } - val doubleMiddleware: Middleware<TestState, TestAction> = { store, next, action -> + val doubleMiddleware: Middleware<TestState, TestAction> = { middlewareContext, next, action -> if (action == TestAction.DoNothingAction) { - store.dispatch(TestAction.DoubleAction) + middlewareContext.store.dispatch(TestAction.DoubleAction) } next(action) @@ -213,9 +213,9 @@ class StoreTest { @Test fun `Middleware can intercept and dispatch other action instead`() { - val rewritingMiddleware: Middleware<TestState, TestAction> = { store, next, action -> + val rewritingMiddleware: Middleware<TestState, TestAction> = { middlewareContext, next, action -> if (action == TestAction.IncrementAction) { - store.dispatch(TestAction.DecrementAction) + middlewareContext.store.dispatch(TestAction.DecrementAction) } else { next(action) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/BrowserToolbarMiddleware.kt @@ -374,7 +374,7 @@ class BrowserToolbarMiddleware( ), ) } else { - context.dispatch(SearchQueryUpdated(BrowserToolbarQuery(searchTerms))) + context.store.dispatch(SearchQueryUpdated(BrowserToolbarQuery(searchTerms))) appStore.dispatch(SearchStarted(selectedTab.id)) } } @@ -394,7 +394,7 @@ class BrowserToolbarMiddleware( } } is PasteFromClipboardClicked -> { - context.dispatch(SearchQueryUpdated(BrowserToolbarQuery(clipboard.text.orEmpty()))) + context.store.dispatch(SearchQueryUpdated(BrowserToolbarQuery(clipboard.text.orEmpty()))) appStore.dispatch(SearchStarted(browserStore.state.selectedTabId)) } is LoadFromClipboardClicked -> { @@ -661,21 +661,21 @@ class BrowserToolbarMiddleware( } private fun updateStartBrowserActions(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) = - context.dispatch( + context.store.dispatch( BrowserActionsStartUpdated( buildStartBrowserActions(), ), ) private fun updateStartPageActions(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) = - context.dispatch( + context.store.dispatch( BrowserDisplayToolbarAction.PageActionsStartUpdated( buildStartPageActions(), ), ) private suspend fun updateEndBrowserActions(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) { - context.dispatch( + context.store.dispatch( BrowserActionsEndUpdated( buildEndBrowserActions(), ), @@ -695,7 +695,7 @@ class BrowserToolbarMiddleware( } private fun updateEndPageActions(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) = - context.dispatch( + context.store.dispatch( PageActionsEndUpdated( buildEndPageActions(), ), @@ -806,7 +806,7 @@ class BrowserToolbarMiddleware( } private suspend fun updateNavigationActions(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) { - context.dispatch( + context.store.dispatch( NavigationActionsUpdated( buildNavigationActions(), ), @@ -870,7 +870,7 @@ class BrowserToolbarMiddleware( browserStore.observeWhileActive { distinctUntilChangedBy { it.selectedTab?.content?.progress } .collect { - context.dispatch( + context.store.dispatch( UpdateProgressBarConfig( buildProgressBar(it.selectedTab?.content?.progress ?: 0), ), @@ -941,7 +941,7 @@ class BrowserToolbarMiddleware( } } - context.dispatch( + context.store.dispatch( BrowserDisplayToolbarAction.PageOriginUpdated( PageOrigin( hint = R.string.search_hint, @@ -970,7 +970,7 @@ class BrowserToolbarMiddleware( distinctUntilChangedBy { it.cancelPrivateDownloadsAccepted } .collect { if (it.cancelPrivateDownloadsAccepted) { - context.dispatch(CloseCurrentTab) + context.store.dispatch(CloseCurrentTab) } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/CustomTabBrowserToolbarMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/CustomTabBrowserToolbarMiddleware.kt @@ -303,7 +303,7 @@ class CustomTabBrowserToolbarMiddleware( mapNotNull { state -> state.findCustomTab(customTabId) } .distinctUntilChangedBy { it.content.progress } .collect { - context.dispatch( + context.store.dispatch( UpdateProgressBarConfig( buildProgressBar(it.content.progress), ), @@ -335,7 +335,7 @@ class CustomTabBrowserToolbarMiddleware( private fun updateStartBrowserActions( context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>, customTab: CustomTabSessionState?, - ) = context.dispatch( + ) = context.store.dispatch( BrowserActionsStartUpdated( buildStartBrowserActions(customTab), ), @@ -344,7 +344,7 @@ class CustomTabBrowserToolbarMiddleware( private fun updateStartPageActions( context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>, customTab: CustomTabSessionState?, - ) = context.dispatch( + ) = context.store.dispatch( PageActionsStartUpdated( buildStartPageActions(customTab), ), @@ -355,7 +355,7 @@ class CustomTabBrowserToolbarMiddleware( customTab: CustomTabSessionState?, ) { scope.launch { - context.dispatch( + context.store.dispatch( BrowserDisplayToolbarAction.PageOriginUpdated( PageOrigin( hint = R.string.search_hint, @@ -372,7 +372,7 @@ class CustomTabBrowserToolbarMiddleware( private fun updateEndPageActions( context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>, customTab: CustomTabSessionState?, - ) = context.dispatch( + ) = context.store.dispatch( BrowserDisplayToolbarAction.PageActionsEndUpdated( buildEndPageActions(customTab), ), @@ -381,7 +381,7 @@ class CustomTabBrowserToolbarMiddleware( private fun updateEndBrowserActions( context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>, customTab: CustomTabSessionState?, - ) = context.dispatch( + ) = context.store.dispatch( BrowserActionsEndUpdated( buildEndBrowserActions(customTab), ), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/downloads/listscreen/middleware/DownloadDeleteMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/downloads/listscreen/middleware/DownloadDeleteMiddleware.kt @@ -66,7 +66,7 @@ class DownloadDeleteMiddleware( try { delay(delay) items.forEach { removeDownloadUseCase(it) } - context.dispatch(DownloadUIAction.FileItemDeletedSuccessfully) + context.store.dispatch(DownloadUIAction.FileItemDeletedSuccessfully) } catch (e: CancellationException) { context.store.dispatch(DownloadUIAction.UndoPendingDeletionSet(items)) } finally { 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 @@ -221,7 +221,7 @@ class HistoryMetadataMiddleware( } val key = historyMetadataService.createMetadata(tab, searchTerm, referrerUrl) - context.dispatch(HistoryMetadataAction.SetHistoryMetadataKeyAction(tab.id, key)) + context.store.dispatch(HistoryMetadataAction.SetHistoryMetadataKeyAction(tab.id, key)) } private fun updateHistoryMetadata(tab: TabSessionState) { 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 @@ -238,7 +238,7 @@ class BrowserToolbarMiddleware( searchTerms: String? = null, ) { browsingMode?.let { browsingModeManager.mode = it } - context.dispatch(SearchQueryUpdated(BrowserToolbarQuery(searchTerms ?: ""))) + context.store.dispatch(SearchQueryUpdated(BrowserToolbarQuery(searchTerms ?: ""))) appStore.dispatch(SearchStarted()) } @@ -273,14 +273,14 @@ class BrowserToolbarMiddleware( private fun updateStartPageActions( context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>, selectedSearchEngine: SearchEngine?, - ) = context.dispatch( + ) = context.store.dispatch( PageActionsStartUpdated( buildStartPageActions(selectedSearchEngine), ), ) private fun updatePageOrigin(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) = - context.dispatch( + context.store.dispatch( PageOriginUpdated( PageOrigin( hint = R.string.search_hint, @@ -293,7 +293,7 @@ class BrowserToolbarMiddleware( ) private fun updateEndBrowserActions(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) { - context.dispatch( + context.store.dispatch( BrowserActionsEndUpdated( buildEndBrowserActions(), ), @@ -330,7 +330,7 @@ class BrowserToolbarMiddleware( } private fun updateNavigationActions(context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>) { - context.dispatch( + context.store.dispatch( NavigationActionsUpdated( buildNavigationActions(), ), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/iconpicker/AppIconMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/iconpicker/AppIconMiddleware.kt @@ -26,9 +26,9 @@ class AppIconMiddleware( when (action) { is UserAction.Confirmed -> { if (updateAppIcon(old = action.newIcon, new = action.oldIcon)) { - context.dispatch(SystemAction.Applied(action.newIcon)) + context.store.dispatch(SystemAction.Applied(action.newIcon)) } else { - context.dispatch( + context.store.dispatch( SystemAction.UpdateFailed( oldIcon = action.oldIcon, newIcon = action.newIcon, 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 @@ -123,12 +123,12 @@ class ReviewPromptMiddleware( if (isTelemetryEnabled()) { // This is a temporary change while investigating repeated custom review prompts as // filed in https://bugzilla.mozilla.org/show_bug.cgi?id=2001801. - context.dispatch(ShowPlayStorePrompt) + context.store.dispatch(ShowPlayStorePrompt) } else { - context.dispatch(ShowPlayStorePrompt) + context.store.dispatch(ShowPlayStorePrompt) } } else { - context.dispatch(DoNotShowReviewPrompt) + context.store.dispatch(DoNotShowReviewPrompt) } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserStoreToFenixSearchMapperMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserStoreToFenixSearchMapperMiddleware.kt @@ -53,7 +53,7 @@ class BrowserStoreToFenixSearchMapperMiddleware( map { it.search } .distinctUntilChanged() .collect { searchState -> - context.dispatch( + context.store.dispatch( UpdateSearchState(searchState, true), ) } 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 @@ -212,7 +212,7 @@ class BrowserToolbarSearchMiddleware( } is SearchSettingsItemClicked -> { - context.dispatch(SearchQueryUpdated(BrowserToolbarQuery(""))) + context.store.dispatch(SearchQueryUpdated(BrowserToolbarQuery(""))) appStore.dispatch(SearchEnded) browserStore.dispatch(EngagementFinished(abandoned = true)) navController.navigate( @@ -272,7 +272,7 @@ class BrowserToolbarSearchMiddleware( Toolbar.buttonTapped.record( Toolbar.ButtonTappedExtra(source = SOURCE_ADDRESS_BAR, item = ACTION_CLEAR_CLICKED), ) - context.dispatch(SearchQueryUpdated(BrowserToolbarQuery(""))) + context.store.dispatch(SearchQueryUpdated(BrowserToolbarQuery(""))) } is SearchQueryUpdated -> { @@ -356,7 +356,7 @@ class BrowserToolbarSearchMiddleware( ) { val defaultEngine = browserStore.state.search.selectedOrDefaultSearchEngine val hintRes = engine.toolbarHintRes(defaultEngine) - context.dispatch(HintUpdated(hintRes)) + context.store.dispatch(HintUpdated(hintRes)) } /** @@ -372,7 +372,7 @@ class BrowserToolbarSearchMiddleware( searchEngineShortcuts, uiContext.resources, ) - context.dispatch( + context.store.dispatch( SearchActionsStartUpdated( when (searchSelector == null) { true -> emptyList() @@ -423,7 +423,7 @@ class BrowserToolbarSearchMiddleware( query.previous?.length == query.current.length + 1 if (shouldCheckForSuggestions && !isBackspacing) { updateAutocompleteJob = scope.launch { - context.dispatch( + context.store.dispatch( BrowserEditToolbarAction.AutocompleteSuggestionUpdated( withContext(autocompleteDispatcher) { fetchAutocomplete( @@ -437,7 +437,7 @@ class BrowserToolbarSearchMiddleware( ) } } else { - context.dispatch(BrowserEditToolbarAction.AutocompleteSuggestionUpdated(null)) + context.store.dispatch(BrowserEditToolbarAction.AutocompleteSuggestionUpdated(null)) } } @@ -483,7 +483,7 @@ class BrowserToolbarSearchMiddleware( private fun updateSearchEndPageActions( context: MiddlewareContext<BrowserToolbarState, BrowserToolbarAction>, selectedSearchEngine: SearchEngine? = reconcileSelectedEngine(), - ) = context.dispatch( + ) = context.store.dispatch( SearchActionsEndUpdated( buildSearchEndPageActions( context.state.editState.query.current, @@ -538,7 +538,7 @@ class BrowserToolbarSearchMiddleware( observeQRScannerInputJob?.cancel() appStore.dispatch(AppAction.QrScannerAction.QrScannerInputConsumed) - context.dispatch( + context.store.dispatch( SearchQueryUpdated( BrowserToolbarQuery(it.qrScannerState.lastScanData), ), @@ -564,7 +564,7 @@ class BrowserToolbarSearchMiddleware( .distinctUntilChanged() .collect { voiceInputResult -> if (!voiceInputResult.isNullOrEmpty()) { - context.dispatch( + context.store.dispatch( SearchQueryUpdated( query = BrowserToolbarQuery(voiceInputResult), isQueryPrefilled = true, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserToolbarSearchStatusSyncMiddleware.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/search/BrowserToolbarSearchStatusSyncMiddleware.kt @@ -60,9 +60,9 @@ class BrowserToolbarSearchStatusSyncMiddleware( .distinctUntilChangedBy { it.searchState.isSearchActive } .collect { if (it.searchState.isSearchActive) { - context.dispatch(EnterEditMode(browsingModeManager.mode.isPrivate)) + context.store.dispatch(EnterEditMode(browsingModeManager.mode.isPrivate)) } else { - context.dispatch(ExitEditMode) + context.store.dispatch(ExitEditMode) } } } 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 @@ -62,7 +62,7 @@ class BrowserToolbarToFenixSearchMapperMiddleware( .collect { if (it.mode == Mode.EDIT) { val editState = toolbarStore.state.editState - context.dispatch( + context.store.dispatch( SearchStarted( selectedSearchEngine = null, isUserSelected = true, @@ -89,7 +89,7 @@ class BrowserToolbarToFenixSearchMapperMiddleware( .collect { query -> val isSearchStartedForCurrentUrl = context.state.searchStartedForCurrentUrl val isQueryPrefilled = toolbarStore.state.editState.isQueryPrefilled - context.dispatch( + context.store.dispatch( SearchFragmentAction.UpdateQuery( when (isSearchStartedForCurrentUrl && isQueryPrefilled) { true -> "" // consider a prefilled query for the current URL as not entered by user 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 @@ -116,7 +116,7 @@ class FenixSearchMiddleware( setupSuggestionsProvidersCleanup(context) - context.dispatch( + context.store.dispatch( SearchFragmentAction.UpdateSearchState( browserStore.state.search, true, @@ -239,7 +239,7 @@ class FenixSearchMiddleware( } val shouldShowSuggestions = shouldShowTrendingSearches || shouldShowSearchSuggestions - context.dispatch(SearchSuggestionsVisibilityUpdated(shouldShowSuggestions)) + context.store.dispatch(SearchSuggestionsVisibilityUpdated(shouldShowSuggestions)) val showPrivatePrompt = with(context.state) { !settings.showSearchSuggestionsInPrivateOnboardingFinished && @@ -247,7 +247,7 @@ class FenixSearchMiddleware( !isSearchSuggestionsFeatureEnabled() && !showSearchShortcuts && url != query } - context.dispatch( + context.store.dispatch( SearchFragmentAction.AllowSearchSuggestionsInPrivateModePrompt( showPrivatePrompt, ), @@ -259,7 +259,7 @@ class FenixSearchMiddleware( */ private fun updateSearchProviders(context: MiddlewareContext<SearchFragmentState, SearchFragmentAction>) { val suggestionsProvidersBuilder = suggestionsProvidersBuilder ?: return - context.dispatch( + context.store.dispatch( SearchProvidersUpdated( buildList { if (context.state.showSearchShortcuts) { @@ -431,16 +431,16 @@ class FenixSearchMiddleware( ) { when { searchEngine.type == SearchEngine.Type.APPLICATION && searchEngine.id == HISTORY_SEARCH_ENGINE_ID -> { - context.dispatch(SearchFragmentAction.SearchHistoryEngineSelected(searchEngine)) + context.store.dispatch(SearchFragmentAction.SearchHistoryEngineSelected(searchEngine)) } searchEngine.type == SearchEngine.Type.APPLICATION && searchEngine.id == BOOKMARKS_SEARCH_ENGINE_ID -> { - context.dispatch(SearchFragmentAction.SearchBookmarksEngineSelected(searchEngine)) + context.store.dispatch(SearchFragmentAction.SearchBookmarksEngineSelected(searchEngine)) } searchEngine.type == SearchEngine.Type.APPLICATION && searchEngine.id == TABS_SEARCH_ENGINE_ID -> { - context.dispatch(SearchFragmentAction.SearchTabsEngineSelected(searchEngine)) + context.store.dispatch(SearchFragmentAction.SearchTabsEngineSelected(searchEngine)) } searchEngine == context.state.defaultEngine -> { - context.dispatch( + context.store.dispatch( SearchFragmentAction.SearchDefaultEngineSelected( engine = searchEngine, browsingMode = browsingModeManager.mode, @@ -449,7 +449,7 @@ class FenixSearchMiddleware( ) } else -> { - context.dispatch( + context.store.dispatch( SearchFragmentAction.SearchShortcutEngineSelected( engine = searchEngine, browsingMode = browsingModeManager.mode, @@ -483,7 +483,7 @@ class FenixSearchMiddleware( override fun onDestroy(owner: LifecycleOwner) { // Search providers may keep hard references to lifecycle dependent objects // so we need to reset them when the environment is cleared. - context.dispatch(SearchProvidersUpdated(emptyList())) + context.store.dispatch(SearchProvidersUpdated(emptyList())) } }, ) 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 @@ -563,10 +563,6 @@ class FenixSearchMiddlewareTest { override val state: SearchFragmentState get() = store.state - override fun dispatch(action: SearchFragmentAction) { - store.dispatch(action) - } - override val store: Store<SearchFragmentState, SearchFragmentAction> = store } diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/locale/screen/LanguageMiddleware.kt b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/locale/screen/LanguageMiddleware.kt @@ -49,7 +49,7 @@ class LanguageMiddleware( } is LanguageScreenAction.InitLanguages -> { // The initial LanguageScreenState when the user enters first in the screen - context.dispatch( + context.store.dispatch( LanguageScreenAction.UpdateLanguages( storage.languages, storage.selectedLanguage, diff --git a/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/settings/permissions/permissionoptions/SitePermissionOptionsStorageMiddleware.kt b/mobile/android/focus-android/app/src/main/java/org/mozilla/focus/settings/permissions/permissionoptions/SitePermissionOptionsStorageMiddleware.kt @@ -27,7 +27,7 @@ class SitePermissionOptionsStorageMiddleware( next(action) } is SitePermissionOptionsScreenAction.InitSitePermissionOptions -> { - context.dispatch( + context.store.dispatch( SitePermissionOptionsScreenAction.UpdateSitePermissionOptions( storage.getSitePermissionOptions(sitePermission), storage.permissionSelectedOption(sitePermission), diff --git a/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/locale/screen/LanguageMiddlewareTest.kt b/mobile/android/focus-android/app/src/test/java/org/mozilla/focus/locale/screen/LanguageMiddlewareTest.kt @@ -10,6 +10,7 @@ import android.content.res.Configuration import android.content.res.Resources import kotlinx.coroutines.test.runTest import mozilla.components.lib.state.MiddlewareContext +import mozilla.components.lib.state.Store import mozilla.components.support.locale.LocaleUseCases import mozilla.components.support.test.any import mozilla.components.support.test.argumentCaptor @@ -110,11 +111,12 @@ class LanguageMiddlewareTest { val action = LanguageScreenAction.InitLanguages `when`(mockStorage.languages).thenReturn(languages) `when`(mockStorage.selectedLanguage).thenReturn(selectedLanguage) - + val mockStore = mock<Store<LanguageScreenState, LanguageScreenAction>>() + `when`(mockMiddlewareContext.store).thenReturn(mockStore) middleware.invoke(mockMiddlewareContext, mockNext, action) val dispatchedActionCaptor = argumentCaptor<LanguageScreenAction>() - verify(mockMiddlewareContext).dispatch(dispatchedActionCaptor.capture()) + verify(mockStore).dispatch(dispatchedActionCaptor.capture()) val dispatchedAction = dispatchedActionCaptor.value assertTrue(dispatchedAction is LanguageScreenAction.UpdateLanguages) dispatchedAction as LanguageScreenAction.UpdateLanguages