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 00b86f191f3a795126c488fe33057ac76010c6a6..db395fbe35af1eb52fc103a0b4a2b93c9b1520a5 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 a53067c8bd91428859745b3d4a7a22d47d7ea078..229a28db7785f8707cab064fee7d877b00c354d8 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) + } } }