diff --git a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStore.kt b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStore.kt index 38295daa27..5a8a9116d5 100644 --- a/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStore.kt +++ b/features/invite/impl/src/main/kotlin/io/element/android/features/invite/impl/DefaultSeenInvitesStore.kt @@ -34,7 +34,7 @@ class DefaultSeenInvitesStore( init { sessionObserver.addListener(object : SessionListener { override suspend fun onSessionCreated(userId: String) = Unit - override suspend fun onSessionDeleted(userId: String) { + override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) { if (sessionId.value == userId) { clear() } diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt index 8995eee65a..03ac11e086 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt @@ -79,7 +79,7 @@ class DefaultLockScreenService( sessionObserver.addListener(object : SessionListener { override suspend fun onSessionCreated(userId: String) = Unit - override suspend fun onSessionDeleted(userId: String) { + override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) { // TODO handle multi session at some point pinCodeManager.deletePinCode() } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt index 16cb3cca18..77d3abffef 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/ImageLoaderHolder.kt @@ -37,7 +37,7 @@ class DefaultImageLoaderHolder( sessionObserver.addListener(object : SessionListener { override suspend fun onSessionCreated(userId: String) = Unit - override suspend fun onSessionDeleted(userId: String) { + override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) { remove(SessionId(userId)) } }) diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStoreFactory.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStoreFactory.kt index fefbd84104..07df852208 100644 --- a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStoreFactory.kt +++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultSessionPreferencesStoreFactory.kt @@ -31,7 +31,7 @@ class DefaultSessionPreferencesStoreFactory( init { sessionObserver.addListener(object : SessionListener { override suspend fun onSessionCreated(userId: String) = Unit - override suspend fun onSessionDeleted(userId: String) { + override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) { val sessionPreferences = cache.remove(SessionId(userId)) sessionPreferences?.clear() } diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPushService.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPushService.kt index c92e512a71..8e8874d6ea 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPushService.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/DefaultPushService.kt @@ -119,7 +119,7 @@ class DefaultPushService( * The current push provider may want to take action, and we need to * cleanup the stores. */ - override suspend fun onSessionDeleted(userId: String) { + override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) { val sessionId = SessionId(userId) val userPushStore = userPushStoreFactory.getOrCreate(sessionId) val currentPushProviderName = userPushStore.getPushProviderName() diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt index f61487c571..43824c88ae 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/conversations/DefaultNotificationConversationService.kt @@ -61,7 +61,7 @@ class DefaultNotificationConversationService( sessionObserver.addListener(object : SessionListener { override suspend fun onSessionCreated(userId: String) = Unit - override suspend fun onSessionDeleted(userId: String) { + override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) { onSessionLogOut(SessionId(userId)) } }) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/DefaultPushServiceTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/DefaultPushServiceTest.kt index 5ae8ab261e..dffd7d4846 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/DefaultPushServiceTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/DefaultPushServiceTest.kt @@ -248,7 +248,7 @@ class DefaultPushServiceTest { ), pushClientSecretStore = pushClientSecretStore, ) - defaultPushService.onSessionDeleted(A_SESSION_ID.value) + defaultPushService.onSessionDeleted(A_SESSION_ID.value, false) assertThat(userPushStore.getPushProviderName()).isNull() assertThat(pushClientSecretStore.getSecret(A_SESSION_ID)).isNull() onSessionDeletedLambda.assertions().isCalledOnce().with(value(A_SESSION_ID)) @@ -268,7 +268,7 @@ class DefaultPushServiceTest { ), pushClientSecretStore = pushClientSecretStore, ) - defaultPushService.onSessionDeleted(A_SESSION_ID.value) + defaultPushService.onSessionDeleted(A_SESSION_ID.value, false) assertThat(userPushStore.getPushProviderName()).isNull() assertThat(pushClientSecretStore.getSecret(A_SESSION_ID)).isNull() } diff --git a/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/observer/SessionListener.kt b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/observer/SessionListener.kt index b0db9fa4bc..6066ffd09b 100644 --- a/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/observer/SessionListener.kt +++ b/libraries/session-storage/api/src/main/kotlin/io/element/android/libraries/sessionstorage/api/observer/SessionListener.kt @@ -9,5 +9,5 @@ package io.element.android.libraries.sessionstorage.api.observer interface SessionListener { suspend fun onSessionCreated(userId: String) - suspend fun onSessionDeleted(userId: String) + suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) } diff --git a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/observer/DefaultSessionObserver.kt b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/observer/DefaultSessionObserver.kt index 71a63db82d..be2e5c9eaa 100644 --- a/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/observer/DefaultSessionObserver.kt +++ b/libraries/session-storage/impl/src/main/kotlin/io/element/android/libraries/sessionstorage/impl/observer/DefaultSessionObserver.kt @@ -60,9 +60,10 @@ class DefaultSessionObserver( // Compute diff // Removed user val removedUsers = currentUserSet - newUserSet + val wasLastSession = newUserSet.isEmpty() removedUsers.forEach { removedUser -> listeners.onEach { listener -> - listener.onSessionDeleted(removedUser) + listener.onSessionDeleted(removedUser, wasLastSession) } } // Added user diff --git a/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/observer/TestSessionListener.kt b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/observer/TestSessionListener.kt index 91ae519538..b08c7ffa6e 100644 --- a/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/observer/TestSessionListener.kt +++ b/libraries/session-storage/impl/src/test/kotlin/io/element/android/libraries/sessionstorage/impl/observer/TestSessionListener.kt @@ -22,7 +22,7 @@ class TestSessionListener : SessionListener { trackRecord.add(Event.Created(userId)) } - override suspend fun onSessionDeleted(userId: String) { + override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) { trackRecord.add(Event.Deleted(userId)) } diff --git a/libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/observer/FakeSessionObserver.kt b/libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/observer/FakeSessionObserver.kt index 817046517a..ef11f5d2d3 100644 --- a/libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/observer/FakeSessionObserver.kt +++ b/libraries/session-storage/test/src/main/kotlin/io/element/android/libraries/sessionstorage/test/observer/FakeSessionObserver.kt @@ -29,6 +29,6 @@ class FakeSessionObserver : SessionObserver { } suspend fun onSessionDeleted(userId: String) { - listeners.forEach { it.onSessionDeleted(userId) } + listeners.forEach { it.onSessionDeleted(userId, false) } } } diff --git a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt index 7d06f762e5..dc6b32ef7d 100644 --- a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt +++ b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt @@ -79,7 +79,7 @@ class DefaultAnalyticsService( // Nothing to do } - override suspend fun onSessionDeleted(userId: String) { + override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) { // Delete the store when the last session is deleted if (sessionStore.getAllSessions().isEmpty()) { analyticsStore.reset() diff --git a/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt b/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt index 1e5a54fb26..61950d122e 100644 --- a/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt +++ b/services/analytics/impl/src/test/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsServiceTest.kt @@ -178,7 +178,7 @@ class DefaultAnalyticsServiceTest { coroutineScope = backgroundScope, analyticsStore = store, ) - sut.onSessionDeleted("userId") + sut.onSessionDeleted("userId", false) resetLambda.assertions().isCalledOnce() }