Skip to content

Commit bfece06

Browse files
committed
fix: reconcile push registration on startup
1 parent 64c94fc commit bfece06

2 files changed

Lines changed: 29 additions & 0 deletions

File tree

‎app/src/main/java/dev/typetype/android/MainViewModel.kt‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import dev.typetype.android.domain.subscriptions.SubscriptionsRepository
2727
import dev.typetype.android.domain.usersettings.UserSettings
2828
import dev.typetype.android.domain.usersettings.UserSettingsRepository
2929
import dev.typetype.android.feature.player.host.PlayerHostController
30+
import dev.typetype.android.services.push.PushRegistrationManager
3031
import javax.inject.Inject
3132
import kotlinx.coroutines.channels.Channel
3233
import kotlinx.coroutines.flow.MutableStateFlow
@@ -63,6 +64,7 @@ class MainViewModel @Inject constructor(
6364
private val subscriptionsRepository: SubscriptionsRepository,
6465
private val libraryRepository: LibraryRepository,
6566
private val activeAccountScope: ActiveAccountScope,
67+
private val pushRegistrationManager: PushRegistrationManager,
6668
private val startupLandingStore: StartupLandingStore,
6769
private val playbackResumeRepository: PlaybackResumeRepository,
6870
private val playbackQueueRepository: PlaybackQueueRepository,
@@ -182,6 +184,7 @@ class MainViewModel @Inject constructor(
182184
launch { profileRepository.refresh() }
183185
launch { subscriptionsRepository.refresh() }
184186
launch { libraryRepository.resumePendingWrites() }
187+
launch { pushRegistrationManager.reconcileRegistration() }
185188
}
186189
}
187190

@@ -221,6 +224,7 @@ class MainViewModel @Inject constructor(
221224
launch { profileRepository.refresh() }
222225
launch { subscriptionsRepository.refresh() }
223226
launch { libraryRepository.resumePendingWrites() }
227+
launch { pushRegistrationManager.reconcileRegistration() }
224228
launch {
225229
restorePlaybackUnlessExternalRequestArrives()
226230
}

‎app/src/main/java/dev/typetype/android/services/push/PushRegistrationManager.kt‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import android.content.Context
44
import dagger.hilt.android.qualifiers.ApplicationContext
55
import dev.typetype.android.R
66
import dev.typetype.android.data.account.ActiveAccountScope
7+
import dev.typetype.android.data.account.AccountScope
78
import dev.typetype.android.data.push.PushRegistrationStore
89
import dev.typetype.android.data.push.pushInstanceName
910
import dev.typetype.android.data.push.scopeFromInstanceName
@@ -37,6 +38,30 @@ class PushRegistrationManager @Inject constructor(
3738
if (!repository.currentCapability().enabled) {
3839
return update(PushRegistrationStatus.Unavailable)
3940
}
41+
return startRegistration(scope)
42+
}
43+
44+
suspend fun reconcileRegistration(): PushRegistrationStatus {
45+
val scope = activeAccountScope.require()
46+
val registration = registrationStore.registrationOnce(scope)
47+
?: return update(PushRegistrationStatus.Disabled)
48+
if (!repository.currentCapability().enabled) {
49+
return update(PushRegistrationStatus.Unavailable)
50+
}
51+
val endpoint = registration.endpoint ?: return startRegistration(scope)
52+
val devices = repository.devices().getOrElse {
53+
return update(PushRegistrationStatus.Failed)
54+
}
55+
if (devices.any { device -> device.deviceId == registration.deviceId }) {
56+
return update(PushRegistrationStatus.Registered)
57+
}
58+
return repository.registerDevice(registration.deviceId, endpoint).fold(
59+
onSuccess = { update(PushRegistrationStatus.Registered) },
60+
onFailure = { update(PushRegistrationStatus.Failed) },
61+
)
62+
}
63+
64+
private suspend fun startRegistration(scope: AccountScope): PushRegistrationStatus {
4065
val instance = pushInstanceName(scope)
4166
if (UnifiedPush.getDistributors(context).isEmpty()) {
4267
return update(PushRegistrationStatus.MissingDistributor)

0 commit comments

Comments
 (0)