Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,8 @@ dependencies {
"gplayImplementation"("com.google.android.gms:play-services-base:18.10.0")
"gplayImplementation"("com.google.firebase:firebase-messaging:25.0.1")

implementation("org.unifiedpush.android:connector:3.3.2")
implementation("org.unifiedpush.android:connector:3.3.3-rc1")
"genericImplementation"("org.unifiedpush.android:embedded-fcm-distributor:3.1.0-rc1")

// compose
implementation(platform("androidx.compose:compose-bom:2026.04.01"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -408,15 +408,21 @@ class AccountVerificationActivity : BaseActivity() {
// - By default, use the Play Services if available
// - If this is a first user, and we have an External UnifiedPush distributor,
// and the server supports it: we use it
// - Else if there is an embedded distributor (so this is a generic flavor, and the
// Play services are installed) => we use it for all accounts that support web push
// - Else we skip push registrations
if (ClosedInterfaceImpl().isGooglePlayServicesAvailable) {
ClosedInterfaceImpl().setUpPushTokenRegistration()
eventBus.post(EventStatus(internalAccountId, EventStatus.EventType.PUSH_REGISTRATION, true))
} else if (userManager.users.blockingGet().size == 1 &&
UnifiedPush.getDistributors(context).isNotEmpty() &&
UnifiedPushUtils.getExternalDistributors(context).isNotEmpty() &&
userManager.getUserWithId(internalAccountId).blockingGet().hasWebPushCapability
) {
useUnifiedPushIntroduced()
} else if (UnifiedPushUtils.hasEmbeddedDistributor(context) &&
userManager.users.blockingGet().any { it.hasWebPushCapability }
) {
useEmbeddedUnifiedPush()
} else {
Log.w(TAG, "Skipping push registration.")
eventBus.post(EventStatus(internalAccountId, EventStatus.EventType.PUSH_REGISTRATION, false))
Expand All @@ -434,13 +440,33 @@ class AccountVerificationActivity : BaseActivity() {
dialogForUnifiedPush { res ->
if (res) {
useUnifiedPush()
} else {
fallbackToEmbeddedUnifiedPush()
}
}
} else {
useUnifiedPush()
}
}

/**
* Check if there is an embedded distributor, and use it if present,
* else, send EventStatus PUSH_REGISTRATION with success=false
*/
private fun fallbackToEmbeddedUnifiedPush() {
if (UnifiedPushUtils.hasEmbeddedDistributor(context)) {
useEmbeddedUnifiedPush()
} else {
eventBus.post(EventStatus(internalAccountId, EventStatus.EventType.PUSH_REGISTRATION, false))
}
}

private fun useEmbeddedUnifiedPush() {
UnifiedPushUtils.useEmbeddedDistributor(context)
UnifiedPushUtils.registerWithCurrentDistributor(context)
eventBus.post(EventStatus(internalAccountId, EventStatus.EventType.PUSH_REGISTRATION, true))
}

private fun useUnifiedPush() {
UnifiedPushUtils.useDefaultDistributor(this) { distrib ->
distrib?.let {
Expand All @@ -449,7 +475,7 @@ class AccountVerificationActivity : BaseActivity() {
eventBus.post(EventStatus(internalAccountId, EventStatus.EventType.PUSH_REGISTRATION, true))
} ?: run {
Log.d(TAG, "No UnifiedPush distrib selected")
eventBus.post(EventStatus(internalAccountId, EventStatus.EventType.PUSH_REGISTRATION, false))
fallbackToEmbeddedUnifiedPush()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ import com.nextcloud.talk.utils.NotificationUtils
import com.nextcloud.talk.utils.ParticipantPermissions
import com.nextcloud.talk.utils.ShareUtils
import com.nextcloud.talk.utils.SpreedFeatures
import com.nextcloud.talk.utils.UnifiedPushUtils
import com.nextcloud.talk.utils.UserIdUtils
import com.nextcloud.talk.utils.bundle.BundleKeys
import com.nextcloud.talk.utils.bundle.BundleKeys.ADD_ADDITIONAL_ACCOUNT
Expand Down Expand Up @@ -307,7 +308,8 @@ class ConversationsListActivity : BaseActivity() {
!platformPermissionUtil.isPostNotificationsPermissionGranted() &&
(
ClosedInterfaceImpl().isGooglePlayServicesAvailable ||
appPreferences.useUnifiedPush
appPreferences.useUnifiedPush ||
UnifiedPushUtils.hasEmbeddedDistributor(context))
)
) {
requestPermissions(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import com.nextcloud.talk.utils.DisplayUtils
import com.nextcloud.talk.utils.NotificationUtils
import com.nextcloud.talk.utils.PushUtils.Companion.LATEST_PUSH_REGISTRATION_AT_PUSH_PROXY
import com.nextcloud.talk.utils.PushUtils.Companion.LATEST_PUSH_REGISTRATION_AT_SERVER
import com.nextcloud.talk.utils.UnifiedPushUtils
import com.nextcloud.talk.utils.UserIdUtils
import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil
import com.nextcloud.talk.utils.power.PowerManagerUtils
Expand Down Expand Up @@ -79,6 +80,7 @@ class DiagnosisActivity : BaseActivity() {
lateinit var platformPermissionUtil: PlatformPermissionUtil

private var isGooglePlayServicesAvailable: Boolean = false
private var useEmbeddedDistrib: Boolean = false

private var nUnifiedPushServices = 0
private var offerUnifiedPush: Boolean = false
Expand All @@ -103,10 +105,11 @@ class DiagnosisActivity : BaseActivity() {

val colorScheme = viewThemeUtils.getColorScheme(this)
isGooglePlayServicesAvailable = ClosedInterfaceImpl().isGooglePlayServicesAvailable
nUnifiedPushServices = UnifiedPush.getDistributors(this).size
nUnifiedPushServices = UnifiedPushUtils.getExternalDistributors(this).size
offerUnifiedPush = nUnifiedPushServices > 0 &&
userManager.users.blockingGet().all { it.hasWebPushCapability }
useUnifiedPush = appPreferences.useUnifiedPush
useEmbeddedDistrib = UnifiedPushUtils.hasEmbeddedDistributor(context) && !useUnifiedPush
unifiedPushService = UnifiedPush.getAckDistributor(this) ?: "N/A"

setContent {
Expand Down Expand Up @@ -160,7 +163,9 @@ class DiagnosisActivity : BaseActivity() {
viewState = viewState,
onTestPushClick = { diagnosisViewModel.fetchTestPushResult() },
onDismissDialog = { diagnosisViewModel.dismissDialog() },
showTestPushButton = isGooglePlayServicesAvailable || useUnifiedPush,
showTestPushButton = isGooglePlayServicesAvailable ||
useUnifiedPush ||
useEmbeddedDistrib,
isOnline = isOnline
)
}
Expand Down Expand Up @@ -254,7 +259,7 @@ class DiagnosisActivity : BaseActivity() {
value = Build.VERSION.SDK_INT.toString()
)

if (isGooglePlayServicesAvailable) {
if (isGooglePlayServicesAvailable || useEmbeddedDistrib) {
addDiagnosisEntry(
key = context.resources.getString(R.string.nc_diagnosis_gplay_available_title),
value = context.resources.getString(R.string.nc_diagnosis_gplay_available_yes)
Expand Down Expand Up @@ -305,7 +310,7 @@ class DiagnosisActivity : BaseActivity() {
value = getStringForBoolean(useUnifiedPush)
)

if (useUnifiedPush) {
if (useUnifiedPush || useEmbeddedDistrib) {
setupAppValuesForPush()
setupAppValuesForUnifiedPush()
} else if (isGooglePlayServicesAvailable) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,10 @@ class PushRegistrationWorker(context: Context, workerParams: WorkerParameters) :
} else if (useUnifiedPush) {
Log.d(TAG, "PushRegistrationWorker called via $origin (unifiedPushWork)")
unifiedPushWork()
} else if (UnifiedPushUtils.hasEmbeddedDistributor(applicationContext)) {
Log.d(TAG, "PushRegistrationWorker called via $origin (unifiedPushWork#embeddedDistrib)")
UnifiedPushUtils.useEmbeddedDistributor(applicationContext)
unifiedPushWork()
} else {
Log.d(TAG, "PushRegistrationWorker called via $origin (proxyPushWork)")
proxyPushWork()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -326,7 +326,7 @@ class SettingsActivity :
}

private fun showUnifiedPushToggle(): Boolean =
UnifiedPush.getDistributors(this).isNotEmpty() &&
UnifiedPushUtils.getExternalDistributors(this).isNotEmpty() &&
userManager.users.blockingGet().all { it.hasWebPushCapability }

private fun setupUnifiedPushSettings() {
Expand All @@ -340,7 +340,7 @@ class SettingsActivity :
binding.settingsUnifiedpush.visibility = View.GONE
binding.settingsUnifiedpushService.visibility = View.GONE
} else {
val nDistrib = UnifiedPush.getDistributors(context).size
val nDistrib = UnifiedPushUtils.getExternalDistributors(context).size
binding.settingsUnifiedpush.visibility = View.VISIBLE
binding.settingsUnifiedpushSwitch.isChecked = appPreferences.useUnifiedPush
binding.settingsUnifiedpush.setOnClickListener {
Expand Down Expand Up @@ -386,7 +386,9 @@ class SettingsActivity :
@SuppressLint("StringFormatInvalid")
@Suppress("LongMethod")
private fun setupNotificationPermissionSettings() {
if (ClosedInterfaceImpl().isGooglePlayServicesAvailable || appPreferences.useUnifiedPush) {
if (ClosedInterfaceImpl().isGooglePlayServicesAvailable ||
appPreferences.useUnifiedPush ||
UnifiedPushUtils.hasEmbeddedDistributor(context)) {
binding.settingsPushOnlyWrapper.visibility = View.VISIBLE
binding.settingsGplayNotAvailable.visibility = View.GONE
binding.settingsPushNotAvailable.visibility = View.GONE
Expand Down
20 changes: 20 additions & 0 deletions app/src/main/java/com/nextcloud/talk/utils/UnifiedPushUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,26 @@ object UnifiedPushUtils {
enqueuePushWorker(context, false, "disableExternalUnifiedPush")
}

/**
* Check if we have a FCM embedded distributor, to get push notifications,
* using the Play services, using Web Push
*
* Available on the generic flavor only
*/
@JvmStatic
fun hasEmbeddedDistributor(context: Context) =
context.packageName in UnifiedPush.getDistributors(context)

@JvmStatic
fun useEmbeddedDistributor(context: Context) =
UnifiedPush.saveDistributor(context, context.packageName)

@JvmStatic
fun getExternalDistributors(context: Context) =
UnifiedPush.getDistributors(context).filter {
it != context.packageName
}

private fun enqueuePushWorker(context: Context, useUnifiedPush: Boolean, origin: String) {
val data = Data.Builder()
.putString(PushRegistrationWorker.ORIGIN, "UnifiedPushUtils#$origin")
Expand Down
5 changes: 4 additions & 1 deletion gradle/verification-metadata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,10 @@
<trusted-key id="7B79ADD11F8A779FE90FD3D0893A028475557671" group="com.gradle" name="develocity-gradle-plugin" version="3.19.2"/>
<trusted-key id="7CEA1BE22FB2423EAC1A4CBC90F76D4A6BCC07D1" group="org.maplibre.gl"/>
<trusted-key id="7E22D50A7EBD9D2CD269B2D4056ACA74D46000BF" group="io.netty"/>
<trusted-key id="7F0C6700F82B97092092AFF84DA93C0B57A98B11" group="org.unifiedpush.android" name="connector" version="3.3.2"/>
<trusted-key id="7F0C6700F82B97092092AFF84DA93C0B57A98B11">
<trusting group="org.unifiedpush.android" name="connector" version="3.3.3-rc1"/>
<trusting group="org.unifiedpush.android" name="embedded-fcm-distributor" version="3.1.0-rc1"/>
</trusted-key>
<trusted-key id="7F36E793AE3252E5D9E9B98FEE9E7DC9D92FC896" group="com.google.errorprone"/>
<trusted-key id="8461EFA0E74ABAE010DE66994EB27DB2A3B88B8B">
<trusting group="androidx.activity"/>
Expand Down