do not use Dialer UI for incoming calls if audio permission is not granted

We cannot request new permissions when Dialer UI is shown. For incoming
calls, if the Dialer UI is displayed over keyguard, then the user may
not even be able to see the permission notifications that we use for
outgoing calls.

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.
This commit is contained in:
Peter Cai 2022-03-11 21:54:59 -05:00
parent 3ba7f3e207
commit 80ac659d7c
2 changed files with 10 additions and 18 deletions

View file

@ -275,24 +275,7 @@ public class ConnectionService extends android.telecom.ConnectionService {
xmppConnectionService.getJingleConnectionManager()
.findJingleRtpConnection(account, with, sessionId);
// Request recording permission only when answering
Set<String> 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

View file

@ -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,13 @@ public class NotificationService {
}
private synchronized boolean tryRingingWithDialerUI(final AbstractJingleConnection.Id id, final Set<Media> media) {
if (mXmppConnectionService.checkSelfPermission(Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
// We cannot request audio permission in Dialer UI
// when Dialer is shown over keyguard, the user cannot even necessarily
// see notifications.
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");