Ask user for microphone permission from dialler integration

We can't ask them for it directly.  The library I am using here will first check
if the permission is already granted.  If so onPermissionGranted will fire and
we will start the call.  If not, the Connection will be created in a dialling
state and a notification will appear saying that the app needs additional
permissions.

Once the user taps the notification they will then be asked to allow microphone
access.  If they say yes, the call will proceed.  If they deny, the call will terminate.
This commit is contained in:
Stephen Paul Weber 2022-02-22 16:57:52 -05:00
parent 4b0ea5c7cd
commit 8c08dee83f
No known key found for this signature in database
GPG key ID: D11C2911CE519CDE
2 changed files with 35 additions and 10 deletions

View file

@ -91,6 +91,7 @@ dependencies {
implementation 'com.google.guava:guava:30.1.1-android'
implementation 'io.michaelrocks:libphonenumber-android:8.12.36'
implementation 'io.github.nishkarsh:android-permissions:2.0.54'
implementation urlFile('https://cloudflare-ipfs.com/ipfs/QmeqMiLxHi8AAjXobxr3QTfa1bSSLyAu86YviAqQnjxCjM/libwebrtc.aar', 'libwebrtc.aar')
// INSERT
}

View file

@ -2,6 +2,7 @@ package com.cheogram.android;
import java.lang.ref.WeakReference;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.Stack;
@ -17,9 +18,12 @@ import android.telecom.StatusHints;
import android.telecom.TelecomManager;
import android.telephony.PhoneNumberUtils;
import android.Manifest;
import androidx.core.content.ContextCompat;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.Bundle;
@ -27,6 +31,9 @@ import android.os.IBinder;
import android.os.Parcel;
import android.util.Log;
import com.intentfilter.androidpermissions.PermissionManager;
import com.intentfilter.androidpermissions.models.DeniedPermissions;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.services.AppRTCAudioManager;
import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder;
@ -96,13 +103,27 @@ public class ConnectionService extends android.telecom.ConnectionService {
Account account = xmppConnectionService.findAccountByJid(Jid.of(gateway[0]));
Jid with = Jid.ofLocalAndDomain(tel, gateway[1]);
String sessionId = xmppConnectionService.getJingleConnectionManager().proposeJingleRtpSession(
account,
with,
ImmutableSet.of(Media.AUDIO)
);
CheogramConnection connection = new CheogramConnection(account, with, postDial);
PermissionManager permissionManager = PermissionManager.getInstance(this);
Set<String> permissions = new HashSet();
permissions.add(Manifest.permission.RECORD_AUDIO);
permissionManager.checkPermissions(permissions, new PermissionManager.PermissionRequestListener() {
@Override
public void onPermissionGranted() {
connection.setSessionId(xmppConnectionService.getJingleConnectionManager().proposeJingleRtpSession(
account,
with,
ImmutableSet.of(Media.AUDIO)
));
}
@Override
public void onPermissionDenied(DeniedPermissions deniedPermissions) {
connection.setDisconnected(new DisconnectCause(DisconnectCause.ERROR));
}
});
Connection connection = new CheogramConnection(account, with, sessionId, postDial);
connection.setAddress(
Uri.fromParts("tel", tel, null), // Normalized tel as tel: URI
TelecomManager.PRESENTATION_ALLOWED
@ -128,15 +149,14 @@ public class ConnectionService extends android.telecom.ConnectionService {
public class CheogramConnection extends Connection implements XmppConnectionService.OnJingleRtpConnectionUpdate {
protected Account account;
protected Jid with;
protected String sessionId;
protected String sessionId = null;
protected Stack<String> postDial = new Stack();
protected WeakReference<JingleRtpConnection> rtpConnection = null;
CheogramConnection(Account account, Jid with, String sessionId, String postDialString) {
CheogramConnection(Account account, Jid with, String postDialString) {
super();
this.account = account;
this.with = with;
this.sessionId = sessionId;
if (postDialString != null) {
for (int i = postDialString.length() - 1; i >= 0; i--) {
@ -145,9 +165,13 @@ public class ConnectionService extends android.telecom.ConnectionService {
}
}
public void setSessionId(final String sessionId) {
this.sessionId = sessionId;
}
@Override
public void onJingleRtpConnectionUpdate(final Account account, final Jid with, final String sessionId, final RtpEndUserState state) {
if (!sessionId.equals(this.sessionId)) return;
if (sessionId == null || !sessionId.equals(this.sessionId)) return;
if (rtpConnection == null) {
this.with = with; // Store full JID of connection
rtpConnection = xmppConnectionService.getJingleConnectionManager().findJingleRtpConnection(account, with, sessionId);