From 6d9ec2789b807b472acf46edb149a8fab54ebdb5 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 2 Nov 2018 16:30:22 +0100 Subject: [PATCH] Clean a bit code of Room list --- .../home/room/list/RoomListActions.kt | 1 + .../home/room/list/RoomListFragment.kt | 32 +++++-------- .../home/room/list/RoomListViewModel.kt | 25 ++++++++-- .../home/room/list/RoomListViewState.kt | 21 ++------- .../home/room/list/RoomSummaryController.kt | 47 +++++++++---------- app/src/main/res/values/strings.xml | 3 ++ 6 files changed, 63 insertions(+), 66 deletions(-) diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListActions.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListActions.kt index 7f5e5301..17b8ec9b 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListActions.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListActions.kt @@ -6,5 +6,6 @@ sealed class RoomListActions { data class SelectRoom(val roomSummary: RoomSummary) : RoomListActions() + object RoomDisplayed : RoomListActions() } \ No newline at end of file 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 8daa10df..6e98c269 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 @@ -8,7 +8,6 @@ import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Incomplete import com.airbnb.mvrx.Success import com.airbnb.mvrx.fragmentViewModel -import com.airbnb.mvrx.withState import im.vector.matrix.android.api.failure.Failure import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.riotredesign.R @@ -39,30 +38,28 @@ class RoomListFragment : RiotFragment(), RoomSummaryController.Callback { roomController = RoomSummaryController(this) stateView.contentView = epoxyRecyclerView epoxyRecyclerView.setController(roomController) - viewModel.subscribe { renderState(it) } } private fun renderState(state: RoomListViewState) { - when (state.roomSummaries) { + when (state.async) { is Incomplete -> renderLoading() - is Success -> renderSuccess(state.roomSummaries(), state.selectedRoom) - is Fail -> renderFailure(state.roomSummaries.error) + is Success -> renderSuccess(state) + is Fail -> renderFailure(state.async.error) } - if (state.selectedRoom != null && state.showLastSelectedRoom) { - val position = state.roomSummaries()?.indexOf(state.selectedRoom) ?: 0 - epoxyRecyclerView.scrollToPosition(position) + if (state.shouldOpenRoomDetail && state.selectedRoom != null) { homeNavigator.openRoomDetail(state.selectedRoom.roomId) + viewModel.accept(RoomListActions.RoomDisplayed) } } - private fun renderSuccess(roomSummaries: List?, selectedRoom: RoomSummary?) { - if (roomSummaries.isNullOrEmpty()) { - stateView.state = StateView.State.Empty("Rejoignez une room pour commencer à utiliser l'application") + private fun renderSuccess(state: RoomListViewState) { + if (state.async().isNullOrEmpty()) { + stateView.state = StateView.State.Empty(getString(R.string.room_list_empty)) } else { stateView.state = StateView.State.Content } - roomController.setData(roomSummaries, selectedRoom) + roomController.setData(state) } private fun renderLoading() { @@ -71,19 +68,14 @@ class RoomListFragment : RiotFragment(), RoomSummaryController.Callback { private fun renderFailure(error: Throwable) { val message = when (error) { - is Failure.NetworkConnection -> "Pas de connexion internet" - else -> "Une erreur est survenue" + is Failure.NetworkConnection -> getString(R.string.error_no_network) + else -> getString(R.string.error_common) } stateView.state = StateView.State.Error(message) } override fun onRoomSelected(room: RoomSummary) { - withState(viewModel) { - if (it.selectedRoom?.roomId != room.roomId) { - viewModel.accept(RoomListActions.SelectRoom(room)) - homeNavigator.openRoomDetail(room.roomId) - } - } + viewModel.accept(RoomListActions.SelectRoom(room)) } } \ No newline at end of file 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 706b8d75..32304f08 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 @@ -29,25 +29,40 @@ class RoomListViewModel(initialState: RoomListViewState, fun accept(action: RoomListActions) { when (action) { is RoomListActions.SelectRoom -> handleSelectRoom(action) + is RoomListActions.RoomDisplayed -> setState { copy(shouldOpenRoomDetail = false) } } } // PRIVATE METHODS ***************************************************************************** private fun handleSelectRoom(action: RoomListActions.SelectRoom) { - session.saveLastSelectedRoom(action.roomSummary) - setState { copy(selectedRoom = action.roomSummary) } + withState { state -> + if (state.selectedRoom?.roomId != action.roomSummary.roomId) { + session.saveLastSelectedRoom(action.roomSummary) + setState { copy(selectedRoom = action.roomSummary, shouldOpenRoomDetail = true) } + } + } } private fun observeRoomSummaries() { session .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 ?: session.lastSelectedRoom() - ?: it.invoke()?.firstOrNull() + ?: directRooms.firstOrNull() + ?: groupRooms.firstOrNull() - copy(roomSummaries = it, selectedRoom = selectedRoom) + copy( + async = async, + directRooms = directRooms, + groupRooms = groupRooms, + selectedRoom = selectedRoom + ) } } 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 8278b616..2e90da51 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 @@ -6,20 +6,9 @@ import com.airbnb.mvrx.Uninitialized import im.vector.matrix.android.api.session.room.model.RoomSummary data class RoomListViewState( - val roomSummaries: Async> = Uninitialized, + val async: Async> = Uninitialized, + val directRooms: List = emptyList(), + val groupRooms: List = emptyList(), val selectedRoom: RoomSummary? = null, - private var _showLastSelectedRoom: Boolean = true -) : MvRxState { - - var showLastSelectedRoom: Boolean = _showLastSelectedRoom - private set - get() { - if (_showLastSelectedRoom) { - _showLastSelectedRoom = false - return true - } - return false - } - - -} \ No newline at end of file + val shouldOpenRoomDetail: Boolean = true +) : MvRxState \ 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 cdcdad9c..2ed08869 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 @@ -1,62 +1,59 @@ 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 class RoomSummaryController(private val callback: Callback? = null -) : Typed2EpoxyController, RoomSummary>() { +) : TypedEpoxyController() { - private var directRoomsExpanded = true - private var groupRoomsExpanded = true + private var isDirectRoomsExpanded = true + private var isGroupRoomsExpanded = true - override fun buildModels(summaries: List?, selected: RoomSummary?) { - - val directRooms = summaries?.filter { it.isDirect } ?: emptyList() - val groupRooms = summaries?.filter { !it.isDirect } ?: emptyList() + override fun buildModels(viewState: RoomListViewState) { RoomCategoryItem( title = "DIRECT MESSAGES", - isExpanded = directRoomsExpanded, + isExpanded = isDirectRoomsExpanded, listener = { - directRoomsExpanded = !directRoomsExpanded - setData(summaries, selected) + isDirectRoomsExpanded = !isDirectRoomsExpanded + setData(viewState) } ) .id("direct_messages") .addTo(this) - if (directRoomsExpanded) { - buildRoomModels(directRooms, selected) + if (isDirectRoomsExpanded) { + buildRoomModels(viewState.directRooms, viewState.selectedRoom) } RoomCategoryItem( title = "GROUPS", - isExpanded = groupRoomsExpanded, + isExpanded = isGroupRoomsExpanded, listener = { - groupRoomsExpanded = !groupRoomsExpanded - setData(summaries, selected) + isGroupRoomsExpanded = !isGroupRoomsExpanded + setData(viewState) } ) .id("group_messages") .addTo(this) - if (groupRoomsExpanded) { - buildRoomModels(groupRooms, selected) + if (isGroupRoomsExpanded) { + buildRoomModels(viewState.groupRooms, viewState.selectedRoom) } } private fun buildRoomModels(summaries: List, selected: RoomSummary?) { - - summaries.forEach { + summaries.forEach { roomSummary -> + val isSelected = roomSummary.roomId == selected?.roomId RoomSummaryItem( - roomName = it.displayName, - avatarUrl = it.avatarUrl, - isSelected = it.roomId == selected?.roomId, - listener = { callback?.onRoomSelected(it) } + roomName = roomSummary.displayName, + avatarUrl = roomSummary.avatarUrl, + isSelected = isSelected, + listener = { callback?.onRoomSelected(roomSummary) } ) - .id(it.roomId) + .id(roomSummary.roomId) .addTo(this) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6260b26b..2f24e7b9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,5 +2,8 @@ Riot Redesign Réessayer + Pas de connexion internet + Une erreur est survenue + Rejoignez une room pour commencer à utiliser l\'application