diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt index 3ee1ed867c..16bece891c 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileActivity.kt @@ -37,6 +37,7 @@ import im.vector.app.features.roomprofile.members.RoomMemberListFragment import im.vector.app.features.roomprofile.notifications.RoomNotificationSettingsFragment import im.vector.app.features.roomprofile.permissions.RoomPermissionsFragment import im.vector.app.features.roomprofile.polls.RoomPollsFragment +import im.vector.app.features.roomprofile.polls.detail.RoomPollDetailFragment import im.vector.app.features.roomprofile.settings.RoomSettingsFragment import im.vector.app.features.roomprofile.uploads.RoomUploadsFragment import im.vector.lib.core.utils.compat.getParcelableCompat @@ -105,6 +106,7 @@ class RoomProfileActivity : RoomProfileSharedAction.OpenRoomUploads -> openRoomUploads() RoomProfileSharedAction.OpenBannedRoomMembers -> openBannedRoomMembers() RoomProfileSharedAction.OpenRoomNotificationSettings -> openRoomNotificationSettings() + is RoomProfileSharedAction.OpenPollDetails -> handleOpenPollDetails() } } .launchIn(lifecycleScope) @@ -130,6 +132,10 @@ class RoomProfileActivity : finish() } + private fun handleOpenPollDetails() { + addFragmentToBackstack(views.simpleFragmentContainer, RoomPollDetailFragment::class.java, roomProfileArgs) + } + private fun openRoomPolls() { addFragmentToBackstack(views.simpleFragmentContainer, RoomPollsFragment::class.java, roomProfileArgs) } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileSharedAction.kt b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileSharedAction.kt index b243ceb206..63e2506c9a 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileSharedAction.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/RoomProfileSharedAction.kt @@ -26,6 +26,7 @@ sealed class RoomProfileSharedAction : VectorSharedAction { object OpenRoomAliasesSettings : RoomProfileSharedAction() object OpenRoomPermissionsSettings : RoomProfileSharedAction() object OpenRoomPolls : RoomProfileSharedAction() + object OpenPollDetails : RoomProfileSharedAction() object OpenRoomUploads : RoomProfileSharedAction() object OpenRoomMembers : RoomProfileSharedAction() object OpenBannedRoomMembers : RoomProfileSharedAction() diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsAction.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsAction.kt index 3fedbfc4a8..b3ef4f45e2 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsAction.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsAction.kt @@ -20,4 +20,5 @@ import im.vector.app.core.platform.VectorViewModelAction sealed interface RoomPollsAction : VectorViewModelAction { object LoadMorePolls : RoomPollsAction + data class OnPollSelected(val selectedPollId: String) : RoomPollsAction } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewEvent.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewEvent.kt index cb2069d824..58b388186e 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewEvent.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewEvent.kt @@ -20,4 +20,5 @@ import im.vector.app.core.platform.VectorViewEvents sealed class RoomPollsViewEvent : VectorViewEvents { object LoadingError : RoomPollsViewEvent() + object NavigateToPollDetail : RoomPollsViewEvent() } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModel.kt index 2beda47816..df891e08e4 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModel.kt @@ -89,9 +89,15 @@ class RoomPollsViewModel @AssistedInject constructor( override fun handle(action: RoomPollsAction) { when (action) { RoomPollsAction.LoadMorePolls -> handleLoadMore() + is RoomPollsAction.OnPollSelected -> handleOnPollSelected(action) } } + private fun handleOnPollSelected(action: RoomPollsAction.OnPollSelected) { + setState { copy(selectedPollId = action.selectedPollId) } + _viewEvents.post(RoomPollsViewEvent.NavigateToPollDetail) + } + private fun handleLoadMore() = withState { viewState -> viewModelScope.launch { setState { copy(isLoadingMore = true) } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewState.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewState.kt index 4a5c138b6a..dca016e529 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewState.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsViewState.kt @@ -27,10 +27,12 @@ data class RoomPollsViewState( val canLoadMore: Boolean = true, val nbSyncedDays: Int = 0, val isSyncing: Boolean = false, + val selectedPollId: String? = null, ) : MavericksState { constructor(roomProfileArgs: RoomProfileArgs) : this(roomId = roomProfileArgs.roomId) fun hasNoPolls() = polls.isEmpty() fun hasNoPollsAndCanLoadMore() = !isSyncing && hasNoPolls() && canLoadMore + fun getSelectedPoll() = polls.find { it.id == selectedPollId } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/detail/RoomPollDetailFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/detail/RoomPollDetailFragment.kt new file mode 100644 index 0000000000..67e6307860 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/detail/RoomPollDetailFragment.kt @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023 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.app.features.roomprofile.polls.detail + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import im.vector.app.core.platform.VectorBaseFragment +import im.vector.app.databinding.FragmentRoomPollDetailBinding + +class RoomPollDetailFragment : VectorBaseFragment() { + + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentRoomPollDetailBinding { + return FragmentRoomPollDetailBinding.inflate(inflater, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + setupToolbar(views.roomPollDetailToolbar) + .allowBack() + } +} diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/PollSummary.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/PollSummary.kt index 5c1eee0d00..542ac68ad2 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/PollSummary.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/PollSummary.kt @@ -22,11 +22,13 @@ sealed interface PollSummary { val id: String val creationTimestamp: Long val title: String + val optionViewStates: List data class ActivePoll( override val id: String, override val creationTimestamp: Long, override val title: String, + override val optionViewStates: List, ) : PollSummary data class EndedPoll( @@ -35,5 +37,6 @@ sealed interface PollSummary { override val title: String, val totalVotes: Int, val winnerOptions: List, + override val optionViewStates: List, ) : PollSummary } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/PollSummaryMapper.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/PollSummaryMapper.kt index 64c712e61f..791f62d414 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/PollSummaryMapper.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/PollSummaryMapper.kt @@ -69,13 +69,15 @@ class PollSummaryMapper @Inject constructor( creationTimestamp = creationTimestamp, title = pollTitle, totalVotes = pollResponseData.totalVotes, - winnerOptions = pollOptionViewStateFactory.createPollEndedOptions(pollCreationInfo, pollResponseData) + winnerOptions = pollOptionViewStateFactory.createPollEndedOptions(pollCreationInfo, pollResponseData), + optionViewStates = pollOptionViewStateFactory.createPollSendingOptions(pollCreationInfo), ) } else { PollSummary.ActivePoll( id = eventId, creationTimestamp = creationTimestamp, title = pollTitle, + optionViewStates = pollOptionViewStateFactory.createPollSendingOptions(pollCreationInfo), ) } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/RoomPollsListFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/RoomPollsListFragment.kt index 1c33959824..21f55629ec 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/RoomPollsListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/ui/RoomPollsListFragment.kt @@ -29,13 +29,14 @@ import im.vector.app.core.extensions.configureWith import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.StringProvider import im.vector.app.databinding.FragmentRoomPollsListBinding +import im.vector.app.features.roomprofile.RoomProfileSharedAction +import im.vector.app.features.roomprofile.RoomProfileSharedActionViewModel import im.vector.app.features.roomprofile.polls.RoomPollsAction import im.vector.app.features.roomprofile.polls.RoomPollsLoadingError import im.vector.app.features.roomprofile.polls.RoomPollsType import im.vector.app.features.roomprofile.polls.RoomPollsViewEvent import im.vector.app.features.roomprofile.polls.RoomPollsViewModel import im.vector.app.features.roomprofile.polls.RoomPollsViewState -import timber.log.Timber import javax.inject.Inject abstract class RoomPollsListFragment : @@ -49,6 +50,7 @@ abstract class RoomPollsListFragment : lateinit var stringProvider: StringProvider private val viewModel: RoomPollsViewModel by parentFragmentViewModel(RoomPollsViewModel::class) + private lateinit var sharedActionViewModel: RoomProfileSharedActionViewModel override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentRoomPollsListBinding { return FragmentRoomPollsListBinding.inflate(inflater, container, false) @@ -56,6 +58,7 @@ abstract class RoomPollsListFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + sharedActionViewModel = activityViewModelProvider[RoomProfileSharedActionViewModel::class.java] observeViewEvents() setupList() setupLoadMoreButton() @@ -65,6 +68,7 @@ abstract class RoomPollsListFragment : viewModel.observeViewEvents { viewEvent -> when (viewEvent) { RoomPollsViewEvent.LoadingError -> showErrorInSnackbar(RoomPollsLoadingError()) + RoomPollsViewEvent.NavigateToPollDetail -> sharedActionViewModel.post(RoomProfileSharedAction.OpenPollDetails) } } } @@ -126,8 +130,7 @@ abstract class RoomPollsListFragment : } override fun onPollClicked(pollId: String) { - // TODO navigate to details - Timber.d("poll with id $pollId clicked") + viewModel.handle(RoomPollsAction.OnPollSelected(pollId)) } override fun onLoadMoreClicked() {