From b1a32713ccc2f7141bc8eea00d3313485b0e1eb9 Mon Sep 17 00:00:00 2001 From: jacquarg Date: Fri, 7 Nov 2025 08:20:45 +0100 Subject: [PATCH] fix:sentry-8669029d: fix crash on unexpected double subscription creation. --- .../SubscriptionsRepositoryImpl.kt | 8 +++++- .../procedures/RegisterToEosNotifications.kt | 28 +++++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/foundation/e/notificationsreceiver/repositories/SubscriptionsRepositoryImpl.kt b/app/src/main/java/foundation/e/notificationsreceiver/repositories/SubscriptionsRepositoryImpl.kt index 00b86f1..db395fb 100644 --- a/app/src/main/java/foundation/e/notificationsreceiver/repositories/SubscriptionsRepositoryImpl.kt +++ b/app/src/main/java/foundation/e/notificationsreceiver/repositories/SubscriptionsRepositoryImpl.kt @@ -17,10 +17,12 @@ package foundation.e.notificationsreceiver.repositories import android.content.Context +import android.database.sqlite.SQLiteConstraintException import dagger.hilt.android.qualifiers.ApplicationContext import foundation.e.notificationsreceiver.domain.entities.Topic import foundation.e.notificationsreceiver.domain.repositories.SubscriptionsRepository import foundation.e.notificationsreceiver.domain.utils.AppBackgroundScope +import foundation.e.notificationsreceiver.domain.utils.w import io.heckel.ntfy.R import io.heckel.ntfy.db.Database import io.heckel.ntfy.db.Repository @@ -95,7 +97,11 @@ class SubscriptionsRepositoryImpl @Inject constructor( lastActive = Date().time / 1000, ) - subscriptionDao.add(subscription) + try { + subscriptionDao.add(subscription) + } catch (e: SQLiteConstraintException) { + w("Skip insert subscription, looks already there: ${e.message}") + } debouncedRefreshSubscriptions() } diff --git a/notificationsreceiver-domain/src/main/java/foundation/e/notificationsreceiver/domain/procedures/RegisterToEosNotifications.kt b/notificationsreceiver-domain/src/main/java/foundation/e/notificationsreceiver/domain/procedures/RegisterToEosNotifications.kt index a53067c..229a28d 100644 --- a/notificationsreceiver-domain/src/main/java/foundation/e/notificationsreceiver/domain/procedures/RegisterToEosNotifications.kt +++ b/notificationsreceiver-domain/src/main/java/foundation/e/notificationsreceiver/domain/procedures/RegisterToEosNotifications.kt @@ -24,6 +24,8 @@ import foundation.e.notificationsreceiver.domain.utils.AppBackgroundScope import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import javax.inject.Inject import javax.inject.Singleton @@ -41,6 +43,8 @@ class RegisterToEosNotifications @Inject constructor( private val SUPPORTED_LANGUAGES = setOf("de", "en", "es", "fr", "it") } + private val mutex = Mutex() + fun register() { backgroundScope.launch(Dispatchers.IO) { updateRegistration() @@ -48,19 +52,21 @@ class RegisterToEosNotifications @Inject constructor( } internal suspend fun updateRegistration() { - val toSubscribeTopics = buildTopicsList() + mutex.withLock { + val toSubscribeTopics = buildTopicsList() - val savedEOSTopics = subscriptionRepository.getSubscriptions() - .filter { it.topic.startsWith(EOS_BROADCAST_TOPIC_PREFIX) } - savedEOSTopics.minus(toSubscribeTopics).forEach { - subscriptionRepository.deactivateSubscription(it) - } - savedEOSTopics.filter { !it.enabled }.intersect(toSubscribeTopics).forEach { - subscriptionRepository.reactivateSubscription(it) - } + val savedEOSTopics = subscriptionRepository.getSubscriptions() + .filter { it.topic.startsWith(EOS_BROADCAST_TOPIC_PREFIX) } + savedEOSTopics.minus(toSubscribeTopics).forEach { + subscriptionRepository.deactivateSubscription(it) + } + savedEOSTopics.filter { !it.enabled }.intersect(toSubscribeTopics).forEach { + subscriptionRepository.reactivateSubscription(it) + } - (toSubscribeTopics - savedEOSTopics).forEach { - subscriptionRepository.createSubscription(it) + (toSubscribeTopics - savedEOSTopics).forEach { + subscriptionRepository.createSubscription(it) + } } } -- GitLab