commit 19389430a0d4c73ecf991eeb6f27bb74f128a41a
parent 21d3e8ab8b61715ddd39ac04c62a846fa79deddd
Author: Segun Famisa <sfamisa@mozilla.com>
Date: Tue, 30 Sep 2025 13:47:02 +0000
Bug 1991066 - Break down bookmarksReducer function to fix "LongMethod" suppression r=android-reviewers,matt-tighe
Differential Revision: https://phabricator.services.mozilla.com/D266335
Diffstat:
3 files changed, 192 insertions(+), 136 deletions(-)
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksAction.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksAction.kt
@@ -92,51 +92,51 @@ internal data object PrivateBrowsingAuthorized : BookmarksAction
/**
* Actions specific to the Add Folder screen.
*/
-internal sealed class AddFolderAction {
- data class TitleChanged(val updatedText: String) : BookmarksAction
- data object ParentFolderClicked : BookmarksAction
- data class FolderCreated(val folder: BookmarkItem.Folder) : BookmarksAction
+internal sealed class AddFolderAction : BookmarksAction {
+ data class TitleChanged(val updatedText: String) : AddFolderAction()
+ data object ParentFolderClicked : AddFolderAction()
+ data class FolderCreated(val folder: BookmarkItem.Folder) : AddFolderAction()
}
/**
* Actions specific to the Edit Folder screen.
*/
internal sealed class EditFolderAction : BookmarksAction {
- data class TitleChanged(val updatedText: String) : BookmarksAction
- data object ParentFolderClicked : BookmarksAction
+ data class TitleChanged(val updatedText: String) : EditFolderAction()
+ data object ParentFolderClicked : EditFolderAction()
data object DeleteClicked : EditFolderAction()
}
-internal sealed class EditBookmarkAction {
- data class TitleChanged(val title: String) : BookmarksAction
- data class URLChanged(val url: String) : BookmarksAction
- data object FolderClicked : BookmarksAction
- data object DeleteClicked : BookmarksAction
+internal sealed class EditBookmarkAction : BookmarksAction {
+ data class TitleChanged(val title: String) : EditBookmarkAction()
+ data class URLChanged(val url: String) : EditBookmarkAction()
+ data object FolderClicked : EditBookmarkAction()
+ data object DeleteClicked : EditBookmarkAction()
}
-internal sealed class SelectFolderAction {
- data object ViewAppeared : BookmarksAction
- data class FoldersLoaded(val folders: List<SelectFolderItem>) : BookmarksAction
- data class ItemClicked(val folder: SelectFolderItem) : BookmarksAction
+internal sealed class SelectFolderAction : BookmarksAction {
+ data object ViewAppeared : SelectFolderAction()
+ data class FoldersLoaded(val folders: List<SelectFolderItem>) : SelectFolderAction()
+ data class ItemClicked(val folder: SelectFolderItem) : SelectFolderAction()
}
-internal sealed class OpenTabsConfirmationDialogAction {
+internal sealed class OpenTabsConfirmationDialogAction : BookmarksAction {
data class Present(
val guid: String,
val count: Int,
val isPrivate: Boolean,
- ) : BookmarksAction
- data object ConfirmTapped : BookmarksAction
- data object CancelTapped : BookmarksAction
+ ) : OpenTabsConfirmationDialogAction()
+ data object ConfirmTapped : OpenTabsConfirmationDialogAction()
+ data object CancelTapped : OpenTabsConfirmationDialogAction()
}
-internal sealed class DeletionDialogAction {
- data class CountLoaded(val count: Int) : BookmarksAction
- data object CancelTapped : BookmarksAction
- data object DeleteTapped : BookmarksAction
+internal sealed class DeletionDialogAction : BookmarksAction {
+ data class CountLoaded(val count: Int) : DeletionDialogAction()
+ data object CancelTapped : DeletionDialogAction()
+ data object DeleteTapped : DeletionDialogAction()
}
-internal sealed class SnackbarAction {
- data object Undo : BookmarksAction
- data object Dismissed : BookmarksAction
+internal sealed class SnackbarAction : BookmarksAction {
+ data object Undo : SnackbarAction()
+ data object Dismissed : SnackbarAction()
}
diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksReducer.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksReducer.kt
@@ -9,7 +9,6 @@ import mozilla.appservices.places.BookmarkRoot
/**
* Function for reducing a new bookmarks state based on the received action.
*/
-@Suppress("LongMethod")
internal fun bookmarksReducer(state: BookmarksState, action: BookmarksAction) = when (action) {
is InitEditLoaded -> state.copy(
currentFolder = action.folder,
@@ -46,126 +45,25 @@ internal fun bookmarksReducer(state: BookmarksState, action: BookmarksAction) =
} else {
state
}
- is AddFolderAction.FolderCreated -> state.copy(
- bookmarksSelectFolderState = null,
- bookmarksEditBookmarkState = state.bookmarksEditBookmarkState?.copy(
- folder = action.folder,
- ),
- )
- is AddFolderAction.TitleChanged -> state.copy(
- bookmarksAddFolderState = state.bookmarksAddFolderState?.copy(
- folderBeingAddedTitle = action.updatedText,
- ),
- )
- is EditBookmarkAction.TitleChanged -> state.copy(
- bookmarksEditBookmarkState = state.bookmarksEditBookmarkState?.let {
- it.copy(
- bookmark = it.bookmark.copy(title = action.title),
- )
- },
- )
- is EditBookmarkAction.URLChanged -> state.copy(
- bookmarksEditBookmarkState = state.bookmarksEditBookmarkState?.let {
- it.copy(
- bookmark = it.bookmark.copy(url = action.url),
- )
- },
- )
- is SelectFolderAction.FoldersLoaded -> state.copy(
- bookmarksSelectFolderState = state.bookmarksSelectFolderState?.copy(
- folders = action.folders,
- ) ?: BookmarksSelectFolderState(folders = action.folders, outerSelectionGuid = BookmarkRoot.Mobile.id),
- )
AddFolderClicked -> state.copy(
bookmarksAddFolderState = BookmarksAddFolderState(
parent = state.currentFolder,
folderBeingAddedTitle = "",
),
)
- is SelectFolderAction.ItemClicked -> state.updateSelectedFolder(action.folder)
- EditBookmarkAction.DeleteClicked -> state.copy(
- bookmarksSnackbarState = state.bookmarksEditBookmarkState?.let {
- state.bookmarksSnackbarState.addGuidToDelete(it.bookmark.guid)
- } ?: BookmarksSnackbarState.None,
- bookmarksEditBookmarkState = null,
- )
+ is SelectFolderAction -> state.handleSelectFolderAction(action)
BackClicked -> state.respondToBackClick()
- EditBookmarkAction.FolderClicked -> state.copy(
- bookmarksSelectFolderState = BookmarksSelectFolderState(
- outerSelectionGuid = state.bookmarksEditBookmarkState?.folder?.guid ?: state.currentFolder.guid,
- ),
- )
- AddFolderAction.ParentFolderClicked -> state.copy(
- bookmarksSelectFolderState = state.bookmarksSelectFolderState?.copy(
- innerSelectionGuid = state.bookmarksAddFolderState?.parent?.guid ?: state.currentFolder.guid,
- ) ?: BookmarksSelectFolderState(
- outerSelectionGuid = state.bookmarksAddFolderState?.parent?.guid ?: state.currentFolder.guid,
- ),
- )
- is EditFolderAction.TitleChanged -> state.copy(
- bookmarksEditFolderState = state.bookmarksEditFolderState?.let {
- it.copy(
- folder = it.folder.copy(title = action.updatedText),
- )
- },
- )
- EditFolderAction.ParentFolderClicked -> state.copy(
- bookmarksSelectFolderState = state.bookmarksSelectFolderState?.copy(
- innerSelectionGuid = state.bookmarksEditFolderState?.parent?.guid ?: state.currentFolder.guid,
- ) ?: BookmarksSelectFolderState(
- outerSelectionGuid = state.bookmarksEditFolderState?.parent?.guid ?: state.currentFolder.guid,
- ),
- )
- EditFolderAction.DeleteClicked -> state.bookmarksEditFolderState?.folder?.guid?.let {
- state.copy(
- bookmarksDeletionDialogState = DeletionDialogState.LoadingCount(
- listOf(state.bookmarksEditFolderState.folder.guid),
- ),
- )
- } ?: state
+ is EditBookmarkAction -> state.handleEditBookmarkAction(action)
+ is AddFolderAction -> state.handleAddFolderAction(action)
+ is EditFolderAction -> state.handleEditFolderAction(action)
is BookmarksListMenuAction -> state.handleListMenuAction(action)
- SnackbarAction.Undo -> {
- state.copy(
- bookmarksSnackbarState = BookmarksSnackbarState.None,
- bookmarksDeletionSnackbarQueueCount = 0,
- )
- }
- SnackbarAction.Dismissed -> {
- if (state.bookmarksDeletionSnackbarQueueCount > 1) {
- state.copy(bookmarksDeletionSnackbarQueueCount = state.bookmarksDeletionSnackbarQueueCount - 1)
- } else {
- state
- .withDeletedItemsRemoved()
- .copy(
- bookmarksSnackbarState = BookmarksSnackbarState.None,
- bookmarksDeletionSnackbarQueueCount = 0,
- )
- }
- }
- is DeletionDialogAction.CountLoaded -> state.copy(
- bookmarksDeletionDialogState = DeletionDialogState.Presenting(
- guidsToDelete = state.bookmarksDeletionDialogState.guidsToDelete,
- recursiveCount = action.count,
- ),
- )
- DeletionDialogAction.CancelTapped -> state.copy(bookmarksDeletionDialogState = DeletionDialogState.None)
- DeletionDialogAction.DeleteTapped -> {
- state.withDeletedItemsRemoved().copy(bookmarksDeletionDialogState = DeletionDialogState.None)
- }
- is OpenTabsConfirmationDialogAction.Present -> state.copy(
- openTabsConfirmationDialog = OpenTabsConfirmationDialog.Presenting(
- guidToOpen = action.guid,
- numberOfTabs = action.count,
- isPrivate = action.isPrivate,
- ),
- )
+ is SnackbarAction -> state.handleSnackbarAction(action)
+ is DeletionDialogAction -> state.handleDeletionDialogAction(action)
+ is OpenTabsConfirmationDialogAction -> state.handleOpenTabsConfirmationDialogAction(action)
is ReceivedSyncSignInUpdate -> {
state.copy(isSignedIntoSync = action.isSignedIn)
}
CloseClicked,
- OpenTabsConfirmationDialogAction.CancelTapped,
- OpenTabsConfirmationDialogAction.ConfirmTapped,
- -> state.copy(openTabsConfirmationDialog = OpenTabsConfirmationDialog.None)
FirstSyncCompleted,
ViewDisposed,
SelectFolderAction.ViewAppeared,
@@ -176,6 +74,165 @@ internal fun bookmarksReducer(state: BookmarksState, action: BookmarksAction) =
-> state
}
+private fun BookmarksState.handleOpenTabsConfirmationDialogAction(
+ action: OpenTabsConfirmationDialogAction,
+): BookmarksState {
+ return when (action) {
+ OpenTabsConfirmationDialogAction.CancelTapped,
+ OpenTabsConfirmationDialogAction.ConfirmTapped,
+ -> this.copy(openTabsConfirmationDialog = OpenTabsConfirmationDialog.None)
+
+ is OpenTabsConfirmationDialogAction.Present -> this.copy(
+ openTabsConfirmationDialog = OpenTabsConfirmationDialog.Presenting(
+ guidToOpen = action.guid,
+ numberOfTabs = action.count,
+ isPrivate = action.isPrivate,
+ ),
+ )
+ }
+}
+
+private fun BookmarksState.handleSelectFolderAction(action: SelectFolderAction): BookmarksState {
+ return when (action) {
+ is SelectFolderAction.ItemClicked -> updateSelectedFolder(action.folder)
+ is SelectFolderAction.FoldersLoaded -> copy(
+ bookmarksSelectFolderState = bookmarksSelectFolderState?.copy(
+ folders = action.folders,
+ ) ?: BookmarksSelectFolderState(
+ folders = action.folders,
+ outerSelectionGuid = BookmarkRoot.Mobile.id,
+ ),
+ )
+
+ SelectFolderAction.ViewAppeared -> this
+ }
+}
+
+private fun BookmarksState.handleEditBookmarkAction(action: EditBookmarkAction): BookmarksState {
+ return when (action) {
+ EditBookmarkAction.FolderClicked -> copy(
+ bookmarksSelectFolderState = BookmarksSelectFolderState(
+ outerSelectionGuid = bookmarksEditBookmarkState?.folder?.guid ?: currentFolder.guid,
+ ),
+ )
+
+ EditBookmarkAction.DeleteClicked -> this.copy(
+ bookmarksSnackbarState = bookmarksEditBookmarkState?.let {
+ bookmarksSnackbarState.addGuidToDelete(it.bookmark.guid)
+ } ?: BookmarksSnackbarState.None,
+ bookmarksEditBookmarkState = null,
+ )
+
+ is EditBookmarkAction.TitleChanged -> this.copy(
+ bookmarksEditBookmarkState = bookmarksEditBookmarkState?.let {
+ it.copy(
+ bookmark = it.bookmark.copy(title = action.title),
+ )
+ },
+ )
+
+ is EditBookmarkAction.URLChanged -> this.copy(
+ bookmarksEditBookmarkState = bookmarksEditBookmarkState?.let {
+ it.copy(
+ bookmark = it.bookmark.copy(url = action.url),
+ )
+ },
+ )
+ }
+}
+
+private fun BookmarksState.handleAddFolderAction(action: AddFolderAction): BookmarksState {
+ return when (action) {
+ is AddFolderAction.ParentFolderClicked -> this.copy(
+ bookmarksSelectFolderState = bookmarksSelectFolderState?.copy(
+ innerSelectionGuid = bookmarksAddFolderState?.parent?.guid ?: currentFolder.guid,
+ ) ?: BookmarksSelectFolderState(
+ outerSelectionGuid = bookmarksAddFolderState?.parent?.guid ?: currentFolder.guid,
+ ),
+ )
+
+ is AddFolderAction.FolderCreated -> this.copy(
+ bookmarksSelectFolderState = null,
+ bookmarksEditBookmarkState = bookmarksEditBookmarkState?.copy(
+ folder = action.folder,
+ ),
+ )
+
+ is AddFolderAction.TitleChanged -> this.copy(
+ bookmarksAddFolderState = bookmarksAddFolderState?.copy(
+ folderBeingAddedTitle = action.updatedText,
+ ),
+ )
+ }
+}
+
+private fun BookmarksState.handleEditFolderAction(action: EditFolderAction): BookmarksState {
+ return when (action) {
+ is EditFolderAction.TitleChanged -> this.copy(
+ bookmarksEditFolderState = bookmarksEditFolderState?.let {
+ it.copy(
+ folder = it.folder.copy(title = action.updatedText),
+ )
+ },
+ )
+
+ is EditFolderAction.ParentFolderClicked -> this.copy(
+ bookmarksSelectFolderState = bookmarksSelectFolderState?.copy(
+ innerSelectionGuid = bookmarksEditFolderState?.parent?.guid ?: currentFolder.guid,
+ ) ?: BookmarksSelectFolderState(
+ outerSelectionGuid = bookmarksEditFolderState?.parent?.guid ?: currentFolder.guid,
+ ),
+ )
+
+ is EditFolderAction.DeleteClicked -> bookmarksEditFolderState?.folder?.guid?.let {
+ this.copy(
+ bookmarksDeletionDialogState = DeletionDialogState.LoadingCount(
+ listOf(bookmarksEditFolderState.folder.guid),
+ ),
+ )
+ } ?: this
+ }
+}
+
+private fun BookmarksState.handleSnackbarAction(action: SnackbarAction): BookmarksState {
+ return when (action) {
+ SnackbarAction.Undo -> {
+ this.copy(
+ bookmarksSnackbarState = BookmarksSnackbarState.None,
+ bookmarksDeletionSnackbarQueueCount = 0,
+ )
+ }
+
+ SnackbarAction.Dismissed -> {
+ if (bookmarksDeletionSnackbarQueueCount > 1) {
+ this.copy(bookmarksDeletionSnackbarQueueCount = bookmarksDeletionSnackbarQueueCount - 1)
+ } else {
+ withDeletedItemsRemoved()
+ .copy(
+ bookmarksSnackbarState = BookmarksSnackbarState.None,
+ bookmarksDeletionSnackbarQueueCount = 0,
+ )
+ }
+ }
+ }
+}
+
+private fun BookmarksState.handleDeletionDialogAction(action: DeletionDialogAction): BookmarksState {
+ return when (action) {
+ is DeletionDialogAction.CountLoaded -> this.copy(
+ bookmarksDeletionDialogState = DeletionDialogState.Presenting(
+ guidsToDelete = bookmarksDeletionDialogState.guidsToDelete,
+ recursiveCount = action.count,
+ ),
+ )
+
+ DeletionDialogAction.CancelTapped -> this.copy(bookmarksDeletionDialogState = DeletionDialogState.None)
+ DeletionDialogAction.DeleteTapped -> {
+ withDeletedItemsRemoved().copy(bookmarksDeletionDialogState = DeletionDialogState.None)
+ }
+ }
+}
+
private fun BookmarksState.withDeletedItemsRemoved(): BookmarksState = when {
bookmarksDeletionDialogState is DeletionDialogState.Presenting -> copy(
bookmarkItems = bookmarkItems.filterNot { bookmarksDeletionDialogState.guidsToDelete.contains(it.guid) },
diff --git a/mobile/android/fenix/config/detekt-baseline.xml b/mobile/android/fenix/config/detekt-baseline.xml
@@ -15,7 +15,6 @@
<ID>ForbiddenSuppress:BookmarkFragment.kt$BookmarkFragment$@Suppress("LongMethod")</ID>
<ID>ForbiddenSuppress:BookmarksMiddleware.kt$BookmarksMiddleware$@Suppress("LongMethod")</ID>
<ID>ForbiddenSuppress:BookmarksMiddleware.kt$BookmarksMiddleware$@Suppress("LongMethod", "ComplexMethod")</ID>
- <ID>ForbiddenSuppress:BookmarksReducer.kt$@Suppress("LongMethod")</ID>
<ID>ForbiddenSuppress:BookmarksScreen.kt$@Suppress("LongMethod", "ComplexMethod")</ID>
<ID>ForbiddenSuppress:BookmarksTelemetryMiddleware.kt$BookmarksTelemetryMiddleware$@Suppress("LongMethod", "ComplexMethod")</ID>
<ID>ForbiddenSuppress:BrowserFragment.kt$BrowserFragment$@Suppress("LongMethod")</ID>