From f4865df50cd164a6edc2be0755d1a73394036146 Mon Sep 17 00:00:00 2001 From: Maxime NATUREL Date: Thu, 1 Sep 2022 10:05:24 +0200 Subject: [PATCH] Show info in overview screen --- .../src/main/res/values/strings.xml | 10 ++++- .../v2/VectorSettingsDevicesFragment.kt | 7 +++- .../devices/v2/list/SessionInfoView.kt | 40 +++++++++++++------ .../devices/v2/list/SessionInfoViewState.kt | 25 ++++++++++++ .../v2/overview/SessionOverviewFragment.kt | 32 +++++++++++++-- .../res/layout/fragment_session_overview.xml | 20 ++++++++++ .../fragment_settings_session_overview.xml | 6 --- .../src/main/res/layout/view_session_info.xml | 2 +- 8 files changed, 115 insertions(+), 27 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt create mode 100644 vector/src/main/res/layout/fragment_session_overview.xml delete mode 100644 vector/src/main/res/layout/fragment_settings_session_overview.xml diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index 823a26df74..e1c03da532 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -3226,8 +3226,14 @@ Unknown device type Verified session Unverified session - Your current session is ready for secure messaging. - Verify your current session for enhanced secure messaging. + + Your current session is ready for secure messaging. + + Verify your current session for enhanced secure messaging. + Your current session is ready for secure messaging. + This session is ready for secure messaging. + Verify your current session for enhanced secure messaging. + Verify or sign out from this session for best security and reliability. Verify Session View Details Current Session diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt index 2adf7969bf..8bab4ebd60 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/VectorSettingsDevicesFragment.kt @@ -42,6 +42,7 @@ import im.vector.app.features.settings.devices.DevicesViewEvents import im.vector.app.features.settings.devices.DevicesViewModel import im.vector.app.features.settings.devices.v2.list.SESSION_IS_MARKED_AS_INACTIVE_AFTER_DAYS import im.vector.app.features.settings.devices.v2.list.SecurityRecommendationViewState +import im.vector.app.features.settings.devices.v2.list.SessionInfoViewState import javax.inject.Inject /** @@ -199,7 +200,11 @@ class VectorSettingsDevicesFragment : currentDeviceInfo?.let { views.deviceListHeaderCurrentSession.isVisible = true views.deviceListCurrentSession.isVisible = true - views.deviceListCurrentSession.render(it) + val viewState = SessionInfoViewState( + isCurrentSession = true, + deviceFullInfo = it + ) + views.deviceListCurrentSession.render(viewState) views.deviceListCurrentSession.debouncedClicks { currentDeviceInfo.deviceInfo.deviceId?.let { deviceId -> navigateToSessionOverview(deviceId) } } 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 b79adfb2d4..be6cfad1c8 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 @@ -22,7 +22,6 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible import im.vector.app.R import im.vector.app.databinding.ViewSessionInfoBinding -import im.vector.app.features.settings.devices.DeviceFullInfo import im.vector.app.features.themes.ThemeUtils import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel @@ -41,31 +40,42 @@ class SessionInfoView @JvmOverloads constructor( val viewDetailsButton = views.sessionInfoViewDetailsButton - fun render(deviceInfo: DeviceFullInfo) { - renderDeviceInfo(deviceInfo.deviceInfo.displayName.orEmpty()) - renderVerificationStatus(deviceInfo.trustLevelForShield) + fun render(sessionInfoViewState: SessionInfoViewState) { + renderDeviceInfo(sessionInfoViewState.deviceFullInfo.deviceInfo.displayName.orEmpty()) + renderVerificationStatus(sessionInfoViewState.deviceFullInfo.trustLevelForShield, sessionInfoViewState.isCurrentSession) + renderDetailsButton(sessionInfoViewState.isDetailsButtonVisible) } - private fun renderVerificationStatus(trustLevelForShield: RoomEncryptionTrustLevel) { - views.sessionInfoVerificationStatusImageView.render(trustLevelForShield) - if (trustLevelForShield == RoomEncryptionTrustLevel.Trusted) { - renderCrossSigningVerified() + private fun renderVerificationStatus(encryptionTrustLevel: RoomEncryptionTrustLevel, isCurrentSession: Boolean) { + views.sessionInfoVerificationStatusImageView.render(encryptionTrustLevel) + if (encryptionTrustLevel == RoomEncryptionTrustLevel.Trusted) { + renderCrossSigningVerified(isCurrentSession) } else { - renderCrossSigningUnverified() + renderCrossSigningUnverified(isCurrentSession) } } - private fun renderCrossSigningVerified() { + private fun renderCrossSigningVerified(isCurrentSession: Boolean) { views.sessionInfoVerificationStatusTextView.text = context.getString(R.string.device_manager_verification_status_verified) views.sessionInfoVerificationStatusTextView.setTextColor(ThemeUtils.getColor(context, R.attr.colorPrimary)) - views.sessionInfoVerificationStatusDetailTextView.text = context.getString(R.string.device_manager_verification_status_detail_verified) + val statusResId = if (isCurrentSession) { + R.string.device_manager_verification_status_detail_current_session_verified + } else { + R.string.device_manager_verification_status_detail_other_session_verified + } + views.sessionInfoVerificationStatusDetailTextView.text = context.getString(statusResId) views.sessionInfoVerifySessionButton.isVisible = false } - private fun renderCrossSigningUnverified() { + private fun renderCrossSigningUnverified(isCurrentSession: Boolean) { views.sessionInfoVerificationStatusTextView.text = context.getString(R.string.device_manager_verification_status_unverified) views.sessionInfoVerificationStatusTextView.setTextColor(ThemeUtils.getColor(context, R.attr.colorError)) - views.sessionInfoVerificationStatusDetailTextView.text = context.getString(R.string.device_manager_verification_status_detail_unverified) + val statusResId = if (isCurrentSession) { + R.string.device_manager_verification_status_detail_current_session_unverified + } else { + R.string.device_manager_verification_status_detail_other_session_unverified + } + views.sessionInfoVerificationStatusDetailTextView.text = context.getString(statusResId) views.sessionInfoVerifySessionButton.isVisible = true } @@ -75,4 +85,8 @@ class SessionInfoView @JvmOverloads constructor( views.sessionInfoDeviceTypeImageView.contentDescription = context.getString(R.string.a11y_device_manager_device_type_mobile) views.sessionInfoNameTextView.text = sessionName } + + private fun renderDetailsButton(isDetailsButtonVisible: Boolean) { + views.sessionInfoViewDetailsButton.isVisible = isDetailsButtonVisible + } } 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 new file mode 100644 index 0000000000..c9a351f568 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/SessionInfoViewState.kt @@ -0,0 +1,25 @@ +/* + * Copyright (c) 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.settings.devices.v2.list + +import im.vector.app.features.settings.devices.DeviceFullInfo + +data class SessionInfoViewState( + val isCurrentSession: Boolean, + val deviceFullInfo: DeviceFullInfo, + val isDetailsButtonVisible: Boolean = true, +) 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 1b8b231a5c..60d58c8a8d 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 @@ -19,28 +19,38 @@ package im.vector.app.features.settings.devices.v2.overview import android.view.LayoutInflater import android.view.ViewGroup import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.isGone +import androidx.core.view.isVisible +import com.airbnb.mvrx.Success import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.withState import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.platform.VectorBaseFragment -import im.vector.app.databinding.FragmentSettingsSessionOverviewBinding +import im.vector.app.databinding.FragmentSessionOverviewBinding +import im.vector.app.features.settings.devices.DeviceFullInfo +import im.vector.app.features.settings.devices.v2.list.SessionInfoViewState /** * Display the overview info about a Session. */ @AndroidEntryPoint class SessionOverviewFragment : - VectorBaseFragment() { + VectorBaseFragment() { private val viewModel: SessionOverviewViewModel by fragmentViewModel() - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSettingsSessionOverviewBinding { - return FragmentSettingsSessionOverviewBinding.inflate(inflater, container, false) + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSessionOverviewBinding { + return FragmentSessionOverviewBinding.inflate(inflater, container, false) } override fun invalidate() = withState(viewModel) { state -> updateToolbar(state.isCurrentSession) + if (state.deviceInfo is Success) { + renderSessionInfo(state.isCurrentSession, state.deviceInfo.invoke()) + } else { + hideSessionInfo() + } } private fun updateToolbar(isCurrentSession: Boolean) { @@ -49,4 +59,18 @@ class SessionOverviewFragment : ?.supportActionBar ?.setTitle(titleResId) } + + private fun renderSessionInfo(isCurrentSession: Boolean, deviceFullInfo: DeviceFullInfo) { + views.sessionOverviewInfo.isVisible = true + val viewState = SessionInfoViewState( + isCurrentSession = isCurrentSession, + deviceFullInfo = deviceFullInfo, + isDetailsButtonVisible = false + ) + views.sessionOverviewInfo.render(viewState) + } + + private fun hideSessionInfo() { + views.sessionOverviewInfo.isGone = true + } } diff --git a/vector/src/main/res/layout/fragment_session_overview.xml b/vector/src/main/res/layout/fragment_session_overview.xml new file mode 100644 index 0000000000..156e61673b --- /dev/null +++ b/vector/src/main/res/layout/fragment_session_overview.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/vector/src/main/res/layout/fragment_settings_session_overview.xml b/vector/src/main/res/layout/fragment_settings_session_overview.xml deleted file mode 100644 index 1354408486..0000000000 --- a/vector/src/main/res/layout/fragment_settings_session_overview.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/vector/src/main/res/layout/view_session_info.xml b/vector/src/main/res/layout/view_session_info.xml index 015f4961c9..02aad7b19d 100644 --- a/vector/src/main/res/layout/view_session_info.xml +++ b/vector/src/main/res/layout/view_session_info.xml @@ -70,7 +70,7 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/sessionInfoVerificationStatusContainer" - tools:text="@string/device_manager_verification_status_detail_verified" /> + tools:text="@string/device_manager_verification_status_detail_current_session_verified" />