Try to centralise the usage of fragment args

This commit is contained in:
Jorge Martín 2022-10-04 12:52:00 +02:00
parent 2c9526543b
commit 0d97fa201e
4 changed files with 25 additions and 28 deletions

View File

@ -20,6 +20,7 @@ import com.airbnb.mvrx.Async
import com.airbnb.mvrx.MavericksState import com.airbnb.mvrx.MavericksState
import com.airbnb.mvrx.Uninitialized import com.airbnb.mvrx.Uninitialized
import im.vector.app.features.home.room.detail.arguments.TimelineArgs import im.vector.app.features.home.room.detail.arguments.TimelineArgs
import im.vector.app.features.share.SharedData
import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
@ -77,6 +78,8 @@ data class RoomDetailViewState(
val threadNotificationBadgeState: ThreadNotificationBadgeState = ThreadNotificationBadgeState(), val threadNotificationBadgeState: ThreadNotificationBadgeState = ThreadNotificationBadgeState(),
val typingUsers: List<SenderInfo>? = null, val typingUsers: List<SenderInfo>? = null,
val isSharingLiveLocation: Boolean = false, val isSharingLiveLocation: Boolean = false,
val showKeyboardWhenPresented: Boolean = false,
val sharedData: SharedData? = null,
) : MavericksState { ) : MavericksState {
constructor(args: TimelineArgs) : this( constructor(args: TimelineArgs) : this(
@ -86,7 +89,9 @@ data class RoomDetailViewState(
// Also highlight the target event, if any // Also highlight the target event, if any
highlightedEventId = args.eventId, highlightedEventId = args.eventId,
switchToParentSpace = args.switchToParentSpace, switchToParentSpace = args.switchToParentSpace,
rootThreadEventId = args.threadTimelineArgs?.rootThreadEventId rootThreadEventId = args.threadTimelineArgs?.rootThreadEventId,
showKeyboardWhenPresented = args.threadTimelineArgs?.showKeyboard.orFalse(),
sharedData = args.sharedData,
) )
fun isCallOptionAvailable(): Boolean { fun isCallOptionAvailable(): Boolean {

View File

@ -300,17 +300,13 @@ class TimelineFragment :
childFragmentManager.findFragmentById(R.id.composerContainer) as? MessageComposerFragment ?: run { childFragmentManager.findFragmentById(R.id.composerContainer) as? MessageComposerFragment ?: run {
childFragmentManager.commitTransaction { childFragmentManager.commitTransaction {
val fragment = MessageComposerFragment() replace(R.id.composerContainer, MessageComposerFragment())
fragment.arguments = timelineArgs.toMvRxBundle()
replace(R.id.composerContainer, fragment)
} }
} }
childFragmentManager.findFragmentById(R.id.voiceMessageRecorderContainer) as? VoiceRecorderFragment ?: run { childFragmentManager.findFragmentById(R.id.voiceMessageRecorderContainer) as? VoiceRecorderFragment ?: run {
childFragmentManager.commitTransaction { childFragmentManager.commitTransaction {
val fragment = VoiceRecorderFragment() replace(R.id.voiceMessageRecorderContainer, VoiceRecorderFragment())
fragment.arguments = timelineArgs.toMvRxBundle()
replace(R.id.voiceMessageRecorderContainer, fragment)
} }
} }
} }
@ -2010,7 +2006,7 @@ class TimelineFragment :
/** /**
* Returns true if the current room is a Thread room, false otherwise. * Returns true if the current room is a Thread room, false otherwise.
*/ */
private fun isThreadTimeLine(): Boolean = timelineArgs.threadTimelineArgs?.rootThreadEventId != null private fun isThreadTimeLine(): Boolean = withState(timelineViewModel) { it.isThreadTimeline() }
/** /**
* Returns true if the current room is a local room, false otherwise. * Returns true if the current room is a local room, false otherwise.
@ -2020,5 +2016,5 @@ class TimelineFragment :
/** /**
* Returns the root thread event if we are in a thread room, otherwise returns null. * Returns the root thread event if we are in a thread room, otherwise returns null.
*/ */
fun getRootThreadEventId(): String? = timelineArgs.threadTimelineArgs?.rootThreadEventId fun getRootThreadEventId(): String? = withState(timelineViewModel) { it.rootThreadEventId }
} }

View File

