From cc798e7475d21448df767ef045b0745d8c848352 Mon Sep 17 00:00:00 2001 From: Taras Smakula <tarassmakula@gmail.com> Date: Mon, 13 May 2024 18:36:11 +0300 Subject: [PATCH] Update active devices list --- core/build.gradle | 8 +-- .../ActiveSessionsDataSource.kt | 52 ++++++++----------- .../ActiveSessionsViewModel.kt | 3 ++ .../list/ActiveSessionsViewHolder.kt | 2 +- .../settings/model/ActiveSessionListItem.kt | 2 - 5 files changed, 31 insertions(+), 36 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index c294d68bc..84ac56eaa 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -80,12 +80,12 @@ dependencies { kapt "com.google.dagger:hilt-compiler:$rootProject.ext.hilt_version" //Matrix release - api('org.futo.gitlab.circles:matrix-android-sdk:v1.6.10.35@aar') { - transitive = true - } +// api('org.futo.gitlab.circles:matrix-android-sdk:v1.6.10.35@aar') { +// transitive = true +// } //Matrix mavenLocal testing - //api "org.futo.gitlab.circles:matrix-android-sdk:0.1.27" + api "org.futo.gitlab.circles:matrix-android-sdk:0.1.46" //Retrofit2 def retrofit_version = '2.11.0' diff --git a/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/ActiveSessionsDataSource.kt b/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/ActiveSessionsDataSource.kt index e87b6430d..f9677cc60 100644 --- a/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/ActiveSessionsDataSource.kt +++ b/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/ActiveSessionsDataSource.kt @@ -1,7 +1,6 @@ package org.futo.circles.settings.feature.active_sessions import android.content.Context -import android.util.Log import androidx.lifecycle.asFlow import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Dispatchers @@ -19,11 +18,7 @@ import org.futo.circles.core.provider.MatrixSessionProvider import org.futo.circles.settings.model.ActiveSession import org.futo.circles.settings.model.ActiveSessionListItem import org.futo.circles.settings.model.SessionHeader -import org.matrix.android.sdk.api.session.crypto.crosssigning.MXCrossSigningInfo import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo -import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo -import org.matrix.android.sdk.api.util.Optional -import java.util.concurrent.TimeUnit import javax.inject.Inject class ActiveSessionsDataSource @Inject constructor( @@ -39,56 +34,55 @@ class ActiveSessionsDataSource @Inject constructor( MutableStateFlow(mutableSetOf()) + suspend fun refreshDevicesList() { + session.cryptoService().downloadKeysIfNeeded(listOf(session.myUserId), true) + } + fun getActiveSessionsFlow(): Flow<List<ActiveSessionListItem>> { return combine( - session.cryptoService().getMyDevicesInfoLive().asFlow(), session.cryptoService().getLiveCryptoDeviceInfo(session.myUserId).asFlow(), itemsWithVisibleOptionsFlow - ) { infoList, cryptoList, devicesWithVisibleOptions -> - buildList(infoList, cryptoList, devicesWithVisibleOptions) + ) { cryptoList, devicesWithVisibleOptions -> + buildList(cryptoList, devicesWithVisibleOptions) }.flowOn(Dispatchers.IO).distinctUntilChanged() } private fun buildList( - infoList: List<DeviceInfo>, cryptoList: List<CryptoDeviceInfo>, sessionsWithVisibleOptions: Set<String> ): List<ActiveSessionListItem> { - val devicesList = infoList.mapNotNull { deviceInfo -> - val cryptoDeviceInfo = cryptoList.firstOrNull { it.deviceId == deviceInfo.deviceId } - cryptoDeviceInfo?.let { deviceInfo to it } - }.sortedByDescending { it.first.lastSeenTs } + val currentSession = cryptoList.firstOrNull { + it.deviceId == MatrixSessionProvider.currentSession?.sessionParams?.deviceId + } ?: return emptyList() - val currentSession = - devicesList.firstOrNull { it.second.deviceId == MatrixSessionProvider.currentSession?.sessionParams?.deviceId } - ?: return emptyList() - val otherSessions = devicesList.toMutableList().apply { remove(currentSession) } + val otherSessions = cryptoList.toMutableList().apply { remove(currentSession) } + .sortedByDescending { it.firstTimeSeenLocalTs } val isCurrentSessionVerified = - currentSession.second.trustLevel?.isCrossSigningVerified() == true + currentSession.trustLevel?.isCrossSigningVerified() == true val sessionsList = mutableListOf<ActiveSessionListItem>(SessionHeader(context.getString(R.string.current_session))) sessionsList.add( ActiveSession( - deviceInfo = currentSession.first, - cryptoDeviceInfo = currentSession.second, + cryptoDeviceInfo = currentSession, canVerify = !isCurrentSessionVerified && otherSessions.isNotEmpty(), isResetKeysVisible = !isCurrentSessionVerified, - isOptionsVisible = sessionsWithVisibleOptions.contains(currentSession.second.deviceId) + isOptionsVisible = sessionsWithVisibleOptions.contains(currentSession.deviceId) ) ) if (otherSessions.isNotEmpty()) { sessionsList.add(SessionHeader(context.getString(R.string.other_sessions))) - sessionsList.addAll(otherSessions.map { - ActiveSession( - deviceInfo = it.first, - cryptoDeviceInfo = it.second, - canVerify = isCurrentSessionVerified && it.second.trustLevel?.isCrossSigningVerified() != true, - isResetKeysVisible = false, - isOptionsVisible = sessionsWithVisibleOptions.contains(it.second.deviceId) - ) + sessionsList.addAll(otherSessions.mapNotNull { + if (!it.isDehydrated) { + ActiveSession( + cryptoDeviceInfo = it, + canVerify = isCurrentSessionVerified && it.trustLevel?.isCrossSigningVerified() != true, + isResetKeysVisible = false, + isOptionsVisible = sessionsWithVisibleOptions.contains(it.deviceId) + ) + } else null } ) } diff --git a/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/ActiveSessionsViewModel.kt b/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/ActiveSessionsViewModel.kt index b2f3db987..c2e296fe7 100644 --- a/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/ActiveSessionsViewModel.kt +++ b/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/ActiveSessionsViewModel.kt @@ -41,6 +41,9 @@ class ActiveSessionsViewModel @Inject constructor( } } + init { + launchBg { dataSource.refreshDevicesList() } + } fun onSessionClicked(deviceId: String) { dataSource.toggleOptionsVisibilityFor(deviceId) diff --git a/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/list/ActiveSessionsViewHolder.kt b/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/list/ActiveSessionsViewHolder.kt index ee21a65a2..9ca96e7dd 100644 --- a/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/list/ActiveSessionsViewHolder.kt +++ b/settings/src/main/java/org/futo/circles/settings/feature/active_sessions/list/ActiveSessionsViewHolder.kt @@ -31,7 +31,7 @@ class SessionItemViewHolder( with(binding) { lRoot.setOnClickListener { activeSessionClickListener.onItemClicked(data.id) } - tvDeviceName.text = data.deviceInfo.displayName ?: data.id + tvDeviceName.text = data.cryptoDeviceInfo.displayName() ?: data.id tvDeviceId.text = data.cryptoDeviceInfo.deviceId vInfo.setData(data, activeSessionClickListener) vInfo.setIsVisible(data.isOptionsVisible) diff --git a/settings/src/main/java/org/futo/circles/settings/model/ActiveSessionListItem.kt b/settings/src/main/java/org/futo/circles/settings/model/ActiveSessionListItem.kt index f2ae29c62..5956757eb 100644 --- a/settings/src/main/java/org/futo/circles/settings/model/ActiveSessionListItem.kt +++ b/settings/src/main/java/org/futo/circles/settings/model/ActiveSessionListItem.kt @@ -3,7 +3,6 @@ package org.futo.circles.settings.model import org.futo.circles.core.base.list.IdEntity import org.futo.circles.core.provider.MatrixSessionProvider import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo -import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo sealed class ActiveSessionListItem : IdEntity<String> @@ -14,7 +13,6 @@ data class SessionHeader( } data class ActiveSession( - val deviceInfo: DeviceInfo, val cryptoDeviceInfo: CryptoDeviceInfo, val canVerify: Boolean, val isResetKeysVisible: Boolean, -- GitLab