forked from GitHub-Mirror/riotX-android
Clean a bit code of Room list
This commit is contained in:
parent
9c48eba26c
commit
6d9ec2789b
@ -6,5 +6,6 @@ sealed class RoomListActions {
|
|||||||
|
|
||||||
data class SelectRoom(val roomSummary: RoomSummary) : RoomListActions()
|
data class SelectRoom(val roomSummary: RoomSummary) : RoomListActions()
|
||||||
|
|
||||||
|
object RoomDisplayed : RoomListActions()
|
||||||
|
|
||||||
}
|
}
|
@ -8,7 +8,6 @@ import com.airbnb.mvrx.Fail
|
|||||||
import com.airbnb.mvrx.Incomplete
|
import com.airbnb.mvrx.Incomplete
|
||||||
import com.airbnb.mvrx.Success
|
import com.airbnb.mvrx.Success
|
||||||
import com.airbnb.mvrx.fragmentViewModel
|
import com.airbnb.mvrx.fragmentViewModel
|
||||||
import com.airbnb.mvrx.withState
|
|
||||||
import im.vector.matrix.android.api.failure.Failure
|
import im.vector.matrix.android.api.failure.Failure
|
||||||
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
||||||
import im.vector.riotredesign.R
|
import im.vector.riotredesign.R
|
||||||
@ -39,30 +38,28 @@ class RoomListFragment : RiotFragment(), RoomSummaryController.Callback {
|
|||||||
roomController = RoomSummaryController(this)
|
roomController = RoomSummaryController(this)
|
||||||
stateView.contentView = epoxyRecyclerView
|
stateView.contentView = epoxyRecyclerView
|
||||||
epoxyRecyclerView.setController(roomController)
|
epoxyRecyclerView.setController(roomController)
|
||||||
|
|
||||||
viewModel.subscribe { renderState(it) }
|
viewModel.subscribe { renderState(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun renderState(state: RoomListViewState) {
|
private fun renderState(state: RoomListViewState) {
|
||||||
when (state.roomSummaries) {
|
when (state.async) {
|
||||||
is Incomplete -> renderLoading()
|
is Incomplete -> renderLoading()
|
||||||
is Success -> renderSuccess(state.roomSummaries(), state.selectedRoom)
|
is Success -> renderSuccess(state)
|
||||||
is Fail -> renderFailure(state.roomSummaries.error)
|
is Fail -> renderFailure(state.async.error)
|
||||||
}
|
}
|
||||||
if (state.selectedRoom != null && state.showLastSelectedRoom) {
|
if (state.shouldOpenRoomDetail && state.selectedRoom != null) {
|
||||||
val position = state.roomSummaries()?.indexOf(state.selectedRoom) ?: 0
|
|
||||||
epoxyRecyclerView.scrollToPosition(position)
|
|
||||||
homeNavigator.openRoomDetail(state.selectedRoom.roomId)
|
homeNavigator.openRoomDetail(state.selectedRoom.roomId)
|
||||||
|
viewModel.accept(RoomListActions.RoomDisplayed)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun renderSuccess(roomSummaries: List<RoomSummary>?, selectedRoom: RoomSummary?) {
|
private fun renderSuccess(state: RoomListViewState) {
|
||||||
if (roomSummaries.isNullOrEmpty()) {
|
if (state.async().isNullOrEmpty()) {
|
||||||
stateView.state = StateView.State.Empty("Rejoignez une room pour commencer à utiliser l'application")
|
stateView.state = StateView.State.Empty(getString(R.string.room_list_empty))
|
||||||
} else {
|
} else {
|
||||||
stateView.state = StateView.State.Content
|
stateView.state = StateView.State.Content
|
||||||
}
|
}
|
||||||
roomController.setData(roomSummaries, selectedRoom)
|
roomController.setData(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun renderLoading() {
|
private fun renderLoading() {
|
||||||
@ -71,19 +68,14 @@ class RoomListFragment : RiotFragment(), RoomSummaryController.Callback {
|
|||||||
|
|
||||||
private fun renderFailure(error: Throwable) {
|
private fun renderFailure(error: Throwable) {
|
||||||
val message = when (error) {
|
val message = when (error) {
|
||||||
is Failure.NetworkConnection -> "Pas de connexion internet"
|
is Failure.NetworkConnection -> getString(R.string.error_no_network)
|
||||||
else -> "Une erreur est survenue"
|
else -> getString(R.string.error_common)
|
||||||
}
|
}
|
||||||
stateView.state = StateView.State.Error(message)
|
stateView.state = StateView.State.Error(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRoomSelected(room: RoomSummary) {
|
override fun onRoomSelected(room: RoomSummary) {
|
||||||
withState(viewModel) {
|
viewModel.accept(RoomListActions.SelectRoom(room))
|
||||||
if (it.selectedRoom?.roomId != room.roomId) {
|
|
||||||
viewModel.accept(RoomListActions.SelectRoom(room))
|
|
||||||
homeNavigator.openRoomDetail(room.roomId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -29,25 +29,40 @@ class RoomListViewModel(initialState: RoomListViewState,
|
|||||||
fun accept(action: RoomListActions) {
|
fun accept(action: RoomListActions) {
|
||||||
when (action) {
|
when (action) {
|
||||||
is RoomListActions.SelectRoom -> handleSelectRoom(action)
|
is RoomListActions.SelectRoom -> handleSelectRoom(action)
|
||||||
|
is RoomListActions.RoomDisplayed -> setState { copy(shouldOpenRoomDetail = false) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PRIVATE METHODS *****************************************************************************
|
// PRIVATE METHODS *****************************************************************************
|
||||||
|
|
||||||
private fun handleSelectRoom(action: RoomListActions.SelectRoom) {
|
private fun handleSelectRoom(action: RoomListActions.SelectRoom) {
|
||||||
session.saveLastSelectedRoom(action.roomSummary)
|
withState { state ->
|
||||||
setState { copy(selectedRoom = action.roomSummary) }
|
if (state.selectedRoom?.roomId != action.roomSummary.roomId) {
|
||||||
|
session.saveLastSelectedRoom(action.roomSummary)
|
||||||
|
setState { copy(selectedRoom = action.roomSummary, shouldOpenRoomDetail = true) }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun observeRoomSummaries() {
|
private fun observeRoomSummaries() {
|
||||||
session
|
session
|
||||||
.rx().liveRoomSummaries()
|
.rx().liveRoomSummaries()
|
||||||
.execute {
|
.execute { async ->
|
||||||
|
val summaries = async()
|
||||||
|
val directRooms = summaries?.filter { it.isDirect } ?: emptyList()
|
||||||
|
val groupRooms = summaries?.filter { !it.isDirect } ?: emptyList()
|
||||||
|
|
||||||
val selectedRoom = selectedRoom
|
val selectedRoom = selectedRoom
|
||||||
?: session.lastSelectedRoom()
|
?: session.lastSelectedRoom()
|
||||||
?: it.invoke()?.firstOrNull()
|
?: directRooms.firstOrNull()
|
||||||
|
?: groupRooms.firstOrNull()
|
||||||
|
|
||||||
copy(roomSummaries = it, selectedRoom = selectedRoom)
|
copy(
|
||||||
|
async = async,
|
||||||
|
directRooms = directRooms,
|
||||||
|
groupRooms = groupRooms,
|
||||||
|
selectedRoom = selectedRoom
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,20 +6,9 @@ import com.airbnb.mvrx.Uninitialized
|
|||||||
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
||||||
|
|
||||||
data class RoomListViewState(
|
data class RoomListViewState(
|
||||||
val roomSummaries: Async<List<RoomSummary>> = Uninitialized,
|
val async: Async<List<RoomSummary>> = Uninitialized,
|
||||||
|
val directRooms: List<RoomSummary> = emptyList(),
|
||||||
|
val groupRooms: List<RoomSummary> = emptyList(),
|
||||||
val selectedRoom: RoomSummary? = null,
|
val selectedRoom: RoomSummary? = null,
|
||||||
private var _showLastSelectedRoom: Boolean = true
|
val shouldOpenRoomDetail: Boolean = true
|
||||||
) : MvRxState {
|
) : MvRxState
|
||||||
|
|
||||||
var showLastSelectedRoom: Boolean = _showLastSelectedRoom
|
|
||||||
private set
|
|
||||||
get() {
|
|
||||||
if (_showLastSelectedRoom) {
|
|
||||||
_showLastSelectedRoom = false
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -1,62 +1,59 @@
|
|||||||
package im.vector.riotredesign.features.home.room.list
|
package im.vector.riotredesign.features.home.room.list
|
||||||
|
|
||||||
import com.airbnb.epoxy.Typed2EpoxyController
|
import com.airbnb.epoxy.TypedEpoxyController
|
||||||
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
||||||
|
|
||||||
class RoomSummaryController(private val callback: Callback? = null
|
class RoomSummaryController(private val callback: Callback? = null
|
||||||
) : Typed2EpoxyController<List<RoomSummary>, RoomSummary>() {
|
) : TypedEpoxyController<RoomListViewState>() {
|
||||||
|
|
||||||
|
|
||||||
private var directRoomsExpanded = true
|
private var isDirectRoomsExpanded = true
|
||||||
private var groupRoomsExpanded = true
|
private var isGroupRoomsExpanded = true
|
||||||
|
|
||||||
override fun buildModels(summaries: List<RoomSummary>?, selected: RoomSummary?) {
|
override fun buildModels(viewState: RoomListViewState) {
|
||||||
|
|
||||||
val directRooms = summaries?.filter { it.isDirect } ?: emptyList()
|
|
||||||
val groupRooms = summaries?.filter { !it.isDirect } ?: emptyList()
|
|
||||||
|
|
||||||
RoomCategoryItem(
|
RoomCategoryItem(
|
||||||
title = "DIRECT MESSAGES",
|
title = "DIRECT MESSAGES",
|
||||||
isExpanded = directRoomsExpanded,
|
isExpanded = isDirectRoomsExpanded,
|
||||||
listener = {
|
listener = {
|
||||||
directRoomsExpanded = !directRoomsExpanded
|
isDirectRoomsExpanded = !isDirectRoomsExpanded
|
||||||
setData(summaries, selected)
|
setData(viewState)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.id("direct_messages")
|
.id("direct_messages")
|
||||||
.addTo(this)
|
.addTo(this)
|
||||||
|
|
||||||
if (directRoomsExpanded) {
|
if (isDirectRoomsExpanded) {
|
||||||
buildRoomModels(directRooms, selected)
|
buildRoomModels(viewState.directRooms, viewState.selectedRoom)
|
||||||
}
|
}
|
||||||
|
|
||||||
RoomCategoryItem(
|
RoomCategoryItem(
|
||||||
title = "GROUPS",
|
title = "GROUPS",
|
||||||
isExpanded = groupRoomsExpanded,
|
isExpanded = isGroupRoomsExpanded,
|
||||||
listener = {
|
listener = {
|
||||||
groupRoomsExpanded = !groupRoomsExpanded
|
isGroupRoomsExpanded = !isGroupRoomsExpanded
|
||||||
setData(summaries, selected)
|
setData(viewState)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
.id("group_messages")
|
.id("group_messages")
|
||||||
.addTo(this)
|
.addTo(this)
|
||||||
|
|
||||||
if (groupRoomsExpanded) {
|
if (isGroupRoomsExpanded) {
|
||||||
buildRoomModels(groupRooms, selected)
|
buildRoomModels(viewState.groupRooms, viewState.selectedRoom)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildRoomModels(summaries: List<RoomSummary>, selected: RoomSummary?) {
|
private fun buildRoomModels(summaries: List<RoomSummary>, selected: RoomSummary?) {
|
||||||
|
summaries.forEach { roomSummary ->
|
||||||
summaries.forEach {
|
val isSelected = roomSummary.roomId == selected?.roomId
|
||||||
RoomSummaryItem(
|
RoomSummaryItem(
|
||||||
roomName = it.displayName,
|
roomName = roomSummary.displayName,
|
||||||
avatarUrl = it.avatarUrl,
|
avatarUrl = roomSummary.avatarUrl,
|
||||||
isSelected = it.roomId == selected?.roomId,
|
isSelected = isSelected,
|
||||||
listener = { callback?.onRoomSelected(it) }
|
listener = { callback?.onRoomSelected(roomSummary) }
|
||||||
)
|
)
|
||||||
.id(it.roomId)
|
.id(roomSummary.roomId)
|
||||||
.addTo(this)
|
.addTo(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,5 +2,8 @@
|
|||||||
<string name="app_name">Riot Redesign</string>
|
<string name="app_name">Riot Redesign</string>
|
||||||
|
|
||||||
<string name="global_retry">Réessayer</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>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
Reference in New Issue
Block a user