From d3d536f4f037f49fe719786283a2af1a6b160bbf Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 29 Jan 2019 14:16:22 +0100 Subject: [PATCH] Room : add RoomTag to handle favourites, low priority and system alerts in room list. --- .../riotredesign/features/home/HomeModule.kt | 5 ++ .../home/room/list/RoomListFragment.kt | 6 +- .../home/room/list/RoomListViewModel.kt | 46 +++++++++--- .../home/room/list/RoomListViewState.kt | 7 +- .../home/room/list/RoomSummaryController.kt | 71 +++++++++++++------ app/src/main/res/values/strings.xml | 16 +++-- .../matrix/android/api/session/room/Room.kt | 1 + .../api/session/room/model/RoomSummary.kt | 5 +- .../api/session/room/model/tag/RoomTag.kt | 31 ++++++++ .../session/room/model/tag/RoomTagContent.kt | 25 +++++++ .../database/mapper/RoomSummaryMapper.kt | 7 +- .../database/model/RoomSummaryEntity.kt | 3 +- .../internal/database/model/RoomTagEntity.kt | 28 ++++++++ .../internal/session/sync/RoomSyncHandler.kt | 17 ++++- .../internal/session/sync/RoomTagHandler.kt | 50 +++++++++++++ .../internal/session/sync/SyncModule.kt | 6 +- .../session/sync/model/RoomSyncAccountData.kt | 2 +- 17 files changed, 276 insertions(+), 50 deletions(-) create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/tag/RoomTag.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/tag/RoomTagContent.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomTagEntity.kt create mode 100644 matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomTagHandler.kt diff --git a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt index ae703990..b8370270 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt @@ -27,6 +27,7 @@ import im.vector.riotredesign.features.home.room.detail.timeline.TimelineDateFor import im.vector.riotredesign.features.home.room.detail.timeline.TimelineEventController import im.vector.riotredesign.features.home.room.detail.timeline.TimelineItemFactory import im.vector.riotredesign.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider +import im.vector.riotredesign.features.home.room.list.RoomSummaryController import org.koin.dsl.module.module class HomeModule { @@ -65,6 +66,10 @@ class HomeModule { HomeNavigator() } + factory { + RoomSummaryController(get()) + } + factory { (roomId: String) -> TimelineEventController(roomId, get(), get(), get()) } diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt index 8aa095cd..904cf66c 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt @@ -22,7 +22,6 @@ import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.view.inputmethod.EditorInfo import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Incomplete import com.airbnb.mvrx.Success @@ -30,7 +29,6 @@ import com.airbnb.mvrx.activityViewModel import im.vector.matrix.android.api.failure.Failure import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.riotredesign.R -import im.vector.riotredesign.core.extensions.hideKeyboard import im.vector.riotredesign.core.extensions.setupAsSearch import im.vector.riotredesign.core.platform.RiotFragment import im.vector.riotredesign.core.platform.StateView @@ -47,8 +45,8 @@ class RoomListFragment : RiotFragment(), RoomSummaryController.Callback { } private val homeNavigator by inject() + private val roomController by inject() private val homeViewModel: RoomListViewModel by activityViewModel() - private lateinit var roomController: RoomSummaryController override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_room_list, container, false) @@ -56,7 +54,7 @@ class RoomListFragment : RiotFragment(), RoomSummaryController.Callback { override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - roomController = RoomSummaryController(this) + roomController.callback = this stateView.contentView = epoxyRecyclerView epoxyRecyclerView.setController(roomController) setupFilterView() diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewModel.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewModel.kt index 5028bc5d..f53e1a34 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewModel.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewModel.kt @@ -24,6 +24,7 @@ import im.vector.matrix.android.api.Matrix import im.vector.matrix.android.api.session.Session import im.vector.matrix.android.api.session.group.model.GroupSummary import im.vector.matrix.android.api.session.room.model.RoomSummary +import im.vector.matrix.android.api.session.room.model.tag.RoomTag import im.vector.matrix.rx.rx import im.vector.riotredesign.core.platform.RiotViewModel import im.vector.riotredesign.features.home.group.SelectedGroupHolder @@ -96,15 +97,7 @@ class RoomListViewModel(initialState: RoomListViewState, selectedGroupHolder.selectedGroup(), roomListFilter, Function3 { rooms, selectedGroupOption, filterRoomOption -> - val filterRoom = filterRoomOption.orNull() - val filteredRooms = rooms.filter { - if (filterRoom.isNullOrBlank()) { - true - } else { - it.displayName.contains(other = filterRoom, ignoreCase = true) - } - } - + val filteredRooms = filterRooms(rooms, filterRoomOption) val selectedGroup = selectedGroupOption.orNull() val filteredDirectRooms = filteredRooms .filter { it.isDirect } @@ -123,7 +116,7 @@ class RoomListViewModel(initialState: RoomListViewState, .filter { selectedGroup?.roomIds?.contains(it.roomId) ?: true } - RoomSummaries(filteredDirectRooms, filteredGroupRooms) + buildRoomSummaries(filteredDirectRooms + filteredGroupRooms) } ) .execute { async -> @@ -132,4 +125,37 @@ class RoomListViewModel(initialState: RoomListViewState, ) } } + + private fun filterRooms(rooms: List, filterRoomOption: Option): List { + val filterRoom = filterRoomOption.orNull() + return rooms.filter { + if (filterRoom.isNullOrBlank()) { + true + } else { + it.displayName.contains(other = filterRoom, ignoreCase = true) + } + } + } + + private fun buildRoomSummaries(rooms: List): RoomSummaries { + val favourites = ArrayList() + val directChats = ArrayList() + val groupRooms = ArrayList() + val lowPriorities = ArrayList() + val serverNotices = ArrayList() + + for (room in rooms) { + val tags = room.tags.map { it.name } + when { + tags.contains(RoomTag.ROOM_TAG_SERVER_NOTICE) -> serverNotices.add(room) + tags.contains(RoomTag.ROOM_TAG_FAVOURITE) -> favourites.add(room) + tags.contains(RoomTag.ROOM_TAG_LOW_PRIORITY) -> lowPriorities.add(room) + room.isDirect -> directChats.add(room) + else -> groupRooms.add(room) + } + } + return RoomSummaries(favourites, directChats, groupRooms, lowPriorities, serverNotices) + } + + } \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewState.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewState.kt index 5b6d6f25..57d0be76 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewState.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListViewState.kt @@ -27,10 +27,13 @@ data class RoomListViewState( ) : MvRxState data class RoomSummaries( + val favourites: List, val directRooms: List, - val groupRooms: List + val groupRooms: List, + val lowPriorities: List, + val serverNotices: List ) fun RoomSummaries?.isNullOrEmpty(): Boolean { - return this == null || (directRooms.isEmpty() && groupRooms.isEmpty()) + return this == null || (directRooms.isEmpty() && groupRooms.isEmpty() && favourites.isEmpty() && lowPriorities.isEmpty() && serverNotices.isEmpty()) } \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryController.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryController.kt index c8922e72..4a6c8a7b 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryController.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomSummaryController.kt @@ -16,47 +16,74 @@ package im.vector.riotredesign.features.home.room.list +import androidx.annotation.StringRes import com.airbnb.epoxy.TypedEpoxyController import im.vector.matrix.android.api.session.room.model.RoomSummary +import im.vector.riotredesign.R +import im.vector.riotredesign.core.resources.StringProvider -class RoomSummaryController(private val callback: Callback? = null +class RoomSummaryController(private val stringProvider: StringProvider ) : TypedEpoxyController() { private var isDirectRoomsExpanded = true private var isGroupRoomsExpanded = true + private var isFavoriteRoomsExpanded = true + private var isLowPriorityRoomsExpanded = true + private var isServerNoticeRoomsExpanded = true + + var callback: Callback? = null override fun buildModels(viewState: RoomListViewState) { val roomSummaries = viewState.asyncRooms() - RoomCategoryItem( - title = "DIRECT MESSAGES", - isExpanded = isDirectRoomsExpanded, - listener = { - isDirectRoomsExpanded = !isDirectRoomsExpanded - setData(viewState) - } - ) - .id("direct_messages") - .addTo(this) + buildRoomCategory(viewState, R.string.room_list_favourites, isFavoriteRoomsExpanded) { + isFavoriteRoomsExpanded = !isFavoriteRoomsExpanded + } + if (isFavoriteRoomsExpanded) { + buildRoomModels(roomSummaries?.favourites ?: emptyList(), viewState.selectedRoomId) + } + + buildRoomCategory(viewState, R.string.room_list_direct, isDirectRoomsExpanded) { + isDirectRoomsExpanded = !isDirectRoomsExpanded + } if (isDirectRoomsExpanded) { buildRoomModels(roomSummaries?.directRooms ?: emptyList(), viewState.selectedRoomId) } - RoomCategoryItem( - title = "GROUPS", - isExpanded = isGroupRoomsExpanded, - listener = { - isGroupRoomsExpanded = !isGroupRoomsExpanded - setData(viewState) - } - ) - .id("group_messages") - .addTo(this) - + buildRoomCategory(viewState, R.string.room_list_group, isGroupRoomsExpanded) { + isGroupRoomsExpanded = !isGroupRoomsExpanded + } if (isGroupRoomsExpanded) { buildRoomModels(roomSummaries?.groupRooms ?: emptyList(), viewState.selectedRoomId) } + buildRoomCategory(viewState, R.string.room_list_low_priority, isLowPriorityRoomsExpanded) { + isLowPriorityRoomsExpanded = !isLowPriorityRoomsExpanded + } + if (isLowPriorityRoomsExpanded) { + buildRoomModels(roomSummaries?.lowPriorities ?: emptyList(), viewState.selectedRoomId) + } + + buildRoomCategory(viewState, R.string.room_list_system_alert, isServerNoticeRoomsExpanded) { + isServerNoticeRoomsExpanded = !isServerNoticeRoomsExpanded + } + if (isServerNoticeRoomsExpanded) { + buildRoomModels(roomSummaries?.serverNotices ?: emptyList(), viewState.selectedRoomId) + } + + } + + private fun buildRoomCategory(viewState: RoomListViewState, @StringRes titleRes: Int, isExpanded: Boolean, mutateExpandedState: () -> Unit) { + RoomCategoryItem( + title = stringProvider.getString(titleRes).toUpperCase(), + isExpanded = isExpanded, + listener = { + mutateExpandedState() + setData(viewState) + } + ) + .id(titleRes) + .addTo(this) } private fun buildRoomModels(summaries: List, selectedRoomId: String?) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f51599c2..62328533 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,9 +1,15 @@ - Riot X + "Riot X" - Réessayer - Pas de connexion internet - Une erreur est survenue - Rejoignez une room pour commencer à utiliser l\'application + "Retry" + "No network connection" + "An error occurred" + + "Join a room to start using the app." + "Favourites" + "People" + "Rooms" + "Low priority" + "System Alerts" diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/Room.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/Room.kt index 85714bb2..20ec0d53 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/Room.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/Room.kt @@ -35,6 +35,7 @@ interface Room : TimelineService, SendService, ReadService { /** * A live [RoomSummary] associated with the room + * You can observe this summary to get dynamic data from this room. */ val roomSummary: LiveData diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt index 3ebe2604..507de556 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/RoomSummary.kt @@ -16,6 +16,8 @@ package im.vector.matrix.android.api.session.room.model +import im.vector.matrix.android.api.session.room.model.tag.RoomTag + /** * This class holds some data of a room. * It can be retrieved by [im.vector.matrix.android.api.session.room.Room] and [im.vector.matrix.android.api.session.room.RoomService] @@ -28,5 +30,6 @@ data class RoomSummary( val isDirect: Boolean, val otherMemberIds: List = emptyList(), var notificationCount: Int = 0, - var highlightCount: Int = 0 + var highlightCount: Int = 0, + var tags: List = emptyList() ) \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/tag/RoomTag.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/tag/RoomTag.kt new file mode 100644 index 00000000..0623e8d9 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/tag/RoomTag.kt @@ -0,0 +1,31 @@ +/* + * 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.api.session.room.model.tag + +data class RoomTag( + val name: String, + val order: Double? +) { + + companion object { + val ROOM_TAG_FAVOURITE = "m.favourite" + val ROOM_TAG_LOW_PRIORITY = "m.lowpriority" + val ROOM_TAG_NO_TAG = "m.recent" + val ROOM_TAG_SERVER_NOTICE = "m.server_notice" + } + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/tag/RoomTagContent.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/tag/RoomTagContent.kt new file mode 100644 index 00000000..a5f7650b --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/model/tag/RoomTagContent.kt @@ -0,0 +1,25 @@ +/* + * 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.api.session.room.model.tag + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class RoomTagContent( + @Json(name = "tags") val tags: Map> = emptyMap() +) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt index 9522b90a..5ef8fb48 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/mapper/RoomSummaryMapper.kt @@ -17,12 +17,16 @@ package im.vector.matrix.android.internal.database.mapper import im.vector.matrix.android.api.session.room.model.RoomSummary +import im.vector.matrix.android.api.session.room.model.tag.RoomTag import im.vector.matrix.android.internal.database.model.RoomSummaryEntity internal object RoomSummaryMapper { fun map(roomSummaryEntity: RoomSummaryEntity): RoomSummary { + val tags = roomSummaryEntity.tags.map { + RoomTag(it.tagName, it.tagOrder) + } return RoomSummary( roomId = roomSummaryEntity.roomId, displayName = roomSummaryEntity.displayName ?: "", @@ -31,7 +35,8 @@ internal object RoomSummaryMapper { isDirect = roomSummaryEntity.isDirect, otherMemberIds = roomSummaryEntity.otherMemberIds.toList(), highlightCount = roomSummaryEntity.highlightCount, - notificationCount = roomSummaryEntity.notificationCount + notificationCount = roomSummaryEntity.notificationCount, + tags = tags ) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt index 3ff5a0e9..9f9c66f0 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomSummaryEntity.kt @@ -31,7 +31,8 @@ internal open class RoomSummaryEntity(@PrimaryKey var roomId: String = "", var isDirect: Boolean = false, var otherMemberIds: RealmList = RealmList(), var notificationCount: Int = 0, - var highlightCount: Int = 0 + var highlightCount: Int = 0, + var tags: RealmList = RealmList() ) : RealmObject() { companion object diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomTagEntity.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomTagEntity.kt new file mode 100644 index 00000000..12ca29b1 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/database/model/RoomTagEntity.kt @@ -0,0 +1,28 @@ +/* + * 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.database.model + +import io.realm.RealmObject + +internal open class RoomTagEntity( + var tagName: String = "", + var tagOrder: Double? = null +) : RealmObject() { + + companion object + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt index 77066c73..7cd703c7 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomSyncHandler.kt @@ -21,6 +21,7 @@ import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.toModel import im.vector.matrix.android.api.session.room.model.MyMembership +import im.vector.matrix.android.api.session.room.model.tag.RoomTagContent import im.vector.matrix.android.internal.database.helper.addAll import im.vector.matrix.android.internal.database.helper.addOrUpdate import im.vector.matrix.android.internal.database.helper.addStateEvents @@ -33,6 +34,7 @@ import im.vector.matrix.android.internal.database.query.where import im.vector.matrix.android.internal.session.room.timeline.PaginationDirection import im.vector.matrix.android.internal.session.sync.model.InvitedRoomSync import im.vector.matrix.android.internal.session.sync.model.RoomSync +import im.vector.matrix.android.internal.session.sync.model.RoomSyncAccountData import im.vector.matrix.android.internal.session.sync.model.RoomSyncEphemeral import im.vector.matrix.android.internal.session.sync.model.RoomSyncSummary import im.vector.matrix.android.internal.session.sync.model.RoomSyncUnreadNotifications @@ -40,9 +42,9 @@ import im.vector.matrix.android.internal.session.sync.model.RoomsSyncResponse import io.realm.Realm import io.realm.kotlin.createObject - internal class RoomSyncHandler(private val monarchy: Monarchy, - private val readReceiptHandler: ReadReceiptHandler) { + private val readReceiptHandler: ReadReceiptHandler, + private val roomTagHandler: RoomTagHandler) { sealed class HandlingStrategy { data class JOINED(val data: Map) : HandlingStrategy() @@ -118,6 +120,10 @@ internal class RoomSyncHandler(private val monarchy: Monarchy, handleEphemeral(realm, roomId, roomSync.ephemeral) } + if (roomSync.accountData != null && roomSync.accountData.events.isNullOrEmpty().not()) { + handleRoomAccountDataEvents(realm, roomId, roomSync.accountData) + } + return roomEntity } @@ -207,4 +213,11 @@ internal class RoomSyncHandler(private val monarchy: Monarchy, } + private fun handleRoomAccountDataEvents(realm: Realm, roomId: String, accountData: RoomSyncAccountData) { + accountData.events + .filter { it.type == EventType.TAG } + .map { it.content.toModel() } + .forEach { roomTagHandler.handle(realm, roomId, it) } + } + } \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomTagHandler.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomTagHandler.kt new file mode 100644 index 00000000..c3722ea6 --- /dev/null +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/RoomTagHandler.kt @@ -0,0 +1,50 @@ +/* + * 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.sync + +import im.vector.matrix.android.api.session.room.model.tag.RoomTagContent +import im.vector.matrix.android.internal.database.model.RoomSummaryEntity +import im.vector.matrix.android.internal.database.model.RoomTagEntity +import im.vector.matrix.android.internal.database.query.where +import io.realm.Realm +import java.util.* + +internal class RoomTagHandler { + + fun handle(realm: Realm, roomId: String, content: RoomTagContent?) { + if (content == null) { + return + } + val tags = ArrayList() + for (tagName in content.tags.keys) { + val params = content.tags[tagName] + val tag = if (params != null) { + RoomTagEntity(tagName, params["order"]) + } else { + RoomTagEntity(tagName, null) + } + tags.add(tag) + } + val roomSummaryEntity = RoomSummaryEntity.where(realm, roomId).findFirst() + ?: RoomSummaryEntity(roomId) + + roomSummaryEntity.tags.clear() + roomSummaryEntity.tags.addAll(tags) + realm.insertOrUpdate(roomSummaryEntity) + } + +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncModule.kt index 9a296607..c62bc2e1 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/SyncModule.kt @@ -36,7 +36,11 @@ internal class SyncModule { } scope(DefaultSession.SCOPE) { - RoomSyncHandler(get(), get()) + RoomTagHandler() + } + + scope(DefaultSession.SCOPE) { + RoomSyncHandler(get(), get(), get()) } scope(DefaultSession.SCOPE) { diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/model/RoomSyncAccountData.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/model/RoomSyncAccountData.kt index 07b323b2..6c2e79f1 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/model/RoomSyncAccountData.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/sync/model/RoomSyncAccountData.kt @@ -25,5 +25,5 @@ internal data class RoomSyncAccountData( /** * List of account data events (array of Event). */ - @Json(name = "events") val events: List? = null + @Json(name = "events") val events: List = emptyList() ) \ No newline at end of file