From f931407d56c94ccfc7626f3a294b3caa8798e1fc Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 19 Dec 2023 13:37:27 +0100 Subject: [PATCH 1/9] Add general receiver registration implementation Signed-off-by: alperozturk Signed-off-by: Andy Scherzinger --- .../nextcloud/talk/utils/ContextExtensions.kt | 54 +++++++++++++++++++ .../com/nextcloud/talk/utils/ReceiverFlag.kt | 35 ++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 app/src/main/java/com/nextcloud/talk/utils/ContextExtensions.kt create mode 100644 app/src/main/java/com/nextcloud/talk/utils/ReceiverFlag.kt diff --git a/app/src/main/java/com/nextcloud/talk/utils/ContextExtensions.kt b/app/src/main/java/com/nextcloud/talk/utils/ContextExtensions.kt new file mode 100644 index 000000000..ed85664f3 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/ContextExtensions.kt @@ -0,0 +1,54 @@ +/* + * Nextcloud Android client application + * + * @author Alper Ozturk + * Copyright (C) 2023 Alper Ozturk + * Copyright (C) 2023 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.utils + +import android.annotation.SuppressLint +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Build +import android.os.Handler + +@SuppressLint("UnspecifiedRegisterReceiverFlag") +fun Context.registerBroadcastReceiver(receiver: BroadcastReceiver?, filter: IntentFilter, flag: ReceiverFlag): Intent? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(receiver, filter, flag.getId()) + } else { + registerReceiver(receiver, filter) + } +} + +@SuppressLint("UnspecifiedRegisterReceiverFlag") +fun Context.registerPermissionHandlerBroadcastReceiver( + receiver: BroadcastReceiver?, + filter: IntentFilter, + broadcastPermission: String?, + scheduler: Handler?, + flag: ReceiverFlag +): Intent? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + registerReceiver(receiver, filter, broadcastPermission, scheduler, flag.getId()) + } else { + registerReceiver(receiver, filter, broadcastPermission, scheduler) + } +} diff --git a/app/src/main/java/com/nextcloud/talk/utils/ReceiverFlag.kt b/app/src/main/java/com/nextcloud/talk/utils/ReceiverFlag.kt new file mode 100644 index 000000000..8ceda84be --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/utils/ReceiverFlag.kt @@ -0,0 +1,35 @@ +/* + * Nextcloud Android client application + * + * @author Alper Ozturk + * Copyright (C) 2023 Alper Ozturk + * Copyright (C) 2023 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.nextcloud.talk.utils + +import android.content.Context +import android.os.Build +import androidx.annotation.RequiresApi + +enum class ReceiverFlag { + NotExported; + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + fun getId(): Int { + return Context.RECEIVER_NOT_EXPORTED + } +} From 7fe6dd066b3a1168053cb48b974cfd567eda30b4 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 19 Dec 2023 13:37:49 +0100 Subject: [PATCH 2/9] Register ReceiverFlags when registering receivers for Android 13+ Signed-off-by: Andy Scherzinger --- .../java/com/nextcloud/talk/activities/CallActivity.kt | 7 +++++-- .../com/nextcloud/talk/webrtc/WebRtcAudioManager.java | 4 +++- .../nextcloud/talk/webrtc/WebRtcBluetoothManager.java | 9 ++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt index 2439940de..aebaabe24 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt @@ -113,6 +113,7 @@ import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.DisplayUtils import com.nextcloud.talk.utils.NotificationUtils.cancelExistingNotificationsForRoom import com.nextcloud.talk.utils.NotificationUtils.getCallRingtoneUri +import com.nextcloud.talk.utils.ReceiverFlag import com.nextcloud.talk.utils.VibrationUtils.vibrateShort import com.nextcloud.talk.utils.animations.PulseAnimation import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_CALL_VOICE_ONLY @@ -136,6 +137,7 @@ import com.nextcloud.talk.utils.database.user.CapabilitiesUtilNew.isCallRecordin import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil import com.nextcloud.talk.utils.power.PowerManagerUtils +import com.nextcloud.talk.utils.registerPermissionHandlerBroadcastReceiver import com.nextcloud.talk.utils.singletons.ApplicationWideCurrentRoomHolder import com.nextcloud.talk.viewmodels.CallRecordingViewModel import com.nextcloud.talk.viewmodels.CallRecordingViewModel.RecordingConfirmStopState @@ -3015,11 +3017,12 @@ class CallActivity : CallBaseActivity() { } } } - registerReceiver( + registerPermissionHandlerBroadcastReceiver( mReceiver, IntentFilter(MICROPHONE_PIP_INTENT_NAME), permissionUtil!!.privateBroadcastPermission, - null + null, + ReceiverFlag.NotExported ) updateUiForPipMode() } else { diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcAudioManager.java b/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcAudioManager.java index a3cf70773..69c2ef71c 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcAudioManager.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcAudioManager.java @@ -44,6 +44,8 @@ import android.media.AudioManager; import android.util.Log; import com.nextcloud.talk.events.ProximitySensorEvent; +import com.nextcloud.talk.utils.ContextExtensionsKt; +import com.nextcloud.talk.utils.ReceiverFlag; import com.nextcloud.talk.utils.power.PowerManagerUtils; import org.greenrobot.eventbus.EventBus; @@ -339,7 +341,7 @@ public class WebRtcAudioManager { * Helper method for receiver registration. */ private void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { - magicContext.registerReceiver(receiver, filter); + ContextExtensionsKt.registerBroadcastReceiver(magicContext, receiver, filter, ReceiverFlag.NotExported); } /** diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcBluetoothManager.java b/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcBluetoothManager.java index ba530f1c3..4f0ddd9bf 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcBluetoothManager.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcBluetoothManager.java @@ -51,6 +51,9 @@ import android.os.Looper; import android.os.Process; import android.util.Log; +import com.nextcloud.talk.utils.ContextExtensionsKt; +import com.nextcloud.talk.utils.ReceiverFlag; + import org.webrtc.ThreadUtils; import java.util.List; @@ -300,7 +303,11 @@ public class WebRtcBluetoothManager { } protected void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { - apprtcContext.registerReceiver(receiver, filter); + ContextExtensionsKt.registerBroadcastReceiver( + apprtcContext, + receiver, + filter, + ReceiverFlag.NotExported); } protected void unregisterReceiver(BroadcastReceiver receiver) { From 29a357ad08e5b9ff51b313fb9e99c784598540a3 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 19 Dec 2023 14:04:04 +0100 Subject: [PATCH 3/9] Bump target sdk to 34 Signed-off-by: Andy Scherzinger --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ee223cd35..8bda1e02e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,7 +43,7 @@ android { defaultConfig { minSdkVersion 24 - targetSdkVersion 33 + targetSdkVersion 34 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable) From f2b838f8b7ac0934c6ba60a5ac7cc57770005099 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 19 Dec 2023 14:16:20 +0100 Subject: [PATCH 4/9] properly name context variable Signed-off-by: Andy Scherzinger --- .../com/nextcloud/talk/webrtc/WebRtcAudioManager.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcAudioManager.java b/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcAudioManager.java index 69c2ef71c..1cd0c6bca 100644 --- a/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcAudioManager.java +++ b/app/src/main/java/com/nextcloud/talk/webrtc/WebRtcAudioManager.java @@ -57,7 +57,7 @@ import java.util.Set; public class WebRtcAudioManager { private static final String TAG = WebRtcAudioManager.class.getSimpleName(); - private final Context magicContext; + private final Context context; private final WebRtcBluetoothManager bluetoothManager; private final boolean useProximitySensor; private final AudioManager audioManager; @@ -83,7 +83,7 @@ public class WebRtcAudioManager { private WebRtcAudioManager(Context context, boolean useProximitySensor) { Log.d(TAG, "ctor"); ThreadUtils.checkIsOnMainThread(); - magicContext = context; + this.context = context; audioManager = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)); bluetoothManager = WebRtcBluetoothManager.create(context, this); wiredHeadsetReceiver = new WiredHeadsetReceiver(); @@ -341,14 +341,14 @@ public class WebRtcAudioManager { * Helper method for receiver registration. */ private void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { - ContextExtensionsKt.registerBroadcastReceiver(magicContext, receiver, filter, ReceiverFlag.NotExported); + ContextExtensionsKt.registerBroadcastReceiver(context, receiver, filter, ReceiverFlag.NotExported); } /** * Helper method for unregistration of an existing receiver. */ private void unregisterReceiver(BroadcastReceiver receiver) { - magicContext.unregisterReceiver(receiver); + context.unregisterReceiver(receiver); } /** @@ -377,7 +377,7 @@ public class WebRtcAudioManager { * Gets the current earpiece state. */ private boolean hasEarpiece() { - return magicContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY); + return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY); } /** From 12d413bd5378c541e41856338e8ee66493bfbeb7 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 19 Dec 2023 14:22:55 +0100 Subject: [PATCH 5/9] Add further lang with additional quantity strings not offered by transifex Signed-off-by: Andy Scherzinger --- app/lint.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/lint.xml b/app/lint.xml index c571055aa..06bf7c2c1 100644 --- a/app/lint.xml +++ b/app/lint.xml @@ -13,6 +13,12 @@ + + + + + + From 69d6d2c04357f7f8dd70e349d98d91aef7518d73 Mon Sep 17 00:00:00 2001 From: Andy Scherzinger Date: Tue, 19 Dec 2023 14:25:01 +0100 Subject: [PATCH 6/9] Add foreground service phone call for gplay build Signed-off-by: Andy Scherzinger --- app/src/gplay/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/gplay/AndroidManifest.xml b/app/src/gplay/AndroidManifest.xml index 7661d02bd..583858293 100644 --- a/app/src/gplay/AndroidManifest.xml +++ b/app/src/gplay/AndroidManifest.xml @@ -23,6 +23,8 @@ + + Date: Tue, 19 Dec 2023 14:33:43 +0100 Subject: [PATCH 7/9] fix patch regex for ca lang Signed-off-by: Andy Scherzinger --- app/lint.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lint.xml b/app/lint.xml index 06bf7c2c1..d0d2d08f6 100644 --- a/app/lint.xml +++ b/app/lint.xml @@ -17,7 +17,7 @@ - + From f7be8dd9a906a41c6a9fb0aaea6523f2a34808bf Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 22 Dec 2023 10:31:00 +0000 Subject: [PATCH 8/9] Analysis: update lint results to reflect reduced error/warning count Signed-off-by: github-actions --- scripts/analysis/lint-results.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/analysis/lint-results.txt b/scripts/analysis/lint-results.txt index 7cc7b2ee3..992f68d81 100644 --- a/scripts/analysis/lint-results.txt +++ b/scripts/analysis/lint-results.txt @@ -1,2 +1,2 @@ DO NOT TOUCH; GENERATED BY DRONE - Lint Report: 8 errors and 83 warnings + Lint Report: 8 errors and 80 warnings From e4a80429d3c820d7b7760f992442c77121e27c43 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Wed, 31 Jan 2024 11:20:24 +0100 Subject: [PATCH 9/9] remove foregroundServiceType="phoneCall" for NCFirebaseMessagingService Using a foregroundServiceType for firebase is not recommended: https://firebase.google.com/docs/cloud-messaging/android/client#manifest and it would violate android14 terms: https://developer.android.com/about/versions/14/changes/fgs-types-required tested and notifications still work as expected Signed-off-by: Marcel Hibbe --- app/src/gplay/AndroidManifest.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/gplay/AndroidManifest.xml b/app/src/gplay/AndroidManifest.xml index 583858293..4032681e4 100644 --- a/app/src/gplay/AndroidManifest.xml +++ b/app/src/gplay/AndroidManifest.xml @@ -42,8 +42,7 @@ + android:exported="false">