* Issue https://github.com/mozilla-mobile/android-components/issues/10197: Move EngineObserver and EngineMiddleware to browser-state and refactor SessionManager dependency away. * Issue https://github.com/mozilla-mobile/android-components/issues/3532: Migrate TabsUseCases to use BrowserStore exclusively. * Issue https://github.com/mozilla-mobile/android-components/issues/10209: Migrate SessionUseCases to use BrowserStore exclusively. * Issue https://github.com/mozilla-mobile/android-components/issues/3532, https://github.com/mozilla-mobile/android-components/issues/10209: Migrate components to use new UseCase APIs. * Issue https://github.com/mozilla-mobile/android-components/issues/10209: Migrate UndoMiddleware to use BrowserStore. * Issue https://github.com/mozilla-mobile/android-components/issues/3532: Migrate CustomTabsUseCases to use BrowserStore. * Issue https://github.com/mozilla-mobile/android-components/issues/10211: Migrate sample-browser to not depend on browser-session. * Issue https://github.com/mozilla-mobile/android-components/issues/10209: Remove browser-session dependency. * Issue https://github.com/mozilla-mobile/android-components/issues/3532: feature-tabs: Remove browser-session dependency. * Issue https://github.com/mozilla-mobile/android-components/issues/10209: Fix UndoMiddlewareTest * Issue https://github.com/mozilla-mobile/android-components/issues/10209: Refactor SessionUseCasesTest to not use SessionManager. * Issue https://github.com/mozilla-mobile/android-components/issues/10209: Fix SessionFeatureTest. * Refactor support-migration tests to not use SessionManager. * Fix tests in feature-contextmenu. * Refactor feature-recentlyclosed tests to not use SessionManager * Refactor browser-session-storage tests to not use SessionManager * Refactor feature-intent tests to not use SessionManager * Refactor feature-tabs tests to not use SessionManager pt. 1 * Refactor feature-customtabs tests to not depend on browser-session. * Make sure initial load url flags are correct * Refactor feature-tabs tests to not use SessionManager pt. 2 * Refactor browser-state tests to not depend on browser-session. * SearchUseCasesTest: Use addTab use case instead of addPrivateTab. * Samples Browser: Remove unused drawable. * Fix feature-pwa tests * Remove browser-session. * Make sure engine session is linked for window requests * Make sure engine session is linked when provided with tab * Make sure engine session is linked when provided with tab pt. 2 * Prevent engine session from being created multiple times * Prevent engine session from being created multiple times pt. 2 * Prevent engine session from being created multiple times pt. 3 * Part 4: REFACTOR ALL THE THINGS * Update tests. * Add additional test for multiple CreateEngineSessionAction dispatching. * Refactor, some docs and tests * Fix CustomTabs tests...
Android Components > Libraries > State
A generic library for maintaining the state of a component, screen or application.
The state library is inspired by existing libraries like Redux and provides a Store class to hold application state.
Usage
Setting up the dependency
Use Gradle to download the library from maven.mozilla.org (Setup repository):
implementation "org.mozilla.components:lib-state:{latest-version}"
Action
Actions represent payloads of information that send data from your application to the Store. You can send actions using store.dispatch(). An Action will usually be a small data class or object describing a change.
data class SetVisibility(val visible: Boolean) : Action
store.dispatch(SetVisibility(true))
Reducer
Reducers are functions describing how the state should change in response to actions sent to the store.
They take the previous state and an action as parameters, and return the new state as a result of that action.
fun reduce(previousState: State, action: Action) = when (action) {
is SetVisibility -> previousState.copy(toolbarVisible = action.visible)
else -> previousState
}
Store
The Store brings together actions and reducers. It holds the application state and allows access to it via the store.state getter. It allows state to be updated via store.dispatch(), and can have listeners registered through store.observe().
Stores can easily be created if you have a reducer.
val store = Store<State, Action>(
initialState = State(),
reducer = ::reduce
)
Once the store is created, you can react to changes in the state by registering an observer.
store.observe(lifecycleOwner) { state ->
toolbarView.visibility = if (state.toolbarVisible) View.VISIBLE else View.GONE
}
store.observe is lifecycle aware and will automatically unregister when the lifecycle owner (such as an Activity or Fragment) is destroyed. Instead of a LifecycleOwner, a View can be supplied instead.
If you wish to manually control the observer subscription, you can use the store.observeManually function. observeManually returns a Subscription class which has an unsubscribe method. Calling unsubscribe removes the observer.
License
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/