Let RustNotificationSettingsService handle the lifecycle of notificationSettings, and call setDelegate(null)

This commit is contained in:
Benoit Marty 2023-12-01 15:02:42 +01:00 committed by Benoit Marty
parent 064671a066
commit 2b83951a4b
2 changed files with 12 additions and 9 deletions

View file

@ -119,10 +119,9 @@ class RustMatrixClient constructor(
.filterByPushRules() .filterByPushRules()
.finish() .finish()
} }
private val notificationSettings = client.getNotificationSettings()
private val notificationService = RustNotificationService(sessionId, notificationClient, dispatchers, clock) private val notificationService = RustNotificationService(sessionId, notificationClient, dispatchers, clock)
private val notificationSettingsService = RustNotificationSettingsService(notificationSettings, dispatchers) private val notificationSettingsService = RustNotificationSettingsService(client, dispatchers)
.also { it.start() }
private val roomSyncSubscriber = RoomSyncSubscriber(innerRoomListService, dispatchers) private val roomSyncSubscriber = RoomSyncSubscriber(innerRoomListService, dispatchers)
private val encryptionService = RustEncryptionService( private val encryptionService = RustEncryptionService(
client = client, client = client,
@ -346,8 +345,7 @@ class RustMatrixClient constructor(
override fun close() { override fun close() {
sessionCoroutineScope.cancel() sessionCoroutineScope.cancel()
clientDelegateTaskHandle?.cancelAndDestroy() clientDelegateTaskHandle?.cancelAndDestroy()
notificationSettings.setDelegate(null) notificationSettingsService.destroy()
notificationSettings.destroy()
verificationService.destroy() verificationService.destroy()
syncService.destroy() syncService.destroy()
innerRoomListService.destroy() innerRoomListService.destroy()

View file

@ -26,16 +26,16 @@ import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.matrix.rustcomponents.sdk.NotificationSettings import org.matrix.rustcomponents.sdk.Client
import org.matrix.rustcomponents.sdk.NotificationSettingsDelegate import org.matrix.rustcomponents.sdk.NotificationSettingsDelegate
import org.matrix.rustcomponents.sdk.NotificationSettingsException import org.matrix.rustcomponents.sdk.NotificationSettingsException
import timber.log.Timber import timber.log.Timber
class RustNotificationSettingsService( class RustNotificationSettingsService(
private val notificationSettings: NotificationSettings, client: Client,
private val dispatchers: CoroutineDispatchers, private val dispatchers: CoroutineDispatchers,
) : NotificationSettingsService { ) : NotificationSettingsService {
private val notificationSettings = client.getNotificationSettings()
private val _notificationSettingsChangeFlow = MutableSharedFlow<Unit>(extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) private val _notificationSettingsChangeFlow = MutableSharedFlow<Unit>(extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
override val notificationSettingsChangeFlow: SharedFlow<Unit> = _notificationSettingsChangeFlow.asSharedFlow() override val notificationSettingsChangeFlow: SharedFlow<Unit> = _notificationSettingsChangeFlow.asSharedFlow()
@ -45,10 +45,15 @@ class RustNotificationSettingsService(
} }
} }
init { fun start() {
notificationSettings.setDelegate(notificationSettingsDelegate) notificationSettings.setDelegate(notificationSettingsDelegate)
} }
fun destroy() {
notificationSettings.setDelegate(null)
notificationSettings.destroy()
}
override suspend fun getRoomNotificationSettings(roomId: RoomId, isEncrypted: Boolean, isOneToOne: Boolean): Result<RoomNotificationSettings> = override suspend fun getRoomNotificationSettings(roomId: RoomId, isEncrypted: Boolean, isOneToOne: Boolean): Result<RoomNotificationSettings> =
runCatching { runCatching {
notificationSettings.getRoomNotificationSettings(roomId.value, isEncrypted, isOneToOne).let(RoomNotificationSettingsMapper::map) notificationSettings.getRoomNotificationSettings(roomId.value, isEncrypted, isOneToOne).let(RoomNotificationSettingsMapper::map)