From 85039faca821fd2313172f0a284ea3a5a12c6e0e Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Mon, 13 Nov 2023 11:43:49 -0500 Subject: [PATCH] If we are in a call, foreground service needs the mic --- .../cheogram/android/ConnectionService.java | 4 ++- .../services/XmppConnectionService.java | 25 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/cheogram/java/com/cheogram/android/ConnectionService.java b/src/cheogram/java/com/cheogram/android/ConnectionService.java index 7c85dadab4acb8071d70b6c7d1e8921bf6b223c3..0cae979e9f1faf25174988af07ee3f294e44152d 100644 --- a/src/cheogram/java/com/cheogram/android/ConnectionService.java +++ b/src/cheogram/java/com/cheogram/android/ConnectionService.java @@ -47,6 +47,7 @@ import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.services.AppRTCAudioManager; import eu.siacs.conversations.services.AvatarService; +import eu.siacs.conversations.services.EventReceiver; import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.ui.RtpSessionActivity; @@ -76,7 +77,8 @@ public class ConnectionService extends android.telecom.ConnectionService { public void onCreate() { // From XmppActivity.connectToBackend Intent intent = new Intent(this, XmppConnectionService.class); - intent.setAction("ui"); + intent.setAction(XmppConnectionService.ACTION_STARTING_CALL); + intent.putExtra(EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE, true); try { startService(intent); } catch (IllegalStateException e) { diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 2a1149cbc0a3aaa8ed50ffb0dbf1003745850b2d..15015e01778a9cef793ba37ad5306ade61bac535 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -223,6 +223,7 @@ public class XmppConnectionService extends Service { public static final String ACTION_FCM_MESSAGE_RECEIVED = "fcm_message_received"; public static final String ACTION_DISMISS_CALL = "dismiss_call"; public static final String ACTION_END_CALL = "end_call"; + public static final String ACTION_STARTING_CALL = "starting_call"; public static final String ACTION_PROVISION_ACCOUNT = "provision_account"; private static final String ACTION_POST_CONNECTIVITY_CHANGE = "eu.siacs.conversations.POST_CONNECTIVITY_CHANGE"; public static final String ACTION_RENEW_UNIFIED_PUSH_ENDPOINTS = "eu.siacs.conversations.UNIFIED_PUSH_RENEW"; @@ -824,7 +825,7 @@ public class XmppConnectionService extends Service { final boolean needsForegroundService = intent != null && intent.getBooleanExtra(EventReceiver.EXTRA_NEEDS_FOREGROUND_SERVICE, false); if (needsForegroundService) { Log.d(Config.LOGTAG, "toggle forced foreground service after receiving event (action=" + action + ")"); - toggleForegroundService(true); + toggleForegroundService(true, action.equals(ACTION_STARTING_CALL)); } final String uuid = intent == null ? null : intent.getStringExtra("uuid"); switch (action) { @@ -1591,20 +1592,20 @@ public class XmppConnectionService extends Service { } public void toggleForegroundService() { - toggleForegroundService(false); + toggleForegroundService(false, false); } public void setOngoingCall(AbstractJingleConnection.Id id, Set media, final boolean reconnecting) { ongoingCall.set(new OngoingCall(id, media, reconnecting)); - toggleForegroundService(false); + toggleForegroundService(false, true); } public void removeOngoingCall() { ongoingCall.set(null); - toggleForegroundService(false); + toggleForegroundService(false, false); } - private void toggleForegroundService(boolean force) { + private void toggleForegroundService(boolean force, boolean needMic) { final boolean status; final OngoingCall ongoing = ongoingCall.get(); final boolean showOngoing = ongoing != null && !diallerIntegrationActive.get(); @@ -1614,12 +1615,12 @@ public class XmppConnectionService extends Service { if (showOngoing) { notification = this.mNotificationService.getOngoingCallNotification(ongoing); id = NotificationService.ONGOING_CALL_NOTIFICATION_ID; - startForegroundOrCatch(id, notification); + startForegroundOrCatch(id, notification, true); mNotificationService.cancel(NotificationService.FOREGROUND_NOTIFICATION_ID); } else { notification = this.mNotificationService.createForegroundNotification(); id = NotificationService.FOREGROUND_NOTIFICATION_ID; - startForegroundOrCatch(id, notification); + startForegroundOrCatch(id, notification, needMic); } if (!mForceForegroundService.get()) { @@ -1639,10 +1640,10 @@ public class XmppConnectionService extends Service { Log.d(Config.LOGTAG, "ForegroundService: " + (status ? "on" : "off")); } - private void startForegroundOrCatch(final int id, final Notification notification) { + private void startForegroundOrCatch(final int id, final Notification notification, boolean needMic) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { - final int foregroundServiceType; + int foregroundServiceType; if (getSystemService(PowerManager.class) .isIgnoringBatteryOptimizations(getPackageName())) { foregroundServiceType = ServiceInfo.FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED; @@ -1656,6 +1657,12 @@ public class XmppConnectionService extends Service { foregroundServiceType = ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE; Log.w(Config.LOGTAG,"falling back to special use foreground service type"); } + + if (needMic && ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) + == PackageManager.PERMISSION_GRANTED) { + foregroundServiceType = ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE; + } + startForeground(id, notification, foregroundServiceType); } else { startForeground(id, notification);