diff --git a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt index b4f9892252..b767f74fea 100644 --- a/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt +++ b/vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheet.kt @@ -56,7 +56,7 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { val verificationId: String? = null, val roomId: String? = null, // Special mode where UX should show loading wheel until other user sends a request/tx - val waitForIncomingRequest : Boolean = false + val waitForIncomingRequest: Boolean = false ) : Parcelable @Inject @@ -250,7 +250,7 @@ class VerificationBottomSheet : VectorBaseBottomSheetDialogFragment() { } } - val WAITING_SELF_VERIF_TAG : String = "WAITING_SELF_VERIF_TAG" + const val WAITING_SELF_VERIF_TAG: String = "WAITING_SELF_VERIF_TAG" } } diff --git a/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesAction.kt b/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesAction.kt index 29fbb9ca46..e4b1b98cc8 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesAction.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesAction.kt @@ -16,14 +16,14 @@ package im.vector.riotx.features.settings.devices -import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo import im.vector.riotx.core.platform.VectorViewModelAction sealed class DevicesAction : VectorViewModelAction { object Retry : DevicesAction() data class Delete(val deviceId: String) : DevicesAction() data class Password(val password: String) : DevicesAction() - data class Rename(val deviceInfo: DeviceInfo, val newName: String) : DevicesAction() - data class PromptRename(val deviceId: String, val deviceInfo: DeviceInfo? = null) : DevicesAction() - data class VerifyMyDevice(val deviceId: String, val userId: String? = null, val transactionId: String? = null) : DevicesAction() + data class Rename(val deviceId: String, val newName: String) : DevicesAction() + + data class PromptRename(val deviceId: String) : DevicesAction() + data class VerifyMyDevice(val deviceId: String) : DevicesAction() } diff --git a/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesViewEvents.kt b/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesViewEvents.kt index b42738439a..b5788366f3 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesViewEvents.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesViewEvents.kt @@ -17,6 +17,7 @@ package im.vector.riotx.features.settings.devices +import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo import im.vector.riotx.core.platform.VectorViewEvents /** @@ -25,4 +26,14 @@ import im.vector.riotx.core.platform.VectorViewEvents sealed class DevicesViewEvents : VectorViewEvents { data class Loading(val message: CharSequence? = null) : DevicesViewEvents() data class Failure(val throwable: Throwable) : DevicesViewEvents() + + object RequestPassword : DevicesViewEvents() + + data class PromptRenameDevice(val deviceInfo: DeviceInfo) : DevicesViewEvents() + + data class ShowVerifyDevice( + val userId: String, + val deviceId: String, + val transactionId: String? + ) : DevicesViewEvents() } diff --git a/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesViewModel.kt b/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesViewModel.kt index 419b6a5492..a7a25caed3 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/devices/DevicesViewModel.kt @@ -16,8 +16,6 @@ package im.vector.riotx.features.settings.devices -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import com.airbnb.mvrx.Async import com.airbnb.mvrx.Fail import com.airbnb.mvrx.FragmentViewModelContext @@ -41,9 +39,7 @@ import im.vector.matrix.android.internal.crypto.model.MXUsersDevicesMap import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo import im.vector.matrix.android.internal.crypto.model.rest.DevicesListResponse import im.vector.matrix.rx.rx -import im.vector.riotx.core.extensions.postLiveEvent import im.vector.riotx.core.platform.VectorViewModel -import im.vector.riotx.core.utils.LiveEvent import im.vector.riotx.features.crypto.verification.supportedVerificationMethods data class DevicesViewState( @@ -76,15 +72,6 @@ class DevicesViewModel @AssistedInject constructor(@Assisted initialState: Devic private var _currentDeviceId: String? = null private var _currentSession: String? = null - private val _requestPasswordLiveData = MutableLiveData>() - val requestPasswordLiveData: LiveData> - get() = _requestPasswordLiveData - - // Used to communicate back from model to fragment - private val _requestLiveData = MutableLiveData>>() - val fragmentActionLiveData: LiveData>> - get() = _requestLiveData - init { refreshDevicesList() session.getVerificationService().addListener(this) @@ -187,25 +174,22 @@ class DevicesViewModel @AssistedInject constructor(@Assisted initialState: Devic private fun handleVerify(action: DevicesAction.VerifyMyDevice) { val txID = session.getVerificationService().requestKeyVerification(supportedVerificationMethods, session.myUserId, listOf(action.deviceId)) - _requestLiveData.postValue(LiveEvent(Success( - action.copy( - userId = session.myUserId, - transactionId = txID.transactionId - ) - ))) + _viewEvents.post(DevicesViewEvents.ShowVerifyDevice( + session.myUserId, + action.deviceId, + txID.transactionId + )) } private fun handlePromptRename(action: DevicesAction.PromptRename) = withState { state -> val info = state.devices.invoke()?.firstOrNull { it.deviceId == action.deviceId } - if (info == null) { - _requestLiveData.postValue(LiveEvent(Uninitialized)) - } else { - _requestLiveData.postValue(LiveEvent(Success(action.copy(deviceInfo = info)))) + if (info != null) { + _viewEvents.post(DevicesViewEvents.PromptRenameDevice(info)) } } private fun handleRename(action: DevicesAction.Rename) { - session.setDeviceName(action.deviceInfo.deviceId!!, action.newName, object : MatrixCallback { + session.setDeviceName(action.deviceId, action.newName, object : MatrixCallback { override fun onSuccess(data: Unit) { setState { copy( @@ -261,7 +245,7 @@ class DevicesViewModel @AssistedInject constructor(@Assisted initialState: Devic ) } - _requestPasswordLiveData.postLiveEvent(Unit) + _viewEvents.post(DevicesViewEvents.RequestPassword) } } diff --git a/vector/src/main/java/im/vector/riotx/features/settings/devices/VectorSettingsDevicesFragment.kt b/vector/src/main/java/im/vector/riotx/features/settings/devices/VectorSettingsDevicesFragment.kt index a1cc93d0b0..76496fc3de 100644 --- a/vector/src/main/java/im/vector/riotx/features/settings/devices/VectorSettingsDevicesFragment.kt +++ b/vector/src/main/java/im/vector/riotx/features/settings/devices/VectorSettingsDevicesFragment.kt @@ -23,7 +23,6 @@ import androidx.appcompat.app.AlertDialog import androidx.core.view.isVisible import com.airbnb.mvrx.Async import com.airbnb.mvrx.Loading -import com.airbnb.mvrx.Success import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo @@ -32,7 +31,6 @@ import im.vector.riotx.core.dialogs.PromptPasswordDialog import im.vector.riotx.core.extensions.cleanup import im.vector.riotx.core.extensions.configureWith import im.vector.riotx.core.extensions.exhaustive -import im.vector.riotx.core.extensions.observeEvent import im.vector.riotx.core.platform.VectorBaseActivity import im.vector.riotx.core.platform.VectorBaseFragment import im.vector.riotx.features.crypto.verification.VerificationBottomSheet @@ -64,35 +62,19 @@ class VectorSettingsDevicesFragment @Inject constructor( recyclerView.configureWith(devicesController, showDivider = true) viewModel.observeViewEvents { when (it) { - is DevicesViewEvents.Loading -> showLoading(it.message) - is DevicesViewEvents.Failure -> showFailure(it.throwable) - }.exhaustive - } - viewModel.requestPasswordLiveData.observeEvent(this) { - maybeShowDeleteDeviceWithPasswordDialog() - } - - viewModel.fragmentActionLiveData.observeEvent(this) { async -> - when (async) { - is Success -> { - when (val action = async.invoke()) { - is DevicesAction.PromptRename -> { - action.deviceInfo?.let { deviceInfo -> - displayDeviceRenameDialog(deviceInfo) - } - } - is DevicesAction.VerifyMyDevice -> { - if (context is VectorBaseActivity) { - VerificationBottomSheet.withArgs( - roomId = null, - otherUserId = action.userId!!, - transactionId = action.transactionId!! - ).show(childFragmentManager, "REQPOP") - } - } - } + is DevicesViewEvents.Loading -> showLoading(it.message) + is DevicesViewEvents.Failure -> showFailure(it.throwable) + is DevicesViewEvents.RequestPassword -> maybeShowDeleteDeviceWithPasswordDialog() + is DevicesViewEvents.PromptRenameDevice -> displayDeviceRenameDialog(it.deviceInfo) + is DevicesViewEvents.ShowVerifyDevice -> { + // TODO Valere: We should pass the deviceId here + VerificationBottomSheet.withArgs( + roomId = null, + otherUserId = it.userId, + transactionId = it.transactionId + ).show(childFragmentManager, "REQPOP") } - } + }.exhaustive } } @@ -152,7 +134,7 @@ class VectorSettingsDevicesFragment @Inject constructor( .setPositiveButton(R.string.ok) { _, _ -> val newName = input.text.toString() - viewModel.handle(DevicesAction.Rename(deviceInfo, newName)) + viewModel.handle(DevicesAction.Rename(deviceInfo.deviceId!!, newName)) } .setNegativeButton(R.string.cancel, null) .show()