@ -40,7 +40,6 @@ import androidx.core.view.isInvisible
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.airbnb.mvrx.args
import com.airbnb.mvrx.existingViewModel import com.airbnb.mvrx.existingViewModel
import com.airbnb.mvrx.withState import com.airbnb.mvrx.withState
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
@ -74,7 +73,6 @@ import im.vector.app.features.home.AvatarRenderer
import im.vector.app.features.home.room.detail.AutoCompleter import im.vector.app.features.home.room.detail.AutoCompleter
import im.vector.app.features.home.room.detail.RoomDetailAction import im.vector.app.features.home.room.detail.RoomDetailAction
import im.vector.app.features.home.room.detail.TimelineViewModel import im.vector.app.features.home.room.detail.TimelineViewModel
import im.vector.app.features.home.room.detail.arguments.TimelineArgs
import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView
import im.vector.app.features.home.room.detail.timeline.action.MessageSharedActionViewModel import im.vector.app.features.home.room.detail.timeline.action.MessageSharedActionViewModel
import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider import im.vector.app.features.home.room.detail.timeline.helper.MatrixItemColorProvider
@ -131,14 +129,14 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A
@Inject lateinit var buildMeta: BuildMeta @Inject lateinit var buildMeta: BuildMeta
@Inject lateinit var session: Session @Inject lateinit var session: Session
private val timelineArgs: TimelineArgs by args() private val roomId: String get() = withState(timelineViewModel) { it.roomId }
private val autoCompleter: AutoCompleter by lazy { private val autoCompleter: AutoCompleter by lazy {
autoCompleterFactory.create(timelineArgs.roomId, isThreadTimeLine()) autoCompleterFactory.create(roomId, isThreadTimeLine())
} }
private val pillsPostProcessor by lazy { private val pillsPostProcessor by lazy {
pillsPostProcessorFactory.create(timelineArgs.roomId) pillsPostProcessorFactory.create(roomId)
} }
private val emojiPopup: EmojiPopup by lifecycleAwareLazy { private val emojiPopup: EmojiPopup by lifecycleAwareLazy {
@ -267,7 +265,8 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A
views.composerLayout.views.composerEmojiButton.isVisible = vectorPreferences.showEmojiKeyboard() views.composerLayout.views.composerEmojiButton.isVisible = vectorPreferences.showEmojiKeyboard()
if (isThreadTimeLine() && timelineArgs.threadTimelineArgs?.showKeyboard == true) { val showKeyboard = withState(timelineViewModel) { it.showKeyboardWhenPresented }
if (isThreadTimeLine() && showKeyboard) {
// Show keyboard when the user started a thread // Show keyboard when the user started a thread
views.composerLayout.views.composerEditText.showKeyboard(andRequestFocus = true) views.composerLayout.views.composerEditText.showKeyboard(andRequestFocus = true)
} }
@ -555,7 +554,7 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A
views.composerLayout.setTextIfDifferent("") views.composerLayout.setTextIfDifferent("")
when (parsedCommand) { when (parsedCommand) {
is ParsedCommand.DevTools -> { is ParsedCommand.DevTools -> {
navigator.openDevTools(requireContext(), timelineArgs.roomId) navigator.openDevTools(requireContext(), roomId)
} }
is ParsedCommand.SetMarkdown -> { is ParsedCommand.SetMarkdown -> {
showSnackWithMessage(getString(if (parsedCommand.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled)) showSnackWithMessage(getString(if (parsedCommand.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled))
@ -578,12 +577,13 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A
private fun handleShowRoomUpgradeDialog(roomDetailViewEvents: MessageComposerViewEvents.ShowRoomUpgradeDialog) { private fun handleShowRoomUpgradeDialog(roomDetailViewEvents: MessageComposerViewEvents.ShowRoomUpgradeDialog) {
val tag = MigrateRoomBottomSheet::javaClass.name val tag = MigrateRoomBottomSheet::javaClass.name
MigrateRoomBottomSheet.newInstance(timelineArgs.roomId, roomDetailViewEvents.newVersion) val roomId = withState(timelineViewModel) { it.roomId }
MigrateRoomBottomSheet.newInstance(roomId, roomDetailViewEvents.newVersion)
.show(parentFragmentManager, tag) .show(parentFragmentManager, tag)
} }
private fun openRoomMemberProfile(userId: String) { private fun openRoomMemberProfile(userId: String) {
navigator.openRoomMemberProfile(userId = userId, roomId = timelineArgs.roomId, context = requireActivity()) navigator.openRoomMemberProfile(userId = userId, roomId = roomId, context = requireActivity())
} }
private val contentAttachmentActivityResultLauncher = registerStartForActivityResult { activityResult -> private val contentAttachmentActivityResultLauncher = registerStartForActivityResult { activityResult ->
@ -598,12 +598,12 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A
/** /**
* Returns the root thread event if we are in a thread room, otherwise returns null. * Returns the root thread event if we are in a thread room, otherwise returns null.
*/ */
fun getRootThreadEventId(): String? = timelineArgs.threadTimelineArgs?.rootThreadEventId fun getRootThreadEventId(): String? = withState(timelineViewModel) { it.rootThreadEventId }
/** /**
* Returns true if the current room is a Thread room, false otherwise. * Returns true if the current room is a Thread room, false otherwise.
*/ */
private fun isThreadTimeLine(): Boolean = timelineArgs.threadTimelineArgs?.rootThreadEventId != null private fun isThreadTimeLine(): Boolean = withState(timelineViewModel) { it.isThreadTimeline() }
// AttachmentsHelper.Callback // AttachmentsHelper.Callback
@ -656,12 +656,12 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A
AttachmentTypeSelectorView.Type.GALLERY -> attachmentsHelper.selectGallery(attachmentMediaActivityResultLauncher) AttachmentTypeSelectorView.Type.GALLERY -> attachmentsHelper.selectGallery(attachmentMediaActivityResultLauncher)
AttachmentTypeSelectorView.Type.CONTACT -> attachmentsHelper.selectContact(attachmentContactActivityResultLauncher) AttachmentTypeSelectorView.Type.CONTACT -> attachmentsHelper.selectContact(attachmentContactActivityResultLauncher)
AttachmentTypeSelectorView.Type.STICKER -> timelineViewModel.handle(RoomDetailAction.SelectStickerAttachment) AttachmentTypeSelectorView.Type.STICKER -> timelineViewModel.handle(RoomDetailAction.SelectStickerAttachment)
AttachmentTypeSelectorView.Type.POLL -> navigator.openCreatePoll(requireContext(), timelineArgs.roomId, null, PollMode.CREATE) AttachmentTypeSelectorView.Type.POLL -> navigator.openCreatePoll(requireContext(), roomId, null, PollMode.CREATE)
AttachmentTypeSelectorView.Type.LOCATION -> { AttachmentTypeSelectorView.Type.LOCATION -> {
navigator navigator
.openLocationSharing( .openLocationSharing(
context = requireContext(), context = requireContext(),
roomId = timelineArgs.roomId, roomId = roomId,
mode = LocationSharingMode.STATIC_SHARING, mode = LocationSharingMode.STATIC_SHARING,
initialLocationData = null, initialLocationData = null,
locationOwnerId = session.myUserId locationOwnerId = session.myUserId
@ -716,7 +716,7 @@ class MessageComposerFragment : VectorBaseFragment<FragmentComposerBinding>(), A
} }
private fun handleShareData() { private fun handleShareData() {
when (val sharedData = timelineArgs.sharedData) { when (val sharedData = withState(timelineViewModel) { it.sharedData }) {
is SharedData.Text -> { is SharedData.Text -> {
messageComposerViewModel.handle(MessageComposerAction.OnTextChanged(sharedData.text)) messageComposerViewModel.handle(MessageComposerAction.OnTextChanged(sharedData.text))
messageComposerViewModel.handle(MessageComposerAction.EnterRegularMode(fromSharing = true)) messageComposerViewModel.handle(MessageComposerAction.EnterRegularMode(fromSharing = true))

View File

@ -21,7 +21,6 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
import com.airbnb.mvrx.args
import com.airbnb.mvrx.existingViewModel import com.airbnb.mvrx.existingViewModel
import com.airbnb.mvrx.withState import com.airbnb.mvrx.withState
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@ -35,7 +34,6 @@ import im.vector.app.core.utils.onPermissionDeniedSnackbar
import im.vector.app.core.utils.registerForPermissionsResult import im.vector.app.core.utils.registerForPermissionsResult
import im.vector.app.databinding.FragmentVoiceRecorderBinding import im.vector.app.databinding.FragmentVoiceRecorderBinding
import im.vector.app.features.home.room.detail.TimelineViewModel import im.vector.app.features.home.room.detail.TimelineViewModel
import im.vector.app.features.home.room.detail.arguments.TimelineArgs
import im.vector.app.features.home.room.detail.composer.MessageComposerAction import im.vector.app.features.home.room.detail.composer.MessageComposerAction
import im.vector.app.features.home.room.detail.composer.MessageComposerViewEvents import im.vector.app.features.home.room.detail.composer.MessageComposerViewEvents
import im.vector.app.features.home.room.detail.composer.MessageComposerViewModel import im.vector.app.features.home.room.detail.composer.MessageComposerViewModel
@ -48,8 +46,6 @@ class VoiceRecorderFragment : VectorBaseFragment<FragmentVoiceRecorderBinding>()
@Inject lateinit var audioMessagePlaybackTracker: AudioMessagePlaybackTracker @Inject lateinit var audioMessagePlaybackTracker: AudioMessagePlaybackTracker
@Inject lateinit var clock: Clock @Inject lateinit var clock: Clock
private val timelineArgs: TimelineArgs by args()
private val timelineViewModel: TimelineViewModel by existingViewModel() private val timelineViewModel: TimelineViewModel by existingViewModel()
private val messageComposerViewModel: MessageComposerViewModel by existingViewModel() private val messageComposerViewModel: MessageComposerViewModel by existingViewModel()
@ -191,6 +187,6 @@ class VoiceRecorderFragment : VectorBaseFragment<FragmentVoiceRecorderBinding>()
/** /**
* Returns the root thread event if we are in a thread room, otherwise returns null. * Returns the root thread event if we are in a thread room, otherwise returns null.
*/ */
fun getRootThreadEventId(): String? = timelineArgs.threadTimelineArgs?.rootThreadEventId fun getRootThreadEventId(): String? = withState(timelineViewModel) { it.rootThreadEventId }
} }