diff --git a/app/src/main/java/org/linphone/call/CallActivity.java b/app/src/main/java/org/linphone/call/CallActivity.java index 8c52ba2a3..e2fd861e1 100644 --- a/app/src/main/java/org/linphone/call/CallActivity.java +++ b/app/src/main/java/org/linphone/call/CallActivity.java @@ -48,6 +48,7 @@ import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.drawerlayout.widget.DrawerLayout; import java.lang.ref.WeakReference; +import java.util.ArrayList; import org.linphone.LinphoneManager; import org.linphone.R; import org.linphone.activities.LinphoneGenericActivity; @@ -81,6 +82,7 @@ public class CallActivity extends LinphoneGenericActivity private static final int MIC_TO_DISABLE_MUTE = 1; private static final int WRITE_EXTERNAL_STORAGE_FOR_RECORDING = 2; private static final int CAMERA_TO_ACCEPT_UPDATE = 3; + private static final int ALL_PERMISSIONS = 4; private static class HideControlsRunnable implements Runnable { private WeakReference mWeakCallActivity; @@ -451,6 +453,11 @@ public class CallActivity extends LinphoneGenericActivity protected void onStart() { super.onStart(); + // This also must be done here in case of an outgoing call accepted + // before user granted or denied permissions + // or if an incoming call was answer from the notification + checkAndRequestCallPermissions(); + mCore = LinphoneManager.getCore(); if (mCore != null) { mCore.setNativeVideoWindowId(mRemoteVideo); @@ -581,23 +588,37 @@ public class CallActivity extends LinphoneGenericActivity public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { // Permission not granted, won't change anything - if (grantResults[0] != PackageManager.PERMISSION_GRANTED) return; - switch (requestCode) { - case CAMERA_TO_TOGGLE_VIDEO: - LinphoneUtils.reloadVideoDevices(); - toggleVideo(); - break; - case MIC_TO_DISABLE_MUTE: - toggleMic(); - break; - case WRITE_EXTERNAL_STORAGE_FOR_RECORDING: - toggleRecording(); - break; - case CAMERA_TO_ACCEPT_UPDATE: - LinphoneUtils.reloadVideoDevices(); - acceptCallUpdate(true); - break; + if (requestCode == ALL_PERMISSIONS) { + for (int index = 0; index < permissions.length; index++) { + int granted = grantResults[index]; + if (granted == PackageManager.PERMISSION_GRANTED) { + String permission = permissions[index]; + if (Manifest.permission.RECORD_AUDIO.equals(permission)) { + toggleMic(); + } else if (Manifest.permission.CAMERA.equals(permission)) { + LinphoneUtils.reloadVideoDevices(); + } + } + } + } else { + if (grantResults[0] != PackageManager.PERMISSION_GRANTED) return; + switch (requestCode) { + case CAMERA_TO_TOGGLE_VIDEO: + LinphoneUtils.reloadVideoDevices(); + toggleVideo(); + break; + case MIC_TO_DISABLE_MUTE: + toggleMic(); + break; + case WRITE_EXTERNAL_STORAGE_FOR_RECORDING: + toggleRecording(); + break; + case CAMERA_TO_ACCEPT_UPDATE: + LinphoneUtils.reloadVideoDevices(); + acceptCallUpdate(true); + break; + } } } @@ -620,6 +641,57 @@ public class CallActivity extends LinphoneGenericActivity return true; } + private void checkAndRequestCallPermissions() { + ArrayList permissionsList = new ArrayList<>(); + + int recordAudio = + getPackageManager() + .checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()); + Log.i( + "[Permission] Record audio permission is " + + (recordAudio == PackageManager.PERMISSION_GRANTED + ? "granted" + : "denied")); + int camera = + getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()); + Log.i( + "[Permission] Camera permission is " + + (camera == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + + int readPhoneState = + getPackageManager() + .checkPermission(Manifest.permission.READ_PHONE_STATE, getPackageName()); + Log.i( + "[Permission] Read phone state permission is " + + (camera == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + + if (recordAudio != PackageManager.PERMISSION_GRANTED) { + Log.i("[Permission] Asking for record audio"); + permissionsList.add(Manifest.permission.RECORD_AUDIO); + } + if (readPhoneState != PackageManager.PERMISSION_GRANTED) { + Log.i("[Permission] Asking for read phone state"); + permissionsList.add(Manifest.permission.READ_PHONE_STATE); + } + + Call call = mCore.getCurrentCall(); + if (LinphonePreferences.instance().shouldInitiateVideoCall() + || (LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests() + && call != null + && call.getRemoteParams().videoEnabled())) { + if (camera != PackageManager.PERMISSION_GRANTED) { + Log.i("[Permission] Asking for camera"); + permissionsList.add(Manifest.permission.CAMERA); + } + } + + if (permissionsList.size() > 0) { + String[] permissions = new String[permissionsList.size()]; + permissions = permissionsList.toArray(permissions); + ActivityCompat.requestPermissions(this, permissions, ALL_PERMISSIONS); + } + } + @Override public void onContactsUpdated() { setCurrentCallContactInformation(); diff --git a/app/src/main/java/org/linphone/call/CallIncomingActivity.java b/app/src/main/java/org/linphone/call/CallIncomingActivity.java index db7b8d05e..238eb5d52 100644 --- a/app/src/main/java/org/linphone/call/CallIncomingActivity.java +++ b/app/src/main/java/org/linphone/call/CallIncomingActivity.java @@ -277,8 +277,8 @@ public class CallIncomingActivity extends LinphoneGenericActivity { Log.i("[Permission] Asking for read phone state"); permissionsList.add(Manifest.permission.READ_PHONE_STATE); } - if (LinphonePreferences.instance().shouldInitiateVideoCall() - || LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { + if (LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests() + && mCall.getRemoteParams().videoEnabled()) { if (camera != PackageManager.PERMISSION_GRANTED) { Log.i("[Permission] Asking for camera"); permissionsList.add(Manifest.permission.CAMERA); diff --git a/app/src/main/java/org/linphone/call/CallOutgoingActivity.java b/app/src/main/java/org/linphone/call/CallOutgoingActivity.java index 90d5c1e15..0bc10864e 100644 --- a/app/src/main/java/org/linphone/call/CallOutgoingActivity.java +++ b/app/src/main/java/org/linphone/call/CallOutgoingActivity.java @@ -283,8 +283,7 @@ public class CallOutgoingActivity extends LinphoneGenericActivity implements OnC Log.i("[Permission] Asking for read phone state"); permissionsList.add(Manifest.permission.READ_PHONE_STATE); } - if (LinphonePreferences.instance().shouldInitiateVideoCall() - || LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { + if (LinphonePreferences.instance().shouldInitiateVideoCall()) { if (camera != PackageManager.PERMISSION_GRANTED) { Log.i("[Permission] Asking for camera"); permissionsList.add(Manifest.permission.CAMERA);