From 042f24c749ab6dd01a9eece2c8b8cfbec1359355 Mon Sep 17 00:00:00 2001 From: Onuray Sahin Date: Mon, 22 Aug 2022 12:10:33 +0300 Subject: [PATCH] Render current session. --- .../v2/VectorSettingsDevicesFragment.kt | 41 +++++++++++++++++ .../devices/v2/list/CurrentSessionView.kt | 46 +++++++++++++++++-- .../devices/v2/list/DevicesListHeaderView.kt | 7 +++ .../res/layout/fragment_settings_devices.xml | 4 +- .../main/res/layout/view_current_session.xml | 19 ++++---- 5 files changed, 100 insertions(+), 17 deletions(-) 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 35fd92023f..28a7fd513b 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 @@ -24,7 +24,11 @@ import android.view.ViewGroup import android.widget.Toast import androidx.appcompat.app.AppCompatActivity 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 dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.dialogs.ManuallyVerifyDialog @@ -35,6 +39,7 @@ import im.vector.app.features.crypto.verification.VerificationBottomSheet import im.vector.app.features.settings.devices.DevicesAction import im.vector.app.features.settings.devices.DevicesViewEvents import im.vector.app.features.settings.devices.DevicesViewModel +import im.vector.app.features.settings.devices.DevicesViewState import javax.inject.Inject /** @@ -117,4 +122,40 @@ class VectorSettingsDevicesFragment @Inject constructor() : VectorBaseFragment + val currentDeviceInfo = state.devices() + ?.firstOrNull { + it.deviceInfo.deviceId == state.myDeviceId + } + + if (state.devices is Success && currentDeviceInfo != null) { + renderCurrentDevice(state) + } else { + hideCurrentSessionView() + } + + handleRequestStatus(state.request) + } + + private fun hideCurrentSessionView() { + views.deviceListHeaderSectionCurrent.isVisible = false + views.deviceListCurrentSession.isVisible = false + } + + private fun renderCurrentDevice(state: DevicesViewState) { + views.deviceListHeaderSectionCurrent.isVisible = true + views.deviceListCurrentSession.isVisible = true + views.deviceListCurrentSession.update( + accountCrossSigningIsTrusted = state.accountCrossSigningIsTrusted, + legacyMode = !state.hasAccountCrossSigning + ) + } + + private fun handleRequestStatus(unIgnoreRequest: Async) { + views.waitingView.root.isVisible = when (unIgnoreRequest) { + is Loading -> true + else -> false + } + } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/CurrentSessionView.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/CurrentSessionView.kt index f3e6fa73ca..fa989a97cf 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/CurrentSessionView.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/CurrentSessionView.kt @@ -18,9 +18,12 @@ package im.vector.app.features.settings.devices.v2.list import android.content.Context import android.util.AttributeSet -import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.isVisible +import im.vector.app.R import im.vector.app.databinding.ViewCurrentSessionBinding +import im.vector.app.features.settings.devices.TrustUtils +import org.matrix.android.sdk.api.session.crypto.crosssigning.DeviceTrustLevel class CurrentSessionView @JvmOverloads constructor( context: Context, @@ -28,8 +31,41 @@ class CurrentSessionView @JvmOverloads constructor( defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { - private val binding = ViewCurrentSessionBinding.inflate( - LayoutInflater.from(context), - this - ) + private val views: ViewCurrentSessionBinding + + init { + inflate(context, R.layout.view_current_session, this) + views = ViewCurrentSessionBinding.bind(this) + } + + fun update(accountCrossSigningIsTrusted: Boolean, legacyMode: Boolean) { + renderDeviceType() + renderVerificationStatus(accountCrossSigningIsTrusted, legacyMode) + } + + private fun renderVerificationStatus(accountCrossSigningIsTrusted: Boolean, legacyMode: Boolean) { + val deviceTrustLevel = DeviceTrustLevel(crossSigningVerified = accountCrossSigningIsTrusted, locallyVerified = true) + val shield = TrustUtils.shieldForTrust( + currentDevice = true, + trustMSK = accountCrossSigningIsTrusted, + legacyMode = legacyMode, + deviceTrustLevel = deviceTrustLevel + ) + views.currentSessionVerificationStatusImageView.render(shield) + if (deviceTrustLevel.crossSigningVerified) { + views.currentSessionVerificationStatusTextView.text = context.getString(R.string.device_manager_verification_status_verified) + views.currentSessionVerificationStatusDetailTextView.text = context.getString(R.string.device_manager_verification_status_detail_verified) + views.currentSessionVerifySessionButton.isVisible = false + } else { + views.currentSessionVerificationStatusTextView.text = context.getString(R.string.device_manager_verification_status_unverified) + views.currentSessionVerificationStatusDetailTextView.text = context.getString(R.string.device_manager_verification_status_detail_unverified) + views.currentSessionVerifySessionButton.isVisible = true + } + } + + // TODO. We don't have this info yet. Update later accordingly. + private fun renderDeviceType() { + views.currentSessionDeviceTypeImageView.setImageResource(R.drawable.ic_device_type_mobile) + views.currentSessionDeviceTypeTextView.text = context.getString(R.string.device_manager_device_type_android) + } } diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/DevicesListHeaderView.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/DevicesListHeaderView.kt index cdd6b58526..d6c7dbe273 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/DevicesListHeaderView.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/DevicesListHeaderView.kt @@ -22,6 +22,7 @@ import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.res.use +import androidx.core.view.isVisible import im.vector.app.R import im.vector.app.core.extensions.setTextWithColoredPart import im.vector.app.databinding.ViewDevicesListHeaderBinding @@ -58,12 +59,18 @@ class DevicesListHeaderView @JvmOverloads constructor( private fun setDescription(typedArray: TypedArray) { val description = typedArray.getString(R.styleable.DevicesListHeaderView_devicesListHeaderDescription) + if (description.isNullOrEmpty()) { + binding.devicesListHeaderDescription.isVisible = false + return + } + val learnMore = context.getString(R.string.action_learn_more) val stringBuilder = StringBuilder() stringBuilder.append(description) stringBuilder.append(" ") stringBuilder.append(learnMore) + binding.devicesListHeaderDescription.isVisible = true binding.devicesListHeaderDescription.setTextWithColoredPart( fullText = stringBuilder.toString(), coloredPart = learnMore, diff --git a/vector/src/main/res/layout/fragment_settings_devices.xml b/vector/src/main/res/layout/fragment_settings_devices.xml index 586082b99e..860e395c1f 100644 --- a/vector/src/main/res/layout/fragment_settings_devices.xml +++ b/vector/src/main/res/layout/fragment_settings_devices.xml @@ -18,10 +18,10 @@ android:id="@+id/deviceListCurrentSession" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginHorizontal="16dp" + android:layout_marginVertical="24dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - android:layout_marginVertical="24dp" - android:layout_marginHorizontal="16dp" app:layout_constraintTop_toBottomOf="@id/deviceListHeaderSectionCurrent" /> - + android:paddingBottom="16dp"> - + app:layout_constraintTop_toBottomOf="@id/currentSessionVerificationStatusDetailTextView" />