Ensure that a PushProvider is available on a device before using it.

It help to fallback to UnifiedPush (if available) if the PlayServices are not installed on the device.
This commit is contained in:
Benoit Marty
2024-01-17 16:07:26 +01:00
committed by Benoit Marty
parent 997629294e
commit 57e1aee984
5 changed files with 45 additions and 1 deletions

View File

@@ -24,6 +24,10 @@ interface PushService {
// TODO Move away
fun notificationStyleChanged()
/**
* Return the list of push providers, available at compile time, and
* available at runtime, sorted by index.
*/
fun getAvailablePushProviders(): List<PushProvider>
/**

View File

@@ -38,7 +38,9 @@ class DefaultPushService @Inject constructor(
}
override fun getAvailablePushProviders(): List<PushProvider> {
return pushProviders.sortedBy { it.index }
return pushProviders
.filter { it.isAvailable() }
.sortedBy { it.index }
}
/**

View File

@@ -32,6 +32,11 @@ interface PushProvider {
*/
val name: String
/**
* Return true if the push provider is available on this device.
*/
fun isAvailable(): Boolean
fun getDistributors(): List<Distributor>
/**

View File

@@ -16,9 +16,13 @@
package io.element.android.libraries.pushproviders.firebase
import android.content.Context
import com.google.android.gms.common.ConnectionResult
import com.google.android.gms.common.GoogleApiAvailability
import com.squareup.anvil.annotations.ContributesMultibinding
import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.pushproviders.api.Distributor
import io.element.android.libraries.pushproviders.api.PushProvider
@@ -30,6 +34,7 @@ private val loggerTag = LoggerTag("FirebasePushProvider", LoggerTag.PushLoggerTa
@ContributesMultibinding(AppScope::class)
class FirebasePushProvider @Inject constructor(
@ApplicationContext private val context: Context,
private val firebaseStore: FirebaseStore,
private val firebaseTroubleshooter: FirebaseTroubleshooter,
private val pusherSubscriber: PusherSubscriber,
@@ -37,6 +42,19 @@ class FirebasePushProvider @Inject constructor(
override val index = FirebaseConfig.INDEX
override val name = FirebaseConfig.NAME
override fun isAvailable(): Boolean {
// The PlayServices has to be available
val apiAvailability = GoogleApiAvailability.getInstance()
val resultCode = apiAvailability.isGooglePlayServicesAvailable(context)
return if (resultCode == ConnectionResult.SUCCESS) {
Timber.tag(loggerTag.value).d("Google Play Services is available")
true
} else {
Timber.tag(loggerTag.value).w("Google Play Services is not available")
false
}
}
override fun getDistributors(): List<Distributor> {
return listOf(Distributor("Firebase", "Firebase"))
}

View File

@@ -19,6 +19,7 @@ package io.element.android.libraries.pushproviders.unifiedpush
import android.content.Context
import com.squareup.anvil.annotations.ContributesMultibinding
import io.element.android.libraries.androidutils.system.getApplicationLabel
import io.element.android.libraries.core.log.logger.LoggerTag
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext
import io.element.android.libraries.matrix.api.MatrixClient
@@ -26,8 +27,11 @@ import io.element.android.libraries.pushproviders.api.Distributor
import io.element.android.libraries.pushproviders.api.PushProvider
import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret
import org.unifiedpush.android.connector.UnifiedPush
import timber.log.Timber
import javax.inject.Inject
private val loggerTag = LoggerTag("UnifiedPushProvider", LoggerTag.PushLoggerTag)
@ContributesMultibinding(AppScope::class)
class UnifiedPushProvider @Inject constructor(
@ApplicationContext private val context: Context,
@@ -38,6 +42,17 @@ class UnifiedPushProvider @Inject constructor(
override val index = UnifiedPushConfig.INDEX
override val name = UnifiedPushConfig.NAME
override fun isAvailable(): Boolean {
val isAvailable = getDistributors().isNotEmpty()
return if (isAvailable) {
Timber.tag(loggerTag.value).d("UnifiedPush is available")
true
} else {
Timber.tag(loggerTag.value).w("UnifiedPush is not available")
false
}
}
override fun getDistributors(): List<Distributor> {
val distributors = UnifiedPush.getDistributors(context)
return distributors.mapNotNull {