From aebaff736c610b7b903a979254071c485d366876 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Fri, 2 Aug 2024 16:49:54 -0400 Subject: [PATCH] Fix mic usage for api34 when app is backgrounded. --- app/src/main/AndroidManifest.xml | 3 ++- .../service/webrtc/ActiveCallManager.kt | 23 +++++++++++++++++-- .../service/webrtc/WebRtcCallService.java | 20 +++++++++------- .../securesms/util/RemoteConfig.kt | 2 +- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ae8fe4c852..c319339958 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -89,6 +89,7 @@ + @@ -1379,7 +1380,7 @@ + android:foregroundServiceType="dataSync|microphone" /> diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallManager.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallManager.kt index 027c9c0fac..b9545a9bd8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallManager.kt @@ -22,6 +22,7 @@ import androidx.core.app.NotificationManagerCompat import androidx.core.os.bundleOf import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.core.SingleObserver import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.schedulers.Schedulers @@ -179,8 +180,26 @@ class ActiveCallManager( previousNotificationId = notificationId if (type != CallNotificationBuilder.TYPE_ESTABLISHED) { - val notification = CallNotificationBuilder.getCallInProgressNotification(application, type, Recipient.resolved(recipientId), isVideoCall, false) + val requiresAsyncNotificationLoad = Build.VERSION.SDK_INT <= 29 + + val notification = CallNotificationBuilder.getCallInProgressNotification(application, type, Recipient.resolved(recipientId), isVideoCall, requiresAsyncNotificationLoad) NotificationManagerCompat.from(application).notify(notificationId, notification) + + if (requiresAsyncNotificationLoad) { + Single.fromCallable { CallNotificationBuilder.getCallInProgressNotification(application, type, Recipient.resolved(recipientId), isVideoCall, false) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : SingleObserver { + override fun onSuccess(t: Notification) { + if (NotificationManagerCompat.from(application).activeNotifications.any { n -> n.id == notificationId }) { + NotificationManagerCompat.from(application).notify(notificationId, notification!!) + } + } + + override fun onSubscribe(d: Disposable) = Unit + override fun onError(e: Throwable) = Unit + }) + } } else { ActiveCallForegroundService.start(application, recipientId, isVideoCall) } @@ -274,7 +293,7 @@ class ActiveCallManager( @get:RequiresApi(30) override val serviceType: Int - get() = ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC + get() = ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC or ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE private var hangUpRtcOnDeviceCallAnswered: PhoneStateListener? = null private var notification: Notification? = null diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java index 2cc363907f..bad1aca0f1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcCallService.java @@ -87,8 +87,12 @@ public final class WebRtcCallService extends Service implements SignalAudioManag private Disposable lastNotificationDisposable = Disposable.disposed(); private boolean stopping = false; + private static boolean useActiveCallManager() { + return Build.VERSION.SDK_INT >= 34 || RemoteConfig.useActiveCallManager(); + } + public synchronized static void update(@NonNull Context context, int type, @NonNull RecipientId recipientId, boolean isVideoCall) { - if (RemoteConfig.useActiveCallManager()) { + if (useActiveCallManager()) { ActiveCallManager.update(context, type, recipientId, isVideoCall); return; @@ -104,7 +108,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public static void denyCall(@NonNull Context context) { - if (RemoteConfig.useActiveCallManager()) { + if (useActiveCallManager()) { ActiveCallManager.denyCall(); return; } @@ -113,7 +117,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public static void hangup(@NonNull Context context) { - if (RemoteConfig.useActiveCallManager()) { + if (useActiveCallManager()) { ActiveCallManager.hangup(); return; } @@ -122,7 +126,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static void stop(@NonNull Context context) { - if (RemoteConfig.useActiveCallManager()) { + if (useActiveCallManager()) { ActiveCallManager.stop(); return; } @@ -134,7 +138,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static @NonNull PendingIntent denyCallIntent(@NonNull Context context) { - if (RemoteConfig.useActiveCallManager()) { + if (useActiveCallManager()) { return ActiveCallManager.denyCallIntent(context); } @@ -142,7 +146,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static @NonNull PendingIntent hangupIntent(@NonNull Context context) { - if (RemoteConfig.useActiveCallManager()) { + if (useActiveCallManager()) { return ActiveCallManager.hangupIntent(context); } @@ -150,7 +154,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static void sendAudioManagerCommand(@NonNull Context context, @NonNull AudioManagerCommand command) { - if (RemoteConfig.useActiveCallManager()) { + if (useActiveCallManager()) { ActiveCallManager.sendAudioManagerCommand(context, command); return; } @@ -162,7 +166,7 @@ public final class WebRtcCallService extends Service implements SignalAudioManag } public synchronized static void changePowerButtonReceiver(@NonNull Context context, boolean register) { - if (RemoteConfig.useActiveCallManager()) { + if (useActiveCallManager()) { ActiveCallManager.changePowerButtonReceiver(context, register); return; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt index df06dc5854..8b42e12054 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/RemoteConfig.kt @@ -961,7 +961,7 @@ object RemoteConfig { @JvmStatic @get:JvmName("useActiveCallManager") val useActiveCallManager: Boolean by remoteBoolean( - key = "android.calling.useActiveCallManager.5", + key = "android.calling.useActiveCallManager.6", defaultValue = false, hotSwappable = false )