@@ -97,11 +97,9 @@ import com.nextcloud.talk.jobs.AccountRemovalWorker
9797import com.nextcloud.talk.jobs.ContactAddressBookWorker.Companion.run
9898import com.nextcloud.talk.jobs.DeleteConversationWorker
9999import com.nextcloud.talk.jobs.UploadAndShareFilesWorker
100- import com.nextcloud.talk.messagesearch.MessageSearchHelper
101100import com.nextcloud.talk.models.domain.ConversationModel
102101import com.nextcloud.talk.models.domain.SearchMessageEntry
103102import com.nextcloud.talk.models.json.conversations.ConversationEnums
104- import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository
105103import com.nextcloud.talk.settings.SettingsActivity
106104import com.nextcloud.talk.threadsoverview.ThreadsOverviewActivity
107105import com.nextcloud.talk.ui.BackgroundVoiceMessageCard
@@ -143,7 +141,6 @@ import io.reactivex.Observable
143141import io.reactivex.android.schedulers.AndroidSchedulers
144142import io.reactivex.disposables.Disposable
145143import io.reactivex.schedulers.Schedulers
146- import io.reactivex.subjects.BehaviorSubject
147144import kotlinx.coroutines.flow.MutableStateFlow
148145import kotlinx.coroutines.flow.collect
149146import kotlinx.coroutines.flow.onEach
@@ -168,9 +165,6 @@ class ConversationsListActivity : BaseActivity() {
168165 @Inject
169166 lateinit var ncApi: NcApi
170167
171- @Inject
172- lateinit var unifiedSearchRepository: UnifiedSearchRepository
173-
174168 @Inject
175169 lateinit var platformPermissionUtil: PlatformPermissionUtil
176170
@@ -220,16 +214,7 @@ class ConversationsListActivity : BaseActivity() {
220214 private var selectedMessageId: String? = null
221215 private var forwardMessage: Boolean = false
222216 private var conversationsListBottomDialog: ConversationsListBottomDialog ? = null
223- private var searchHelper: MessageSearchHelper ? = null
224217 private var searchViewDisposable: Disposable ? = null
225- private var filterState =
226- mutableMapOf (
227- MENTION to false ,
228- UNREAD to false ,
229- ARCHIVE to false ,
230- FilterConversationFragment .DEFAULT to true
231- )
232- val searchBehaviorSubject = BehaviorSubject .createDefault(false )
233218 private lateinit var accountIconBadge: BadgeDrawable
234219
235220 private val onBackPressedCallback = object : OnBackPressedCallback (true ) {
@@ -303,21 +288,10 @@ class ConversationsListActivity : BaseActivity() {
303288 showServerEOLDialog()
304289 return
305290 }
306- currentUser?.capabilities?.spreedCapability?.let { spreedCapabilities ->
307- if (hasSpreedFeatureCapability(spreedCapabilities, SpreedFeatures .UNIFIED_SEARCH )) {
308- searchHelper = MessageSearchHelper (
309- unifiedSearchRepository = unifiedSearchRepository,
310- currentUser = currentUser!!
311- )
312- }
313- }
314291 credentials = ApiUtils .getCredentials(currentUser!! .username, currentUser!! .token)
315292
316293 loadUserAvatar(binding.switchAccountButton)
317294 viewThemeUtils.material.colorMaterialTextButton(binding.switchAccountButton)
318- val isSearchCurrentlyActive = conversationsListViewModel.isSearchActiveFlow.value
319- searchBehaviorSubject.onNext(isSearchCurrentlyActive)
320- conversationsListViewModel.setIsSearchActive(isSearchCurrentlyActive)
321295 conversationsListViewModel.setHideRoomToken(intent.getStringExtra(KEY_FORWARD_HIDE_SOURCE_ROOM ))
322296 fetchRooms()
323297 fetchPendingInvitations()
@@ -328,9 +302,7 @@ class ConversationsListActivity : BaseActivity() {
328302
329303 showSearchOrToolbar()
330304 conversationsListViewModel.checkIfThreadsExist()
331- // initialise filter state in ViewModel
332- getFilterStates()
333- conversationsListViewModel.applyFilter(filterState)
305+ conversationsListViewModel.reloadFilterFromStorage(UserIdUtils .getIdForUser(currentUser))
334306 }
335307
336308 override fun onPause () {
@@ -433,6 +405,15 @@ class ConversationsListActivity : BaseActivity() {
433405 }.collect()
434406 }
435407
408+ lifecycleScope.launch {
409+ conversationsListViewModel.filterStateFlow.collect { filterState ->
410+ val archiveFilterOn = filterState[ARCHIVE ] == true
411+ showNoArchivedViewState.value = archiveFilterOn
412+ if (archiveFilterOn) showUnreadBubbleState.value = false
413+ updateFilterConversationButtonColor()
414+ }
415+ }
416+
436417 lifecycleScope.launch {
437418 chatViewModel.backgroundPlayUIFlow.onEach { msg ->
438419 binding.composeViewForBackgroundPlay.apply {
@@ -507,26 +488,24 @@ class ConversationsListActivity : BaseActivity() {
507488 }
508489
509490 fun applyFilter () {
510- getFilterStates()
511- conversationsListViewModel.applyFilter(filterState)
512- updateFilterConversationButtonColor()
491+ conversationsListViewModel.reloadFilterFromStorage(UserIdUtils .getIdForUser(currentUser))
513492 }
514493
515- private fun hasFilterEnabled (): Boolean {
516- for (( k, v) in filterState) {
517- if ( k != FilterConversationFragment .DEFAULT && v) return true
494+ private fun hasFilterEnabled (): Boolean =
495+ conversationsListViewModel.filterStateFlow.value.any { ( k, v) ->
496+ k != FilterConversationFragment .DEFAULT && v
518497 }
519- return false
520- }
521498
522499 fun showOnlyNearFutureEvents () {
523500 // Reset all filters so the ViewModel's default view (non-archived, non-future-events) is shown
524- filterState[MENTION ] = false
525- filterState[UNREAD ] = false
526- filterState[ARCHIVE ] = false
527- filterState[FilterConversationFragment .DEFAULT ] = true
528- conversationsListViewModel.applyFilter(filterState)
529- updateFilterConversationButtonColor()
501+ conversationsListViewModel.applyFilter(
502+ mapOf (
503+ MENTION to false ,
504+ UNREAD to false ,
505+ ARCHIVE to false ,
506+ FilterConversationFragment .DEFAULT to true
507+ )
508+ )
530509 }
531510
532511 private fun setupConversationList () {
@@ -617,34 +596,19 @@ class ConversationsListActivity : BaseActivity() {
617596 }
618597 updateFilterConversationButtonColor()
619598 binding.filterConversationsButton.setOnClickListener {
620- val newFragment = FilterConversationFragment .newInstance(filterState)
599+ val newFragment = FilterConversationFragment .newInstance(
600+ conversationsListViewModel.filterStateFlow.value.toMutableMap()
601+ )
621602 newFragment.show(supportFragmentManager, FilterConversationFragment .TAG )
622603 }
623604 binding.threadsButton.setOnClickListener { openFollowedThreadsOverview() }
624605 viewThemeUtils.platform.colorImageView(binding.threadsButton, ColorRole .ON_SURFACE_VARIANT )
625606 }
626607
627- fun getFilterStates () {
628- val accountId = UserIdUtils .getIdForUser(currentUser)
629- filterState[UNREAD ] = (
630- arbitraryStorageManager.getStorageSetting(accountId, UNREAD , " " ).blockingGet()?.value ? : " "
631- ) == " true"
632- filterState[MENTION ] = (
633- arbitraryStorageManager.getStorageSetting(accountId, MENTION , " " ).blockingGet()?.value ? : " "
634- ) == " true"
635- filterState[ARCHIVE ] = (
636- arbitraryStorageManager.getStorageSetting(accountId, ARCHIVE , " " ).blockingGet()?.value ? : " "
637- ) == " true"
638- }
639-
640608 fun filterConversation () {
641- // Delegate to ViewModel; FilterConversationFragment still calls this via cast
642- getFilterStates()
643- val archiveFilterOn = filterState[ARCHIVE ] == true
644- showNoArchivedViewState.value = archiveFilterOn
645- conversationsListViewModel.applyFilter(filterState)
646- if (archiveFilterOn) showUnreadBubbleState.value = false
647- updateFilterConversationButtonColor()
609+ // Delegate to ViewModel; FilterConversationFragment still calls this via cast.
610+ // filterStateFlow observer in initObservers handles showNoArchivedViewState + button colour.
611+ conversationsListViewModel.reloadFilterFromStorage(UserIdUtils .getIdForUser(currentUser))
648612 }
649613
650614 private fun setupActionBar () {
@@ -823,7 +787,7 @@ class ConversationsListActivity : BaseActivity() {
823787 supportActionBar?.setTitle(R .string.nc_forward_to_three_dots)
824788 } else {
825789 searchItem!! .isVisible = conversationsListViewModel.conversationListEntriesFlow.value.isNotEmpty()
826- if (searchBehaviorSubject. value == true && searchView != null ) {
790+ if (conversationsListViewModel.isSearchActiveFlow. value && searchView != null ) {
827791 showSearchView(searchView, searchItem)
828792 val savedQuery = conversationsListViewModel.currentSearchQueryFlow.value
829793 if (savedQuery.isNotEmpty()) {
@@ -859,17 +823,13 @@ class ConversationsListActivity : BaseActivity() {
859823 searchItem!! .setOnActionExpandListener(object : MenuItem .OnActionExpandListener {
860824 override fun onMenuItemActionExpand (item : MenuItem ): Boolean {
861825 initSearchDisposable()
862- searchBehaviorSubject.onNext(true )
863826 conversationsListViewModel.setIsSearchActive(true )
864827 return true
865828 }
866829
867830 override fun onMenuItemActionCollapse (item : MenuItem ): Boolean {
868- searchBehaviorSubject.onNext(false )
869831 conversationsListViewModel.setIsSearchActive(false )
870- if (searchHelper != null ) {
871- searchHelper!! .cancelSearch()
872- }
832+ conversationsListViewModel.cancelSearch()
873833 searchView!! .onActionViewCollapsed()
874834
875835 binding.conversationListAppbar.stateListAnimator = AnimatorInflater .loadStateListAnimator(
@@ -1146,7 +1106,7 @@ class ConversationsListActivity : BaseActivity() {
11461106
11471107 @Suppress(" Detekt.TooGenericExceptionCaught" )
11481108 private fun checkToShowUnreadBubble (lastVisibleIndex : Int ) {
1149- if (searchBehaviorSubject.value == true || conversationsListViewModel.isSearchActiveFlow.value) {
1109+ if (conversationsListViewModel.isSearchActiveFlow.value) {
11501110 nextUnreadConversationScrollPosition = 0
11511111 showUnreadBubbleState.value = false
11521112 return
0 commit comments