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:
mike a
2025-03-18 01:39:28 +00:00
parent 84b547ba31
commit 6788fd328e
5 changed files with 13 additions and 213 deletions

View File

@@ -28,13 +28,6 @@ class SetupChecklistMiddleware(
when (action) { when (action) {
is SetupChecklistAction.Init -> {} is SetupChecklistAction.Init -> {}
is SetupChecklistAction.Closed -> {} 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 -> { is SetupChecklistAction.ChecklistItemClicked -> {
if (action.item is ChecklistItem.Task) { if (action.item is ChecklistItem.Task) {
when (action.item.type) { when (action.item.type) {

View File

@@ -15,14 +15,6 @@ import org.mozilla.fenix.checklist.ChecklistItem
*/ */
data class SetupChecklistState( data class SetupChecklistState(
val checklistItems: List<ChecklistItem> = emptyList(), 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 ) : State
/** /**
@@ -34,75 +26,15 @@ sealed interface SetupChecklistAction : Action {
*/ */
data object Init : SetupChecklistAction data object Init : SetupChecklistAction
/**
* When a setup checklist item is clicked.
*/
data class ChecklistItemClicked(val item: ChecklistItem) : SetupChecklistAction
/** /**
* When the setup checklist is closed. * When the setup checklist is closed.
*/ */
data object Closed : SetupChecklistAction 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 data class ChecklistItemClicked(val item: ChecklistItem) : 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 tasks child tasks are also visible.
EXPANDED_FUNDAMENTALS,
EXPANDED_CUSTOMIZATION,
EXPANDED_EXTRAS,
} }
private fun reducer( private fun reducer(
@@ -110,17 +42,6 @@ private fun reducer(
action: SetupChecklistAction, action: SetupChecklistAction,
): SetupChecklistState = when (action) { ): SetupChecklistState = when (action) {
is SetupChecklistAction.Init, SetupChecklistAction.Closed -> state 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( is SetupChecklistAction.ChecklistItemClicked -> state.copy(
checklistItems = state.checklistItems.map { item -> checklistItems = state.checklistItems.map { item ->
when { when {

View File

@@ -24,13 +24,6 @@ class SetupChecklistTelemetryMiddleware(val telemetry: SetupChecklistTelemetryRe
when (action) { when (action) {
is SetupChecklistAction.Init -> {} is SetupChecklistAction.Init -> {}
is SetupChecklistAction.Closed -> {} 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 -> {} is SetupChecklistAction.ChecklistItemClicked -> {}
} }
} }

View File

@@ -6,7 +6,6 @@ package org.mozilla.fenix.home.setup.store
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
@@ -28,14 +27,7 @@ class SetupChecklistStoreTest {
fun `WHEN store is initialized THEN the initial state is correct`() { fun `WHEN store is initialized THEN the initial state is correct`() {
val initialState = SetupChecklistState() val initialState = SetupChecklistState()
assertEquals(initialState.collection, SetupChecklistTaskCollection.THREE_TASKS) assertEquals(initialState.checklistItems, emptyList<ChecklistItem>())
assertEquals(initialState.viewState, SetupChecklistViewState.FULL)
assertFalse(initialState.defaultBrowserClicked)
assertFalse(initialState.syncClicked)
assertFalse(initialState.themeSelectionClicked)
assertFalse(initialState.toolbarSelectionClicked)
assertFalse(initialState.extensionsClicked)
assertFalse(initialState.addSearchWidgetClicked)
} }
@Test @Test
@@ -56,77 +48,6 @@ class SetupChecklistStoreTest {
assertEquals(initialState, store.state) 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 @Test
fun `WHEN a group item is clicked THEN it changes its expanded state to the opposite `() { fun `WHEN a group item is clicked THEN it changes its expanded state to the opposite `() {
val initialState = true val initialState = true

View File

@@ -7,6 +7,8 @@ import org.junit.runner.RunWith
import org.mockito.Mock import org.mockito.Mock
import org.mockito.Mockito.verifyNoInteractions import org.mockito.Mockito.verifyNoInteractions
import org.mockito.junit.MockitoJUnitRunner 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 // todo complete as part of https://bugzilla.mozilla.org/show_bug.cgi?id=1951909
@@ -38,44 +40,14 @@ class SetupChecklistTelemetryMiddlewareTest {
} }
@Test @Test
fun `GIVEN default browser clicked action WHEN middleware is invoked THEN no telemetry is sent`() { fun `GIVEN checklist item clicked action WHEN middleware is invoked THEN no telemetry is sent`() {
middleware.invoke(context, {}, SetupChecklistAction.DefaultBrowserClicked) val task = ChecklistItem.Task(
verifyNoInteractions(telemetry) type = ChecklistItem.Task.Type.EXPLORE_EXTENSION,
} title = "A cool task",
icon = R.drawable.ic_addons_extensions,
@Test isCompleted = false,
fun `GIVEN sync click action WHEN middleware is invoked THEN no telemetry is sent`() { )
middleware.invoke(context, {}, SetupChecklistAction.SyncClicked) middleware.invoke(context, {}, SetupChecklistAction.ChecklistItemClicked(task))
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))
verifyNoInteractions(telemetry) verifyNoInteractions(telemetry)
} }
} }