diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml index f4a88ad354..ed21c2de8a 100644 --- a/library/ui-strings/src/main/res/values/strings.xml +++ b/library/ui-strings/src/main/res/values/strings.xml @@ -3225,6 +3225,7 @@ View All (%1$d) Verified · Last activity %1$s Unverified · Last activity %1$s + Inactive for %1$d+ days (%2$s) Security recommendations Improve your account security by following these recommendations. Unverified sessions diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt index 7aa3955d07..3b5bcb61d9 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/DevicesViewModel.kt @@ -91,6 +91,7 @@ data class DeviceFullInfo( val deviceInfo: DeviceInfo, val cryptoDeviceInfo: CryptoDeviceInfo?, val trustLevelForShield: RoomEncryptionTrustLevel, + val isInactive: Boolean, ) class DevicesViewModel @AssistedInject constructor( @@ -148,7 +149,8 @@ class DevicesViewModel @AssistedInject constructor( deviceTrustLevel = cryptoDeviceInfo?.trustLevel, isCurrentDevice = deviceInfo.deviceId == session.sessionParams.deviceId ) - DeviceFullInfo(deviceInfo, cryptoDeviceInfo, trustLevelForShield) + val isInactive = checkIfSessionIsInactiveUseCase.execute(deviceInfo.lastSeenTs ?: 0) + DeviceFullInfo(deviceInfo, cryptoDeviceInfo, trustLevelForShield, isInactive) } } .distinctUntilChanged() diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/OtherSessionItem.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/OtherSessionItem.kt index 2a62100994..e9376953e0 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/OtherSessionItem.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/OtherSessionItem.kt @@ -16,6 +16,7 @@ package im.vector.app.features.settings.devices.v2.list +import android.graphics.drawable.Drawable import android.widget.ImageView import android.widget.TextView import com.airbnb.epoxy.EpoxyAttribute @@ -42,6 +43,9 @@ abstract class OtherSessionItem : VectorEpoxyModel(R.la @EpoxyAttribute var sessionDescription: String? = null + @EpoxyAttribute + var sessionDescriptionDrawable: Drawable? = null + @EpoxyAttribute lateinit var stringProvider: StringProvider @@ -68,6 +72,7 @@ abstract class OtherSessionItem : VectorEpoxyModel(R.la holder.otherSessionVerificationStatusImageView.render(roomEncryptionTrustLevel) holder.otherSessionNameTextView.text = sessionName holder.otherSessionDescriptionTextView.text = sessionDescription + holder.otherSessionDescriptionTextView.setCompoundDrawablesWithIntrinsicBounds(sessionDescriptionDrawable, null, null, null) } class Holder : VectorEpoxyHolder() { diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/OtherSessionsController.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/OtherSessionsController.kt index 44c73e6eb7..04427d4cb6 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/OtherSessionsController.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/OtherSessionsController.kt @@ -21,6 +21,7 @@ import im.vector.app.R import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.epoxy.noResultItem +import im.vector.app.core.resources.DrawableProvider import im.vector.app.core.resources.StringProvider import im.vector.app.features.settings.devices.DeviceFullInfo import org.matrix.android.sdk.api.session.crypto.model.RoomEncryptionTrustLevel @@ -29,6 +30,7 @@ import javax.inject.Inject class OtherSessionsController @Inject constructor( private val stringProvider: StringProvider, private val dateFormatter: VectorDateFormatter, + private val drawableProvider: DrawableProvider, ) : TypedEpoxyController>() { override fun buildModels(data: List?) { @@ -42,11 +44,18 @@ class OtherSessionsController @Inject constructor( } else { data.take(NUMBER_OF_OTHER_DEVICES_TO_RENDER).forEach { device -> val formattedLastActivityDate = host.dateFormatter.format(device.deviceInfo.lastSeenTs, DateFormatKind.DEFAULT_DATE_AND_TIME) - val description = if (device.trustLevelForShield == RoomEncryptionTrustLevel.Trusted) { + val description = if (device.isInactive) { + stringProvider.getString( + R.string.device_manager_other_sessions_description_inactive, + SESSION_IS_MARKED_AS_INACTIVE_AFTER_DAYS, + formattedLastActivityDate + ) + } else if (device.trustLevelForShield == RoomEncryptionTrustLevel.Trusted) { stringProvider.getString(R.string.device_manager_other_sessions_description_verified, formattedLastActivityDate) } else { stringProvider.getString(R.string.device_manager_other_sessions_description_unverified, formattedLastActivityDate) } + val descriptionDrawable = if (device.isInactive) drawableProvider.getDrawable(R.drawable.ic_inactive_sessions) else null otherSessionItem { id(device.deviceInfo.deviceId) @@ -54,6 +63,7 @@ class OtherSessionsController @Inject constructor( roomEncryptionTrustLevel(device.trustLevelForShield) sessionName(device.deviceInfo.displayName) sessionDescription(description) + sessionDescriptionDrawable(descriptionDrawable) stringProvider(this@OtherSessionsController.stringProvider) } } diff --git a/vector/src/main/res/layout/item_other_session.xml b/vector/src/main/res/layout/item_other_session.xml index 84b813c977..2c41ce6a56 100644 --- a/vector/src/main/res/layout/item_other_session.xml +++ b/vector/src/main/res/layout/item_other_session.xml @@ -50,6 +50,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="2dp" + android:drawablePadding="8dp" app:layout_constraintStart_toStartOf="@id/otherSessionNameTextView" app:layout_constraintTop_toBottomOf="@id/otherSessionNameTextView" tools:text="@string/device_manager_verification_status_verified" />