Skip to content

Commit

Permalink
Fix notification and message monitors (#340)
Browse files Browse the repository at this point in the history
* Fix notification and message monitors
* Adjust tests to match new implementation
  • Loading branch information
markocic authored Feb 22, 2025
1 parent 6258276 commit e7b5f1c
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.serialization.encodeToString
import net.primal.android.config.AppConfigProvider
import net.primal.android.core.coroutines.CoroutineDispatcherProvider
import net.primal.android.core.serialization.json.NostrJson
Expand All @@ -36,7 +35,6 @@ import net.primal.android.nostr.notary.NostrNotary
import net.primal.android.notifications.api.model.PubkeyRequestBody
import net.primal.android.notifications.domain.NotificationsSummary
import net.primal.android.user.accounts.active.ActiveAccountStore
import net.primal.android.user.accounts.active.ActiveUserAccountState
import net.primal.android.user.domain.Badges
import net.primal.android.user.repository.UserRepository
import net.primal.android.wallet.api.model.BalanceRequestBody
Expand All @@ -58,7 +56,6 @@ class SubscriptionsManager @Inject constructor(

private val scope = CoroutineScope(dispatcherProvider.io())
private var subscriptionsActive = false
private var activeUserId: String? = null

private var notificationsSummarySubscription: PrimalSocketSubscription<NotificationsSummary>? = null
private var messagesUnreadCountSubscription: PrimalSocketSubscription<MessagesUnreadCount>? = null
Expand All @@ -85,24 +82,21 @@ class SubscriptionsManager @Inject constructor(
private fun observeActiveAccount() =
scope.launch {
appConfigProvider.waitForCacheAndWalletConfigsUrls()
activeAccountStore.activeAccountState.collect {
when (it) {
is ActiveUserAccountState.ActiveUserAccount -> {
val newActiveUserId = it.data.pubkey
if (newActiveUserId != activeUserId) {
activeUserId = newActiveUserId
subscribeAll(userId = newActiveUserId)
withContext(Dispatchers.Main) {
ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleEventObserver)
}
activeAccountStore.activeUserId.collect { newActiveUserId ->
when {
newActiveUserId.isEmpty() -> {
emitBadgesUpdate { Badges() }
unsubscribeAll()
withContext(Dispatchers.Main) {
ProcessLifecycleOwner.get().lifecycle.removeObserver(lifecycleEventObserver)
}
}

ActiveUserAccountState.NoUserAccount -> {
emitBadgesUpdate { Badges() }
else -> {
unsubscribeAll()
subscribeAll(userId = newActiveUserId)
withContext(Dispatchers.Main) {
ProcessLifecycleOwner.get().lifecycle.removeObserver(lifecycleEventObserver)
ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleEventObserver)
}
}
}
Expand All @@ -123,16 +117,14 @@ class SubscriptionsManager @Inject constructor(

private suspend fun resumeSubscriptions() {
if (!subscriptionsActive) {
activeUserId?.let {
subscribeAll(userId = it)
}
unsubscribeAll()
subscribeAll(userId = activeAccountStore.activeUserId())
}
}

private suspend fun pauseSubscriptions() = unsubscribeAll()

private suspend fun subscribeAll(userId: String) {
unsubscribeAll()
private fun subscribeAll(userId: String) {
subscriptionsActive = true
notificationsSummarySubscription = launchNotificationsSummarySubscription(userId = userId)
messagesUnreadCountSubscription = launchMessagesUnreadCountSubscription(userId = userId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import io.mockk.every
import io.mockk.mockk
import io.mockk.spyk
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
import net.primal.android.config.AppConfigHandler
import net.primal.android.config.AppConfigProvider
Expand All @@ -16,8 +16,6 @@ import net.primal.android.networking.primal.PrimalServerType
import net.primal.android.nostr.model.NostrEvent
import net.primal.android.nostr.model.NostrEventKind
import net.primal.android.user.accounts.active.ActiveAccountStore
import net.primal.android.user.accounts.active.ActiveUserAccountState
import net.primal.android.user.domain.UserAccount
import okhttp3.OkHttpClient
import org.junit.Rule
import org.junit.Test
Expand All @@ -31,9 +29,7 @@ class SubscriptionsManagerTest {
val coroutinesTestRule = CoroutinesTestRule()

private val activeAccountStoreMock = mockk<ActiveAccountStore>(relaxed = true) {
every { activeAccountState } returns flow {
emit(ActiveUserAccountState.ActiveUserAccount(data = UserAccount.EMPTY))
}
every { activeUserId } returns MutableStateFlow("")
}

private val emptyNostrEvent = NostrEvent(
Expand Down

0 comments on commit e7b5f1c

Please sign in to comment.