From a6cb25d0c3bfd18d659dca93f87196dbae3631a7 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Fri, 16 Sep 2022 10:10:54 +0200 Subject: [PATCH] Verification of another session --- .../devices/v2/list/SessionInfoView.kt | 8 ++++--- .../devices/v2/list/SessionInfoViewState.kt | 1 + .../v2/overview/SessionOverviewFragment.kt | 14 ++++++++++--- .../v2/overview/SessionOverviewViewEvent.kt | 3 ++- .../v2/overview/SessionOverviewViewModel.kt | 9 +++++++- .../v2/overview/SessionOverviewViewState.kt | 1 + .../overview/SessionOverviewViewModelTest.kt | 21 ++++++++++++++++++- 7 files changed, 48 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt index 38bc0cb5d8..340a4f3c3a 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoView.kt @@ -62,6 +62,7 @@ class SessionInfoView @JvmOverloads constructor( sessionInfoViewState.deviceFullInfo.roomEncryptionTrustLevel, sessionInfoViewState.isCurrentSession, sessionInfoViewState.isLearnMoreLinkVisible, + sessionInfoViewState.isVerifyButtonVisible, ) renderDeviceLastSeenDetails( sessionInfoViewState.deviceFullInfo.isInactive, @@ -78,12 +79,13 @@ class SessionInfoView @JvmOverloads constructor( encryptionTrustLevel: RoomEncryptionTrustLevel, isCurrentSession: Boolean, hasLearnMoreLink: Boolean, + isVerifyButtonVisible: Boolean, ) { views.sessionInfoVerificationStatusImageView.render(encryptionTrustLevel) if (encryptionTrustLevel == RoomEncryptionTrustLevel.Trusted) { renderCrossSigningVerified(isCurrentSession) } else { - renderCrossSigningUnverified(isCurrentSession) + renderCrossSigningUnverified(isCurrentSession, isVerifyButtonVisible) } if (hasLearnMoreLink) { appendLearnMoreToVerificationStatus() @@ -120,7 +122,7 @@ class SessionInfoView @JvmOverloads constructor( views.sessionInfoVerifySessionButton.isVisible = false } - private fun renderCrossSigningUnverified(isCurrentSession: Boolean) { + private fun renderCrossSigningUnverified(isCurrentSession: Boolean, isVerifyButtonVisible: Boolean) { views.sessionInfoVerificationStatusTextView.text = context.getString(R.string.device_manager_verification_status_unverified) views.sessionInfoVerificationStatusTextView.setTextColor(ThemeUtils.getColor(context, R.attr.colorError)) val statusResId = if (isCurrentSession) { @@ -129,7 +131,7 @@ class SessionInfoView @JvmOverloads constructor( R.string.device_manager_verification_status_detail_other_session_unverified } views.sessionInfoVerificationStatusDetailTextView.text = context.getString(statusResId) - views.sessionInfoVerifySessionButton.isVisible = true + views.sessionInfoVerifySessionButton.isVisible = isVerifyButtonVisible } // TODO. We don't have this info yet. Update later accordingly. diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt index 60e1234820..287bb956f5 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt @@ -21,6 +21,7 @@ import im.vector.app.features.settings.devices.v2.DeviceFullInfo data class SessionInfoViewState( val isCurrentSession: Boolean, val deviceFullInfo: DeviceFullInfo, + val isVerifyButtonVisible: Boolean = true, val isDetailsButtonVisible: Boolean = true, val isLearnMoreLinkVisible: Boolean = false, val isLastSeenDetailsVisible: Boolean = false, diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt index 4c83408fe7..db293e88a9 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewFragment.kt @@ -82,9 +82,12 @@ class SessionOverviewFragment : private fun observeViewEvents() { viewModel.observeViewEvents { when (it) { - is SessionOverviewViewEvent.SelfVerification -> { + is SessionOverviewViewEvent.ShowVerifyCurrentSession -> { navigator.requestSelfSessionVerification(requireActivity()) } + is SessionOverviewViewEvent.ShowVerifyOtherSession -> { + navigator.requestSessionVerification(requireActivity(), it.deviceId) + } is SessionOverviewViewEvent.PromptResetSecrets -> { navigator.open4SSetup(requireActivity(), SetupMode.PASSPHRASE_AND_NEEDED_SECRETS_RESET) } @@ -105,7 +108,7 @@ class SessionOverviewFragment : updateToolbar(state.isCurrentSession) updateEntryDetails(state.deviceId) if (state.deviceInfo is Success) { - renderSessionInfo(state.isCurrentSession, state.deviceInfo.invoke()) + renderSessionInfo(state.isCurrentSession, state.deviceInfo.invoke(), state.isCurrentSessionTrusted) } else { hideSessionInfo() } @@ -124,11 +127,16 @@ class SessionOverviewFragment : } } - private fun renderSessionInfo(isCurrentSession: Boolean, deviceFullInfo: DeviceFullInfo) { + private fun renderSessionInfo( + isCurrentSession: Boolean, + deviceFullInfo: DeviceFullInfo, + isCurrentSessionTrusted: Boolean, + ) { views.sessionOverviewInfo.isVisible = true val viewState = SessionInfoViewState( isCurrentSession = isCurrentSession, deviceFullInfo = deviceFullInfo, + isVerifyButtonVisible = isCurrentSession || isCurrentSessionTrusted, isDetailsButtonVisible = false, isLearnMoreLinkVisible = true, isLastSeenDetailsVisible = true, diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt index 83d438ecb4..8508b395ad 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewEvent.kt @@ -19,6 +19,7 @@ package im.vector.app.features.settings.devices.v2.overview import im.vector.app.core.platform.VectorViewEvents sealed class SessionOverviewViewEvent : VectorViewEvents { - object SelfVerification : SessionOverviewViewEvent() + object ShowVerifyCurrentSession : SessionOverviewViewEvent() + data class ShowVerifyOtherSession(val deviceId: String) : SessionOverviewViewEvent() object PromptResetSecrets : SessionOverviewViewEvent() } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt index bcf7542783..183469936f 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModel.kt @@ -45,6 +45,7 @@ class SessionOverviewViewModel @AssistedInject constructor( } init { + // TODO check if current session is trusted setState { copy(isCurrentSession = isCurrentSession(deviceId)) } @@ -70,6 +71,8 @@ class SessionOverviewViewModel @AssistedInject constructor( private fun handleVerifySessionAction() = withState { viewState -> if (isCurrentSession(viewState.deviceId)) { handleVerifyCurrentSession() + } else { + handleVerifyOtherSession(verifySession.deviceId) } } @@ -77,10 +80,14 @@ class SessionOverviewViewModel @AssistedInject constructor( viewModelScope.launch { val currentSessionCanBeVerified = checkIfCurrentSessionCanBeVerifiedUseCase.execute() if (currentSessionCanBeVerified) { - _viewEvents.post(SessionOverviewViewEvent.SelfVerification) + _viewEvents.post(SessionOverviewViewEvent.ShowVerifyCurrentSession) } else { _viewEvents.post(SessionOverviewViewEvent.PromptResetSecrets) } } } + + private fun handleVerifyOtherSession(deviceId: String) { + _viewEvents.post(SessionOverviewViewEvent.ShowVerifyOtherSession(deviceId)) + } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewState.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewState.kt index a447336c23..1cb455dd5c 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewState.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewState.kt @@ -24,6 +24,7 @@ import im.vector.app.features.settings.devices.v2.DeviceFullInfo data class SessionOverviewViewState( val deviceId: String, val isCurrentSession: Boolean = false, + val isCurrentSessionTrusted: Boolean = false, val deviceInfo: Async = Uninitialized, ) : MavericksState { constructor(args: SessionOverviewArgs) : this( diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt index 71978129d3..ed7fc766c7 100644 --- a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/SessionOverviewViewModelTest.kt @@ -95,7 +95,7 @@ class SessionOverviewViewModelTest { // Then viewModelTest - .assertEvent { it is SessionOverviewViewEvent.SelfVerification } + .assertEvent { it is SessionOverviewViewEvent.ShowVerifyCurrentSession } .finish() coVerify { checkIfCurrentSessionCanBeVerifiedUseCase.execute() @@ -124,4 +124,23 @@ class SessionOverviewViewModelTest { checkIfCurrentSessionCanBeVerifiedUseCase.execute() } } + + @Test + fun `given another session when handling verify session action then verify session event is posted`() { + // Given + val deviceFullInfo = mockk() + every { getDeviceFullInfoUseCase.execute(A_SESSION_ID) } returns flowOf(deviceFullInfo) + every { isCurrentSessionUseCase.execute(any()) } returns false + val verifySessionAction = SessionOverviewAction.VerifySession(A_SESSION_ID) + + // When + val viewModel = createViewModel() + val viewModelTest = viewModel.test() + viewModel.handle(verifySessionAction) + + // Then + viewModelTest + .assertEvent { it is SessionOverviewViewEvent.ShowVerifyOtherSession } + .finish() + } }