Clean a bit code of Room list

This commit is contained in:
ganfra 2018-11-02 16:30:22 +01:00
parent 9c48eba26c
commit 6d9ec2789b
6 changed files with 63 additions and 66 deletions

View File

@ -6,5 +6,6 @@ sealed class RoomListActions {


data class SelectRoom(val roomSummary: RoomSummary) : RoomListActions() data class SelectRoom(val roomSummary: RoomSummary) : RoomListActions()


object RoomDisplayed : RoomListActions()


} }

View File

@ -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)
}
}
} }


} }

View File

@ -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
)
} }
} }



View File

@ -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
}


}

View File

@ -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)
} }
} }

View File

@ -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>