Rendering inactive status in SessionInfoView
This commit is contained in:
parent
0b105e2a7a
commit
6e9b2baf6f
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
<style name="TextAppearance.Vector.Body.DevicesManagement">
|
<style name="TextAppearance.Vector.Body.DevicesManagement">
|
||||||
<item name="android:textColor">?vctr_content_secondary</item>
|
<item name="android:textColor">?vctr_content_secondary</item>
|
||||||
|
<item name="android:drawablePadding">12dp</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -34,6 +34,8 @@ import im.vector.app.R
|
||||||
import im.vector.app.core.date.VectorDateFormatter
|
import im.vector.app.core.date.VectorDateFormatter
|
||||||
import im.vector.app.core.dialogs.ManuallyVerifyDialog
|
import im.vector.app.core.dialogs.ManuallyVerifyDialog
|
||||||
import im.vector.app.core.platform.VectorBaseFragment
|
import im.vector.app.core.platform.VectorBaseFragment
|
||||||
|
import im.vector.app.core.resources.ColorProvider
|
||||||
|
import im.vector.app.core.resources.DrawableProvider
|
||||||
import im.vector.app.databinding.FragmentSettingsDevicesBinding
|
import im.vector.app.databinding.FragmentSettingsDevicesBinding
|
||||||
import im.vector.app.features.crypto.recover.SetupMode
|
import im.vector.app.features.crypto.recover.SetupMode
|
||||||
import im.vector.app.features.crypto.verification.VerificationBottomSheet
|
import im.vector.app.features.crypto.verification.VerificationBottomSheet
|
||||||
|
@ -41,9 +43,9 @@ import im.vector.app.features.settings.devices.DeviceFullInfo
|
||||||
import im.vector.app.features.settings.devices.DevicesAction
|
import im.vector.app.features.settings.devices.DevicesAction
|
||||||
import im.vector.app.features.settings.devices.DevicesViewEvents
|
import im.vector.app.features.settings.devices.DevicesViewEvents
|
||||||
import im.vector.app.features.settings.devices.DevicesViewModel
|
import im.vector.app.features.settings.devices.DevicesViewModel
|
||||||
|
import im.vector.app.features.settings.devices.v2.list.OtherSessionsController
|
||||||
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.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.SecurityRecommendationViewState
|
||||||
import im.vector.app.features.settings.devices.v2.list.OtherSessionsController
|
|
||||||
import im.vector.app.features.settings.devices.v2.list.SessionInfoViewState
|
import im.vector.app.features.settings.devices.v2.list.SessionInfoViewState
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@ -58,6 +60,10 @@ class VectorSettingsDevicesFragment :
|
||||||
|
|
||||||
@Inject lateinit var dateFormatter: VectorDateFormatter
|
@Inject lateinit var dateFormatter: VectorDateFormatter
|
||||||
|
|
||||||
|
@Inject lateinit var drawableProvider: DrawableProvider
|
||||||
|
|
||||||
|
@Inject lateinit var colorProvider: ColorProvider
|
||||||
|
|
||||||
private val viewModel: DevicesViewModel by fragmentViewModel()
|
private val viewModel: DevicesViewModel by fragmentViewModel()
|
||||||
|
|
||||||
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSettingsDevicesBinding {
|
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSettingsDevicesBinding {
|
||||||
|
@ -217,7 +223,7 @@ class VectorSettingsDevicesFragment :
|
||||||
isCurrentSession = true,
|
isCurrentSession = true,
|
||||||
deviceFullInfo = it
|
deviceFullInfo = it
|
||||||
)
|
)
|
||||||
views.deviceListCurrentSession.render(viewState, dateFormatter)
|
views.deviceListCurrentSession.render(viewState, dateFormatter, drawableProvider, colorProvider)
|
||||||
views.deviceListCurrentSession.debouncedClicks {
|
views.deviceListCurrentSession.debouncedClicks {
|
||||||
currentDeviceInfo.deviceInfo.deviceId?.let { deviceId -> navigateToSessionOverview(deviceId) }
|
currentDeviceInfo.deviceInfo.deviceId?.let { deviceId -> navigateToSessionOverview(deviceId) }
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,8 @@ import im.vector.app.R
|
||||||
import im.vector.app.core.date.DateFormatKind
|
import im.vector.app.core.date.DateFormatKind
|
||||||
import im.vector.app.core.date.VectorDateFormatter
|
import im.vector.app.core.date.VectorDateFormatter
|
||||||
import im.vector.app.core.extensions.setTextWithColoredPart
|
import im.vector.app.core.extensions.setTextWithColoredPart
|
||||||
|
import im.vector.app.core.resources.ColorProvider
|
||||||
|
import im.vector.app.core.resources.DrawableProvider
|
||||||
import im.vector.app.databinding.ViewSessionInfoBinding
|
import im.vector.app.databinding.ViewSessionInfoBinding
|
||||||
import im.vector.app.features.themes.ThemeUtils
|
import im.vector.app.features.themes.ThemeUtils
|
||||||
import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo
|
import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo
|
||||||
|
@ -47,14 +49,26 @@ class SessionInfoView @JvmOverloads constructor(
|
||||||
|
|
||||||
val viewDetailsButton = views.sessionInfoViewDetailsButton
|
val viewDetailsButton = views.sessionInfoViewDetailsButton
|
||||||
|
|
||||||
fun render(sessionInfoViewState: SessionInfoViewState, dateFormatter: VectorDateFormatter) {
|
fun render(
|
||||||
|
sessionInfoViewState: SessionInfoViewState,
|
||||||
|
dateFormatter: VectorDateFormatter,
|
||||||
|
drawableProvider: DrawableProvider,
|
||||||
|
colorProvider: ColorProvider,
|
||||||
|
) {
|
||||||
renderDeviceInfo(sessionInfoViewState.deviceFullInfo.deviceInfo.displayName.orEmpty())
|
renderDeviceInfo(sessionInfoViewState.deviceFullInfo.deviceInfo.displayName.orEmpty())
|
||||||
renderVerificationStatus(
|
renderVerificationStatus(
|
||||||
sessionInfoViewState.deviceFullInfo.trustLevelForShield,
|
sessionInfoViewState.deviceFullInfo.trustLevelForShield,
|
||||||
sessionInfoViewState.isCurrentSession,
|
sessionInfoViewState.isCurrentSession,
|
||||||
sessionInfoViewState.isLearnMoreLinkVisible
|
sessionInfoViewState.isLearnMoreLinkVisible,
|
||||||
|
)
|
||||||
|
renderDeviceLastSeenDetails(
|
||||||
|
sessionInfoViewState.deviceFullInfo.isInactive,
|
||||||
|
sessionInfoViewState.deviceFullInfo.deviceInfo,
|
||||||
|
sessionInfoViewState.isLastSeenDetailsVisible,
|
||||||
|
dateFormatter,
|
||||||
|
drawableProvider,
|
||||||
|
colorProvider,
|
||||||
)
|
)
|
||||||
renderDeviceLastSeenDetails(sessionInfoViewState.deviceFullInfo.deviceInfo, dateFormatter, sessionInfoViewState.isLastSeenDetailsVisible)
|
|
||||||
renderDetailsButton(sessionInfoViewState.isDetailsButtonVisible)
|
renderDetailsButton(sessionInfoViewState.isDetailsButtonVisible)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,16 +137,36 @@ class SessionInfoView @JvmOverloads constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun renderDeviceLastSeenDetails(
|
private fun renderDeviceLastSeenDetails(
|
||||||
|
isInactive: Boolean,
|
||||||
deviceInfo: DeviceInfo,
|
deviceInfo: DeviceInfo,
|
||||||
dateFormatter: VectorDateFormatter,
|
|
||||||
isLastSeenDetailsVisible: Boolean,
|
isLastSeenDetailsVisible: Boolean,
|
||||||
|
dateFormatter: VectorDateFormatter,
|
||||||
|
drawableProvider: DrawableProvider,
|
||||||
|
colorProvider: ColorProvider,
|
||||||
) {
|
) {
|
||||||
deviceInfo.lastSeenTs
|
deviceInfo.lastSeenTs
|
||||||
?.takeIf { isLastSeenDetailsVisible }
|
?.takeIf { isLastSeenDetailsVisible }
|
||||||
?.let { timestamp ->
|
?.let { timestamp ->
|
||||||
views.sessionInfoLastActivityTextView.isVisible = true
|
views.sessionInfoLastActivityTextView.isVisible = true
|
||||||
|
views.sessionInfoLastActivityTextView.text = if (isInactive) {
|
||||||
|
val formattedTs = dateFormatter.format(timestamp, DateFormatKind.TIMELINE_DAY_DIVIDER)
|
||||||
|
context.resources.getQuantityString(
|
||||||
|
R.plurals.device_manager_other_sessions_description_inactive,
|
||||||
|
SESSION_IS_MARKED_AS_INACTIVE_AFTER_DAYS,
|
||||||
|
SESSION_IS_MARKED_AS_INACTIVE_AFTER_DAYS,
|
||||||
|
formattedTs
|
||||||
|
)
|
||||||
|
} else {
|
||||||
val formattedTs = dateFormatter.format(timestamp, DateFormatKind.DEFAULT_DATE_AND_TIME)
|
val formattedTs = dateFormatter.format(timestamp, DateFormatKind.DEFAULT_DATE_AND_TIME)
|
||||||
views.sessionInfoLastActivityTextView.text = context.getString(R.string.device_manager_session_last_activity, formattedTs)
|
context.getString(R.string.device_manager_session_last_activity, formattedTs)
|
||||||
|
}
|
||||||
|
val drawable = if (isInactive) {
|
||||||
|
val drawableColor = colorProvider.getColorFromAttribute(R.attr.vctr_content_secondary)
|
||||||
|
drawableProvider.getDrawable(R.drawable.ic_inactive_sessions, drawableColor)
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
views.sessionInfoLastActivityTextView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)
|
||||||
}
|
}
|
||||||
?: run {
|
?: run {
|
||||||
views.sessionInfoLastActivityTextView.isGone = true
|
views.sessionInfoLastActivityTextView.isGone = true
|
||||||
|
|
|
@ -31,6 +31,8 @@ import dagger.hilt.android.AndroidEntryPoint
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.core.date.VectorDateFormatter
|
import im.vector.app.core.date.VectorDateFormatter
|
||||||
import im.vector.app.core.platform.VectorBaseFragment
|
import im.vector.app.core.platform.VectorBaseFragment
|
||||||
|
import im.vector.app.core.resources.ColorProvider
|
||||||
|
import im.vector.app.core.resources.DrawableProvider
|
||||||
import im.vector.app.databinding.FragmentSessionOverviewBinding
|
import im.vector.app.databinding.FragmentSessionOverviewBinding
|
||||||
import im.vector.app.features.settings.devices.DeviceFullInfo
|
import im.vector.app.features.settings.devices.DeviceFullInfo
|
||||||
import im.vector.app.features.settings.devices.v2.list.SessionInfoViewState
|
import im.vector.app.features.settings.devices.v2.list.SessionInfoViewState
|
||||||
|
@ -45,6 +47,10 @@ class SessionOverviewFragment :
|
||||||
|
|
||||||
@Inject lateinit var dateFormatter: VectorDateFormatter
|
@Inject lateinit var dateFormatter: VectorDateFormatter
|
||||||
|
|
||||||
|
@Inject lateinit var drawableProvider: DrawableProvider
|
||||||
|
|
||||||
|
@Inject lateinit var colorProvider: ColorProvider
|
||||||
|
|
||||||
private val viewModel: SessionOverviewViewModel by fragmentViewModel()
|
private val viewModel: SessionOverviewViewModel by fragmentViewModel()
|
||||||
|
|
||||||
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSessionOverviewBinding {
|
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentSessionOverviewBinding {
|
||||||
|
@ -96,7 +102,7 @@ class SessionOverviewFragment :
|
||||||
isLearnMoreLinkVisible = true,
|
isLearnMoreLinkVisible = true,
|
||||||
isLastSeenDetailsVisible = true,
|
isLastSeenDetailsVisible = true,
|
||||||
)
|
)
|
||||||
views.sessionOverviewInfo.render(viewState, dateFormatter)
|
views.sessionOverviewInfo.render(viewState, dateFormatter, drawableProvider, colorProvider)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun hideSessionInfo() {
|
private fun hideSessionInfo() {
|
||||||
|
|
|
@ -79,13 +79,13 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="32dp"
|
android:layout_marginHorizontal="32dp"
|
||||||
android:layout_marginTop="12dp"
|
android:layout_marginTop="12dp"
|
||||||
android:gravity="center"
|
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/sessionInfoVerificationStatusDetailTextView"
|
app:layout_constraintTop_toBottomOf="@id/sessionInfoVerificationStatusDetailTextView"
|
||||||
tools:text="Last activity Fri 14:59" />
|
app:layout_constraintWidth="wrap_content_constrained"
|
||||||
|
tools:text="Last activity Fri 14:59"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/sessionInfoLastIPAddressTextView"
|
android:id="@+id/sessionInfoLastIPAddressTextView"
|
||||||
|
@ -95,11 +95,11 @@
|
||||||
android:layout_marginHorizontal="32dp"
|
android:layout_marginHorizontal="32dp"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/sessionInfoLastActivityTextView"
|
app:layout_constraintTop_toBottomOf="@id/sessionInfoLastActivityTextView"
|
||||||
tools:text="81.235.41.100 (United Kingdom)" />
|
tools:text="81.235.41.100 (United Kingdom)"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/sessionInfoVerifySessionButton"
|
android:id="@+id/sessionInfoVerifySessionButton"
|
||||||
|
|
Loading…
Reference in New Issue