tor-browser

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

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:
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksAction.kt | 52++++++++++++++++++++++++++--------------------------
Mmobile/android/fenix/app/src/main/java/org/mozilla/fenix/bookmarks/BookmarksReducer.kt | 275++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Mmobile/android/fenix/config/detekt-baseline.xml | 1-
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>