Merge pull request #618 from vector-im/feature/mark_all_read
Mark all as read
This commit is contained in:
commit
b1710fde60
@ -8,6 +8,7 @@ Improvements:
|
|||||||
- Persist active tab between sessions (#503)
|
- Persist active tab between sessions (#503)
|
||||||
- Do not upload file too big for the homeserver (#587)
|
- Do not upload file too big for the homeserver (#587)
|
||||||
- Handle read markers (#84)
|
- Handle read markers (#84)
|
||||||
|
- Mark all messages as read (#396)
|
||||||
|
|
||||||
Other changes:
|
Other changes:
|
||||||
- Accessibility improvements to read receipts in the room timeline and reactions emoji chooser
|
- Accessibility improvements to read receipts in the room timeline and reactions emoji chooser
|
||||||
|
@ -53,4 +53,9 @@ interface RoomService {
|
|||||||
* @return the [LiveData] of [RoomSummary]
|
* @return the [LiveData] of [RoomSummary]
|
||||||
*/
|
*/
|
||||||
fun liveRoomSummaries(): LiveData<List<RoomSummary>>
|
fun liveRoomSummaries(): LiveData<List<RoomSummary>>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark all rooms as read
|
||||||
|
*/
|
||||||
|
fun markAllAsRead(roomIds: List<String>, callback: MatrixCallback<Unit>): Cancelable
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ import im.vector.matrix.android.internal.database.model.RoomSummaryEntityFields
|
|||||||
import im.vector.matrix.android.internal.database.query.where
|
import im.vector.matrix.android.internal.database.query.where
|
||||||
import im.vector.matrix.android.internal.session.room.create.CreateRoomTask
|
import im.vector.matrix.android.internal.session.room.create.CreateRoomTask
|
||||||
import im.vector.matrix.android.internal.session.room.membership.joining.JoinRoomTask
|
import im.vector.matrix.android.internal.session.room.membership.joining.JoinRoomTask
|
||||||
|
import im.vector.matrix.android.internal.session.room.read.MarkAllRoomsReadTask
|
||||||
import im.vector.matrix.android.internal.task.TaskExecutor
|
import im.vector.matrix.android.internal.task.TaskExecutor
|
||||||
import im.vector.matrix.android.internal.task.configureWith
|
import im.vector.matrix.android.internal.task.configureWith
|
||||||
import io.realm.Realm
|
import io.realm.Realm
|
||||||
@ -41,6 +42,7 @@ internal class DefaultRoomService @Inject constructor(private val monarchy: Mona
|
|||||||
private val roomSummaryMapper: RoomSummaryMapper,
|
private val roomSummaryMapper: RoomSummaryMapper,
|
||||||
private val createRoomTask: CreateRoomTask,
|
private val createRoomTask: CreateRoomTask,
|
||||||
private val joinRoomTask: JoinRoomTask,
|
private val joinRoomTask: JoinRoomTask,
|
||||||
|
private val markAllRoomsReadTask: MarkAllRoomsReadTask,
|
||||||
private val roomFactory: RoomFactory,
|
private val roomFactory: RoomFactory,
|
||||||
private val taskExecutor: TaskExecutor) : RoomService {
|
private val taskExecutor: TaskExecutor) : RoomService {
|
||||||
|
|
||||||
@ -80,4 +82,12 @@ internal class DefaultRoomService @Inject constructor(private val monarchy: Mona
|
|||||||
}
|
}
|
||||||
.executeBy(taskExecutor)
|
.executeBy(taskExecutor)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun markAllAsRead(roomIds: List<String>, callback: MatrixCallback<Unit>): Cancelable {
|
||||||
|
return markAllRoomsReadTask
|
||||||
|
.configureWith(MarkAllRoomsReadTask.Params(roomIds)) {
|
||||||
|
this.callback = callback
|
||||||
|
}
|
||||||
|
.executeBy(taskExecutor)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,22 +40,14 @@ import im.vector.matrix.android.internal.session.room.membership.leaving.Default
|
|||||||
import im.vector.matrix.android.internal.session.room.membership.leaving.LeaveRoomTask
|
import im.vector.matrix.android.internal.session.room.membership.leaving.LeaveRoomTask
|
||||||
import im.vector.matrix.android.internal.session.room.prune.DefaultPruneEventTask
|
import im.vector.matrix.android.internal.session.room.prune.DefaultPruneEventTask
|
||||||
import im.vector.matrix.android.internal.session.room.prune.PruneEventTask
|
import im.vector.matrix.android.internal.session.room.prune.PruneEventTask
|
||||||
|
import im.vector.matrix.android.internal.session.room.read.DefaultMarkAllRoomsReadTask
|
||||||
import im.vector.matrix.android.internal.session.room.read.DefaultSetReadMarkersTask
|
import im.vector.matrix.android.internal.session.room.read.DefaultSetReadMarkersTask
|
||||||
|
import im.vector.matrix.android.internal.session.room.read.MarkAllRoomsReadTask
|
||||||
import im.vector.matrix.android.internal.session.room.read.SetReadMarkersTask
|
import im.vector.matrix.android.internal.session.room.read.SetReadMarkersTask
|
||||||
import im.vector.matrix.android.internal.session.room.relation.DefaultFetchEditHistoryTask
|
import im.vector.matrix.android.internal.session.room.relation.*
|
||||||
import im.vector.matrix.android.internal.session.room.relation.DefaultFindReactionEventForUndoTask
|
|
||||||
import im.vector.matrix.android.internal.session.room.relation.DefaultUpdateQuickReactionTask
|
|
||||||
import im.vector.matrix.android.internal.session.room.relation.FetchEditHistoryTask
|
|
||||||
import im.vector.matrix.android.internal.session.room.relation.FindReactionEventForUndoTask
|
|
||||||
import im.vector.matrix.android.internal.session.room.relation.UpdateQuickReactionTask
|
|
||||||
import im.vector.matrix.android.internal.session.room.state.DefaultSendStateTask
|
import im.vector.matrix.android.internal.session.room.state.DefaultSendStateTask
|
||||||
import im.vector.matrix.android.internal.session.room.state.SendStateTask
|
import im.vector.matrix.android.internal.session.room.state.SendStateTask
|
||||||
import im.vector.matrix.android.internal.session.room.timeline.*
|
import im.vector.matrix.android.internal.session.room.timeline.*
|
||||||
import im.vector.matrix.android.internal.session.room.timeline.ClearUnlinkedEventsTask
|
|
||||||
import im.vector.matrix.android.internal.session.room.timeline.DefaultGetContextOfEventTask
|
|
||||||
import im.vector.matrix.android.internal.session.room.timeline.DefaultPaginationTask
|
|
||||||
import im.vector.matrix.android.internal.session.room.timeline.GetContextOfEventTask
|
|
||||||
import im.vector.matrix.android.internal.session.room.timeline.PaginationTask
|
|
||||||
import retrofit2.Retrofit
|
import retrofit2.Retrofit
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@ -110,6 +102,9 @@ internal abstract class RoomModule {
|
|||||||
@Binds
|
@Binds
|
||||||
abstract fun bindSetReadMarkersTask(setReadMarkersTask: DefaultSetReadMarkersTask): SetReadMarkersTask
|
abstract fun bindSetReadMarkersTask(setReadMarkersTask: DefaultSetReadMarkersTask): SetReadMarkersTask
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
abstract fun bindMarkAllRoomsReadTask(markAllRoomsReadTask: DefaultMarkAllRoomsReadTask): MarkAllRoomsReadTask
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
abstract fun bindFindReactionEventForUndoTask(findReactionEventForUndoTask: DefaultFindReactionEventForUndoTask): FindReactionEventForUndoTask
|
abstract fun bindFindReactionEventForUndoTask(findReactionEventForUndoTask: DefaultFindReactionEventForUndoTask): FindReactionEventForUndoTask
|
||||||
|
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.matrix.android.internal.session.room.read
|
||||||
|
|
||||||
|
import im.vector.matrix.android.internal.task.Task
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
internal interface MarkAllRoomsReadTask : Task<MarkAllRoomsReadTask.Params, Unit> {
|
||||||
|
data class Params(
|
||||||
|
val roomIds: List<String>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class DefaultMarkAllRoomsReadTask @Inject constructor(private val readMarkersTask: SetReadMarkersTask) : MarkAllRoomsReadTask {
|
||||||
|
|
||||||
|
override suspend fun execute(params: MarkAllRoomsReadTask.Params) {
|
||||||
|
params.roomIds.forEach { roomId ->
|
||||||
|
readMarkersTask.execute(SetReadMarkersTask.Params(roomId, markAllAsRead = true))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -25,7 +25,7 @@ import io.realm.Realm
|
|||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
// the receipts dictionnaries
|
// the receipts dictionaries
|
||||||
// key : $EventId
|
// key : $EventId
|
||||||
// value : dict key $UserId
|
// value : dict key $UserId
|
||||||
// value dict key ts
|
// value dict key ts
|
||||||
|
@ -32,6 +32,7 @@ import im.vector.matrix.android.api.session.room.timeline.Timeline
|
|||||||
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
|
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
|
||||||
import im.vector.matrix.android.api.session.room.timeline.TimelineSettings
|
import im.vector.matrix.android.api.session.room.timeline.TimelineSettings
|
||||||
import im.vector.matrix.android.api.util.Cancelable
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
|
import im.vector.matrix.android.api.util.Optional
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
@ -172,7 +173,6 @@ class PushrulesConditionTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class MockRoomService() : RoomService {
|
class MockRoomService() : RoomService {
|
||||||
|
|
||||||
override fun createRoom(createRoomParams: CreateRoomParams, callback: MatrixCallback<String>): Cancelable {
|
override fun createRoom(createRoomParams: CreateRoomParams, callback: MatrixCallback<String>): Cancelable {
|
||||||
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
||||||
}
|
}
|
||||||
@ -192,9 +192,21 @@ class PushrulesConditionTest {
|
|||||||
override fun liveRoomSummaries(): LiveData<List<RoomSummary>> {
|
override fun liveRoomSummaries(): LiveData<List<RoomSummary>> {
|
||||||
return MutableLiveData()
|
return MutableLiveData()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun markAllAsRead(roomIds: List<String>, callback: MatrixCallback<Unit>): Cancelable {
|
||||||
|
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MockRoom(override val roomId: String, val _numberOfJoinedMembers: Int) : Room {
|
class MockRoom(override val roomId: String, val _numberOfJoinedMembers: Int) : Room {
|
||||||
|
override fun getReadMarkerLive(): LiveData<Optional<String>> {
|
||||||
|
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getMyReadReceiptLive(): LiveData<Optional<String>> {
|
||||||
|
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
|
||||||
override fun resendTextMessage(localEcho: TimelineEvent): Cancelable? {
|
override fun resendTextMessage(localEcho: TimelineEvent): Cancelable? {
|
||||||
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
||||||
}
|
}
|
||||||
@ -242,7 +254,7 @@ class PushrulesConditionTest {
|
|||||||
override fun fetchEditHistory(eventId: String, callback: MatrixCallback<List<Event>>) {
|
override fun fetchEditHistory(eventId: String, callback: MatrixCallback<List<Event>>) {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun liveTimeLineEvent(eventId: String): LiveData<TimelineEvent> {
|
override fun getTimeLineEventLive(eventId: String): LiveData<Optional<TimelineEvent>> {
|
||||||
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,7 +262,7 @@ class PushrulesConditionTest {
|
|||||||
return _numberOfJoinedMembers
|
return _numberOfJoinedMembers
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun liveRoomSummary(): LiveData<RoomSummary> {
|
override fun getRoomSummaryLive(): LiveData<Optional<RoomSummary>> {
|
||||||
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,7 +359,7 @@ class PushrulesConditionTest {
|
|||||||
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getEventSummaryLive(eventId: String): LiveData<EventAnnotationsSummary> {
|
override fun getEventSummaryLive(eventId: String): LiveData<Optional<EventAnnotationsSummary>> {
|
||||||
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
TODO("not implemented") // To change body of created functions use File | Settings | File Templates.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ abstract class DebugMaterialThemeActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
menuInflater.inflate(R.menu.vector_home, menu)
|
menuInflater.inflate(R.menu.home, menu)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,7 +182,7 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true
|
return super.onOptionsItemSelected(item)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
override fun onBackPressed() {
|
||||||
|
@ -19,14 +19,10 @@ package im.vector.riotx.features.home.room.list
|
|||||||
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
||||||
|
|
||||||
sealed class RoomListActions {
|
sealed class RoomListActions {
|
||||||
|
|
||||||
data class SelectRoom(val roomSummary: RoomSummary) : RoomListActions()
|
data class SelectRoom(val roomSummary: RoomSummary) : RoomListActions()
|
||||||
|
|
||||||
data class ToggleCategory(val category: RoomCategory) : RoomListActions()
|
data class ToggleCategory(val category: RoomCategory) : RoomListActions()
|
||||||
|
|
||||||
data class AcceptInvitation(val roomSummary: RoomSummary) : RoomListActions()
|
data class AcceptInvitation(val roomSummary: RoomSummary) : RoomListActions()
|
||||||
|
|
||||||
data class RejectInvitation(val roomSummary: RoomSummary) : RoomListActions()
|
data class RejectInvitation(val roomSummary: RoomSummary) : RoomListActions()
|
||||||
|
|
||||||
data class FilterWith(val filter: String) : RoomListActions()
|
data class FilterWith(val filter: String) : RoomListActions()
|
||||||
|
object MarkAllRoomsRead : RoomListActions()
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,8 @@ package im.vector.riotx.features.home.room.list
|
|||||||
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
@ -78,6 +80,26 @@ class RoomListFragment : VectorBaseFragment(), RoomSummaryController.Listener, O
|
|||||||
injector.inject(this)
|
injector.inject(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var hasUnreadRooms = false
|
||||||
|
|
||||||
|
override fun getMenuRes() = R.menu.room_list
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
when (item.itemId) {
|
||||||
|
R.id.menu_home_mark_all_as_read -> {
|
||||||
|
roomListViewModel.accept(RoomListActions.MarkAllRoomsRead)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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?) {
|
override fun onActivityCreated(savedInstanceState: Bundle?) {
|
||||||
super.onActivityCreated(savedInstanceState)
|
super.onActivityCreated(savedInstanceState)
|
||||||
setupCreateRoomButton()
|
setupCreateRoomButton()
|
||||||
@ -180,6 +202,20 @@ class RoomListFragment : VectorBaseFragment(), RoomSummaryController.Listener, O
|
|||||||
is Fail -> renderFailure(state.asyncFilteredRooms.error)
|
is Fail -> renderFailure(state.asyncFilteredRooms.error)
|
||||||
}
|
}
|
||||||
roomController.update(state)
|
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) {
|
private fun renderSuccess(state: RoomListViewState) {
|
||||||
|
@ -78,6 +78,7 @@ class RoomListViewModel @AssistedInject constructor(@Assisted initialState: Room
|
|||||||
is RoomListActions.AcceptInvitation -> handleAcceptInvitation(action)
|
is RoomListActions.AcceptInvitation -> handleAcceptInvitation(action)
|
||||||
is RoomListActions.RejectInvitation -> handleRejectInvitation(action)
|
is RoomListActions.RejectInvitation -> handleRejectInvitation(action)
|
||||||
is RoomListActions.FilterWith -> handleFilter(action)
|
is RoomListActions.FilterWith -> handleFilter(action)
|
||||||
|
is RoomListActions.MarkAllRoomsRead -> handleMarkAllRoomsRead()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,6 +194,15 @@ class RoomListViewModel @AssistedInject constructor(@Assisted initialState: Room
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun handleMarkAllRoomsRead() = withState { state ->
|
||||||
|
state.asyncFilteredRooms.invoke()
|
||||||
|
?.flatMap { it.value }
|
||||||
|
?.filter { it.membership == Membership.JOIN }
|
||||||
|
?.map { it.roomId }
|
||||||
|
?.toList()
|
||||||
|
?.let { session.markAllAsRead(it, object : MatrixCallback<Unit> {}) }
|
||||||
|
}
|
||||||
|
|
||||||
private fun buildRoomSummaries(rooms: List<RoomSummary>): RoomSummaries {
|
private fun buildRoomSummaries(rooms: List<RoomSummary>): RoomSummaries {
|
||||||
val invites = ArrayList<RoomSummary>()
|
val invites = ArrayList<RoomSummary>()
|
||||||
val favourites = ArrayList<RoomSummary>()
|
val favourites = ArrayList<RoomSummary>()
|
||||||
|
@ -20,6 +20,7 @@ import androidx.annotation.StringRes
|
|||||||
import com.airbnb.mvrx.Async
|
import com.airbnb.mvrx.Async
|
||||||
import com.airbnb.mvrx.MvRxState
|
import com.airbnb.mvrx.MvRxState
|
||||||
import com.airbnb.mvrx.Uninitialized
|
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.matrix.android.api.session.room.model.RoomSummary
|
||||||
import im.vector.riotx.R
|
import im.vector.riotx.R
|
||||||
|
|
||||||
@ -67,6 +68,13 @@ data class RoomListViewState(
|
|||||||
RoomCategory.SERVER_NOTICE -> copy(isServerNoticeRoomsExpanded = !isServerNoticeRoomsExpanded)
|
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<RoomCategory, List<RoomSummary>>
|
typealias RoomSummaries = LinkedHashMap<RoomCategory, List<RoomSummary>>
|
||||||
|
9
vector/src/main/res/menu/room_list.xml
Normal file
9
vector/src/main/res/menu/room_list.xml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/menu_home_mark_all_as_read"
|
||||||
|
android:icon="@drawable/ic_material_done"
|
||||||
|
android:title="@string/action_mark_all_as_read" />
|
||||||
|
|
||||||
|
</menu>
|
@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
tools:context="org.matrix.vector.activity.VectorHomeActivity">
|
|
||||||
|
|
||||||
<item
|
|
||||||
android:id="@+id/ic_action_global_search"
|
|
||||||
android:icon="@drawable/ic_material_search_white"
|
|
||||||
android:title="@string/action_global_search"
|
|
||||||
app:showAsAction="collapseActionView" />
|
|
||||||
|
|
||||||
<item
|
|
||||||
android:id="@+id/ic_action_historical"
|
|
||||||
android:icon="@drawable/ic_material_history_white"
|
|
||||||
android:title="@string/action_historical"
|
|
||||||
app:showAsAction="collapseActionView" />
|
|
||||||
|
|
||||||
<item
|
|
||||||
android:id="@+id/ic_action_mark_all_as_read"
|
|
||||||
android:icon="@drawable/ic_material_done_all_white"
|
|
||||||
android:title="@string/action_mark_all_as_read"
|
|
||||||
app:showAsAction="collapseActionView" />
|
|
||||||
</menu>
|
|
Loading…
x
Reference in New Issue
Block a user