From 203da0f37ebbeb6e576b1a8a2ea11d8bf37c0639 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 15 Oct 2019 16:48:31 +0200 Subject: [PATCH] Mark all as read: not for all Room list and look if there is unread rooms --- .../home/room/list/RoomListFragment.kt | 22 +++++++++++++++++++ .../home/room/list/RoomListViewModel.kt | 1 - .../home/room/list/RoomListViewState.kt | 8 +++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt index 75bf15efa7..6665500676 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListFragment.kt @@ -18,6 +18,7 @@ package im.vector.riotx.features.home.room.list import android.os.Bundle import android.os.Parcelable +import android.view.Menu import android.view.MenuItem import androidx.annotation.StringRes import androidx.core.content.ContextCompat @@ -79,6 +80,8 @@ class RoomListFragment : VectorBaseFragment(), RoomSummaryController.Listener, O injector.inject(this) } + private var hasUnreadRooms = false + override fun getMenuRes() = R.menu.room_list override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -92,6 +95,11 @@ class RoomListFragment : VectorBaseFragment(), RoomSummaryController.Listener, O return super.onOptionsItemSelected(item) } + override fun onPrepareOptionsMenu(menu: Menu) { + menu.findItem(R.id.menu_home_mark_all_as_read).isVisible = hasUnreadRooms + super.onPrepareOptionsMenu(menu) + } + override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) setupCreateRoomButton() @@ -194,6 +202,20 @@ class RoomListFragment : VectorBaseFragment(), RoomSummaryController.Listener, O is Fail -> renderFailure(state.asyncFilteredRooms.error) } roomController.update(state) + + // Mark all as read menu + when (roomListParams.displayMode) { + DisplayMode.HOME, + DisplayMode.PEOPLE, + DisplayMode.ROOMS -> { + val newValue = state.hasUnread + if (hasUnreadRooms != newValue) { + hasUnreadRooms = newValue + requireActivity().invalidateOptionsMenu() + } + } + else -> Unit + } } private fun renderSuccess(state: RoomListViewState) { diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt index 292e5405c4..695ab53812 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewModel.kt @@ -203,7 +203,6 @@ class RoomListViewModel @AssistedInject constructor(@Assisted initialState: Room ?.let { session.markAllAsRead(it, object : MatrixCallback {}) } } - private fun buildRoomSummaries(rooms: List): RoomSummaries { val invites = ArrayList() val favourites = ArrayList() diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewState.kt b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewState.kt index 2f388b60d8..505554a8fb 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewState.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/list/RoomListViewState.kt @@ -20,6 +20,7 @@ import androidx.annotation.StringRes import com.airbnb.mvrx.Async import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.Uninitialized +import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.riotx.R @@ -67,6 +68,13 @@ data class RoomListViewState( RoomCategory.SERVER_NOTICE -> copy(isServerNoticeRoomsExpanded = !isServerNoticeRoomsExpanded) } } + + val hasUnread: Boolean + get() = asyncFilteredRooms.invoke() + ?.flatMap { it.value } + ?.filter { it.membership == Membership.JOIN } + ?.any { it.hasUnreadMessages } + ?: false } typealias RoomSummaries = LinkedHashMap>