mirror of
https://github.com/element-hq/element-android
synced 2024-12-18 07:12:47 +03:00
Using navigator and new activity for the new screen
This commit is contained in:
parent
8aa89f1dfd
commit
fb44562824
15 changed files with 100 additions and 79 deletions
|
@ -327,6 +327,7 @@
|
|||
<activity android:name=".features.settings.devices.v2.details.SessionDetailsActivity" />
|
||||
<activity android:name=".features.settings.devices.v2.rename.RenameSessionActivity" />
|
||||
<activity android:name=".features.login.qr.QrCodeLoginActivity" />
|
||||
<activity android:name=".features.roomprofile.polls.detail.RoomPollDetailActivity" />
|
||||
|
||||
<!-- Services -->
|
||||
|
||||
|
|
|
@ -37,7 +37,6 @@ 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
|
||||
|
@ -106,7 +105,6 @@ class RoomProfileActivity :
|
|||
RoomProfileSharedAction.OpenRoomUploads -> openRoomUploads()
|
||||
RoomProfileSharedAction.OpenBannedRoomMembers -> openBannedRoomMembers()
|
||||
RoomProfileSharedAction.OpenRoomNotificationSettings -> openRoomNotificationSettings()
|
||||
is RoomProfileSharedAction.OpenPollDetails -> handleOpenPollDetails(sharedAction)
|
||||
}
|
||||
}
|
||||
.launchIn(lifecycleScope)
|
||||
|
@ -132,14 +130,6 @@ class RoomProfileActivity :
|
|||
finish()
|
||||
}
|
||||
|
||||
private fun handleOpenPollDetails(sharedAction: RoomProfileSharedAction.OpenPollDetails) {
|
||||
addFragmentToBackstack(
|
||||
views.simpleFragmentContainer,
|
||||
RoomPollDetailFragment::class.java,
|
||||
roomProfileArgs.copy(selectedPollId = sharedAction.pollId)
|
||||
)
|
||||
}
|
||||
|
||||
private fun openRoomPolls() {
|
||||
addFragmentToBackstack(views.simpleFragmentContainer, RoomPollsFragment::class.java, roomProfileArgs)
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ sealed class RoomProfileSharedAction : VectorSharedAction {
|
|||
object OpenRoomAliasesSettings : RoomProfileSharedAction()
|
||||
object OpenRoomPermissionsSettings : RoomProfileSharedAction()
|
||||
object OpenRoomPolls : RoomProfileSharedAction()
|
||||
data class OpenPollDetails(val pollId: String) : RoomProfileSharedAction()
|
||||
object OpenRoomUploads : RoomProfileSharedAction()
|
||||
object OpenRoomMembers : RoomProfileSharedAction()
|
||||
object OpenBannedRoomMembers : RoomProfileSharedAction()
|
||||
|
|
|
@ -20,6 +20,4 @@ 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
|
||||
}
|
||||
|
|
|
@ -20,9 +20,6 @@ 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
|
||||
|
@ -69,35 +66,9 @@ 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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,5 +20,4 @@ import im.vector.app.core.platform.VectorViewEvents
|
|||
|
||||
sealed class RoomPollsViewEvent : VectorViewEvents {
|
||||
object LoadingError : RoomPollsViewEvent()
|
||||
data class NavigateToPollDetail(val selectedPollId: String) : RoomPollsViewEvent()
|
||||
}
|
||||
|
|
|
@ -89,20 +89,9 @@ class RoomPollsViewModel @AssistedInject constructor(
|
|||
override fun handle(action: RoomPollsAction) {
|
||||
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(action.selectedPollId))
|
||||
}
|
||||
|
||||
private fun handleLoadMore() = withState { viewState ->
|
||||
viewModelScope.launch {
|
||||
setState { copy(isLoadingMore = true) }
|
||||
|
|
|
@ -27,14 +27,10 @@ data class RoomPollsViewState(
|
|||
val canLoadMore: Boolean = true,
|
||||
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)
|
||||
|
||||
fun hasNoPolls() = polls.isEmpty()
|
||||
fun hasNoPollsAndCanLoadMore() = !isSyncing && hasNoPolls() && canLoadMore
|
||||
fun getSelectedPoll() = polls.find { it.id == selectedPollId }
|
||||
fun canVoteSelectedPoll() = selectedRoomPollsType == RoomPollsType.ACTIVE
|
||||
}
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* Copyright 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.detail
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import com.airbnb.mvrx.Mavericks
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import im.vector.app.core.extensions.addFragment
|
||||
import im.vector.app.core.platform.VectorBaseActivity
|
||||
import im.vector.app.databinding.ActivitySimpleBinding
|
||||
import im.vector.lib.core.utils.compat.getParcelableExtraCompat
|
||||
|
||||
/**
|
||||
* Display the details of a given poll.
|
||||
*/
|
||||
@AndroidEntryPoint
|
||||
class RoomPollDetailActivity : VectorBaseActivity<ActivitySimpleBinding>() {
|
||||
|
||||
override fun getBinding() = ActivitySimpleBinding.inflate(layoutInflater)
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
if (isFirstCreation()) {
|
||||
addFragment(
|
||||
container = views.simpleFragmentContainer,
|
||||
fragmentClass = RoomPollDetailFragment::class.java,
|
||||
params = intent.getParcelableExtraCompat(Mavericks.KEY_ARG)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun newIntent(context: Context, pollId: String): Intent {
|
||||
return Intent(context, RoomPollDetailActivity::class.java).apply {
|
||||
putExtra(Mavericks.KEY_ARG, RoomPollDetailArgs(pollId))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -22,9 +22,8 @@ import im.vector.app.features.roomprofile.polls.RoomPollsViewState
|
|||
import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence
|
||||
import javax.inject.Inject
|
||||
|
||||
class RoomPollDetailController @Inject constructor(
|
||||
|
||||
) : TypedEpoxyController<RoomPollDetailViewState>() {
|
||||
class RoomPollDetailController @Inject constructor()
|
||||
: TypedEpoxyController<RoomPollDetailViewState>() {
|
||||
|
||||
override fun buildModels(viewState: RoomPollDetailViewState?) {
|
||||
viewState ?: return
|
||||
|
|
|
@ -36,7 +36,6 @@ import javax.inject.Inject
|
|||
|
||||
@Parcelize
|
||||
data class RoomPollDetailArgs(
|
||||
val roomId: String,
|
||||
val pollId: String,
|
||||
) : Parcelable
|
||||
|
||||
|
|
|
@ -25,10 +25,11 @@ class RoomPollDetailViewModel @AssistedInject constructor(
|
|||
) : VectorViewModel<RoomPollDetailViewState, RoomPollDetailAction, RoomPollDetailViewEvent>(initialState) {
|
||||
|
||||
init {
|
||||
// Subscribe to the poll event and map it
|
||||
// TODO observe poll using TimelineService.getTimelineEventLive
|
||||
// TODO create a dedicated useCase and mapper
|
||||
}
|
||||
|
||||
override fun handle(action: RoomPollDetailAction) {
|
||||
|
||||
// TODO handle go to timeline action
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,11 +19,9 @@ package im.vector.app.features.roomprofile.polls.detail
|
|||
import com.airbnb.mvrx.MavericksState
|
||||
|
||||
data class RoomPollDetailViewState(
|
||||
val roomId: String,
|
||||
val pollId: String,
|
||||
val pollDetail: RoomPollDetail? = null,
|
||||
val pollId: String,
|
||||
val pollDetail: RoomPollDetail? = null,
|
||||
) : MavericksState {
|
||||
|
||||
constructor(roomPollDetailArgs: RoomPollDetailArgs)
|
||||
: this(roomId = roomPollDetailArgs.roomId, pollId = roomPollDetailArgs.pollId)
|
||||
constructor(roomPollDetailArgs: RoomPollDetailArgs) : this(pollId = roomPollDetailArgs.pollId)
|
||||
}
|
||||
|
|
|
@ -29,8 +29,6 @@ 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
|
||||
|
@ -49,8 +47,10 @@ abstract class RoomPollsListFragment :
|
|||
@Inject
|
||||
lateinit var stringProvider: StringProvider
|
||||
|
||||
@Inject
|
||||
lateinit var viewNavigator: RoomPollsListNavigator
|
||||
|
||||
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)
|
||||
|
@ -58,7 +58,6 @@ abstract class RoomPollsListFragment :
|
|||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
sharedActionViewModel = activityViewModelProvider[RoomProfileSharedActionViewModel::class.java]
|
||||
observeViewEvents()
|
||||
setupList()
|
||||
setupLoadMoreButton()
|
||||
|
@ -68,9 +67,6 @@ abstract class RoomPollsListFragment :
|
|||
viewModel.observeViewEvents { viewEvent ->
|
||||
when (viewEvent) {
|
||||
RoomPollsViewEvent.LoadingError -> showErrorInSnackbar(RoomPollsLoadingError())
|
||||
is RoomPollsViewEvent.NavigateToPollDetail -> {
|
||||
sharedActionViewModel.post(RoomProfileSharedAction.OpenPollDetails(viewEvent.selectedPollId))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -132,7 +128,7 @@ abstract class RoomPollsListFragment :
|
|||
}
|
||||
|
||||
override fun onPollClicked(pollId: String) {
|
||||
viewModel.handle(RoomPollsAction.OnPollSelected(pollId))
|
||||
viewNavigator.goToPollDetails(requireContext(), pollId)
|
||||
}
|
||||
|
||||
override fun onLoadMoreClicked() {
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* 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.list.ui
|
||||
|
||||
import android.content.Context
|
||||
import im.vector.app.features.roomprofile.polls.detail.RoomPollDetailActivity
|
||||
import javax.inject.Inject
|
||||
|
||||
// TODO add unit tests
|
||||
class RoomPollsListNavigator @Inject constructor() {
|
||||
|
||||
fun goToPollDetails(context: Context, pollId: String) {
|
||||
context.startActivity(RoomPollDetailActivity.newIntent(context, pollId))
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue