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,8 +588,21 @@ 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;
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) { switch (requestCode) {
case CAMERA_TO_TOGGLE_VIDEO: case CAMERA_TO_TOGGLE_VIDEO:
LinphoneUtils.reloadVideoDevices(); LinphoneUtils.reloadVideoDevices();
@ -600,6 +620,7 @@ public class CallActivity extends LinphoneGenericActivity
break; break;
} }
} }
}
private boolean checkPermission(String permission) { private boolean checkPermission(String permission) {
int granted = getPackageManager().checkPermission(permission, getPackageName()); int granted = getPackageManager().checkPermission(permission, getPackageName());
@ -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);