Bug 1954250 - Refactor SetupChecklistStore r=android-reviewers,twhite
This refactoring aims to shift storing the UI state from flags within the state to a list of data items that contain the state of each individual items Differential Revision: https://phabricator.services.mozilla.com/D241714
This commit is contained in:
@@ -28,13 +28,6 @@ class SetupChecklistMiddleware(
|
||||
when (action) {
|
||||
is SetupChecklistAction.Init -> {}
|
||||
is SetupChecklistAction.Closed -> {}
|
||||
is SetupChecklistAction.DefaultBrowserClicked -> {}
|
||||
is SetupChecklistAction.SyncClicked -> {}
|
||||
is SetupChecklistAction.ThemeSelectionClicked -> {}
|
||||
is SetupChecklistAction.ToolbarSelectionClicked -> {}
|
||||
is SetupChecklistAction.ExtensionsClicked -> {}
|
||||
is SetupChecklistAction.AddSearchWidgetClicked -> {}
|
||||
is SetupChecklistAction.ViewState -> {}
|
||||
is SetupChecklistAction.ChecklistItemClicked -> {
|
||||
if (action.item is ChecklistItem.Task) {
|
||||
when (action.item.type) {
|
||||
|
||||
@@ -15,14 +15,6 @@ import org.mozilla.fenix.checklist.ChecklistItem
|
||||
*/
|
||||
data class SetupChecklistState(
|
||||
val checklistItems: List<ChecklistItem> = emptyList(),
|
||||
val collection: SetupChecklistTaskCollection = SetupChecklistTaskCollection.THREE_TASKS,
|
||||
val viewState: SetupChecklistViewState = SetupChecklistViewState.FULL,
|
||||
val defaultBrowserClicked: Boolean = false,
|
||||
val syncClicked: Boolean = false,
|
||||
val themeSelectionClicked: Boolean = false,
|
||||
val toolbarSelectionClicked: Boolean = false,
|
||||
val extensionsClicked: Boolean = false,
|
||||
val addSearchWidgetClicked: Boolean = false,
|
||||
) : State
|
||||
|
||||
/**
|
||||
@@ -34,75 +26,15 @@ sealed interface SetupChecklistAction : Action {
|
||||
*/
|
||||
data object Init : SetupChecklistAction
|
||||
|
||||
/**
|
||||
* When a setup checklist item is clicked.
|
||||
*/
|
||||
data class ChecklistItemClicked(val item: ChecklistItem) : SetupChecklistAction
|
||||
|
||||
/**
|
||||
* When the setup checklist is closed.
|
||||
*/
|
||||
data object Closed : SetupChecklistAction
|
||||
|
||||
/**
|
||||
* When the default browser task in the setup checklist is clicked.
|
||||
* When a setup checklist item is clicked.
|
||||
*/
|
||||
data object DefaultBrowserClicked : SetupChecklistAction
|
||||
|
||||
/**
|
||||
* When the sync task in the setup checklist is clicked.
|
||||
*/
|
||||
data object SyncClicked : SetupChecklistAction
|
||||
|
||||
/**
|
||||
* When the theme selection task in the setup checklist is clicked.
|
||||
*/
|
||||
data object ThemeSelectionClicked : SetupChecklistAction
|
||||
|
||||
/**
|
||||
* When the toolbar selection task in the setup checklist is clicked.
|
||||
*/
|
||||
data object ToolbarSelectionClicked : SetupChecklistAction
|
||||
|
||||
/**
|
||||
* When the extensions task in the setup checklist is clicked.
|
||||
*/
|
||||
data object ExtensionsClicked : SetupChecklistAction
|
||||
|
||||
/**
|
||||
* When the add search widget task in the setup checklist is clicked.
|
||||
*/
|
||||
data object AddSearchWidgetClicked : SetupChecklistAction
|
||||
|
||||
/**
|
||||
* When the view state is changed.
|
||||
*/
|
||||
data class ViewState(val section: SetupChecklistViewState) : SetupChecklistAction
|
||||
}
|
||||
|
||||
/**
|
||||
* Which collection of tasks to show in the setup checklist.
|
||||
*/
|
||||
enum class SetupChecklistTaskCollection {
|
||||
THREE_TASKS,
|
||||
SIX_TASKS,
|
||||
}
|
||||
|
||||
/**
|
||||
* The core view state of the setup checklist.
|
||||
*/
|
||||
enum class SetupChecklistViewState {
|
||||
// The view is minimized. No tasks are visible; only the title and progress indicator are shown.
|
||||
MINIMIZED,
|
||||
|
||||
// The full view is shown. The title, progress indicator, and parent tasks are visible,
|
||||
// but child tasks are hidden.
|
||||
FULL,
|
||||
|
||||
// Same as FULL, but the selected parent task’s child tasks are also visible.
|
||||
EXPANDED_FUNDAMENTALS,
|
||||
EXPANDED_CUSTOMIZATION,
|
||||
EXPANDED_EXTRAS,
|
||||
data class ChecklistItemClicked(val item: ChecklistItem) : SetupChecklistAction
|
||||
}
|
||||
|
||||
private fun reducer(
|
||||
@@ -110,17 +42,6 @@ private fun reducer(
|
||||
action: SetupChecklistAction,
|
||||
): SetupChecklistState = when (action) {
|
||||
is SetupChecklistAction.Init, SetupChecklistAction.Closed -> state
|
||||
|
||||
is SetupChecklistAction.ViewState -> state.copy(viewState = action.section)
|
||||
|
||||
is SetupChecklistAction.DefaultBrowserClicked -> state.copy(defaultBrowserClicked = true)
|
||||
is SetupChecklistAction.SyncClicked -> state.copy(syncClicked = true)
|
||||
|
||||
is SetupChecklistAction.ThemeSelectionClicked -> state.copy(themeSelectionClicked = true)
|
||||
is SetupChecklistAction.ToolbarSelectionClicked -> state.copy(toolbarSelectionClicked = true)
|
||||
|
||||
is SetupChecklistAction.ExtensionsClicked -> state.copy(extensionsClicked = true)
|
||||
is SetupChecklistAction.AddSearchWidgetClicked -> state.copy(addSearchWidgetClicked = true)
|
||||
is SetupChecklistAction.ChecklistItemClicked -> state.copy(
|
||||
checklistItems = state.checklistItems.map { item ->
|
||||
when {
|
||||
|
||||
@@ -24,13 +24,6 @@ class SetupChecklistTelemetryMiddleware(val telemetry: SetupChecklistTelemetryRe
|
||||
when (action) {
|
||||
is SetupChecklistAction.Init -> {}
|
||||
is SetupChecklistAction.Closed -> {}
|
||||
is SetupChecklistAction.DefaultBrowserClicked -> {}
|
||||
is SetupChecklistAction.SyncClicked -> {}
|
||||
is SetupChecklistAction.ThemeSelectionClicked -> {}
|
||||
is SetupChecklistAction.ToolbarSelectionClicked -> {}
|
||||
is SetupChecklistAction.ExtensionsClicked -> {}
|
||||
is SetupChecklistAction.AddSearchWidgetClicked -> {}
|
||||
is SetupChecklistAction.ViewState -> {}
|
||||
is SetupChecklistAction.ChecklistItemClicked -> {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ package org.mozilla.fenix.home.setup.store
|
||||
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
@@ -28,14 +27,7 @@ class SetupChecklistStoreTest {
|
||||
fun `WHEN store is initialized THEN the initial state is correct`() {
|
||||
val initialState = SetupChecklistState()
|
||||
|
||||
assertEquals(initialState.collection, SetupChecklistTaskCollection.THREE_TASKS)
|
||||
assertEquals(initialState.viewState, SetupChecklistViewState.FULL)
|
||||
assertFalse(initialState.defaultBrowserClicked)
|
||||
assertFalse(initialState.syncClicked)
|
||||
assertFalse(initialState.themeSelectionClicked)
|
||||
assertFalse(initialState.toolbarSelectionClicked)
|
||||
assertFalse(initialState.extensionsClicked)
|
||||
assertFalse(initialState.addSearchWidgetClicked)
|
||||
assertEquals(initialState.checklistItems, emptyList<ChecklistItem>())
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -56,77 +48,6 @@ class SetupChecklistStoreTest {
|
||||
assertEquals(initialState, store.state)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN the default browser clicked action is dispatched THEN defaultBrowserClicked is set to true`() {
|
||||
assertFalse(store.state.defaultBrowserClicked)
|
||||
|
||||
store.testDispatch(SetupChecklistAction.DefaultBrowserClicked)
|
||||
|
||||
val expectedState = SetupChecklistState(defaultBrowserClicked = true)
|
||||
assertEquals(expectedState, store.state)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN the sync clicked action is dispatched THEN syncClicked is set to true`() {
|
||||
assertFalse(store.state.syncClicked)
|
||||
|
||||
store.testDispatch(SetupChecklistAction.SyncClicked)
|
||||
|
||||
val expectedState = SetupChecklistState(syncClicked = true)
|
||||
assertEquals(expectedState, store.state)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN the theme selection clicked action is dispatched THEN themeSelectionClicked is set to true`() {
|
||||
assertFalse(store.state.themeSelectionClicked)
|
||||
|
||||
store.testDispatch(SetupChecklistAction.ThemeSelectionClicked)
|
||||
|
||||
val expectedState = SetupChecklistState(themeSelectionClicked = true)
|
||||
assertEquals(expectedState, store.state)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN the toolbar selection clicked action is dispatched THEN toolbarSelectionClicked is set to true`() {
|
||||
assertFalse(store.state.toolbarSelectionClicked)
|
||||
|
||||
store.testDispatch(SetupChecklistAction.ToolbarSelectionClicked)
|
||||
|
||||
val expectedState = SetupChecklistState(toolbarSelectionClicked = true)
|
||||
assertEquals(expectedState, store.state)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN the extensions clicked action is dispatched THEN extensionsClicked is set to true`() {
|
||||
assertFalse(store.state.extensionsClicked)
|
||||
|
||||
store.testDispatch(SetupChecklistAction.ExtensionsClicked)
|
||||
|
||||
val expectedState = SetupChecklistState(extensionsClicked = true)
|
||||
assertEquals(expectedState, store.state)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN the add search widget clicked action is dispatched THEN addSearchWidgetClicked is set to true`() {
|
||||
assertFalse(store.state.addSearchWidgetClicked)
|
||||
|
||||
store.testDispatch(SetupChecklistAction.AddSearchWidgetClicked)
|
||||
|
||||
val expectedState = SetupChecklistState(addSearchWidgetClicked = true)
|
||||
assertEquals(expectedState, store.state)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN the view state action is dispatched THEN the view state value is updated`() {
|
||||
assertEquals(store.state.viewState, SetupChecklistViewState.FULL)
|
||||
|
||||
store.testDispatch(SetupChecklistAction.ViewState(SetupChecklistViewState.EXPANDED_FUNDAMENTALS))
|
||||
|
||||
val expectedState =
|
||||
SetupChecklistState(viewState = SetupChecklistViewState.EXPANDED_FUNDAMENTALS)
|
||||
assertEquals(expectedState, store.state)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `WHEN a group item is clicked THEN it changes its expanded state to the opposite `() {
|
||||
val initialState = true
|
||||
|
||||
@@ -7,6 +7,8 @@ import org.junit.runner.RunWith
|
||||
import org.mockito.Mock
|
||||
import org.mockito.Mockito.verifyNoInteractions
|
||||
import org.mockito.junit.MockitoJUnitRunner
|
||||
import org.mozilla.fenix.R
|
||||
import org.mozilla.fenix.checklist.ChecklistItem
|
||||
|
||||
// todo complete as part of https://bugzilla.mozilla.org/show_bug.cgi?id=1951909
|
||||
|
||||
@@ -38,44 +40,14 @@ class SetupChecklistTelemetryMiddlewareTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN default browser clicked action WHEN middleware is invoked THEN no telemetry is sent`() {
|
||||
middleware.invoke(context, {}, SetupChecklistAction.DefaultBrowserClicked)
|
||||
verifyNoInteractions(telemetry)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN sync click action WHEN middleware is invoked THEN no telemetry is sent`() {
|
||||
middleware.invoke(context, {}, SetupChecklistAction.SyncClicked)
|
||||
verifyNoInteractions(telemetry)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN theme selection click action WHEN middleware is invoked THEN no telemetry is sent`() {
|
||||
middleware.invoke(context, {}, SetupChecklistAction.ThemeSelectionClicked)
|
||||
verifyNoInteractions(telemetry)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN toolbar selection click action WHEN middleware is invoked THEN no telemetry is sent`() {
|
||||
middleware.invoke(context, {}, SetupChecklistAction.ToolbarSelectionClicked)
|
||||
verifyNoInteractions(telemetry)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN extensions clicked action WHEN middleware is invoked THEN no telemetry is sent`() {
|
||||
middleware.invoke(context, {}, SetupChecklistAction.ExtensionsClicked)
|
||||
verifyNoInteractions(telemetry)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN add search widget click action WHEN middleware is invoked THEN no telemetry is sent`() {
|
||||
middleware.invoke(context, {}, SetupChecklistAction.AddSearchWidgetClicked)
|
||||
verifyNoInteractions(telemetry)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN view state action WHEN middleware is invoked THEN no telemetry is sent`() {
|
||||
middleware.invoke(context, {}, SetupChecklistAction.ViewState(SetupChecklistViewState.FULL))
|
||||
fun `GIVEN checklist item clicked action WHEN middleware is invoked THEN no telemetry is sent`() {
|
||||
val task = ChecklistItem.Task(
|
||||
type = ChecklistItem.Task.Type.EXPLORE_EXTENSION,
|
||||
title = "A cool task",
|
||||
icon = R.drawable.ic_addons_extensions,
|
||||
isCompleted = false,
|
||||
)
|
||||
middleware.invoke(context, {}, SetupChecklistAction.ChecklistItemClicked(task))
|
||||
verifyNoInteractions(telemetry)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user