Open poll detail screen.

This commit is contained in:
Onuray Sahin 2023-01-31 11:13:14 +03:00 committed by Maxime NATUREL
parent c9dc570f83
commit b86f6a41bd
10 changed files with 80 additions and 10 deletions

View file

@ -106,7 +106,7 @@ class RoomProfileActivity :
RoomProfileSharedAction.OpenRoomUploads -> openRoomUploads()
RoomProfileSharedAction.OpenBannedRoomMembers -> openBannedRoomMembers()
RoomProfileSharedAction.OpenRoomNotificationSettings -> openRoomNotificationSettings()
is RoomProfileSharedAction.OpenPollDetails -> handleOpenPollDetails()
is RoomProfileSharedAction.OpenPollDetails -> handleOpenPollDetails(sharedAction)
}
}
.launchIn(lifecycleScope)
@ -132,8 +132,12 @@ class RoomProfileActivity :
finish()
}
private fun handleOpenPollDetails() {
addFragmentToBackstack(views.simpleFragmentContainer, RoomPollDetailFragment::class.java, roomProfileArgs)
private fun handleOpenPollDetails(sharedAction: RoomProfileSharedAction.OpenPollDetails) {
addFragmentToBackstack(
views.simpleFragmentContainer,
RoomPollDetailFragment::class.java,
roomProfileArgs.copy(selectedPollId = sharedAction.pollId)
)
}
private fun openRoomPolls() {

View file

@ -64,7 +64,8 @@ import javax.inject.Inject
@Parcelize
data class RoomProfileArgs(
val roomId: String
val roomId: String,
val selectedPollId: String? = null,
) : Parcelable
@AndroidEntryPoint

View file

@ -26,7 +26,7 @@ sealed class RoomProfileSharedAction : VectorSharedAction {
object OpenRoomAliasesSettings : RoomProfileSharedAction()
object OpenRoomPermissionsSettings : RoomProfileSharedAction()
object OpenRoomPolls : RoomProfileSharedAction()
object OpenPollDetails : RoomProfileSharedAction()
data class OpenPollDetails(val pollId: String) : RoomProfileSharedAction()
object OpenRoomUploads : RoomProfileSharedAction()
object OpenRoomMembers : RoomProfileSharedAction()
object OpenBannedRoomMembers : RoomProfileSharedAction()

View file

@ -20,5 +20,6 @@ import im.vector.app.core.platform.VectorViewModelAction
sealed interface RoomPollsAction : VectorViewModelAction {
object LoadMorePolls : RoomPollsAction
data class OnRoomPollsTypeChange(val roomPollsType: RoomPollsType) : RoomPollsAction
data class OnPollSelected(val selectedPollId: String) : RoomPollsAction
}

View file

@ -20,6 +20,9 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.viewpager2.widget.ViewPager2
import com.airbnb.mvrx.args
import com.airbnb.mvrx.fragmentViewModel
import com.google.android.material.tabs.TabLayoutMediator
@ -66,9 +69,35 @@ class RoomPollsFragment : VectorBaseFragment<FragmentRoomPollsBinding>() {
tabLayoutMediator = TabLayoutMediator(views.roomPollsTabs, views.roomPollsViewPager) { tab, position ->
when (position) {
RoomPollsType.ACTIVE.ordinal -> tab.text = getString(R.string.room_polls_active)
RoomPollsType.ENDED.ordinal -> 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() }
val onPageChangeCallback = object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
when (position) {
RoomPollsType.ACTIVE.ordinal -> {
viewModel.handle(RoomPollsAction.OnRoomPollsTypeChange(RoomPollsType.ACTIVE))
}
RoomPollsType.ENDED.ordinal -> {
viewModel.handle(RoomPollsAction.OnRoomPollsTypeChange(RoomPollsType.ENDED))
}
}
}
}
viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
views.roomPollsViewPager.registerOnPageChangeCallback(onPageChangeCallback)
}
override fun onDestroy(owner: LifecycleOwner) {
views.roomPollsViewPager.unregisterOnPageChangeCallback(onPageChangeCallback)
}
})
}
}

