From 0f581f889a654f5af4fd54f857c402e4a40ad3bf Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Fri, 11 Mar 2022 17:43:41 -0500 Subject: [PATCH] do not use Dialer UI for incoming calls if audio permission is not granted We cannot always request new permissions when Dialer UI is shown. For example, Dialer UI can be shown over keyguard, which doesn't allow other dialogs (like the permission request dialog) to be displayed. However it doesn't return the failed response either, making ConnectionService kind of stuck. If we just do not use the Dialer UI when the permission is not granted, it is at most a minor annoyance for the first time. After the user has accepted an incoming call even just once, the permission will be granted, and the Dialer integration will start to work just fine. --- .../cheogram/android/ConnectionService.java | 19 +------------------ .../services/NotificationService.java | 8 ++++++++ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/cheogram/java/com/cheogram/android/ConnectionService.java b/src/cheogram/java/com/cheogram/android/ConnectionService.java index 89d00962a..1a31faa21 100644 --- a/src/cheogram/java/com/cheogram/android/ConnectionService.java +++ b/src/cheogram/java/com/cheogram/android/ConnectionService.java @@ -268,24 +268,7 @@ public class ConnectionService extends android.telecom.ConnectionService { xmppConnectionService.getJingleConnectionManager() .findJingleRtpConnection(account, with, sessionId); - // Request recording permission only when answering - Set permissions = new HashSet<>(); - permissions.add(Manifest.permission.RECORD_AUDIO); - mPermissionManager.checkPermissions(permissions, new PermissionManager.PermissionRequestListener() { - @Override - public void onPermissionGranted() { - if (rtpConnection == null || rtpConnection.get() == null) { - setDisconnected(new DisconnectCause(DisconnectCause.ERROR)); - } else { - rtpConnection.get().acceptCall(); - } - } - - @Override - public void onPermissionDenied(DeniedPermissions deniedPermissions) { - setDisconnected(new DisconnectCause(DisconnectCause.ERROR)); - } - }); + rtpConnection.get().acceptCall(); } @Override diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 62baeccd5..b73eb4994 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -1,5 +1,6 @@ package eu.siacs.conversations.services; +import android.Manifest; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; @@ -8,6 +9,7 @@ import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Typeface; @@ -427,6 +429,12 @@ public class NotificationService { } private synchronized boolean tryRingingWithDialerUI(final AbstractJingleConnection.Id id, final Set media) { + if (mXmppConnectionService.checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { + // We cannot always request audio permission in Dialer UI + // e.g. when Dialer is shown over keyguard + return false; + } + if (media.size() != 1 || !media.contains(Media.AUDIO)) { // Currently our ConnectionService only handles single audio calls Log.w(Config.LOGTAG, "only audio calls can be handled by cheogram connection service");