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" />