Skip to content

Commit 8bd8894

Browse files
style(conv-list): resize fab to properly show the drop shadow
AI-assistant: Copilot 1.0.10 (Claude Sonnet 4.6) Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
1 parent ac2ee96 commit 8bd8894

9 files changed

Lines changed: 221 additions & 889 deletions

app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.kt

Lines changed: 0 additions & 531 deletions
This file was deleted.

app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt

Lines changed: 31 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,9 @@ import com.nextcloud.talk.jobs.AccountRemovalWorker
9797
import com.nextcloud.talk.jobs.ContactAddressBookWorker.Companion.run
9898
import com.nextcloud.talk.jobs.DeleteConversationWorker
9999
import com.nextcloud.talk.jobs.UploadAndShareFilesWorker
100-
import com.nextcloud.talk.messagesearch.MessageSearchHelper
101100
import com.nextcloud.talk.models.domain.ConversationModel
102101
import com.nextcloud.talk.models.domain.SearchMessageEntry
103102
import com.nextcloud.talk.models.json.conversations.ConversationEnums
104-
import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository
105103
import com.nextcloud.talk.settings.SettingsActivity
106104
import com.nextcloud.talk.threadsoverview.ThreadsOverviewActivity
107105
import com.nextcloud.talk.ui.BackgroundVoiceMessageCard
@@ -143,7 +141,6 @@ import io.reactivex.Observable
143141
import io.reactivex.android.schedulers.AndroidSchedulers
144142
import io.reactivex.disposables.Disposable
145143
import io.reactivex.schedulers.Schedulers
146-
import io.reactivex.subjects.BehaviorSubject
147144
import kotlinx.coroutines.flow.MutableStateFlow
148145
import kotlinx.coroutines.flow.collect
149146
import 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

app/src/main/java/com/nextcloud/talk/conversationlist/ui/ConversationListFab.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ fun ConversationListFab(isVisible: Boolean, isEnabled: Boolean, onClick: () -> U
4848
) {
4949
FloatingActionButton(
5050
onClick = { if (isEnabled) onClick() },
51-
modifier = Modifier.alpha(if (isEnabled) 1f else DISABLED_ALPHA)
51+
modifier = Modifier
52+
.padding(8.dp)
53+
.alpha(if (isEnabled) 1f else DISABLED_ALPHA)
5254
) {
5355
Icon(
5456
painter = painterResource(R.drawable.ic_pencil_grey600_24dp),

0 commit comments

Comments
 (0)