From 16b6678aa2df443efe95aeaddb572893a99567c9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 18 Nov 2020 14:14:43 +0100 Subject: [PATCH] CreateRoomFragment: use argument instead of Activity ViewModel to pass the initial room name --- .../roomdirectory/RoomDirectoryActivity.kt | 14 +++++++------- .../createroom/CreateRoomActivity.kt | 12 +++++------- .../createroom/CreateRoomFragment.kt | 15 ++++++++++++--- .../createroom/CreateRoomViewModel.kt | 12 +++--------- .../createroom/CreateRoomViewState.kt | 4 ++++ 5 files changed, 31 insertions(+), 26 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryActivity.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryActivity.kt index 9dc41cbc21..a21f4e670a 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryActivity.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryActivity.kt @@ -26,18 +26,15 @@ import im.vector.app.core.di.ScreenComponent import im.vector.app.core.extensions.addFragment import im.vector.app.core.extensions.addFragmentToBackstack import im.vector.app.core.platform.VectorBaseActivity -import im.vector.app.features.roomdirectory.createroom.CreateRoomAction import im.vector.app.features.roomdirectory.createroom.CreateRoomFragment -import im.vector.app.features.roomdirectory.createroom.CreateRoomViewModel +import im.vector.app.features.roomdirectory.createroom.CreateRoomArgs import im.vector.app.features.roomdirectory.picker.RoomDirectoryPickerFragment import javax.inject.Inject class RoomDirectoryActivity : VectorBaseActivity() { - @Inject lateinit var createRoomViewModelFactory: CreateRoomViewModel.Factory @Inject lateinit var roomDirectoryViewModelFactory: RoomDirectoryViewModel.Factory private val roomDirectoryViewModel: RoomDirectoryViewModel by viewModel() - private val createRoomViewModel: CreateRoomViewModel by viewModel() private lateinit var sharedActionViewModel: RoomDirectorySharedActionViewModel override fun getLayoutRes() = R.layout.activity_simple @@ -60,10 +57,13 @@ class RoomDirectoryActivity : VectorBaseActivity() { when (sharedAction) { is RoomDirectorySharedAction.Back -> onBackPressed() is RoomDirectorySharedAction.CreateRoom -> { - addFragmentToBackstack(R.id.simpleFragmentContainer, CreateRoomFragment::class.java) - // Transmit the filter to the createRoomViewModel + // Transmit the filter to the CreateRoomFragment withState(roomDirectoryViewModel) { - createRoomViewModel.handle(CreateRoomAction.SetName(it.currentFilter)) + addFragmentToBackstack( + R.id.simpleFragmentContainer, + CreateRoomFragment::class.java, + CreateRoomArgs(it.currentFilter) + ) } } is RoomDirectorySharedAction.ChangeProtocol -> diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomActivity.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomActivity.kt index e003c4905c..b6ee00a52f 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomActivity.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomActivity.kt @@ -20,7 +20,6 @@ import android.content.Context import android.content.Intent import android.os.Bundle import androidx.appcompat.widget.Toolbar -import com.airbnb.mvrx.viewModel import im.vector.app.R import im.vector.app.core.di.ScreenComponent import im.vector.app.core.extensions.addFragment @@ -28,16 +27,12 @@ import im.vector.app.core.platform.ToolbarConfigurable import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.features.roomdirectory.RoomDirectorySharedAction import im.vector.app.features.roomdirectory.RoomDirectorySharedActionViewModel -import javax.inject.Inject /** * Simple container for [CreateRoomFragment] */ class CreateRoomActivity : VectorBaseActivity(), ToolbarConfigurable { - @Inject lateinit var createRoomViewModelFactory: CreateRoomViewModel.Factory - private val createRoomViewModel: CreateRoomViewModel by viewModel() - private lateinit var sharedActionViewModel: RoomDirectorySharedActionViewModel override fun getLayoutRes() = R.layout.activity_simple @@ -52,8 +47,11 @@ class CreateRoomActivity : VectorBaseActivity(), ToolbarConfigurable { override fun initUiAndData() { if (isFirstCreation()) { - addFragment(R.id.simpleFragmentContainer, CreateRoomFragment::class.java) - createRoomViewModel.handle(CreateRoomAction.SetName(intent?.getStringExtra(INITIAL_NAME) ?: "")) + addFragment( + R.id.simpleFragmentContainer, + CreateRoomFragment::class.java, + CreateRoomArgs(intent?.getStringExtra(INITIAL_NAME) ?: "") + ) } } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt index 124b6a415a..a20bc7dbf5 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomFragment.kt @@ -18,10 +18,12 @@ package im.vector.app.features.roomdirectory.createroom import android.net.Uri import android.os.Bundle +import android.os.Parcelable import android.view.View import androidx.appcompat.app.AlertDialog import com.airbnb.mvrx.Success -import com.airbnb.mvrx.activityViewModel +import com.airbnb.mvrx.args +import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import im.vector.app.R import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper @@ -33,12 +35,19 @@ import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.resources.ColorProvider import im.vector.app.features.roomdirectory.RoomDirectorySharedAction import im.vector.app.features.roomdirectory.RoomDirectorySharedActionViewModel +import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.fragment_create_room.* import timber.log.Timber import javax.inject.Inject +@Parcelize +data class CreateRoomArgs( + val initialName: String +) : Parcelable + class CreateRoomFragment @Inject constructor( private val createRoomController: CreateRoomController, + val createRoomViewModelFactory: CreateRoomViewModel.Factory, colorProvider: ColorProvider ) : VectorBaseFragment(), CreateRoomController.Listener, @@ -46,8 +55,8 @@ class CreateRoomFragment @Inject constructor( OnBackPressed { private lateinit var sharedActionViewModel: RoomDirectorySharedActionViewModel - // TODO BMA: use fragmentViewMode(). Else back does not reset the form. Use Fragment Argument to pass room name - private val viewModel: CreateRoomViewModel by activityViewModel() + private val viewModel: CreateRoomViewModel by fragmentViewModel() + private val args: CreateRoomArgs by args() private val galleryOrCameraDialogHelper = GalleryOrCameraDialogHelper(this, colorProvider) diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt index 52e1b3f801..e25298b0f1 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -17,10 +17,9 @@ package im.vector.app.features.roomdirectory.createroom import androidx.core.net.toFile -import androidx.fragment.app.FragmentActivity import androidx.lifecycle.viewModelScope -import com.airbnb.mvrx.ActivityViewModelContext import com.airbnb.mvrx.Fail +import com.airbnb.mvrx.FragmentViewModelContext import com.airbnb.mvrx.Loading import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.Success @@ -31,7 +30,6 @@ import im.vector.app.core.extensions.exhaustive import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.raw.wellknown.getElementWellknown import im.vector.app.features.raw.wellknown.isE2EByDefault -import im.vector.app.features.roomdirectory.RoomDirectoryActivity import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.matrix.android.sdk.api.MatrixCallback @@ -88,13 +86,9 @@ class CreateRoomViewModel @AssistedInject constructor(@Assisted initialState: Cr @JvmStatic override fun create(viewModelContext: ViewModelContext, state: CreateRoomViewState): CreateRoomViewModel? { - val activity: FragmentActivity = (viewModelContext as ActivityViewModelContext).activity() + val fragment: CreateRoomFragment = (viewModelContext as FragmentViewModelContext).fragment() - return when (activity) { - is CreateRoomActivity -> activity.createRoomViewModelFactory.create(state) - is RoomDirectoryActivity -> activity.createRoomViewModelFactory.create(state) - else -> error("Wrong activity") - } + return fragment.createRoomViewModelFactory.create(state) } } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewState.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewState.kt index cc7a441eb5..398f804db3 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewState.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewState.kt @@ -34,6 +34,10 @@ data class CreateRoomViewState( val asyncCreateRoomRequest: Async = Uninitialized ) : MvRxState { + constructor(args: CreateRoomArgs) : this( + roomName = args.initialName + ) + /** * Return true if there is not important input from user */