View file

@ -20,5 +20,5 @@ import im.vector.app.core.platform.VectorViewEvents
sealed class RoomPollsViewEvent : VectorViewEvents {
object LoadingError : RoomPollsViewEvent()
object NavigateToPollDetail : RoomPollsViewEvent()
data class NavigateToPollDetail(val selectedPollId: String) : RoomPollsViewEvent()
}

View file

@ -90,12 +90,17 @@ class RoomPollsViewModel @AssistedInject constructor(
when (action) {
RoomPollsAction.LoadMorePolls -> handleLoadMore()
is RoomPollsAction.OnPollSelected -> handleOnPollSelected(action)
is RoomPollsAction.OnRoomPollsTypeChange -> handleOnRoomPollsTypeChange(action)
}
}
private fun handleOnRoomPollsTypeChange(action: RoomPollsAction.OnRoomPollsTypeChange) {
setState { copy(selectedRoomPollsType = action.roomPollsType) }
}
private fun handleOnPollSelected(action: RoomPollsAction.OnPollSelected) {
setState { copy(selectedPollId = action.selectedPollId) }
_viewEvents.post(RoomPollsViewEvent.NavigateToPollDetail)
_viewEvents.post(RoomPollsViewEvent.NavigateToPollDetail(action.selectedPollId))
}
private fun handleLoadMore() = withState { viewState ->

View file

@ -28,6 +28,7 @@ data class RoomPollsViewState(
val nbSyncedDays: Int = 0,
val isSyncing: Boolean = false,
val selectedPollId: String? = null,
val selectedRoomPollsType: RoomPollsType = RoomPollsType.ACTIVE,
) : MavericksState {
constructor(roomProfileArgs: RoomProfileArgs) : this(roomId = roomProfileArgs.roomId)

View file

@ -20,11 +20,24 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.airbnb.mvrx.activityViewModel
import com.airbnb.mvrx.args
import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.R
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentRoomPollDetailBinding
import im.vector.app.features.roomprofile.RoomProfileArgs
import im.vector.app.features.roomprofile.polls.RoomPollsType
import im.vector.app.features.roomprofile.polls.RoomPollsViewModel
@AndroidEntryPoint
class RoomPollDetailFragment : VectorBaseFragment<FragmentRoomPollDetailBinding>() {
private val viewModel: RoomPollsViewModel by activityViewModel()
private val roomProfileArgs: RoomProfileArgs by args()
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentRoomPollDetailBinding {
return FragmentRoomPollDetailBinding.inflate(inflater, container, false)
}
@ -32,7 +45,21 @@ class RoomPollDetailFragment : VectorBaseFragment<FragmentRoomPollDetailBinding>
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initToolbar()
}
private fun initToolbar() = withState(viewModel) { state ->
val title = if (state.selectedRoomPollsType == RoomPollsType.ACTIVE) getString(R.string.room_polls_active)
else getString(R.string.room_polls_ended)
setupToolbar(views.roomPollDetailToolbar)
.setTitle(title)
.allowBack()
}
override fun invalidate() = withState(viewModel) { state ->
state.getSelectedPoll()?.let { _ ->
}
Unit
}
}

View file

@ -68,7 +68,9 @@ abstract class RoomPollsListFragment :
viewModel.observeViewEvents { viewEvent ->
when (viewEvent) {
RoomPollsViewEvent.LoadingError -> showErrorInSnackbar(RoomPollsLoadingError())
RoomPollsViewEvent.NavigateToPollDetail -> sharedActionViewModel.post(RoomProfileSharedAction.OpenPollDetails)
is RoomPollsViewEvent.NavigateToPollDetail -> {
sharedActionViewModel.post(RoomProfileSharedAction.OpenPollDetails(viewEvent.selectedPollId))
}
}
}
}