diff --git a/build.gradle b/build.gradle index 30264fab3..4fc29a244 100644 --- a/build.gradle +++ b/build.gradle @@ -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 } diff --git a/src/cheogram/java/com/cheogram/android/ConnectionService.java b/src/cheogram/java/com/cheogram/android/ConnectionService.java index 687020552..ca6e1b263 100644 --- a/src/cheogram/java/com/cheogram/android/ConnectionService.java +++ b/src/cheogram/java/com/cheogram/android/ConnectionService.java @@ -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 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 postDial = new Stack(); protected WeakReference 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);