From 1a4de5339f99fa77c541213e8a8459a76db719e5 Mon Sep 17 00:00:00 2001 From: gavine99 Date: Wed, 4 Sep 2024 18:58:26 +1000 Subject: [PATCH 1/2] changes to enable unified push notifications in generic build. Signed-off-by: gavine99 --- app/build.gradle | 8 ++ app/src/generic/AndroidManifest.xml | 21 +++ .../com/nextcloud/unifiedpush/UnifiedPush.kt | 132 ++++++++++++++++++ .../com/owncloud/android/utils/PushUtils.java | 37 ++++- .../firebase/NCFirebaseMessagingService.java | 6 +- .../com/owncloud/android/utils/PushUtils.java | 8 +- .../com/owncloud/android/utils/PushUtils.java | 6 +- .../client/jobs/AccountRemovalWork.kt | 5 +- .../client/jobs/BackgroundJobManager.kt | 2 +- .../client/jobs/BackgroundJobManagerImpl.kt | 3 +- .../nextcloud/client/jobs/NotificationWork.kt | 92 +++++++----- .../android/ui/activity/DrawerActivity.java | 2 + .../android/ui/activity/FileActivity.java | 3 - .../ui/activity/FileDisplayActivity.java | 2 +- .../ui/activity/NotificationsActivity.kt | 26 ++-- .../android/ui/activity/SettingsActivity.java | 28 ++++ .../android/ui/activity/UserInfoActivity.java | 5 +- app/src/main/res/values-ar/strings.xml | 1 - app/src/main/res/values-b+en+001/strings.xml | 1 - app/src/main/res/values-bg-rBG/strings.xml | 1 - app/src/main/res/values-br/strings.xml | 1 - app/src/main/res/values-ca/strings.xml | 1 - app/src/main/res/values-cs-rCZ/strings.xml | 1 - app/src/main/res/values-da/strings.xml | 1 - app/src/main/res/values-de/strings.xml | 1 - app/src/main/res/values-el/strings.xml | 1 - app/src/main/res/values-eo/strings.xml | 1 - app/src/main/res/values-es-rAR/strings.xml | 1 - app/src/main/res/values-es-rCL/strings.xml | 1 - app/src/main/res/values-es-rCO/strings.xml | 1 - app/src/main/res/values-es-rEC/strings.xml | 1 - app/src/main/res/values-es-rMX/strings.xml | 1 - app/src/main/res/values-es/strings.xml | 1 - app/src/main/res/values-eu/strings.xml | 1 - app/src/main/res/values-fa/strings.xml | 1 - app/src/main/res/values-fi-rFI/strings.xml | 1 - app/src/main/res/values-fr/strings.xml | 1 - app/src/main/res/values-ga/strings.xml | 1 - app/src/main/res/values-gd/strings.xml | 1 - app/src/main/res/values-hr/strings.xml | 1 - app/src/main/res/values-hu-rHU/strings.xml | 1 - app/src/main/res/values-in/strings.xml | 1 - app/src/main/res/values-is/strings.xml | 1 - app/src/main/res/values-it/strings.xml | 1 - app/src/main/res/values-iw/strings.xml | 1 - app/src/main/res/values-ja-rJP/strings.xml | 1 - app/src/main/res/values-ka/strings.xml | 1 - app/src/main/res/values-ko/strings.xml | 1 - app/src/main/res/values-lo/strings.xml | 1 - app/src/main/res/values-lt-rLT/strings.xml | 1 - app/src/main/res/values-mk/strings.xml | 1 - app/src/main/res/values-nb-rNO/strings.xml | 1 - app/src/main/res/values-nl/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 1 - app/src/main/res/values-pt-rPT/strings.xml | 1 - app/src/main/res/values-ro/strings.xml | 1 - app/src/main/res/values-ru/strings.xml | 1 - app/src/main/res/values-sk-rSK/strings.xml | 1 - app/src/main/res/values-sl/strings.xml | 1 - app/src/main/res/values-sq/strings.xml | 1 - app/src/main/res/values-sr-rSP/strings.xml | 1 - app/src/main/res/values-sr/strings.xml | 1 - app/src/main/res/values-sv/strings.xml | 3 +- app/src/main/res/values-tk/strings.xml | 1 - app/src/main/res/values-uk/strings.xml | 1 - app/src/main/res/values-vi/strings.xml | 1 - app/src/main/res/values-zh-rHK/strings.xml | 1 - app/src/main/res/values/strings.xml | 5 +- app/src/main/res/xml/preferences.xml | 4 + .../com/owncloud/android/utils/PushUtils.java | 4 +- .../com/owncloud/android/utils/PushUtils.java | 7 +- gradle/verification-metadata.xml | 97 ++++++++++++- 73 files changed, 432 insertions(+), 124 deletions(-) create mode 100644 app/src/generic/AndroidManifest.xml create mode 100644 app/src/generic/java/com/nextcloud/unifiedpush/UnifiedPush.kt diff --git a/app/build.gradle b/app/build.gradle index dc3a7e1e6086..f19494eeaa82 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -318,6 +318,14 @@ dependencies { implementation "com.vanniktech:emoji-google:0.21.0" implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7") + // unified push library for generic flavour + genericImplementation 'org.unifiedpush.android:connector:3.0.7' + genericImplementation 'org.unifiedpush.android:connector-ui:1.1.0' + + // unified push library for generic flavour + genericImplementation 'org.unifiedpush.android:connector:3.0.7' + genericImplementation 'org.unifiedpush.android:connector-ui:1.1.0' + // document scanner not available on FDroid (generic) due to OpenCV binaries gplayImplementation project(":appscan") huaweiImplementation project(":appscan") diff --git a/app/src/generic/AndroidManifest.xml b/app/src/generic/AndroidManifest.xml new file mode 100644 index 000000000000..a3b2570c2780 --- /dev/null +++ b/app/src/generic/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/app/src/generic/java/com/nextcloud/unifiedpush/UnifiedPush.kt b/app/src/generic/java/com/nextcloud/unifiedpush/UnifiedPush.kt new file mode 100644 index 000000000000..77f4b65de85e --- /dev/null +++ b/app/src/generic/java/com/nextcloud/unifiedpush/UnifiedPush.kt @@ -0,0 +1,132 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2024 Your Name + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.unifiedpush + +import android.content.Context +import android.os.PowerManager +import androidx.work.WorkManager +import com.google.gson.Gson +import com.nextcloud.client.core.ClockImpl +import com.nextcloud.client.jobs.BackgroundJobManagerImpl +import com.nextcloud.client.jobs.NotificationWork +import com.nextcloud.client.preferences.AppPreferencesImpl +import com.owncloud.android.datamodel.ArbitraryDataProviderImpl +import com.owncloud.android.datamodel.PushConfigurationState +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.ui.activity.DrawerActivity +import com.owncloud.android.utils.PushUtils +import org.unifiedpush.android.connector.FailedReason +import org.unifiedpush.android.connector.PushService +import org.unifiedpush.android.connector.UnifiedPush +import org.unifiedpush.android.connector.data.PushEndpoint +import org.unifiedpush.android.connector.data.PushMessage +import org.unifiedpush.android.connector.ui.SelectDistributorDialogsBuilder +import org.unifiedpush.android.connector.ui.UnifiedPushFunctions + +class UnifiedPush : PushService() { + companion object { + private val TAG: String? = UnifiedPush::class.java.simpleName + private const val WAKELOCK_TIMEOUT = 5000L + + fun registerForPushMessaging(activity: DrawerActivity?, accountName: String, forceChoose: Boolean) { + if ((activity === null) || (activity.mHandler === null) || activity.isFinishing) + return + + // run on ui thread + activity.mHandler.post { + SelectDistributorDialogsBuilder( + activity, + object : UnifiedPushFunctions { + override fun tryUseDefaultDistributor(callback: (Boolean) -> Unit) = + UnifiedPush.tryUseDefaultDistributor(activity, callback).also { + Log_OC.d(TAG, "tryUseDefaultDistributor()") + } + + override fun getAckDistributor(): String? = + UnifiedPush.getAckDistributor(activity).also { + Log_OC.d(TAG, "getAckDistributor() = $it") + } + + override fun getDistributors(): List = + UnifiedPush.getDistributors(activity).also { + Log_OC.d(TAG, "getDistributors() = $it") + } + + override fun register(instance: String) = + UnifiedPush.register(activity, instance).also { + Log_OC.d(TAG, "register($instance)") + } + + override fun saveDistributor(distributor: String) = + UnifiedPush.saveDistributor(activity, distributor).also { + Log_OC.d(TAG, "saveDistributor($distributor)") + } + } + ).apply { + instances = listOf(accountName) + mayUseCurrent = !forceChoose + mayUseDefault = !forceChoose + }.run() + } + } + + fun unregisterForPushMessaging(context: Context, accountName: String) { + // unregister with distributor + UnifiedPush.unregister(context, accountName) + + // delete locally saved endpoint value + ArbitraryDataProviderImpl(context).deleteKeyForAccount(accountName, PushUtils.KEY_PUSH) + } + } + + override fun onMessage(message: PushMessage, instance: String) { + // get a wake lock to 'help' background job run more promptly since it can take minutes to run if phone is + // sleeping/dozing - 5 secs should be well long enough to get the notification displayed + val wakeLock = (getSystemService(POWER_SERVICE) as PowerManager) + .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "nc:timedPartialwakelock") + wakeLock?.acquire(WAKELOCK_TIMEOUT) + + // called when a new message is received. The message contains the full POST body of the push message + Log_OC.d(TAG, "unified push message received") + + BackgroundJobManagerImpl( + WorkManager.getInstance(this), ClockImpl(), AppPreferencesImpl.fromContext(this) + ).startNotificationJob( + message.content.toString(Charsets.UTF_8), + instance, + NotificationWork.BACKEND_TYPE_UNIFIED_PUSH + ) + } + + override fun onNewEndpoint(endpoint: PushEndpoint, instance: String) { + Log_OC.d(TAG, "onNewEndpoint(${endpoint.url}, $instance)") + + val newAccountPushData = PushConfigurationState() + newAccountPushData.setPushToken(endpoint.url) + ArbitraryDataProviderImpl(this).storeOrUpdateKeyValue( + instance, + PushUtils.KEY_PUSH, + Gson().toJson(newAccountPushData) + ) + } + + override fun onRegistrationFailed(reason: FailedReason, instance: String) = + // the registration is not possible, eg. no network + // force unregister to make sure cleaned up. re-register will be re-attempted next time + UnifiedPush.unregister(this, instance).also { + Log_OC.d(TAG, "onRegistrationFailed(${reason.name}, $instance)") + } + + override fun onUnregistered(instance: String) = + // this application is unregistered by the distributor from receiving push messages + // force unregister to make sure cleaned up. re-register will be re-attempted next time + UnifiedPush.unregister(this, instance).also { + Log_OC.d(TAG, "onUnregistered($instance)") + } + +} diff --git a/app/src/generic/java/com/owncloud/android/utils/PushUtils.java b/app/src/generic/java/com/owncloud/android/utils/PushUtils.java index 139377f210d9..2a8f322066f6 100644 --- a/app/src/generic/java/com/owncloud/android/utils/PushUtils.java +++ b/app/src/generic/java/com/owncloud/android/utils/PushUtils.java @@ -9,10 +9,18 @@ import android.content.Context; +import android.accounts.Account; +import android.text.TextUtils; + +import com.google.gson.Gson; import com.nextcloud.client.account.UserAccountManager; import com.nextcloud.client.preferences.AppPreferencesImpl; import com.owncloud.android.MainApp; +import com.owncloud.android.datamodel.ArbitraryDataProviderImpl; +import com.owncloud.android.datamodel.PushConfigurationState; import com.owncloud.android.datamodel.SignatureVerification; +import com.nextcloud.unifiedpush.UnifiedPush; +import com.owncloud.android.ui.activity.DrawerActivity; import java.security.Key; @@ -22,13 +30,31 @@ public final class PushUtils { private PushUtils() { } - public static void pushRegistrationToServer(final UserAccountManager accountManager, final String pushToken) { - // do nothing + public static void updateRegistrationsWithServer( + final DrawerActivity activity, + final UserAccountManager accountManager, + final String pushToken) { + for (Account account : accountManager.getAccounts()) { + String providerValue = new ArbitraryDataProviderImpl(MainApp.getAppContext()).getValue(account.name, KEY_PUSH); + PushConfigurationState accountPushData = new Gson().fromJson(providerValue, PushConfigurationState.class); + + if ((accountPushData != null) && accountPushData.isShouldBeDeleted()) { + // unregister push notifications + UnifiedPush.Companion.unregisterForPushMessaging(MainApp.getAppContext(), account.name); + } else { + // else, (re-)register for push notifications + if (activity != null) { + UnifiedPush.Companion.registerForPushMessaging( + activity, + account.name, + ((accountPushData == null) || TextUtils.isEmpty(accountPushData.getPushToken()))); + } + } + } } public static void reinitKeys(UserAccountManager accountManager) { - Context context = MainApp.getAppContext(); - AppPreferencesImpl.fromContext(context).setKeysReInitEnabled(); + AppPreferencesImpl.fromContext(MainApp.getAppContext()).setKeysReInitEnabled(); } public static Key readKeyFromFile(boolean readPublicKey) { @@ -39,8 +65,7 @@ public static SignatureVerification verifySignature( final Context context, final UserAccountManager accountManager, final byte[] signatureBytes, - final byte[] subjectBytes - ) { + final byte[] subjectBytes) { return null; } diff --git a/app/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java b/app/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java index ce6beea9b7e9..fee1b4bace90 100644 --- a/app/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java +++ b/app/src/gplay/java/com/owncloud/android/services/firebase/NCFirebaseMessagingService.java @@ -86,7 +86,9 @@ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { final String subject = data.get(NotificationWork.KEY_NOTIFICATION_SUBJECT); final String signature = data.get(NotificationWork.KEY_NOTIFICATION_SIGNATURE); if (subject != null && signature != null) { - backgroundJobManager.startNotificationJob(subject, signature); + backgroundJobManager.startNotificationJob(subject, + signature, + NotificationWork.BACKEND_TYPE_FIREBASE_CLOUD_MESSAGING); } } @@ -97,7 +99,7 @@ public void onNewToken(@NonNull String newToken) { if (!TextUtils.isEmpty(getResources().getString(R.string.push_server_url))) { preferences.setPushToken(newToken); - PushUtils.pushRegistrationToServer(accountManager, preferences.getPushToken()); + PushUtils.updateRegistrationsWithServer(null, accountManager, preferences.getPushToken()); } } } diff --git a/app/src/gplay/java/com/owncloud/android/utils/PushUtils.java b/app/src/gplay/java/com/owncloud/android/utils/PushUtils.java index 816612e6902a..43018a89e0ef 100644 --- a/app/src/gplay/java/com/owncloud/android/utils/PushUtils.java +++ b/app/src/gplay/java/com/owncloud/android/utils/PushUtils.java @@ -35,6 +35,7 @@ import com.owncloud.android.lib.resources.notifications.UnregisterAccountDeviceForNotificationsOperation; import com.owncloud.android.lib.resources.notifications.UnregisterAccountDeviceForProxyOperation; import com.owncloud.android.lib.resources.notifications.models.PushResponse; +import com.owncloud.android.ui.activity.DrawerActivity; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.io.FileUtils; @@ -164,7 +165,10 @@ private static void deleteRegistrationForAccount(Account account) { } } - public static void pushRegistrationToServer(final UserAccountManager accountManager, final String token) { + public static void updateRegistrationsWithServer( + final Context unusedContext, + final UserAccountManager accountManager, + final String token) { arbitraryDataProvider = new ArbitraryDataProviderImpl(MainApp.getAppContext()); if (!TextUtils.isEmpty(MainApp.getAppContext().getResources().getString(R.string.push_server_url)) && @@ -343,7 +347,7 @@ public static void reinitKeys(final UserAccountManager accountManager) { AppPreferences preferences = AppPreferencesImpl.fromContext(context); String pushToken = preferences.getPushToken(); - pushRegistrationToServer(accountManager, pushToken); + updateRegistrationsWithServer(null, accountManager, pushToken); preferences.setKeysReInitEnabled(); } diff --git a/app/src/huawei/java/com/owncloud/android/utils/PushUtils.java b/app/src/huawei/java/com/owncloud/android/utils/PushUtils.java index bf1949a33a72..c2a59ca09384 100644 --- a/app/src/huawei/java/com/owncloud/android/utils/PushUtils.java +++ b/app/src/huawei/java/com/owncloud/android/utils/PushUtils.java @@ -13,6 +13,7 @@ import com.nextcloud.client.preferences.AppPreferencesImpl; import com.owncloud.android.MainApp; import com.owncloud.android.datamodel.SignatureVerification; +import com.owncloud.android.ui.activity.DrawerActivity; import java.security.Key; @@ -22,7 +23,10 @@ public final class PushUtils { private PushUtils() { } - public static void pushRegistrationToServer(final UserAccountManager accountManager, final String pushToken) { + public static void updateRegistrationsWithServer( + final Context context, + final UserAccountManager accountManager, + final String pushToken) { // do nothing } diff --git a/app/src/main/java/com/nextcloud/client/jobs/AccountRemovalWork.kt b/app/src/main/java/com/nextcloud/client/jobs/AccountRemovalWork.kt index ebcb5f7dd4d3..bc8a1c36a0a7 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/AccountRemovalWork.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/AccountRemovalWork.kt @@ -166,7 +166,10 @@ class AccountRemovalWork( PushUtils.KEY_PUSH, gson.toJson(pushArbitraryData) ) - PushUtils.pushRegistrationToServer(userAccountManager, pushArbitraryData.getPushToken()) + PushUtils.updateRegistrationsWithServer( + null, // can pass null for context because this is guaranteed to be an 'unregister' operation + userAccountManager, + pushArbitraryData.getPushToken()) } } diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt index 9290e2e4e622..56ffb102c1ad 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt @@ -137,7 +137,7 @@ interface BackgroundJobManager { fun scheduleMediaFoldersDetectionJob() fun startMediaFoldersDetectionJob() - fun startNotificationJob(subject: String, signature: String) + fun startNotificationJob(subject: String, signature: String, backendType: Int) fun startAccountRemovalJob(accountName: String, remoteWipe: Boolean) fun startFilesUploadJob(user: User) fun getFileUploads(user: User): LiveData> diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt index 1330aeefff48..0d9a69482e51 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt @@ -545,10 +545,11 @@ internal class BackgroundJobManagerImpl( ) } - override fun startNotificationJob(subject: String, signature: String) { + override fun startNotificationJob(subject: String, signature: String, backendType: Int) { val data = Data.Builder() .putString(NotificationWork.KEY_NOTIFICATION_SUBJECT, subject) .putString(NotificationWork.KEY_NOTIFICATION_SIGNATURE, signature) + .putInt(NotificationWork.KEY_NOTIFICATION_TYPE, backendType) .build() val request = oneTimeRequestBuilder(NotificationWork::class, JOB_NOTIFICATION) diff --git a/app/src/main/java/com/nextcloud/client/jobs/NotificationWork.kt b/app/src/main/java/com/nextcloud/client/jobs/NotificationWork.kt index e6f37a16e2cd..e748f7b05a26 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/NotificationWork.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/NotificationWork.kt @@ -70,53 +70,75 @@ class NotificationWork constructor( const val KEY_NOTIFICATION_ACCOUNT = "KEY_NOTIFICATION_ACCOUNT" const val KEY_NOTIFICATION_SUBJECT = "subject" const val KEY_NOTIFICATION_SIGNATURE = "signature" + const val KEY_NOTIFICATION_TYPE = "type" private const val KEY_NOTIFICATION_ACTION_LINK = "KEY_NOTIFICATION_ACTION_LINK" private const val KEY_NOTIFICATION_ACTION_TYPE = "KEY_NOTIFICATION_ACTION_TYPE" private const val PUSH_NOTIFICATION_ID = "PUSH_NOTIFICATION_ID" private const val NUMERIC_NOTIFICATION_ID = "NUMERIC_NOTIFICATION_ID" + const val BACKEND_TYPE_FIREBASE_CLOUD_MESSAGING = 1 + const val BACKEND_TYPE_UNIFIED_PUSH = 2 } @Suppress("TooGenericExceptionCaught", "NestedBlockDepth", "ComplexMethod", "LongMethod") // legacy code override fun doWork(): Result { - val subject = inputData.getString(KEY_NOTIFICATION_SUBJECT) ?: "" - val signature = inputData.getString(KEY_NOTIFICATION_SIGNATURE) ?: "" - if (!TextUtils.isEmpty(subject) && !TextUtils.isEmpty(signature)) { - try { - val base64DecodedSubject = Base64.decode(subject, Base64.DEFAULT) - val base64DecodedSignature = Base64.decode(signature, Base64.DEFAULT) - val privateKey = PushUtils.readKeyFromFile(false) as PrivateKey - try { - val signatureVerification = PushUtils.verifySignature( - context, - accountManager, - base64DecodedSignature, - base64DecodedSubject - ) - if (signatureVerification != null && signatureVerification.signatureValid) { - val cipher = Cipher.getInstance("RSA/None/PKCS1Padding") - cipher.init(Cipher.DECRYPT_MODE, privateKey) - val decryptedSubject = cipher.doFinal(base64DecodedSubject) - val gson = Gson() - val decryptedPushMessage = gson.fromJson( - String(decryptedSubject), - DecryptedPushMessage::class.java - ) - if (decryptedPushMessage.delete) { - notificationManager.cancel(decryptedPushMessage.nid) - } else if (decryptedPushMessage.deleteAll) { - notificationManager.cancelAll() - } else { - val user = accountManager.getUser(signatureVerification.account?.name) - .orElseThrow { RuntimeException() } - fetchCompleteNotification(user, decryptedPushMessage) + try { + val messageData = inputData.getString(KEY_NOTIFICATION_SUBJECT) ?: "" + val signatureOrUser = inputData.getString(KEY_NOTIFICATION_SIGNATURE) ?: "" + + if (!TextUtils.isEmpty(messageData) && !TextUtils.isEmpty(signatureOrUser)) { + val decryptedMessageData: StringBuilder = StringBuilder() + val accountName: StringBuilder = StringBuilder() + + val type = inputData.getInt(KEY_NOTIFICATION_TYPE, -1) + + // if using firebase cloud messaging (via nextcloud proxy) for push notifications... + when (type) { + BACKEND_TYPE_FIREBASE_CLOUD_MESSAGING -> { + val base64DecodedSubject = Base64.decode(messageData, Base64.DEFAULT) + val base64DecodedSignature = Base64.decode(signatureOrUser, Base64.DEFAULT) + val privateKey = PushUtils.readKeyFromFile(false) as PrivateKey + try { + val signatureVerification = PushUtils.verifySignature( + context, + accountManager, + base64DecodedSignature, + base64DecodedSubject + ) + if (signatureVerification != null && signatureVerification.signatureValid) { + accountName.append(signatureVerification.account?.name) + val cipher = Cipher.getInstance("RSA/None/PKCS1Padding") + cipher.init(Cipher.DECRYPT_MODE, privateKey) + decryptedMessageData.append(String(cipher.doFinal(base64DecodedSubject))) + } + } catch (e1: GeneralSecurityException) { + Log_OC.d(TAG, "Error decrypting message ${e1.javaClass.name} ${e1.localizedMessage}") + return Result.success() } + // else, if using unified push messaging... + } + BACKEND_TYPE_UNIFIED_PUSH -> { + decryptedMessageData.append(messageData) + accountName.append(signatureOrUser) } - } catch (e1: GeneralSecurityException) { - Log_OC.d(TAG, "Error decrypting message ${e1.javaClass.name} ${e1.localizedMessage}") + else -> return Result.success() + } + + // transform string message to object + val decryptedPushMessage = + Gson().fromJson(decryptedMessageData.toString(), DecryptedPushMessage::class.java) + + if (decryptedPushMessage.delete) { + notificationManager.cancel(decryptedPushMessage.nid) + } else if (decryptedPushMessage.deleteAll) { + notificationManager.cancelAll() + } else { + val user = accountManager.getUser(accountName) + .orElseThrow { RuntimeException() } + fetchCompleteNotification(user, decryptedPushMessage) } - } catch (exception: Exception) { - Log_OC.d(TAG, "Something went very wrong" + exception.localizedMessage) } + } catch (exception: Exception) { + Log_OC.d(TAG, "Something went very wrong" + exception.localizedMessage) } return Result.success() } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 781a532ffebd..bab1be428ec9 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -209,6 +209,8 @@ public abstract class DrawerActivity extends ToolbarActivity @Inject ClientFactory clientFactory; + public Handler mHandler; + /** * Initializes the drawer and its content. This method needs to be called after the content view has been set. */ diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index e263d54fc0af..d6e4e3eaba60 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -150,9 +150,6 @@ public abstract class FileActivity extends DrawerActivity /** Flag to signal if the activity is launched by a notification */ private boolean mFromNotification; - /** Messages handler associated to the main thread and the life cycle of the activity */ - private Handler mHandler; - private FileOperationsHelper mFileOperationsHelper; private ServiceConnection mOperationsServiceConnection; diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java index ce7bbff93bb0..6a2fbfac4b60 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -2472,7 +2472,7 @@ public void onMessageEvent(TokenPushEvent event) { if (!preferences.isKeysReInitEnabled()) { PushUtils.reinitKeys(getUserAccountManager()); } else { - PushUtils.pushRegistrationToServer(getUserAccountManager(), preferences.getPushToken()); + PushUtils.updateRegistrationsWithServer(this, getUserAccountManager(), preferences.getPushToken()); } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt index ada5a2da54f1..f0930f0f288e 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.kt @@ -175,19 +175,23 @@ class NotificationsActivity : AppCompatActivity(), NotificationsContract.View, I } } else { val pushUrl = resources.getString(R.string.push_server_url) + val arbitraryDataProvider: ArbitraryDataProvider = ArbitraryDataProviderImpl(this) + val accountName: String = if (optionalUser?.isPresent == true) { + optionalUser?.get()?.accountName ?: "" + } else { + "" + } + + // if using unified push... if (pushUrl.isEmpty()) { - snackbar = Snackbar.make( - binding.emptyList.emptyListView, - R.string.push_notifications_not_implemented, - Snackbar.LENGTH_INDEFINITE - ) + // if a unified push distributor is not set, show snackbar alerting user to unified push capability + if (arbitraryDataProvider.getValue(accountName, PushUtils.KEY_PUSH).isEmpty()) + snackbar = Snackbar.make( + binding.emptyList.emptyListView, + R.string.push_notifications_no_distributor, + Snackbar.LENGTH_INDEFINITE + ) } else { - val arbitraryDataProvider: ArbitraryDataProvider = ArbitraryDataProviderImpl(this) - val accountName: String = if (optionalUser?.isPresent == true) { - optionalUser?.get()?.accountName ?: "" - } else { - "" - } val usesOldLogin = arbitraryDataProvider.getBooleanValue( accountName, UserAccountManager.ACCOUNT_USES_STANDARD_PASSWORD diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java index 445d664e0280..0a2161c85118 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java @@ -15,6 +15,7 @@ */ package com.owncloud.android.ui.activity; +import android.accounts.Account; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; @@ -61,6 +62,7 @@ import com.owncloud.android.datamodel.ArbitraryDataProvider; import com.owncloud.android.datamodel.ArbitraryDataProviderImpl; import com.owncloud.android.datamodel.ExternalLinksProvider; +import com.owncloud.android.datamodel.PushConfigurationState; import com.owncloud.android.lib.common.ExternalLink; import com.owncloud.android.lib.common.ExternalLinkType; import com.owncloud.android.lib.common.utils.Log_OC; @@ -92,6 +94,9 @@ import androidx.core.content.ContextCompat; import androidx.core.content.res.ResourcesCompat; +import static com.owncloud.android.utils.PushUtils.KEY_PUSH; +import com.google.gson.Gson; + /** * An Activity that allows the user to change the application's settings. * It proxies the necessary calls via {@link androidx.appcompat.app.AppCompatDelegate} to be used with AppCompat. @@ -378,6 +383,8 @@ private void setupMoreCategory() { setupBackupPreference(); + setupResetPushPreference(); + setupE2EPreference(preferenceCategoryMore); setupE2EKeysExist(preferenceCategoryMore); @@ -631,6 +638,27 @@ private void setupBackupPreference() { } } + private void setupResetPushPreference() { + Preference pResetPushNotifications = findPreference("reset_push_notifications"); + if (pResetPushNotifications == null) + return; + + pResetPushNotifications.setOnPreferenceClickListener(preference -> { + Gson gson = new Gson(); + for (Account account : accountManager.getAccounts()) { + String providerValue = arbitraryDataProvider.getValue(account.name, KEY_PUSH); + if (!TextUtils.isEmpty(providerValue)) { + PushConfigurationState accountPushData = gson.fromJson(providerValue, PushConfigurationState.class); + accountPushData.shouldBeDeleted = true; // set this so push account will be reset + arbitraryDataProvider.storeOrUpdateKeyValue(account.name, KEY_PUSH, gson.toJson(accountPushData)); + } + } + + DisplayUtils.showSnackMessage(this, R.string.prefs_reset_push_done); + return true; + }); + } + private void setupCalendarPreference(PreferenceCategory preferenceCategoryMore) { boolean calendarContactsEnabled = getResources().getBoolean(R.bool.davdroid_integration_enabled); Preference pCalendarContacts = findPreference("calendar_contacts"); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index e1cf782b39cb..f96fdf029a21 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -15,6 +15,7 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.os.Bundle; +import android.os.Handler; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; @@ -85,6 +86,8 @@ public class UserInfoActivity extends DrawerActivity implements Injectable { public void onCreate(Bundle savedInstanceState) { Log_OC.v(TAG, "onCreate() start"); super.onCreate(savedInstanceState); + mHandler = new Handler(); + Bundle bundle = getIntent().getExtras(); if (bundle == null) { @@ -339,7 +342,7 @@ protected void onSaveInstanceState(@NonNull Bundle outState) { @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessageEvent(TokenPushEvent event) { - PushUtils.pushRegistrationToServer(getUserAccountManager(), preferences.getPushToken()); + PushUtils.updateRegistrationsWithServer(this, getUserAccountManager(), preferences.getPushToken()); } diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 66d922e943ff..1296e0eb7fbe 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -736,7 +736,6 @@ آسف الخصوصية اسم جديد - تم تعطيل الإشعارات الفورية بسبب التبعيات على خدمات Google Play المملوكة. لا توجد إشعارات دفع بسبب جلسة تسجيل الدخول القديمة. يرجى النظر في إعادة إضافة حسابك. إشعارات الدفع غير متوفرة حاليا. لايمكن قراءة رمز QR diff --git a/app/src/main/res/values-b+en+001/strings.xml b/app/src/main/res/values-b+en+001/strings.xml index 5abf0d44a422..51473c4f1d76 100644 --- a/app/src/main/res/values-b+en+001/strings.xml +++ b/app/src/main/res/values-b+en+001/strings.xml @@ -730,7 +730,6 @@ Sorry Privacy New name - Push notifications disabled due to dependencies on proprietary Google Play services. No push notifications due to outdated login session. Please consider re-adding your account. Push notifications currently not available. QR code could not be read! diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index 27e28b16f411..4b0e6f35cf06 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -585,7 +585,6 @@ Извиняваме се Защита на лични данни Ново име - Известията са изключени заради зависимост от частни Google Play услуги. Няма налични известия поради изтекла потребителска сесия. Моля, обмислете да пре-добавите вашия профил. Известията не са достъпни в момента. QR кодът не може да се прочете! diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml index 5562ae2f9404..6408404d161c 100644 --- a/app/src/main/res/values-br/strings.xml +++ b/app/src/main/res/values-br/strings.xml @@ -571,7 +571,6 @@ Digarez Prevezder Anv nevez - Kemenadennoù push disaotreet blam da sujudigezh war perc\'hentiez war servijoù Google Play Kemenadenn push ebet blam da kozhder ar mont tre evit an dalc\'h. Adlakait o c\'hont mar-plij Kemenadennoù push ebet evit poent Klaskit %1$s war o ardivink diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 3fc6aa5b9f21..c802c69270bd 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -705,7 +705,6 @@ Ho sento Privadesa Nou nom - Les notificacions \"push\" s\'han inhabilitat a causa de dependències de serveis propietaris de Google Play. No hi ha notificacions \"push\" a causa d\'un inici de sessió no actualitzat. Si us plau valoreu tornar a afegir el vostre compte. Les notificacions \"push\" no estan disponibles actualment. No s\'ha pogut llegir el codi QR! diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index ba13f1ce22ce..313d0ea5c183 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -730,7 +730,6 @@ Je nám líto Soukromí Nový název - Push upozorňování je vypnuto kvůli závislostem na proprietárních službách Google Play. Žádná push upozornění kvůli zastaralé relaci přihlášení. Zvažte odebrání a opětovné přidání svého účtu. Push upozornění momentálně nejsou k dispozici. QR kód se nepodařilo načíst! diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 9273f3e092d4..31e3d95c3dd3 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -716,7 +716,6 @@ Undskyld Privatliv Nyt navn - Push notifikationer deaktiveret på grund af proprietære afhængigheder af Google Play services. Ingen push notifikationer fordi login sessionen er udløbet. Venligst overvej at genintaste din konto. Push notifikationer ikke tilgængelige nu. QR koden kunne ikke læses! diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9098f6f7cf61..45f70144ca81 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -730,7 +730,6 @@ Entschuldigung Datenschutz Neuer Name - Push Benachrichtigungen deaktiviert aufgrund der Abhängigkeiten zu proprietären Google Play Diensten. Keine Push Benachrichtigungen aufgrund veralteter Benutzersitzung. Bitte erwägen Sie das erneute Hinzufügen Ihres Kontos. Push Benachrichtigungen aktuell nicht verfügbar. QR-Code konnte nicht gelesen werden! diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index a34ecf548856..eb31ed8816c7 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -593,7 +593,6 @@ Σας ζητούμε συγγνώμη Ιδιωτικότητα Νέο όνομα - Οι ειδοποιήσεις απενεργοποιήθηκαν λόγω εξαρτήσεων στις ιδιόκτητες υπηρεσίες Google Play. Δεν υπάρχουν ειδοποιήσεις λόγω παρωχημένης συνεδρίας σύνδεσης. Παρακαλούμε επανεξετάσετε το ενδεχόμενο να ξανά προσθέσετε τον λογαριασμό σας. Οι ειδοποιήσεις push δεν είναι διαθέσιμες αυτήν τη στιγμή. Ο κώδικας QR δεν μπορεί να αναγνωσθεί diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 8031c4fd31eb..0e5eec6dfe04 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -425,7 +425,6 @@ Ne eblas montri bildon Pardonu Privateco - Tujaj sciigoj estas malebligitaj pro dependeco al proprietaj „Google Play“-servoj. Neniu tuja sciigo pro malaktuala ensaluto-seanco. Bonvolu eble re-aldoni vian konton. Tujaj sciigoj momente ne disponeblas. Provu %1$s sur via aparato! diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 7f6a311799c3..ae95e790da29 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -653,7 +653,6 @@ Disculpe Privacidad Nuevo nombre - Notificaciones push deshabilitadas debido a dependencias en servicios propietarios de Google Play. No hay notificaciones push debido a la sesión de inicio de sesión obsoleta. Por favor considere volver a agregar su cuenta. Notificaciones push actualmente no disponibles. ¡No se pudo leer el código QR! diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index 8c1c825c58f2..289f26cc6b22 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -402,7 +402,6 @@ No es posible mostrar la imagen Disculpa Privacidad - Las notificaciones push están deshabilitadas debido a dependencias de servicios propietarios de Google Play. No hay notificaciones push debido a un inicio de sesión caduco. Por favor vuelve a ingresar a tu cuenta. En este momento las notificaciones push no están disponibles. ¡Prueba %1$s en tu dispositivo! diff --git a/app/src/main/res/values-es-rCO/strings.xml b/app/src/main/res/values-es-rCO/strings.xml index d17cae3acb8f..6088df99c88d 100644 --- a/app/src/main/res/values-es-rCO/strings.xml +++ b/app/src/main/res/values-es-rCO/strings.xml @@ -376,7 +376,6 @@ No es posible mostrar la imagen Disculpa Privacidad - Las notificaciones push están deshabilitadas debido a dependencias de servicios propietarios de Google Play. No hay notificaciones push debido a un inicio de sesión caduco. Por favor vuelve a ingresar a tu cuenta. En este momento las notificaciones push no están disponibles. ¡Prueba %1$s en tu dispositivo! diff --git a/app/src/main/res/values-es-rEC/strings.xml b/app/src/main/res/values-es-rEC/strings.xml index 8aca567f87ce..cd3008eeb44f 100644 --- a/app/src/main/res/values-es-rEC/strings.xml +++ b/app/src/main/res/values-es-rEC/strings.xml @@ -594,7 +594,6 @@ Disculpa Privacidad Nombre nuevo - Las notificaciones push están deshabilitadas debido a dependencias de servicios propietarios de Google Play. No hay notificaciones push debido a un inicio de sesión caduco. Por favor vuelve a ingresar a tu cuenta. En este momento las notificaciones push no están disponibles. No se pudo leer el código QR diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index 1d36cca5043c..11d1f348b95a 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -655,7 +655,6 @@ Disculpa Privacidad Nuevo nombre - Las notificaciones push están deshabilitadas debido a dependencias de servicios propietarios de Google Play. No hay notificaciones push debido a un inicio de sesión caduco. Por favor vuelve a ingresar a tu cuenta. En este momento las notificaciones push no están disponibles. ¡No se pudo leer el código QR! diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index e725304cfa1e..1c49e324d95d 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -708,7 +708,6 @@ ¡Lo sentimos Privacidad Nuevo nombre - Notificaciones push deshabilitadas debido a que depende de servicios propietarios de Google Play. No hay notificaciones push debido a que la sesión está caducada. Por favor, considera volver a añadir la cuenta. Notificaciones push actualmente no disponibles. ¡No se ha podido leer el código QR! diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 927f1a5fb1d4..9011589101ef 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -704,7 +704,6 @@ Barkatu Pribatutasuna Izen berria - Push jakinarazpenak Google Play zerbitzu jabedunen menpekotasunengatik desgaituta. Ez dago push jakinarazpenik saio zaharkituaren ondorioz. Mesedez, kontua berriz gehitu. Push jakinarazpenak ez daude eskuragarri. Ezin da QR kodea irakurri! diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 6434f9a1dfdd..de8eb28a1a6e 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -630,7 +630,6 @@ ببخشید حریم خصوصی اسم جدید - ارسال اعلانات به دلیل وابستگی به خدمات اختصاصی Google Play غیرفعال شده است. امکان ارسال اعلانات، به دلیل منقضی شدن زمان نشست ورود به سیستم وجود ندارد. لطفاً دوباره حساب خود را اضافه کنید. ارسال اعلانات در حال حاضر در دسترس نیست. کد QR قابل خواندن نیست! diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 50ff6f10d5a3..1e81ac1e8f3c 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -655,7 +655,6 @@ GNU yleinen lisenssi, versio 2 Anteeksi Yksityisyys Uusi nimi - Push-ilmoitukset ovat pois käytöstä, koska ne riippuvat suljetuista Google Play -palveluista. Ei puskusanomia johtuen vanhentuneesta kirjautumisistunnosta. Harkitse tilin uudelleenlisäämistä. Push-ilmoitukset eivät ole nyt käytettävissä. QR-koodia ei voitu lukea! diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5fdb5f42aa72..7e121dbd4faf 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -718,7 +718,6 @@ Désolé Vie privée Nouveau nom - L\'envoi de notifications push est désactivé à cause des dépendances propriétaires des services Google Play. Aucune notification push à cause d\'une connexion expirée. Veuillez ajouter de nouveau votre compte. Les notifications push ne sont pas disponibles actuellement. Le code QR ne peut être lu diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml index 2b5b291c1e77..d071bdaf3750 100644 --- a/app/src/main/res/values-ga/strings.xml +++ b/app/src/main/res/values-ga/strings.xml @@ -718,7 +718,6 @@ Tá brón orm Príobháideacht Ainm nua - Díchumasaíodh fógraí brú de bharr spleáchais ar sheirbhísí dílseánaigh Google Play. Níl aon bhrúfhógraí mar gheall ar sheisiún logáil isteach atá as dáta. Smaoinigh ar do chuntas a chur leis arís le do thoil. Níl fógraí brúigh ar fáil faoi láthair. Níorbh fhéidir an cód QR a léamh! diff --git a/app/src/main/res/values-gd/strings.xml b/app/src/main/res/values-gd/strings.xml index 0fa26054dd52..c7c5bc8402ba 100644 --- a/app/src/main/res/values-gd/strings.xml +++ b/app/src/main/res/values-gd/strings.xml @@ -499,7 +499,6 @@ Duilich Prìobhaideachd Ainm ùr - Tha na brathan putaidh à comas ri linn eisimeileachd air seirbheisean Google Play fo shealbh. Chan fhaigh thu brathan putaidh ri linn seisean clàraidh a-steach ro shean. Saoil an cuir thu an cunntas agad ris a-rithist? Chan eil brathan putaidh ri fhaighinn an-dràsta. Cha b’ urrainn dhuinn an còd QR a leughadh! diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index de7d667a7d99..2836983d1990 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -555,7 +555,6 @@ Oprosti Privatnost Novi naziv - Push obavijesti su onemogućene zbog ovisnosti o vlasničkim servisima trgovine Google Play. Nema push obavijesti zbog zastarjele prijave. Razmislite o ponovnom dodavanju računa. Push obavijesti trenutno nisu dostupne. Čitanje QR kôda nije uspjelo! diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 625a60d0dbfa..1145e9a67838 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -712,7 +712,6 @@ Sajnáljuk Adatvédelem Új név - A leküldéses üzenetek ki vannak kapcsolva, mert azok a zárt Google Play szolgáltatásoktól függenek. Nincsenek leküldéses értesítések, mert a munkamenet lejárt. Adja hozzá újra a fiókját. A leküldéses értesítések jelenleg nem érhetőek el. A QR-kód nem olvasható. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 44073b40adfd..82a014d482d4 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -605,7 +605,6 @@ Otomatis unggah hanya bekerja dengan baik apabila Anda mengeluarkan aplikasi ini Maaf Privasi Nama baru - Notifikasi push dinonaktifkan karena ketergantungan pada layanan Google Play bersumber tertutup. Tidak ada notifikasi push karena sesi masuk sudah usang. Mohon pertimbangkan untuk menambahkan kembali akun Anda. Notifikasi push saat ini tidak tersedia. Kode QR tidak dapat dibaca! diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index f8154e3fd109..ee4b6739fb73 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -714,7 +714,6 @@ Því miður Gagnaleynd Nýtt nafn - Ýti-tilkynningar eru óvirkar vegna ósamhæfis við séreignahugbúnað í Google Play þjónustu. Engar ýtitilkynningar vegna útrunnirnnar innskráningarsetu. Íhugaðu að setja aðganginn þinn inn aftur. Ýti-tilkynningar eru ekki tiltækar þessa stundina. Ekki tókst að lesa QR-kóða! diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7066828e845f..867e63b32e94 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -714,7 +714,6 @@ Spiacenti Riservatezza Nuovo nome - Notifiche push disabilitate a causa delle dipendenze dai servizi proprietari di Google Play. Nessuna notifica push a causa della sessione di accesso scaduta. Considera di aggiungere nuovamente il tuo account. Notifiche push attualmente non disponibili. Il codice QR non può essere letto! diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index c56e267f3ec3..daf7d1a2b0c7 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -506,7 +506,6 @@ לא ניתן להציג תמונה אנו מתנצלים פרטיות - התראות בדחיפה מושבתות עקב תלות בשירותי Google Play קנייניים. אין התראות בדחיפה עקב כניסה מיושנת. מוטב לשקול להוסיף את החשבון שלך מחדש. כרגע התרעות בדחיפה אינן זמינות. לנסות את %1$s בהתקן שלך! diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 8df76cf73166..e07c696c2448 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -701,7 +701,6 @@ 申し訳ありません プライバシー 新しい名前 - 独自のGoogle Playサービスの依存関係のため、プッシュ通知が無効になっています。 古くなったログインセッションによるプッシュ通知はありません。 アカウントを再追加することを検討してください。 プッシュ通知は現在利用できません。 QRコードを読み込めません! diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 13cb8e3f4e18..0730fc5d1b31 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -608,7 +608,6 @@ Sorry Privacy New name - Push notifications disabled due to dependencies on proprietary Google Play services. No push notifications due to outdated login session. Please consider re-adding your account. Push notifications currently not available. QR code could not be read! diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 97d6d8995c6e..24a38e221740 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -708,7 +708,6 @@ 죄송합니다 개인 정보 새 이름 - 비자유 Google Play 서비스 의존성 때문에 푸시 알림이 비활성화되었습니다. 로그인 세션이 오래되어 푸시 알림이 비활성화되었습니다. 계정을 다시 추가하십시오. 푸시 알림을 사용할 수 없습니다. QR 코드를 읽을 수 없습니다! diff --git a/app/src/main/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml index 21a9982c510b..45f6c61e589c 100644 --- a/app/src/main/res/values-lo/strings.xml +++ b/app/src/main/res/values-lo/strings.xml @@ -500,7 +500,6 @@ ຂໍໂທດ ສ່ວນຕົວ ຊື່ໄໝ່ - ປິດການແຈ້ງເຕືອນ ເນື່ອງຈາກການເພິ່ງພາອາໄສການບໍລິການ Google Play ທີ່ເປັນເຈົ້າຂອງ. ບໍ່ມີການແຈ້ງ ເຕືອນ ເນື່ອງ ຈາກພາກ ການເຂົ້າລະບົບ ສະໄຫມ. ກະລຸນາພິຈາລະນາການເພີ່ມບັນຊີຂອງທ່ານຄືນໃຫມ່. ການແຈ້ງເຕືອນຊຸກຍູ້ໃນປະຈຸບັນຍັງບໍ່ມີ. ລອງໃສ່ອຸປະກອນຂອງທ່ານ!%1$s diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/app/src/main/res/values-lt-rLT/strings.xml index 0769f29f775f..9b95fb29ae20 100644 --- a/app/src/main/res/values-lt-rLT/strings.xml +++ b/app/src/main/res/values-lt-rLT/strings.xml @@ -599,7 +599,6 @@ Atsiprašome Privatumas Naujas pavadinimas - Push pranešimai išjungti dėl priklausomybės nuo nuosavybinių „Google Play“ paslaugų. Nėra pranešimų dėl pasenusios prisijungimo sesijos. Pasvarstykite galimybę iš naujo pridėti prisijungimo duomenis. Stumti pranešimus funkcija šiuo metu negalima Nepavyko perskaityti QR kodo! diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 6ac68bc60dae..08183468dc11 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -516,7 +516,6 @@ Извинете Приватност Ново име - Push известувањата се оневозможени поради зависноста на Google Play сервисот. Нема push известувања бидејќи вашата сесија е истечена. Ве молиме повторно најавете се на вашта сметка. Не се достапни Push известувања. Пробајте го %1$s на вашиот уред! diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 4fbd7ce82e27..4811fae9b0ef 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -687,7 +687,6 @@ Beklager Personvern Nytt navn - Push-merknader er avskrudd på grunn av avhengigheter til proprietære Google Play-tjenester. Ingen push-varsler på grunn av utdatert innloggingsøkt. Du bør vurdere å legge til kontoen på nytt. Push-merknader er for tiden ikke tilgjengelige. QR-koden kunne ikke leses! diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 200628f34e00..b7995e411181 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -690,7 +690,6 @@ Sorry Privacy Nieuwe naam - Push notificaties uitgeschakeld door afhankelijkheden op eigen Google Play-services. Geen push-notificaties als gevolg van de verouderde inlogsessie. Overweeg het opnieuw toevoegen van je account. Push notificaties momenteel niet beschikbaar. QR code kan niet worden gelezen! diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 27597f2b1bef..abd70da917d7 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -718,7 +718,6 @@ Przykro nam Prywatność Nowa nazwa - Powiadomienia Push zostały wyłączone ze względu na zastrzeżenia prawne usług Google Play. Brak powiadomień Push z powodu nieaktualnej sesji logowania. Rozważ ponowne dodanie swojego konta. Powiadomienia Push nie są obecnie dostępne. Nie można odczytać kodu QR! diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 69e7f9eaff10..e7610a2349f6 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -730,7 +730,6 @@ Desculpe Privacidade Novo nome - Envio de notificações desativado devido a dependências de serviços proprietários do Google Play. Sem envio de notificações devido à sessão de login desatualizada. Considere readicionar sua conta. Atualmente o envio de notificações está indisponível. Não foi possível ler o código QR! diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 2dffb43d7205..e2dad753b91e 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -611,7 +611,6 @@ Desculpa Privacidade Novo nome - Notificações \"push\" desactivadas devido a dependências sobre serviços proprietários Google Play. Sem notificações \"push\" devido a sessão de acesso de desatualizada. Por favor, considere readicionar a sua conta. Notificações \"push\" actualmente não disponíveis. Não foi possível ler o código QR! diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 9e80ba207ffe..9dcfca1728ed 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -675,7 +675,6 @@ Scuze Confindențialitate Nume nou - Notificările push sunt oprite datorită dependințelor de serviciile proprietare Google Play. Fără notificări push datorită sesiunilor de login expirate. Vă rugăm considerați să adăugați din nou contul dumneavoastră. Notificările push nu sunt disponibile în acest moment. Codul QR nua putut fi citit! diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 25cf7cd1ad23..fe95dddacb72 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -714,7 +714,6 @@ Приносим извинения Конфиденциальность Новое имя - Всплывающие уведомления отключены, так как зависят от Google Play сервисов Нет аккаунтов для уведомлений. Пожалуйста добавьте аккаунт. Всплывающие уведомления недоступны Не удалось считать QR-код! diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 973f1cb67ad7..8bfdb4ef5941 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -730,7 +730,6 @@ Prepáčte Súkromie Nový názov - Push notifikácie sú vypnuté z dôvodu závislosti na proprietárnych službách Google Play Žiadne push notifikácie z dôvodu zastaraného prihlásenia. Prosím skúste znova pridať váš účet. Push notifikácie sú v súčasnosti nedostupné. QR kód nie je možné načítať! diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 75f7380b8cb2..6e44e57d777b 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -611,7 +611,6 @@ Na žalost Zasebnost Novo ime - Potisna obvestila so onemogočena zaradi odvisnosti od storitev Google Play. Zaradi pretečene prijavne seje ni mogoče prikazati potisnih obvestil. Priporočljivo je ponovno dodati račun med nastavitvami. Potisna obvestila trenutno niso na voljo. Kode QR ni mogoče prebrati! diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 887a41d2b2f0..93511be3d5e3 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -456,7 +456,6 @@ Kjo figurë nuk mund të shfaqet Më vjen keq Privatësi - Njoftimet push janë të çaktivizuara për shkak të varësive nga shërbimet e patentuara të Google Play. Nuk ka asnjë njoftim për shkak se sesioni i identifikimit nuk ishte i përditësuar. Ju lutem konsideroni të shtoni përsëri llogarinë tuaj. Njoftimet push nuk ofrohen për momentin. Provojeni %1$s në pajisjen tuaj! diff --git a/app/src/main/res/values-sr-rSP/strings.xml b/app/src/main/res/values-sr-rSP/strings.xml index 707baa5d6abc..302fac290a53 100644 --- a/app/src/main/res/values-sr-rSP/strings.xml +++ b/app/src/main/res/values-sr-rSP/strings.xml @@ -441,7 +441,6 @@ Ne mogu da prikažem sliku Izvinite Privatnost - Brza obaveštenja isključena jer zavise od vlasničkog Google Play servisa. Nema brzih obaveštenja zato što vam je sesija zastarela. Izbrišite i dodajte ponovo nalog. Brza obaveštenja trenutno nisu dostupna. Isprobaj %1$s na svom uređaju! diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index cb9f54ffe775..f9c230f4e87f 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -730,7 +730,6 @@ Извините Приватност Ново име - Брза обавештења искључена јер зависе од власничког Гугл плеј сервиса. Нема брзих обавештења јер је сесија застарела. Избришите и додајте поново налог. Брза обавештења тренутно нису доступна. QR кôд није могао да се прочита! diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9262dd7e982a..9c2d0da1d3f7 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -731,8 +731,7 @@ Tyvärr Privat Nytt namn - Push-aviseringar har inaktiverats på grund av beroenden till skyddade Google Play-tjänster - Inga push-aviseringar på grund av utgången inloggningssession. Överväg att lägga till ditt konto på nytt. + Inga push-aviseringar på grund av utgången inloggningssession. Överväg att lägga till ditt konto på nytt. Push-aviseringar är inte tillgängligt för tillfället. QR-koden kunde inte läsas! Ändringar för automatisk uppladdning diff --git a/app/src/main/res/values-tk/strings.xml b/app/src/main/res/values-tk/strings.xml index a661542ab713..52b56f60c4ea 100644 --- a/app/src/main/res/values-tk/strings.xml +++ b/app/src/main/res/values-tk/strings.xml @@ -493,7 +493,6 @@ Bagyşlaň Gizlinlik Täze ady - Hususy Google Play hyzmatlaryna baglylyk sebäpli basma bildirişleri ýapylýar. Könelen giriş sessiýasy sebäpli itergi habarnamalary ýok. Hasabyňyzy täzeden goşmagy göz öňünde tutmagyňyzy haýyş edýäris. Push habarnamalary häzirki wagtda elýeterli däl. %1$senjamyňyzda synap görüň! diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a5a6d0121db9..5ae7de6ac5d3 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -715,7 +715,6 @@ Перепрошуємо Конфіденційність Нова назва - Сповіщення push вимкнено через залежність від служби Google Play Сповіщення push неактивні, оскільки час сесії вичерпано. Будь ласка, додайте наново ваш обліковий запис. Зараз сповіщення push недоступні. Неможливо прочитати QR-код! diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a29ba2d764cf..e8ecc51da3ca 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -559,7 +559,6 @@ Xin lỗi Riêng tư Tên mới - Thông báo bị tắt do phụ thuộc vào các dịch vụ độc quyền của Google Play. Không có thông báo do phiên đăng nhập đã lỗi thời. Vui lòng xem xét việc thêm lại tài khoản của bạn. Thông báo hiện không khả dụng. Không thể đọc mã QR! diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 311d8027f9d9..865dd4f60083 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -730,7 +730,6 @@ 很抱歉 私隱政策 新名稱 - 由於依賴專有的Google Play服務,推送通知已停用。 由於登入已過期,因此沒有推送通知。請考慮重新添加您的帳戶。 推送通知目前無法使用。 QR 碼無法讀取! diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3f438a585484..6861fa7e6bb1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -761,7 +761,7 @@ Get source code License GNU General Public License, version 2 - Push notifications disabled due to dependencies on proprietary Google Play services. + Push notifications are available using Unified Push. See https://apps.nextcloud.com/apps/uppush. No push notifications due to outdated login session. Please consider re-adding your account. Push notifications currently not available. @@ -1342,4 +1342,7 @@ Create link This folder is best viewed in %1$s. Open in %1$s + Reset push notifications + Reset push notifications in case of push messaging issues or changing distributors + Push notifications reset diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 63a1902c5264..9094bdef068c 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -79,6 +79,10 @@ android:title="@string/backup_title" android:key="backup" android:summary="@string/prefs_daily_backup_summary" /> + - + + @@ -405,6 +406,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11313,6 +11356,14 @@ + + + + + + + + @@ -12512,6 +12563,11 @@ + + + + + @@ -12528,6 +12584,14 @@ + + + + + + + + @@ -12544,6 +12608,22 @@ + + + + + + + + + + + + + + + + @@ -12567,6 +12647,11 @@ + + + + + @@ -15901,7 +15986,15 @@ - + + + + + + + + + From b0765e899121f5258e95fb5cbfd9d0726e00c863 Mon Sep 17 00:00:00 2001 From: gavine99 Date: Mon, 17 Nov 2025 18:27:46 +1100 Subject: [PATCH 2/2] merge in latest master. fix build issues from move to new library dependency method. remove dependency verification. --- app/build.gradle.kts | 4 ++++ .../com/owncloud/android/ui/activity/FileDisplayActivity.kt | 2 +- gradle.properties | 3 ++- gradle/libs.versions.toml | 6 ++++++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7c5764b7af6b..9f355452f2b6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -338,6 +338,10 @@ tasks.named("check").configure { } dependencies { + // unified push + implementation(libs.unifiedpush.connector) + implementation(libs.unifiedpush.connector.ui) + // region Nextcloud library implementation(libs.android.library) { exclude(group = "org.ogce", module = "xpp3") // unused in Android and brings wrong Junit version diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 82dc1eaa77f4..d064ad18829b 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -2772,7 +2772,7 @@ class FileDisplayActivity : if (!preferences.isKeysReInitEnabled()) { PushUtils.reinitKeys(userAccountManager) } else { - PushUtils.pushRegistrationToServer(userAccountManager, preferences.getPushToken()) + PushUtils.updateRegistrationsWithServer(this, userAccountManager, preferences.getPushToken()); } } diff --git a/gradle.properties b/gradle.properties index 50cc48359122..be7e13b789c5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,8 @@ android.nonTransitiveRClass=true # JVM arguments to optimize heap usage, enable heap dump on out-of-memory errors, and set the file encoding org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g -org.gradle.dependency.verification.console=verbose +# org.gradle.dependency.verification.console=verbose +org.gradle.dependency.verification=off kotlin.daemon.jvmargs=-Xmx6144m -XX:+UseParallelGC org.gradle.caching=true org.gradle.parallel=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d9c83224b60a..a331d59e9b5e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -84,8 +84,14 @@ spotless = "7.2.1" stateless4jVersion = "2.6.0" webkitVersion = "1.14.0" workRuntime = "2.10.4" +unifiedpush-connector = "3.1.2" +unifiedpush-connector-ui = "1.1.0" [libraries] +# unified push +unifiedpush-connector = { module = "org.unifiedpush.android:connector", version.ref = "unifiedpush-connector" } +unifiedpush-connector-ui = { module = "org.unifiedpush.android:connector-ui", version.ref = "unifiedpush-connector-ui" } + # Crypto android-library = { module = "com.github.nextcloud:android-library", version.ref = "androidLibraryVersion" } conscrypt-android = { module = "org.conscrypt:conscrypt-android", version.ref = "conscryptAndroidVersion" }