forked from GitHub-Mirror/riotX-android
Room : add RoomTag to handle favourites, low priority and system alerts in room list.
This commit is contained in:
@ -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())
|
||||
}
|
||||
|
@ -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<HomeNavigator>()
|
||||
private val roomController by inject<RoomSummaryController>()
|
||||
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()
|
||||
|
@ -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<RoomSummary>, filterRoomOption: Option<RoomListFilterName>): List<RoomSummary> {
|
||||
val filterRoom = filterRoomOption.orNull()
|
||||
return rooms.filter {
|
||||
if (filterRoom.isNullOrBlank()) {
|
||||
true
|
||||
} else {
|
||||
it.displayName.contains(other = filterRoom, ignoreCase = true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun buildRoomSummaries(rooms: List<RoomSummary>): RoomSummaries {
|
||||
val favourites = ArrayList<RoomSummary>()
|
||||
val directChats = ArrayList<RoomSummary>()
|
||||
val groupRooms = ArrayList<RoomSummary>()
|
||||
val lowPriorities = ArrayList<RoomSummary>()
|
||||
val serverNotices = ArrayList<RoomSummary>()
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -27,10 +27,13 @@ data class RoomListViewState(
|
||||
) : MvRxState
|
||||
|
||||
data class RoomSummaries(
|
||||
val favourites: List<RoomSummary>,
|
||||
val directRooms: List<RoomSummary>,
|
||||
val groupRooms: List<RoomSummary>
|
||||
val groupRooms: List<RoomSummary>,
|
||||
val lowPriorities: List<RoomSummary>,
|
||||
val serverNotices: List<RoomSummary>
|
||||
)
|
||||
|
||||
fun RoomSummaries?.isNullOrEmpty(): Boolean {
|
||||
return this == null || (directRooms.isEmpty() && groupRooms.isEmpty())
|
||||
return this == null || (directRooms.isEmpty() && groupRooms.isEmpty() && favourites.isEmpty() && lowPriorities.isEmpty() && serverNotices.isEmpty())
|
||||
}
|
@ -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<RoomListViewState>() {
|
||||
|
||||
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<RoomSummary>, selectedRoomId: String?) {
|
||||
|
@ -1,9 +1,15 @@
|
||||
<resources>
|
||||
<string name="app_name">Riot X</string>
|
||||
<string name="app_name">"Riot X"</string>
|
||||
|
||||
<string name="global_retry">Réessayer</string>
|
||||
<string name="error_no_network">Pas de connexion internet</string>
|
||||
<string name="error_common">Une erreur est survenue</string>
|
||||
<string name="room_list_empty">Rejoignez une room pour commencer à utiliser l\'application</string>
|
||||
<string name="global_retry">"Retry"</string>
|
||||
<string name="error_no_network">"No network connection"</string>
|
||||
<string name="error_common">"An error occurred"</string>
|
||||
|
||||
<string name="room_list_empty">"Join a room to start using the app."</string>
|
||||
<string name="room_list_favourites">"Favourites"</string>
|
||||
<string name="room_list_direct">"People"</string>
|
||||
<string name="room_list_group">"Rooms"</string>
|
||||
<string name="room_list_low_priority">"Low priority"</string>
|
||||
<string name="room_list_system_alert">"System Alerts"</string>
|
||||
|
||||
</resources>
|
||||
|
Reference in New Issue
Block a user