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