Improved permissions request for calls

This commit is contained in:
Sylvain Berfini 2019-11-21 10:28:28 +01:00
parent eca542ae28
commit a2e1240641
3 changed files with 91 additions and 20 deletions

View file

@ -48,6 +48,7 @@ import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.drawerlayout.widget.DrawerLayout; import androidx.drawerlayout.widget.DrawerLayout;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.ArrayList;
import org.linphone.LinphoneManager; import org.linphone.LinphoneManager;
import org.linphone.R; import org.linphone.R;
import org.linphone.activities.LinphoneGenericActivity; 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 MIC_TO_DISABLE_MUTE = 1;
private static final int WRITE_EXTERNAL_STORAGE_FOR_RECORDING = 2; private static final int WRITE_EXTERNAL_STORAGE_FOR_RECORDING = 2;
private static final int CAMERA_TO_ACCEPT_UPDATE = 3; private static final int CAMERA_TO_ACCEPT_UPDATE = 3;
private static final int ALL_PERMISSIONS = 4;
private static class HideControlsRunnable implements Runnable { private static class HideControlsRunnable implements Runnable {
private WeakReference<CallActivity> mWeakCallActivity; private WeakReference<CallActivity> mWeakCallActivity;
@ -451,6 +453,11 @@ public class CallActivity extends LinphoneGenericActivity
protected void onStart() { protected void onStart() {
super.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(); mCore = LinphoneManager.getCore();
if (mCore != null) { if (mCore != null) {
mCore.setNativeVideoWindowId(mRemoteVideo); mCore.setNativeVideoWindowId(mRemoteVideo);
@ -581,23 +588,37 @@ public class CallActivity extends LinphoneGenericActivity
public void onRequestPermissionsResult( public void onRequestPermissionsResult(
int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
// Permission not granted, won't change anything // Permission not granted, won't change anything
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) return;
switch (requestCode) { if (requestCode == ALL_PERMISSIONS) {
case CAMERA_TO_TOGGLE_VIDEO: for (int index = 0; index < permissions.length; index++) {
LinphoneUtils.reloadVideoDevices(); int granted = grantResults[index];
toggleVideo(); if (granted == PackageManager.PERMISSION_GRANTED) {
break; String permission = permissions[index];
case MIC_TO_DISABLE_MUTE: if (Manifest.permission.RECORD_AUDIO.equals(permission)) {
toggleMic(); toggleMic();
break; } else if (Manifest.permission.CAMERA.equals(permission)) {
case WRITE_EXTERNAL_STORAGE_FOR_RECORDING: LinphoneUtils.reloadVideoDevices();
toggleRecording(); }
break; }
case CAMERA_TO_ACCEPT_UPDATE: }
LinphoneUtils.reloadVideoDevices(); } else {
acceptCallUpdate(true); if (grantResults[0] != PackageManager.PERMISSION_GRANTED) return;
break; 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; return true;
} }
private void checkAndRequestCallPermissions() {
ArrayList<String> 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 @Override
public void onContactsUpdated() { public void onContactsUpdated() {
setCurrentCallContactInformation(); setCurrentCallContactInformation();

View file

@ -277,8 +277,8 @@ public class CallIncomingActivity extends LinphoneGenericActivity {
Log.i("[Permission] Asking for read phone state"); Log.i("[Permission] Asking for read phone state");
permissionsList.add(Manifest.permission.READ_PHONE_STATE); permissionsList.add(Manifest.permission.READ_PHONE_STATE);
} }
if (LinphonePreferences.instance().shouldInitiateVideoCall() if (LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()
|| LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { && mCall.getRemoteParams().videoEnabled()) {
if (camera != PackageManager.PERMISSION_GRANTED) { if (camera != PackageManager.PERMISSION_GRANTED) {
Log.i("[Permission] Asking for camera"); Log.i("[Permission] Asking for camera");
permissionsList.add(Manifest.permission.CAMERA); permissionsList.add(Manifest.permission.CAMERA);

View file

@ -283,8 +283,7 @@ public class CallOutgoingActivity extends LinphoneGenericActivity implements OnC
Log.i("[Permission] Asking for read phone state"); Log.i("[Permission] Asking for read phone state");
permissionsList.add(Manifest.permission.READ_PHONE_STATE); permissionsList.add(Manifest.permission.READ_PHONE_STATE);
} }
if (LinphonePreferences.instance().shouldInitiateVideoCall() if (LinphonePreferences.instance().shouldInitiateVideoCall()) {
|| LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) {
if (camera != PackageManager.PERMISSION_GRANTED) { if (camera != PackageManager.PERMISSION_GRANTED) {
Log.i("[Permission] Asking for camera"); Log.i("[Permission] Asking for camera");
permissionsList.add(Manifest.permission.CAMERA); permissionsList.add(Manifest.permission.CAMERA);