diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt index f34462b7e5..ef0c37a3d9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt @@ -382,9 +382,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner } override fun onSearchClick() { - conversationListTabsViewModel.onSearchOpened() toolbarViewModel.setToolbarMode(MainToolbarMode.SEARCH) - toolbarViewModel.emitEvent(MainToolbarViewModel.Event.Search.Open) } override fun onClearCallHistoryClick() { @@ -404,9 +402,7 @@ class MainActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner } override fun onCloseSearchClick() { - conversationListTabsViewModel.onSearchClosed() toolbarViewModel.setToolbarMode(MainToolbarMode.FULL) - toolbarViewModel.emitEvent(MainToolbarViewModel.Event.Search.Close) } override fun onCloseArchiveClick() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt index da75476e6b..6b62959d8e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogFragment.kt @@ -416,7 +416,6 @@ class CallLogFragment : Fragment(R.layout.call_log_fragment), CallLogAdapter.Cal private fun closeSearchIfOpen(): Boolean { if (isSearchOpen()) { mainToolbarViewModel.setToolbarMode(MainToolbarMode.FULL) - tabsViewModel.onSearchClosed() return true } return false diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index 7ece58ed0e..d9e8b21fa2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -663,7 +663,6 @@ public class ConversationListFragment extends MainFragment implements ActionMode setAdapter(defaultAdapter); fadeInButtonsAndMegaphone(250); mainToolbarViewModel.setToolbarMode(MainToolbarMode.FULL); - conversationListTabsViewModel.onSearchClosed(); return true; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/MainToolbarViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/main/MainToolbarViewModel.kt index b9414675f6..e2138efa6e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/MainToolbarViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/MainToolbarViewModel.kt @@ -64,9 +64,13 @@ class MainToolbarViewModel : ViewModel() { @JvmOverloads fun setToolbarMode(mode: MainToolbarMode, destination: MainNavigationDestination? = null) { + val previousMode = internalStateFlow.value.mode + internalStateFlow.update { it.copy(mode = mode, destination = destination ?: it.destination, searchQuery = "") } + + emitPossibleSearchStateChangeEvent(previousMode, mode) } fun setProxyState(proxyState: MainToolbarState.ProxyState) { @@ -147,6 +151,14 @@ class MainToolbarViewModel : ViewModel() { } } + private fun emitPossibleSearchStateChangeEvent(previousMode: MainToolbarMode, mode: MainToolbarMode) { + if (previousMode == MainToolbarMode.SEARCH && mode != MainToolbarMode.SEARCH) { + emitEvent(Event.Search.Close) + } else if (mode == MainToolbarMode.SEARCH && previousMode != MainToolbarMode.SEARCH) { + emitEvent(Event.Search.Open) + } + } + sealed interface Event { sealed interface Search : Event { data object Open : Search diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt index fc5c8d2c9c..b90baed892 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingFragment.kt @@ -415,7 +415,6 @@ class StoriesLandingFragment : DSLSettingsFragment(layoutId = R.layout.stories_l private fun closeSearchIfOpen(): Boolean { if (isSearchOpen()) { mainToolbarViewModel.setToolbarMode(MainToolbarMode.FULL) - tabsViewModel.onSearchClosed() return true } return false diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt index 4f7827a0a8..677931d5a2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment.kt @@ -1,15 +1,26 @@ package org.thoughtcrime.securesms.stories.tabs +import android.os.Bundle +import android.view.View import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rxjava3.subscribeAsState +import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.launch import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.main.MainNavigationBar import org.thoughtcrime.securesms.main.MainNavigationDestination import org.thoughtcrime.securesms.main.MainNavigationRail import org.thoughtcrime.securesms.main.MainNavigationState +import org.thoughtcrime.securesms.main.MainToolbarMode +import org.thoughtcrime.securesms.main.MainToolbarViewModel import org.thoughtcrime.securesms.window.Navigation import org.thoughtcrime.securesms.window.WindowSizeClass @@ -19,6 +30,38 @@ import org.thoughtcrime.securesms.window.WindowSizeClass class ConversationListTabsFragment : ComposeFragment() { private val viewModel: ConversationListTabsViewModel by viewModels(ownerProducer = { requireActivity() }) + private val mainToolbarViewModel: MainToolbarViewModel by activityViewModels() + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewLifecycleOwner.lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.RESUMED) { + mainToolbarViewModel.state.map { it.mode }.collectLatest { + when (it) { + MainToolbarMode.ACTION_MODE -> { + viewModel.onMultiSelectStarted() + viewModel.onSearchClosed() + } + MainToolbarMode.FULL -> { + viewModel.onMultiSelectFinished() + viewModel.onSearchClosed() + viewModel.isShowingArchived(false) + } + MainToolbarMode.BASIC -> { + viewModel.onMultiSelectFinished() + viewModel.onSearchClosed() + viewModel.isShowingArchived(true) + } + MainToolbarMode.SEARCH -> { + viewModel.onMultiSelectFinished() + viewModel.onSearchOpened() + } + } + } + } + } + } @Composable override fun FragmentContent() {