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 { init {
sessionObserver.addListener(object : SessionListener { sessionObserver.addListener(object : SessionListener {
override suspend fun onSessionCreated(userId: String) = Unit 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) { if (sessionId.value == userId) {
clear() clear()
} }

View File

@@ -79,7 +79,7 @@ class DefaultLockScreenService(
sessionObserver.addListener(object : SessionListener { sessionObserver.addListener(object : SessionListener {
override suspend fun onSessionCreated(userId: String) = Unit 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 // TODO handle multi session at some point
pinCodeManager.deletePinCode() pinCodeManager.deletePinCode()
} }

View File

@@ -37,7 +37,7 @@ class DefaultImageLoaderHolder(
sessionObserver.addListener(object : SessionListener { sessionObserver.addListener(object : SessionListener {
override suspend fun onSessionCreated(userId: String) = Unit override suspend fun onSessionCreated(userId: String) = Unit
override suspend fun onSessionDeleted(userId: String) { override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) {
remove(SessionId(userId)) remove(SessionId(userId))
} }
}) })

View File

@@ -31,7 +31,7 @@ class DefaultSessionPreferencesStoreFactory(
init { init {
sessionObserver.addListener(object : SessionListener { sessionObserver.addListener(object : SessionListener {
override suspend fun onSessionCreated(userId: String) = Unit 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)) val sessionPreferences = cache.remove(SessionId(userId))
sessionPreferences?.clear() sessionPreferences?.clear()
} }

View File

@@ -119,7 +119,7 @@ class DefaultPushService(
* The current push provider may want to take action, and we need to * The current push provider may want to take action, and we need to
* cleanup the stores. * cleanup the stores.
*/ */
override suspend fun onSessionDeleted(userId: String) { override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) {
val sessionId = SessionId(userId) val sessionId = SessionId(userId)
val userPushStore = userPushStoreFactory.getOrCreate(sessionId) val userPushStore = userPushStoreFactory.getOrCreate(sessionId)
val currentPushProviderName = userPushStore.getPushProviderName() val currentPushProviderName = userPushStore.getPushProviderName()

View File

@@ -61,7 +61,7 @@ class DefaultNotificationConversationService(
sessionObserver.addListener(object : SessionListener { sessionObserver.addListener(object : SessionListener {
override suspend fun onSessionCreated(userId: String) = Unit override suspend fun onSessionCreated(userId: String) = Unit
override suspend fun onSessionDeleted(userId: String) { override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) {
onSessionLogOut(SessionId(userId)) onSessionLogOut(SessionId(userId))
} }
}) })

View File

@@ -248,7 +248,7 @@ class DefaultPushServiceTest {
), ),
pushClientSecretStore = pushClientSecretStore, pushClientSecretStore = pushClientSecretStore,
) )
defaultPushService.onSessionDeleted(A_SESSION_ID.value) defaultPushService.onSessionDeleted(A_SESSION_ID.value, false)
assertThat(userPushStore.getPushProviderName()).isNull() assertThat(userPushStore.getPushProviderName()).isNull()
assertThat(pushClientSecretStore.getSecret(A_SESSION_ID)).isNull() assertThat(pushClientSecretStore.getSecret(A_SESSION_ID)).isNull()
onSessionDeletedLambda.assertions().isCalledOnce().with(value(A_SESSION_ID)) onSessionDeletedLambda.assertions().isCalledOnce().with(value(A_SESSION_ID))
@@ -268,7 +268,7 @@ class DefaultPushServiceTest {
), ),
pushClientSecretStore = pushClientSecretStore, pushClientSecretStore = pushClientSecretStore,
) )
defaultPushService.onSessionDeleted(A_SESSION_ID.value) defaultPushService.onSessionDeleted(A_SESSION_ID.value, false)
assertThat(userPushStore.getPushProviderName()).isNull() assertThat(userPushStore.getPushProviderName()).isNull()
assertThat(pushClientSecretStore.getSecret(A_SESSION_ID)).isNull() assertThat(pushClientSecretStore.getSecret(A_SESSION_ID)).isNull()
} }

View File

@@ -9,5 +9,5 @@ package io.element.android.libraries.sessionstorage.api.observer
interface SessionListener { interface SessionListener {
suspend fun onSessionCreated(userId: String) 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 // Compute diff
// Removed user // Removed user
val removedUsers = currentUserSet - newUserSet val removedUsers = currentUserSet - newUserSet
val wasLastSession = newUserSet.isEmpty()
removedUsers.forEach { removedUser -> removedUsers.forEach { removedUser ->
listeners.onEach { listener -> listeners.onEach { listener ->
listener.onSessionDeleted(removedUser) listener.onSessionDeleted(removedUser, wasLastSession)
} }
} }
// Added user // Added user

View File

@@ -22,7 +22,7 @@ class TestSessionListener : SessionListener {
trackRecord.add(Event.Created(userId)) trackRecord.add(Event.Created(userId))
} }
override suspend fun onSessionDeleted(userId: String) { override suspend fun onSessionDeleted(userId: String, wasLastSession: Boolean) {
trackRecord.add(Event.Deleted(userId)) trackRecord.add(Event.Deleted(userId))
} }

View File

@@ -29,6 +29,6 @@ class FakeSessionObserver : SessionObserver {
} }
suspend fun onSessionDeleted(userId: String) { 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 // 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 // Delete the store when the last session is deleted
if (sessionStore.getAllSessions().isEmpty()) { if (sessionStore.getAllSessions().isEmpty()) {
analyticsStore.reset() analyticsStore.reset()

View File

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