From 0b535910d649d5c9dbe3777f15971aabb4cc973c Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 30 Dec 2022 15:50:32 +0100 Subject: [PATCH 01/10] Adding changelog entry --- changelog.d/7864.wip | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.d/7864.wip b/changelog.d/7864.wip index 4dc55708be..e1187ee1e7 100644 --- a/changelog.d/7864.wip +++ b/changelog.d/7864.wip @@ -1 +1,2 @@ [Poll] Render active polls list of a room +[Poll] Render past polls list of a room From cb45056c1a311ec652d72a198c089abb66f78669 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 30 Dec 2022 17:28:57 +0100 Subject: [PATCH 02/10] Mutualizing list fragments and add ended polls tab --- .../src/main/res/values/strings.xml | 2 + .../roomprofile/polls/GetPollsUseCase.kt | 9 +- .../features/roomprofile/polls/PollSummary.kt | 6 ++ .../roomprofile/polls/RoomPollsAction.kt | 4 +- .../roomprofile/polls/RoomPollsFragment.kt | 1 + .../polls/RoomPollsPagerAdapter.kt | 8 +- .../roomprofile/polls/RoomPollsViewModel.kt | 25 ++---- .../polls/active/RoomActivePollsFragment.kt | 70 ++------------- .../polls/ended/RoomEndedPollsFragment.kt | 34 +++++++ .../RoomPollItem.kt} | 4 +- .../RoomPollsController.kt} | 43 ++++++--- .../polls/list/RoomPollsListFragment.kt | 90 +++++++++++++++++++ 12 files changed, 190 insertions(+), 106 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt rename vector/src/main/java/im/vector/app/features/roomprofile/polls/{active/ActivePollItem.kt => list/RoomPollItem.kt} (90%) rename vector/src/main/java/im/vector/app/features/roomprofile/polls/{active/RoomActivePollsController.kt => list/RoomPollsController.kt} (50%) create mode 100644 vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 43507e60ce..6120398566 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -3193,6 +3193,8 @@ Results are only revealed when you end the poll Active polls There are no active polls in this room + Past polls + There are no past polls in this room Share location diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt index d35d192e04..06915c7b6a 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt @@ -17,19 +17,16 @@ package im.vector.app.features.roomprofile.polls import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import javax.inject.Inject class GetPollsUseCase @Inject constructor() { - fun execute(filter: RoomPollsFilterType): Flow> { + fun execute(): Flow> { // TODO unmock and add unit tests - return when (filter) { - RoomPollsFilterType.ACTIVE -> getActivePolls() - RoomPollsFilterType.ENDED -> emptyFlow() - }.map { it.sortedByDescending { poll -> poll.creationTimestamp } } + return getActivePolls() + .map { it.sortedByDescending { poll -> poll.creationTimestamp } } } private fun getActivePolls(): Flow> { diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt index 3eb45c6144..939ee3ffa0 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt @@ -22,4 +22,10 @@ sealed interface PollSummary { val creationTimestamp: Long, val title: String, ) : PollSummary + + data class EndedPoll( + val id: String, + val creationTimestamp: Long, + val title: String, + ) : PollSummary } 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 5f074bdd6f..c18142a306 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 @@ -18,6 +18,4 @@ package im.vector.app.features.roomprofile.polls import im.vector.app.core.platform.VectorViewModelAction -sealed interface RoomPollsAction : VectorViewModelAction { - data class SetFilter(val filter: RoomPollsFilterType) : RoomPollsAction -} +sealed interface RoomPollsAction : VectorViewModelAction diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFragment.kt index 5c150f4391..95aa5d0d95 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFragment.kt @@ -67,6 +67,7 @@ class RoomPollsFragment : VectorBaseFragment() { tabLayoutMediator = TabLayoutMediator(views.roomPollsTabs, views.roomPollsViewPager) { tab, position -> when (position) { 0 -> tab.text = getString(R.string.room_polls_active) + 1 -> tab.text = getString(R.string.room_polls_ended) } }.also { it.attach() } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsPagerAdapter.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsPagerAdapter.kt index 5472782079..2dc6fd4369 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsPagerAdapter.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsPagerAdapter.kt @@ -19,15 +19,19 @@ package im.vector.app.features.roomprofile.polls import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter import im.vector.app.features.roomprofile.polls.active.RoomActivePollsFragment +import im.vector.app.features.roomprofile.polls.ended.RoomEndedPollsFragment class RoomPollsPagerAdapter( private val fragment: Fragment ) : FragmentStateAdapter(fragment) { - override fun getItemCount() = 1 + override fun getItemCount() = 2 override fun createFragment(position: Int): Fragment { - return instantiateFragment(RoomActivePollsFragment::class.java.name) + return when (position) { + 0 -> instantiateFragment(RoomActivePollsFragment::class.java.name) + else -> instantiateFragment(RoomEndedPollsFragment::class.java.name) + } } private fun instantiateFragment(fragmentName: String): Fragment { 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 7bc06894fa..95cb4717ca 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 @@ -16,7 +16,6 @@ package im.vector.app.features.roomprofile.polls -import androidx.annotation.VisibleForTesting import com.airbnb.mvrx.MavericksViewModelFactory import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -24,7 +23,6 @@ import dagger.assisted.AssistedInject import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel -import kotlinx.coroutines.Job import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -40,24 +38,17 @@ class RoomPollsViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() - @VisibleForTesting - var pollsCollectionJob: Job? = null - - override fun handle(action: RoomPollsAction) { - when (action) { - is RoomPollsAction.SetFilter -> handleSetFilter(action.filter) - } + init { + observePolls() } - override fun onCleared() { - pollsCollectionJob = null - super.onCleared() - } - - private fun handleSetFilter(filter: RoomPollsFilterType) { - pollsCollectionJob?.cancel() - pollsCollectionJob = getPollsUseCase.execute(filter) + private fun observePolls() { + getPollsUseCase.execute() .onEach { setState { copy(polls = it) } } .launchIn(viewModelScope) } + + override fun handle(action: RoomPollsAction) { + // do nothing for now + } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsFragment.kt index 61c7e961bd..dc735c79be 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsFragment.kt @@ -16,77 +16,19 @@ package im.vector.app.features.roomprofile.polls.active -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.core.view.isVisible -import com.airbnb.mvrx.parentFragmentViewModel -import com.airbnb.mvrx.withState import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R -import im.vector.app.core.extensions.cleanup -import im.vector.app.core.extensions.configureWith -import im.vector.app.core.platform.VectorBaseFragment -import im.vector.app.databinding.FragmentRoomPollsListBinding -import im.vector.app.features.roomprofile.polls.PollSummary -import im.vector.app.features.roomprofile.polls.RoomPollsAction import im.vector.app.features.roomprofile.polls.RoomPollsFilterType -import im.vector.app.features.roomprofile.polls.RoomPollsViewModel -import timber.log.Timber -import javax.inject.Inject +import im.vector.app.features.roomprofile.polls.list.RoomPollsListFragment @AndroidEntryPoint -class RoomActivePollsFragment : - VectorBaseFragment(), - RoomActivePollsController.Listener { +class RoomActivePollsFragment : RoomPollsListFragment() { - @Inject - lateinit var roomActivePollsController: RoomActivePollsController - - private val viewModel: RoomPollsViewModel by parentFragmentViewModel(RoomPollsViewModel::class) - - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentRoomPollsListBinding { - return FragmentRoomPollsListBinding.inflate(inflater, container, false) + override fun getEmptyListTitle(): String { + return getString(R.string.room_polls_active_no_item) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - setupList() - } - - private fun setupList() { - roomActivePollsController.listener = this - views.roomPollsList.configureWith(roomActivePollsController) - views.roomPollsEmptyTitle.text = getString(R.string.room_polls_active_no_item) - } - - override fun onDestroyView() { - cleanUpList() - super.onDestroyView() - } - - private fun cleanUpList() { - views.roomPollsList.cleanup() - roomActivePollsController.listener = null - } - - override fun onResume() { - super.onResume() - viewModel.handle(RoomPollsAction.SetFilter(RoomPollsFilterType.ACTIVE)) - } - - override fun invalidate() = withState(viewModel) { viewState -> - renderList(viewState.polls.filterIsInstance(PollSummary.ActivePoll::class.java)) - } - - private fun renderList(polls: List) { - roomActivePollsController.setData(polls) - views.roomPollsEmptyTitle.isVisible = polls.isEmpty() - } - - override fun onPollClicked(pollId: String) { - // TODO navigate to details - Timber.d("poll with id $pollId clicked") + override fun getRoomPollsFilter(): RoomPollsFilterType { + return RoomPollsFilterType.ACTIVE } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt new file mode 100644 index 0000000000..bad1a4e2da --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022 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.ended + +import dagger.hilt.android.AndroidEntryPoint +import im.vector.app.R +import im.vector.app.features.roomprofile.polls.RoomPollsFilter +import im.vector.app.features.roomprofile.polls.list.RoomPollsListFragment + +@AndroidEntryPoint +class RoomEndedPollsFragment : RoomPollsListFragment() { + + override fun getEmptyListTitle(): String { + return getString(R.string.room_polls_ended_no_item) + } + + override fun getRoomPollsFilter(): RoomPollsFilter { + return RoomPollsFilter.ENDED + } +} diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/ActivePollItem.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt similarity index 90% rename from vector/src/main/java/im/vector/app/features/roomprofile/polls/active/ActivePollItem.kt rename to vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt index 35b1ecd6e1..ac2b9cf3c0 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/ActivePollItem.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.roomprofile.polls.active +package im.vector.app.features.roomprofile.polls.list import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute @@ -26,7 +26,7 @@ import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.epoxy.onClick @EpoxyModelClass -abstract class ActivePollItem : VectorEpoxyModel(R.layout.item_poll) { +abstract class RoomPollItem : VectorEpoxyModel(R.layout.item_poll) { @EpoxyAttribute lateinit var formattedDate: String diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt similarity index 50% rename from vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsController.kt rename to vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt index 7a7c818693..e24241f0af 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package im.vector.app.features.roomprofile.polls.active +package im.vector.app.features.roomprofile.polls.list import com.airbnb.epoxy.TypedEpoxyController import im.vector.app.core.date.DateFormatKind @@ -22,9 +22,9 @@ import im.vector.app.core.date.VectorDateFormatter import im.vector.app.features.roomprofile.polls.PollSummary import javax.inject.Inject -class RoomActivePollsController @Inject constructor( +class RoomPollsController @Inject constructor( val dateFormatter: VectorDateFormatter, -) : TypedEpoxyController>() { +) : TypedEpoxyController>() { interface Listener { fun onPollClicked(pollId: String) @@ -32,20 +32,39 @@ class RoomActivePollsController @Inject constructor( var listener: Listener? = null - override fun buildModels(data: List?) { + override fun buildModels(data: List?) { if (data.isNullOrEmpty()) { return } - val host = this for (poll in data) { - activePollItem { - id(poll.id) - formattedDate(host.dateFormatter.format(poll.creationTimestamp, DateFormatKind.TIMELINE_DAY_DIVIDER)) - title(poll.title) - clickListener { - host.listener?.onPollClicked(poll.id) - } + when (poll) { + is PollSummary.ActivePoll -> buildActivePollItem(poll) + is PollSummary.EndedPoll -> buildEndedPollItem(poll) + } + } + } + + private fun buildActivePollItem(poll: PollSummary.ActivePoll) { + val host = this + roomPollItem { + id(poll.id) + formattedDate(host.dateFormatter.format(poll.creationTimestamp, DateFormatKind.TIMELINE_DAY_DIVIDER)) + title(poll.title) + clickListener { + host.listener?.onPollClicked(poll.id) + } + } + } + + private fun buildEndedPollItem(poll: PollSummary.EndedPoll) { + val host = this + roomPollItem { + id(poll.id) + formattedDate(host.dateFormatter.format(poll.creationTimestamp, DateFormatKind.TIMELINE_DAY_DIVIDER)) + title(poll.title) + clickListener { + host.listener?.onPollClicked(poll.id) } } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt new file mode 100644 index 0000000000..f408f1c781 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2022 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.list + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.isVisible +import com.airbnb.mvrx.parentFragmentViewModel +import com.airbnb.mvrx.withState +import im.vector.app.core.extensions.cleanup +import im.vector.app.core.extensions.configureWith +import im.vector.app.core.platform.VectorBaseFragment +import im.vector.app.databinding.FragmentRoomPollsListBinding +import im.vector.app.features.roomprofile.polls.PollSummary +import im.vector.app.features.roomprofile.polls.RoomPollsFilter +import im.vector.app.features.roomprofile.polls.RoomPollsViewModel +import timber.log.Timber +import javax.inject.Inject + +abstract class RoomPollsListFragment : + VectorBaseFragment(), + RoomPollsController.Listener { + + @Inject + lateinit var roomPollsController: RoomPollsController + + private val viewModel: RoomPollsViewModel by parentFragmentViewModel(RoomPollsViewModel::class) + + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentRoomPollsListBinding { + return FragmentRoomPollsListBinding.inflate(inflater, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupList() + } + + abstract fun getEmptyListTitle(): String + + abstract fun getRoomPollsFilter(): RoomPollsFilter + + private fun setupList() { + roomPollsController.listener = this + views.roomPollsList.configureWith(roomPollsController) + views.roomPollsEmptyTitle.text = getEmptyListTitle() + } + + override fun onDestroyView() { + cleanUpList() + super.onDestroyView() + } + + private fun cleanUpList() { + views.roomPollsList.cleanup() + roomPollsController.listener = null + } + + override fun invalidate() = withState(viewModel) { viewState -> + when (getRoomPollsFilter()) { + RoomPollsFilter.ACTIVE -> renderList(viewState.polls.filterIsInstance(PollSummary.ActivePoll::class.java)) + RoomPollsFilter.ENDED -> renderList(viewState.polls.filterIsInstance(PollSummary.EndedPoll::class.java)) + } + } + + private fun renderList(polls: List) { + roomPollsController.setData(polls) + views.roomPollsEmptyTitle.isVisible = polls.isEmpty() + } + + override fun onPollClicked(pollId: String) { + // TODO navigate to details + Timber.d("poll with id $pollId clicked") + } +} From 740591cd38a01d8bf469cac3d78cf162e4a71c89 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 30 Dec 2022 17:31:23 +0100 Subject: [PATCH 03/10] Updating unit tests --- .../roomprofile/polls/RoomPollsViewModelTest.kt | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/vector/src/test/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModelTest.kt b/vector/src/test/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModelTest.kt index 0dce2dd6e0..9cca32c5e6 100644 --- a/vector/src/test/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/roomprofile/polls/RoomPollsViewModelTest.kt @@ -23,7 +23,6 @@ import io.mockk.every import io.mockk.mockk import io.mockk.verify import kotlinx.coroutines.flow.flowOf -import org.amshove.kluent.shouldNotBeNull import org.junit.Rule import org.junit.Test @@ -45,28 +44,22 @@ class RoomPollsViewModelTest { } @Test - fun `given SetFilter action when handle then useCase is called with given filter and viewState is updated`() { + fun `given viewModel when created then polls list is observed and viewState is updated`() { // Given - val filter = RoomPollsFilterType.ACTIVE - val action = RoomPollsAction.SetFilter(filter = filter) val polls = listOf(givenAPollSummary()) - every { fakeGetPollsUseCase.execute(any()) } returns flowOf(polls) - val viewModel = createViewModel() + every { fakeGetPollsUseCase.execute() } returns flowOf(polls) val expectedViewState = initialState.copy(polls = polls) // When + val viewModel = createViewModel() val viewModelTest = viewModel.test() - viewModel.pollsCollectionJob = null - viewModel.handle(action) // Then viewModelTest .assertLatestState(expectedViewState) .finish() - viewModel.pollsCollectionJob.shouldNotBeNull() verify { - viewModel.pollsCollectionJob?.cancel() - fakeGetPollsUseCase.execute(filter) + fakeGetPollsUseCase.execute() } } From cf82486efa20613b7130399928c094eb031a790b Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 30 Dec 2022 17:38:55 +0100 Subject: [PATCH 04/10] Adding mocked data for ended polls --- .../roomprofile/polls/GetPollsUseCase.kt | 79 ++++++++++++------- .../features/roomprofile/polls/PollSummary.kt | 16 ++-- 2 files changed, 60 insertions(+), 35 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt index 06915c7b6a..7346f8769c 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt @@ -25,38 +25,59 @@ class GetPollsUseCase @Inject constructor() { fun execute(): Flow> { // TODO unmock and add unit tests - return getActivePolls() + return flowOf(getActivePolls() + getEndedPolls()) .map { it.sortedByDescending { poll -> poll.creationTimestamp } } } - private fun getActivePolls(): Flow> { - return flowOf( - listOf( - PollSummary.ActivePoll( - id = "id1", - // 2022/06/28 UTC+1 - creationTimestamp = 1656367200000, - title = "Which charity would you like to support?" - ), - PollSummary.ActivePoll( - id = "id2", - // 2022/06/26 UTC+1 - creationTimestamp = 1656194400000, - title = "Which sport should the pupils do this year?" - ), - PollSummary.ActivePoll( - id = "id3", - // 2022/06/24 UTC+1 - creationTimestamp = 1656021600000, - title = "What type of food should we have at the party?" - ), - PollSummary.ActivePoll( - id = "id4", - // 2022/06/22 UTC+1 - creationTimestamp = 1655848800000, - title = "What film should we show at the end of the year party?" - ), - ) + private fun getActivePolls(): List { + return listOf( + PollSummary.ActivePoll( + id = "id1", + // 2022/06/28 UTC+1 + creationTimestamp = 1656367200000, + title = "Which charity would you like to support?" + ), + PollSummary.ActivePoll( + id = "id2", + // 2022/06/26 UTC+1 + creationTimestamp = 1656194400000, + title = "Which sport should the pupils do this year?" + ), + PollSummary.ActivePoll( + id = "id3", + // 2022/06/24 UTC+1 + creationTimestamp = 1656021600000, + title = "What type of food should we have at the party?" + ), + PollSummary.ActivePoll( + id = "id4", + // 2022/06/22 UTC+1 + creationTimestamp = 1655848800000, + title = "What film should we show at the end of the year party?" + ), + ) + } + + private fun getEndedPolls(): List { + return listOf( + PollSummary.EndedPoll( + id = "id1-ended", + // 2022/06/28 UTC+1 + creationTimestamp = 1656367200000, + title = "Which charity would you like to support?" + ), + PollSummary.EndedPoll( + id = "id2-ended", + // 2022/06/26 UTC+1 + creationTimestamp = 1656194400000, + title = "Where should we do the offsite?" + ), + PollSummary.EndedPoll( + id = "id3-ended", + // 2022/06/24 UTC+1 + creationTimestamp = 1656021600000, + title = "What type of food should we have at the party?" + ), ) } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt index 939ee3ffa0..12ac97dc02 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt @@ -17,15 +17,19 @@ package im.vector.app.features.roomprofile.polls sealed interface PollSummary { + val id: String + val creationTimestamp: Long + val title: String + data class ActivePoll( - val id: String, - val creationTimestamp: Long, - val title: String, + override val id: String, + override val creationTimestamp: Long, + override val title: String, ) : PollSummary data class EndedPoll( - val id: String, - val creationTimestamp: Long, - val title: String, + override val id: String, + override val creationTimestamp: Long, + override val title: String, ) : PollSummary } From 3deae1101c317375dbf1f14ddbcde8e40fa5a6c9 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Tue, 3 Jan 2023 17:32:41 +0100 Subject: [PATCH 05/10] Adding extra data for ended poll --- .../roomprofile/polls/GetPollsUseCase.kt | 37 +++++++++++++++++-- .../features/roomprofile/polls/PollSummary.kt | 4 ++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt index 7346f8769c..6f2a757ed7 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/GetPollsUseCase.kt @@ -16,6 +16,7 @@ package im.vector.app.features.roomprofile.polls +import im.vector.app.features.home.room.detail.timeline.item.PollOptionViewState import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map @@ -64,19 +65,49 @@ class GetPollsUseCase @Inject constructor() { id = "id1-ended", // 2022/06/28 UTC+1 creationTimestamp = 1656367200000, - title = "Which charity would you like to support?" + title = "Which charity would you like to support?", + totalVotes = 22, + winnerOptions = listOf( + PollOptionViewState.PollEnded( + optionId = "id1", + optionAnswer = "Cancer research", + voteCount = 13, + votePercentage = 13 / 22.0, + isWinner = true, + ) + ), ), PollSummary.EndedPoll( id = "id2-ended", // 2022/06/26 UTC+1 creationTimestamp = 1656194400000, - title = "Where should we do the offsite?" + title = "Where should we do the offsite?", + totalVotes = 92, + winnerOptions = listOf( + PollOptionViewState.PollEnded( + optionId = "id1", + optionAnswer = "Hawaii", + voteCount = 43, + votePercentage = 43 / 92.0, + isWinner = true, + ) + ), ), PollSummary.EndedPoll( id = "id3-ended", // 2022/06/24 UTC+1 creationTimestamp = 1656021600000, - title = "What type of food should we have at the party?" + title = "What type of food should we have at the party?", + totalVotes = 22, + winnerOptions = listOf( + PollOptionViewState.PollEnded( + optionId = "id1", + optionAnswer = "Brazilian", + voteCount = 13, + votePercentage = 13 / 22.0, + isWinner = true, + ) + ), ), ) } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt index 12ac97dc02..f24ac8b8a6 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/PollSummary.kt @@ -16,6 +16,8 @@ package im.vector.app.features.roomprofile.polls +import im.vector.app.features.home.room.detail.timeline.item.PollOptionViewState + sealed interface PollSummary { val id: String val creationTimestamp: Long @@ -31,5 +33,7 @@ sealed interface PollSummary { override val id: String, override val creationTimestamp: Long, override val title: String, + val totalVotes: Int, + val winnerOptions: List, ) : PollSummary } From 1cc26449f3f9145abe79e105a9635aa1f4152dde Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 4 Jan 2023 10:12:34 +0100 Subject: [PATCH 06/10] Renaming some ui fields --- .../features/roomprofile/polls/list/RoomPollItem.kt | 4 ++-- vector/src/main/res/layout/item_poll.xml | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt index ac2b9cf3c0..633162f6eb 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt @@ -45,7 +45,7 @@ abstract class RoomPollItem : VectorEpoxyModel(R.layout.ite } class Holder : VectorEpoxyHolder() { - val date by bind(R.id.pollActiveDate) - val title by bind(R.id.pollActiveTitle) + val date by bind(R.id.pollDate) + val title by bind(R.id.pollTitle) } } diff --git a/vector/src/main/res/layout/item_poll.xml b/vector/src/main/res/layout/item_poll.xml index 956ecf9b3c..8e9fa54a0f 100644 --- a/vector/src/main/res/layout/item_poll.xml +++ b/vector/src/main/res/layout/item_poll.xml @@ -7,7 +7,7 @@ android:foreground="?selectableItemBackground"> From 05363dc8ca26609ff41f746869a720ccb7da6135 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 4 Jan 2023 10:30:57 +0100 Subject: [PATCH 07/10] Adding winner option views for ended poll items --- .../features/roomprofile/polls/list/RoomPollItem.kt | 13 +++++++++++++ .../roomprofile/polls/list/RoomPollsController.kt | 1 + vector/src/main/res/layout/item_poll.xml | 12 ++++++++++++ 3 files changed, 26 insertions(+) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt index 633162f6eb..fd4e36159e 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt @@ -16,6 +16,7 @@ package im.vector.app.features.roomprofile.polls.list +import android.widget.LinearLayout import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass @@ -24,6 +25,8 @@ import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.epoxy.onClick +import im.vector.app.features.home.room.detail.timeline.item.PollOptionView +import im.vector.app.features.home.room.detail.timeline.item.PollOptionViewState @EpoxyModelClass abstract class RoomPollItem : VectorEpoxyModel(R.layout.item_poll) { @@ -34,6 +37,9 @@ abstract class RoomPollItem : VectorEpoxyModel(R.layout.ite @EpoxyAttribute lateinit var title: String + @EpoxyAttribute + var winnerOptions: List = emptyList() + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var clickListener: ClickListener? = null @@ -42,10 +48,17 @@ abstract class RoomPollItem : VectorEpoxyModel(R.layout.ite holder.view.onClick(clickListener) holder.date.text = formattedDate holder.title.text = title + holder.winnerOptions.removeAllViews() + for (winnerOption in winnerOptions) { + val optionView = PollOptionView(holder.view.context) + holder.winnerOptions.addView(optionView) + optionView.render(winnerOption) + } } class Holder : VectorEpoxyHolder() { val date by bind(R.id.pollDate) val title by bind(R.id.pollTitle) + val winnerOptions by bind(R.id.pollWinnerOptionsContainer) } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt index e24241f0af..c6288aac8b 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt @@ -63,6 +63,7 @@ class RoomPollsController @Inject constructor( id(poll.id) formattedDate(host.dateFormatter.format(poll.creationTimestamp, DateFormatKind.TIMELINE_DAY_DIVIDER)) title(poll.title) + winnerOptions(poll.winnerOptions) clickListener { host.listener?.onPollClicked(poll.id) } diff --git a/vector/src/main/res/layout/item_poll.xml b/vector/src/main/res/layout/item_poll.xml index 8e9fa54a0f..9563f3d52a 100644 --- a/vector/src/main/res/layout/item_poll.xml +++ b/vector/src/main/res/layout/item_poll.xml @@ -42,4 +42,16 @@ app:layout_constraintTop_toBottomOf="@id/pollDate" tools:text="Which sport should the pupils do this year?" /> + + From a5d076a28a2c82483cdaea9114f1e0cc0cc561da Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 4 Jan 2023 10:49:07 +0100 Subject: [PATCH 08/10] Adding total votes status for ended poll items --- .../features/roomprofile/polls/list/RoomPollItem.kt | 8 ++++++++ .../roomprofile/polls/list/RoomPollsController.kt | 4 ++++ vector/src/main/res/layout/item_poll.xml | 12 ++++++++++++ 3 files changed, 24 insertions(+) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt index fd4e36159e..da00fedddb 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollItem.kt @@ -18,6 +18,7 @@ package im.vector.app.features.roomprofile.polls.list import android.widget.LinearLayout import android.widget.TextView +import androidx.core.view.isVisible import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R @@ -25,6 +26,7 @@ import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.epoxy.onClick +import im.vector.app.core.extensions.setTextOrHide import im.vector.app.features.home.room.detail.timeline.item.PollOptionView import im.vector.app.features.home.room.detail.timeline.item.PollOptionViewState @@ -40,6 +42,9 @@ abstract class RoomPollItem : VectorEpoxyModel(R.layout.ite @EpoxyAttribute var winnerOptions: List = emptyList() + @EpoxyAttribute + var totalVotesStatus: String? = null + @EpoxyAttribute(EpoxyAttribute.Option.DoNotHash) var clickListener: ClickListener? = null @@ -49,16 +54,19 @@ abstract class RoomPollItem : VectorEpoxyModel(R.layout.ite holder.date.text = formattedDate holder.title.text = title holder.winnerOptions.removeAllViews() + holder.winnerOptions.isVisible = winnerOptions.isNotEmpty() for (winnerOption in winnerOptions) { val optionView = PollOptionView(holder.view.context) holder.winnerOptions.addView(optionView) optionView.render(winnerOption) } + holder.totalVotes.setTextOrHide(totalVotesStatus) } class Holder : VectorEpoxyHolder() { val date by bind(R.id.pollDate) val title by bind(R.id.pollTitle) val winnerOptions by bind(R.id.pollWinnerOptionsContainer) + val totalVotes by bind(R.id.pollTotalVotes) } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt index c6288aac8b..f0e3b6b9a4 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsController.kt @@ -17,13 +17,16 @@ package im.vector.app.features.roomprofile.polls.list import com.airbnb.epoxy.TypedEpoxyController +import im.vector.app.R import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter +import im.vector.app.core.resources.StringProvider import im.vector.app.features.roomprofile.polls.PollSummary import javax.inject.Inject class RoomPollsController @Inject constructor( val dateFormatter: VectorDateFormatter, + val stringProvider: StringProvider, ) : TypedEpoxyController>() { interface Listener { @@ -64,6 +67,7 @@ class RoomPollsController @Inject constructor( formattedDate(host.dateFormatter.format(poll.creationTimestamp, DateFormatKind.TIMELINE_DAY_DIVIDER)) title(poll.title) winnerOptions(poll.winnerOptions) + totalVotesStatus(host.stringProvider.getQuantityString(R.plurals.poll_total_vote_count_after_ended, poll.totalVotes, poll.totalVotes)) clickListener { host.listener?.onPollClicked(poll.id) } diff --git a/vector/src/main/res/layout/item_poll.xml b/vector/src/main/res/layout/item_poll.xml index 9563f3d52a..17f3b5abf5 100644 --- a/vector/src/main/res/layout/item_poll.xml +++ b/vector/src/main/res/layout/item_poll.xml @@ -54,4 +54,16 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/pollTitle" /> + + From 9b5fda2689531063847707804100be2576990afa Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Thu, 5 Jan 2023 15:45:35 +0100 Subject: [PATCH 09/10] Fix after rebase --- .../roomprofile/polls/ended/RoomEndedPollsFragment.kt | 6 +++--- .../roomprofile/polls/list/RoomPollsListFragment.kt | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt index bad1a4e2da..add7096409 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt @@ -18,7 +18,7 @@ package im.vector.app.features.roomprofile.polls.ended import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R -import im.vector.app.features.roomprofile.polls.RoomPollsFilter +import im.vector.app.features.roomprofile.polls.RoomPollsFilterType import im.vector.app.features.roomprofile.polls.list.RoomPollsListFragment @AndroidEntryPoint @@ -28,7 +28,7 @@ class RoomEndedPollsFragment : RoomPollsListFragment() { return getString(R.string.room_polls_ended_no_item) } - override fun getRoomPollsFilter(): RoomPollsFilter { - return RoomPollsFilter.ENDED + override fun getRoomPollsFilter(): RoomPollsFilterType { + return RoomPollsFilterType.ENDED } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt index f408f1c781..f6aa59f447 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt @@ -28,7 +28,7 @@ import im.vector.app.core.extensions.configureWith import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentRoomPollsListBinding import im.vector.app.features.roomprofile.polls.PollSummary -import im.vector.app.features.roomprofile.polls.RoomPollsFilter +import im.vector.app.features.roomprofile.polls.RoomPollsFilterType import im.vector.app.features.roomprofile.polls.RoomPollsViewModel import timber.log.Timber import javax.inject.Inject @@ -53,7 +53,7 @@ abstract class RoomPollsListFragment : abstract fun getEmptyListTitle(): String - abstract fun getRoomPollsFilter(): RoomPollsFilter + abstract fun getRoomPollsFilter(): RoomPollsFilterType private fun setupList() { roomPollsController.listener = this @@ -73,8 +73,8 @@ abstract class RoomPollsListFragment : override fun invalidate() = withState(viewModel) { viewState -> when (getRoomPollsFilter()) { - RoomPollsFilter.ACTIVE -> renderList(viewState.polls.filterIsInstance(PollSummary.ActivePoll::class.java)) - RoomPollsFilter.ENDED -> renderList(viewState.polls.filterIsInstance(PollSummary.EndedPoll::class.java)) + RoomPollsFilterType.ACTIVE -> renderList(viewState.polls.filterIsInstance(PollSummary.ActivePoll::class.java)) + RoomPollsFilterType.ENDED -> renderList(viewState.polls.filterIsInstance(PollSummary.EndedPoll::class.java)) } } From 85cfa433d9e15362c0b907d19e253c01cff665c5 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Fri, 6 Jan 2023 14:13:58 +0100 Subject: [PATCH 10/10] Using ordinal of enum to render tabs --- .../features/roomprofile/polls/RoomPollsFragment.kt | 4 ++-- .../roomprofile/polls/RoomPollsPagerAdapter.kt | 7 ++++--- .../polls/{RoomPollsFilterType.kt => RoomPollsType.kt} | 2 +- .../polls/active/RoomActivePollsFragment.kt | 6 +++--- .../roomprofile/polls/ended/RoomEndedPollsFragment.kt | 6 +++--- .../roomprofile/polls/list/RoomPollsListFragment.kt | 10 +++++----- 6 files changed, 18 insertions(+), 17 deletions(-) rename vector/src/main/java/im/vector/app/features/roomprofile/polls/{RoomPollsFilterType.kt => RoomPollsType.kt} (95%) diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFragment.kt index 95aa5d0d95..9f7e704135 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFragment.kt @@ -66,8 +66,8 @@ class RoomPollsFragment : VectorBaseFragment() { tabLayoutMediator = TabLayoutMediator(views.roomPollsTabs, views.roomPollsViewPager) { tab, position -> when (position) { - 0 -> tab.text = getString(R.string.room_polls_active) - 1 -> tab.text = getString(R.string.room_polls_ended) + RoomPollsType.ACTIVE.ordinal -> tab.text = getString(R.string.room_polls_active) + RoomPollsType.ENDED.ordinal -> tab.text = getString(R.string.room_polls_ended) } }.also { it.attach() } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsPagerAdapter.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsPagerAdapter.kt index 2dc6fd4369..c60fc5de27 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsPagerAdapter.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsPagerAdapter.kt @@ -25,12 +25,13 @@ class RoomPollsPagerAdapter( private val fragment: Fragment ) : FragmentStateAdapter(fragment) { - override fun getItemCount() = 2 + override fun getItemCount() = RoomPollsType.values().size override fun createFragment(position: Int): Fragment { return when (position) { - 0 -> instantiateFragment(RoomActivePollsFragment::class.java.name) - else -> instantiateFragment(RoomEndedPollsFragment::class.java.name) + RoomPollsType.ACTIVE.ordinal -> instantiateFragment(RoomActivePollsFragment::class.java.name) + RoomPollsType.ENDED.ordinal -> instantiateFragment(RoomEndedPollsFragment::class.java.name) + else -> throw IllegalArgumentException("position should be between 0 and ${itemCount - 1}, while it was $position") } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFilterType.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsType.kt similarity index 95% rename from vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFilterType.kt rename to vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsType.kt index 39f1163536..134ef9a195 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsFilterType.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/RoomPollsType.kt @@ -16,7 +16,7 @@ package im.vector.app.features.roomprofile.polls -enum class RoomPollsFilterType { +enum class RoomPollsType { ACTIVE, ENDED, } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsFragment.kt index dc735c79be..1c6a03c480 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/active/RoomActivePollsFragment.kt @@ -18,7 +18,7 @@ package im.vector.app.features.roomprofile.polls.active import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R -import im.vector.app.features.roomprofile.polls.RoomPollsFilterType +import im.vector.app.features.roomprofile.polls.RoomPollsType import im.vector.app.features.roomprofile.polls.list.RoomPollsListFragment @AndroidEntryPoint @@ -28,7 +28,7 @@ class RoomActivePollsFragment : RoomPollsListFragment() { return getString(R.string.room_polls_active_no_item) } - override fun getRoomPollsFilter(): RoomPollsFilterType { - return RoomPollsFilterType.ACTIVE + override fun getRoomPollsType(): RoomPollsType { + return RoomPollsType.ACTIVE } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt index add7096409..8dd0cadadf 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/ended/RoomEndedPollsFragment.kt @@ -18,7 +18,7 @@ package im.vector.app.features.roomprofile.polls.ended import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R -import im.vector.app.features.roomprofile.polls.RoomPollsFilterType +import im.vector.app.features.roomprofile.polls.RoomPollsType import im.vector.app.features.roomprofile.polls.list.RoomPollsListFragment @AndroidEntryPoint @@ -28,7 +28,7 @@ class RoomEndedPollsFragment : RoomPollsListFragment() { return getString(R.string.room_polls_ended_no_item) } - override fun getRoomPollsFilter(): RoomPollsFilterType { - return RoomPollsFilterType.ENDED + override fun getRoomPollsType(): RoomPollsType { + return RoomPollsType.ENDED } } diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt index f6aa59f447..0d97bd8dcb 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/polls/list/RoomPollsListFragment.kt @@ -28,7 +28,7 @@ import im.vector.app.core.extensions.configureWith import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.databinding.FragmentRoomPollsListBinding import im.vector.app.features.roomprofile.polls.PollSummary -import im.vector.app.features.roomprofile.polls.RoomPollsFilterType +import im.vector.app.features.roomprofile.polls.RoomPollsType import im.vector.app.features.roomprofile.polls.RoomPollsViewModel import timber.log.Timber import javax.inject.Inject @@ -53,7 +53,7 @@ abstract class RoomPollsListFragment : abstract fun getEmptyListTitle(): String - abstract fun getRoomPollsFilter(): RoomPollsFilterType + abstract fun getRoomPollsType(): RoomPollsType private fun setupList() { roomPollsController.listener = this @@ -72,9 +72,9 @@ abstract class RoomPollsListFragment : } override fun invalidate() = withState(viewModel) { viewState -> - when (getRoomPollsFilter()) { - RoomPollsFilterType.ACTIVE -> renderList(viewState.polls.filterIsInstance(PollSummary.ActivePoll::class.java)) - RoomPollsFilterType.ENDED -> renderList(viewState.polls.filterIsInstance(PollSummary.EndedPoll::class.java)) + when (getRoomPollsType()) { + RoomPollsType.ACTIVE -> renderList(viewState.polls.filterIsInstance(PollSummary.ActivePoll::class.java)) + RoomPollsType.ENDED -> renderList(viewState.polls.filterIsInstance(PollSummary.EndedPoll::class.java)) } }