Add parameter wasLastSession to SessionListener.onSessionDeleted

This commit is contained in:
Benoit Marty
2025-10-23 16:20:15 +02:00
parent 0b9a4a6302
commit 44e125dbc7
13 changed files with 15 additions and 14 deletions

View File

@@ -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()
}

View File

@@ -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()
}

View File

@@ -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))
}
})

View File

@@ -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()
}

View File

@@ -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()

View File

@@ -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))
}
})

View File

@@ -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()
}

View File

@@ -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)
}

View File

@@ -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

View File

@@ -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))
}

View File

@@ -29,6 +29,6 @@ class FakeSessionObserver : SessionObserver {
}
suspend fun onSessionDeleted(userId: String) {
listeners.forEach { it.onSessionDeleted(userId) }
listeners.forEach { it.onSessionDeleted(userId, false) }
}
}

View File

@@ -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()

View File

@@ -178,7 +178,7 @@ class DefaultAnalyticsServiceTest {
coroutineScope = backgroundScope,
analyticsStore = store,
)
sut.onSessionDeleted("userId")
sut.onSessionDeleted("userId", false)
resetLambda.assertions().isCalledOnce()
}