feat: Multiselect and swipe messages on search#2914
Open
solrubado wants to merge 52 commits into
Open
Conversation
There was a problem hiding this comment.
Pull request overview
This PR extends the existing thread multi-selection feature to work from the Search screen by reusing the same toolbar/quick-action UI and routing actions through updated navigation args (isFromSearch) so action sheets can behave appropriately when invoked from search results.
Changes:
- Added multiselect UI + quick action bar support to
SearchFragment, and extracted the multiselect info toolbar into a reusable layout include. - Refactored multi-selection state (on/off + selected threads) out of
MainViewModelinto a dedicatedMultiselectionViewModel. - Updated navigation/actions bottom sheets to support “from search” behavior (new
isFromSearchargument) and refresh search results after actions.
Reviewed changes
Copilot reviewed 31 out of 31 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| app/src/main/res/navigation/main_navigation.xml | Adds isFromSearch args + new navigation actions from search to action sheets. |
| app/src/main/res/layout/view_multiselection_info_toolbar.xml | New reusable included toolbar layout for multiselect info/actions. |
| app/src/main/res/layout/fragment_thread_list.xml | Replaces inline multiselect toolbar with included reusable layout. |
| app/src/main/res/layout/fragment_search.xml | Adds included multiselect toolbar + bottom quick action bar; adjusts IDs/padding. |
| app/src/main/java/com/infomaniak/mail/useCases/MessagesActions.kt | Adds helper to filter messages eligible for move/archive. |
| app/src/main/java/com/infomaniak/mail/ui/newMessage/encryption/EncryptionActionsBottomSheet.kt | Updates base bottom-sheet dependency from mainViewModel to multiselectionViewModel. |
| app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt | Removes multi-selection state previously stored in MainViewModel. |
| app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt | Back-press handling now closes multiselect via MultiselectionViewModel. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/ThreadFragment.kt | Propagates isFromSearch when opening thread actions. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/encryption/UnencryptableRecipientsBottomSheetDialog.kt | Updates base bottom-sheet dependency to multiselection viewmodel. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/DetailedContactBottomSheetDialog.kt | Updates base bottom-sheet dependency to multiselection viewmodel. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/UserToBlockBottomSheetDialog.kt | Updates base bottom-sheet dependency to multiselection viewmodel. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/ThreadActionsViewModel.kt | Makes missing threadUid error explicit. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/ThreadActionsBottomSheetDialog.kt | Adds search-specific behavior and triggers search refresh after actions. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/ReplyBottomSheetDialog.kt | Updates base bottom-sheet dependency to multiselection viewmodel. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/multiselection/MultiselectionViewModel.kt | New central ViewModel to manage multiselect state across hosts. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/multiselection/MultiselectionHost.kt | New host interface to allow reuse of multiselect logic across fragments. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/multiselection/MultiselectionBinding.kt | New binding abstraction to unify multiselect UI references. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/MultiSelectBottomSheetDialog.kt | Adds isFromSearch handling and search-aware navigation to folder picker. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/MessageActionsBottomSheetDialog.kt | Adds isFromSearch handling for substitute class name + multiselect vm hookup. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/MailActionsBottomSheetDialog.kt | Introduces substituteClassName abstraction for upgrade bottom sheet tracking. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/AttachmentActionsBottomSheetDialog.kt | Updates base bottom-sheet dependency to multiselection viewmodel. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/ActionsViewModel.kt | Uses new message-filter helper before move/archive operations. |
| app/src/main/java/com/infomaniak/mail/ui/main/thread/actions/ActionsBottomSheetDialog.kt | Base class now closes multiselect through multiselectionViewModel. |
| app/src/main/java/com/infomaniak/mail/ui/main/search/SearchViewModel.kt | Adds withContacts param to refresh/search; exposes filters. |
| app/src/main/java/com/infomaniak/mail/ui/main/search/SearchFragment.kt | Implements MultiSelectionHost, adds multiselect + swipe handling for search results. |
| app/src/main/java/com/infomaniak/mail/ui/main/folderPicker/FolderPickerFragment.kt | If isFromSearch, closes multiselect and refreshes search after move. |
| app/src/main/java/com/infomaniak/mail/ui/main/folder/TwoPaneFragment.kt | Makes localSettings overridable for subclasses. |
| app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListMultiSelection.kt | Refactors multiselect logic to be host-agnostic (thread list + search). |
| app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListFragment.kt | Implements MultiSelectionHost and wires MultiselectionViewModel into adapter + UI. |
| app/src/main/java/com/infomaniak/mail/ui/main/folder/PerformSwipeActionManager.kt | Adds a generic swipe-action API usable outside ThreadListFragment (e.g., search). |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Base automatically changed from
messages-actions-use-case
to
protected/refactor-mail-actions
May 27, 2026 09:35
3a9597c to
5b6b752
Compare
…es and show dialog
# Conflicts: # app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListMultiSelection.kt # app/src/main/java/com/infomaniak/mail/ui/main/search/SearchFragment.kt
# Conflicts: # app/src/main/java/com/infomaniak/mail/ui/main/search/SearchFragment.kt # app/src/main/java/com/infomaniak/mail/ui/main/search/SearchViewModel.kt
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



No description provided.