Merge pull request #2248 from element-hq/feature/bma/pushProviderSelection
Ensure that a PushProvider is available on a device before using it.
This commit is contained in:
commit
e6d2e1af72
6 changed files with 46 additions and 1 deletions
1
changelog.d/2248.misc
Normal file
1
changelog.d/2248.misc
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
Fallback to UnifiedPush (if available) if the PlayServices are not installed on the device.
|
||||||
|
|
@ -24,6 +24,10 @@ interface PushService {
|
||||||
// TODO Move away
|
// TODO Move away
|
||||||
fun notificationStyleChanged()
|
fun notificationStyleChanged()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the list of push providers, available at compile time, and
|
||||||
|
* available at runtime, sorted by index.
|
||||||
|
*/
|
||||||
fun getAvailablePushProviders(): List<PushProvider>
|
fun getAvailablePushProviders(): List<PushProvider>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,9 @@ class DefaultPushService @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getAvailablePushProviders(): List<PushProvider> {
|
override fun getAvailablePushProviders(): List<PushProvider> {
|
||||||
return pushProviders.sortedBy { it.index }
|
return pushProviders
|
||||||
|
.filter { it.isAvailable() }
|
||||||
|
.sortedBy { it.index }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,11 @@ interface PushProvider {
|
||||||
*/
|
*/
|
||||||
val name: String
|
val name: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return true if the push provider is available on this device.
|
||||||
|
*/
|
||||||
|
fun isAvailable(): Boolean
|
||||||
|
|
||||||
fun getDistributors(): List<Distributor>
|
fun getDistributors(): List<Distributor>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,13 @@
|
||||||
|
|
||||||
package io.element.android.libraries.pushproviders.firebase
|
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 com.squareup.anvil.annotations.ContributesMultibinding
|
||||||
import io.element.android.libraries.core.log.logger.LoggerTag
|
import io.element.android.libraries.core.log.logger.LoggerTag
|
||||||
import io.element.android.libraries.di.AppScope
|
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.matrix.api.MatrixClient
|
||||||
import io.element.android.libraries.pushproviders.api.Distributor
|
import io.element.android.libraries.pushproviders.api.Distributor
|
||||||
import io.element.android.libraries.pushproviders.api.PushProvider
|
import io.element.android.libraries.pushproviders.api.PushProvider
|
||||||
|
|
@ -30,6 +34,7 @@ private val loggerTag = LoggerTag("FirebasePushProvider", LoggerTag.PushLoggerTa
|
||||||
|
|
||||||
@ContributesMultibinding(AppScope::class)
|
@ContributesMultibinding(AppScope::class)
|
||||||
class FirebasePushProvider @Inject constructor(
|
class FirebasePushProvider @Inject constructor(
|
||||||
|
@ApplicationContext private val context: Context,
|
||||||
private val firebaseStore: FirebaseStore,
|
private val firebaseStore: FirebaseStore,
|
||||||
private val firebaseTroubleshooter: FirebaseTroubleshooter,
|
private val firebaseTroubleshooter: FirebaseTroubleshooter,
|
||||||
private val pusherSubscriber: PusherSubscriber,
|
private val pusherSubscriber: PusherSubscriber,
|
||||||
|
|
@ -37,6 +42,19 @@ class FirebasePushProvider @Inject constructor(
|
||||||
override val index = FirebaseConfig.INDEX
|
override val index = FirebaseConfig.INDEX
|
||||||
override val name = FirebaseConfig.NAME
|
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> {
|
override fun getDistributors(): List<Distributor> {
|
||||||
return listOf(Distributor("Firebase", "Firebase"))
|
return listOf(Distributor("Firebase", "Firebase"))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ package io.element.android.libraries.pushproviders.unifiedpush
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.squareup.anvil.annotations.ContributesMultibinding
|
import com.squareup.anvil.annotations.ContributesMultibinding
|
||||||
import io.element.android.libraries.androidutils.system.getApplicationLabel
|
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.AppScope
|
||||||
import io.element.android.libraries.di.ApplicationContext
|
import io.element.android.libraries.di.ApplicationContext
|
||||||
import io.element.android.libraries.matrix.api.MatrixClient
|
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.pushproviders.api.PushProvider
|
||||||
import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret
|
import io.element.android.libraries.pushstore.api.clientsecret.PushClientSecret
|
||||||
import org.unifiedpush.android.connector.UnifiedPush
|
import org.unifiedpush.android.connector.UnifiedPush
|
||||||
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
private val loggerTag = LoggerTag("UnifiedPushProvider", LoggerTag.PushLoggerTag)
|
||||||
|
|
||||||
@ContributesMultibinding(AppScope::class)
|
@ContributesMultibinding(AppScope::class)
|
||||||
class UnifiedPushProvider @Inject constructor(
|
class UnifiedPushProvider @Inject constructor(
|
||||||
@ApplicationContext private val context: Context,
|
@ApplicationContext private val context: Context,
|
||||||
|
|
@ -38,6 +42,17 @@ class UnifiedPushProvider @Inject constructor(
|
||||||
override val index = UnifiedPushConfig.INDEX
|
override val index = UnifiedPushConfig.INDEX
|
||||||
override val name = UnifiedPushConfig.NAME
|
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> {
|
override fun getDistributors(): List<Distributor> {
|
||||||
val distributors = UnifiedPush.getDistributors(context)
|
val distributors = UnifiedPush.getDistributors(context)
|
||||||
return distributors.mapNotNull {
|
return distributors.mapNotNull {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue