diff --git a/src/org/linphone/CallActivity.java b/src/org/linphone/CallActivity.java index cd4c2c498..321d0a80a 100644 --- a/src/org/linphone/CallActivity.java +++ b/src/org/linphone/CallActivity.java @@ -87,6 +87,7 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve private final static int SECONDS_BEFORE_DENYING_CALL_UPDATE = 30000; private static final int PERMISSIONS_REQUEST_CAMERA = 202; private static final int PERMISSIONS_ENABLED_CAMERA = 203; + private static final int PERMISSIONS_ENABLED_MIC = 204; private static CallActivity instance; @@ -446,15 +447,23 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve } public void checkAndRequestPermission(String permission, int result) { - if (getPackageManager().checkPermission(permission, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - if (!ActivityCompat.shouldShowRequestPermissionRationale(this,permission)){ - ActivityCompat.requestPermissions(this, new String[]{permission}, result); + int permissionGranted = getPackageManager().checkPermission(permission, getPackageName()); + Log.i("[Permission] " + permission + " is " + (permissionGranted == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + + if (permissionGranted != PackageManager.PERMISSION_GRANTED) { + if (LinphonePreferences.instance().firstTimeAskingForPermission(permission) || ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) { + Log.i("[Permission] Asking for " + permission); + ActivityCompat.requestPermissions(this, new String[] { permission }, result); } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, final int[] grantResults) { + for (int i = 0; i < permissions.length; i++) { + Log.i("[Permission] " + permissions[i] + " is " + (grantResults[i] == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + } + switch (requestCode) { case PERMISSIONS_REQUEST_CAMERA: UIThreadDispatcher.dispatch(new Runnable() { @@ -472,6 +481,16 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve } }); break; + case PERMISSIONS_ENABLED_MIC: + UIThreadDispatcher.dispatch(new Runnable() { + @Override + public void run() { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + toggleMicro(); + } + } + }); + break; } } @@ -518,6 +537,9 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve video.setImageResource(R.drawable.camera_button); } } + if (getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) { + video.setImageResource(R.drawable.camera_button); + } if (isSpeakerEnabled) { speaker.setImageResource(R.drawable.speaker_selected); @@ -525,6 +547,9 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve speaker.setImageResource(R.drawable.speaker_default); } + if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) != PackageManager.PERMISSION_GRANTED) { + isMicMuted = true; + } if (isMicMuted) { micro.setImageResource(R.drawable.micro_selected); } else { @@ -604,14 +629,28 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve } if (id == R.id.video) { - if (getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) == PackageManager.PERMISSION_GRANTED) { + int camera = getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()); + Log.i("[Permission] Camera permission is " + (camera == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + + if (camera == PackageManager.PERMISSION_GRANTED) { disableVideo(isVideoEnabled(LinphoneManager.getLc().getCurrentCall())); } else { - checkAndRequestPermission(Manifest.permission.CAMERA, PERMISSIONS_ENABLED_CAMERA); + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { + checkAndRequestPermission(Manifest.permission.CAMERA, PERMISSIONS_ENABLED_CAMERA); + } } } else if (id == R.id.micro) { - toggleMicro(); + int recordAudio = getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()); + Log.i("[Permission] Record audio permission is " + (recordAudio == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + + if (recordAudio == PackageManager.PERMISSION_GRANTED) { + toggleMicro(); + } else { + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.RECORD_AUDIO) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { + checkAndRequestPermission(Manifest.permission.RECORD_AUDIO, PERMISSIONS_ENABLED_MIC); + } + } } else if (id == R.id.speaker) { toggleSpeaker(); @@ -1378,10 +1417,17 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve delete.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - if (getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) == PackageManager.PERMISSION_GRANTED || !ActivityCompat.shouldShowRequestPermissionRationale(CallActivity.this, Manifest.permission.CAMERA)) { + int camera = getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()); + Log.i("[Permission] Camera permission is " + (camera == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + + if (camera == PackageManager.PERMISSION_GRANTED) { CallActivity.instance().acceptCallUpdate(true); } else { - checkAndRequestPermission(Manifest.permission.CAMERA, PERMISSIONS_REQUEST_CAMERA); + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale(CallActivity.this, Manifest.permission.CAMERA)) { + checkAndRequestPermission(Manifest.permission.CAMERA, PERMISSIONS_REQUEST_CAMERA); + } else { + CallActivity.instance().acceptCallUpdate(false); + } } dialog.dismiss(); diff --git a/src/org/linphone/CallIncomingActivity.java b/src/org/linphone/CallIncomingActivity.java index 1aa118f2f..e33b052ad 100644 --- a/src/org/linphone/CallIncomingActivity.java +++ b/src/org/linphone/CallIncomingActivity.java @@ -201,8 +201,6 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig } } }; - - checkAndRequestCallPermissions(); super.onCreate(savedInstanceState); instance = this; @@ -235,6 +233,8 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig finish(); return; } + + LinphoneAddress address = mCall.getRemoteAddress(); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(address); if (contact != null) { @@ -245,6 +245,12 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig } number.setText(address.asStringUriOnly()); } + + @Override + protected void onStart() { + super.onStart(); + checkAndRequestCallPermissions(); + } @Override protected void onPause() { @@ -324,18 +330,38 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig private void checkAndRequestCallPermissions() { ArrayList permissionsList = new ArrayList(); - if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO) && getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - permissionsList.add(Manifest.permission.RECORD_AUDIO); - } - if (LinphonePreferences.instance().shouldInitiateVideoCall() || LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { - if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) && getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - permissionsList.add(Manifest.permission.CAMERA); + + 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")); + + if (recordAudio != PackageManager.PERMISSION_GRANTED) { + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.RECORD_AUDIO) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { + Log.i("[Permission] Asking for record audio"); + permissionsList.add(Manifest.permission.RECORD_AUDIO); } } + if (LinphonePreferences.instance().shouldInitiateVideoCall() || LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { + if (camera != PackageManager.PERMISSION_GRANTED) { + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { + 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, 0); } } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + for (int i = 0; i < permissions.length; i++) { + Log.i("[Permission] " + permissions[i] + " is " + (grantResults[i] == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + } + } } \ No newline at end of file diff --git a/src/org/linphone/CallOutgoingActivity.java b/src/org/linphone/CallOutgoingActivity.java index ce24b64de..b3ad9b00c 100644 --- a/src/org/linphone/CallOutgoingActivity.java +++ b/src/org/linphone/CallOutgoingActivity.java @@ -128,8 +128,6 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{ } } }; - - checkAndRequestCallPermissions(); super.onCreate(savedInstanceState); instance = this; @@ -170,6 +168,12 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{ } number.setText(address.asStringUriOnly()); } + + @Override + protected void onStart() { + super.onStart(); + checkAndRequestCallPermissions(); + } @Override protected void onPause() { @@ -242,18 +246,38 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{ private void checkAndRequestCallPermissions() { ArrayList permissionsList = new ArrayList(); - if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO) && getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - permissionsList.add(Manifest.permission.RECORD_AUDIO); - } - if (LinphonePreferences.instance().shouldInitiateVideoCall() || LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { - if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) && getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - permissionsList.add(Manifest.permission.CAMERA); + + 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")); + + if (recordAudio != PackageManager.PERMISSION_GRANTED) { + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.RECORD_AUDIO) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { + Log.i("[Permission] Asking for record audio"); + permissionsList.add(Manifest.permission.RECORD_AUDIO); } } + if (LinphonePreferences.instance().shouldInitiateVideoCall() || LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { + if (camera != PackageManager.PERMISSION_GRANTED) { + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { + 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, 0); } } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + for (int i = 0; i < permissions.length; i++) { + Log.i("[Permission] " + permissions[i] + " is " + (grantResults[i] == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + } + } } diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 8e83ed2f2..f02ade576 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -103,8 +103,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta private static final int FIRST_LOGIN_ACTIVITY = 101; private static final int REMOTE_PROVISIONING_LOGIN_ACTIVITY = 102; private static final int CALL_ACTIVITY = 19; - private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 201; - private static final int PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL = 203; private static final int PERMISSIONS_REQUEST_OVERLAY = 206; private static final int PERMISSIONS_REQUEST_SYNC = 207; @@ -235,17 +233,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta @Override public void callState(LinphoneCore lc, LinphoneCall call, LinphoneCall.State state, String message) { if (state == State.IncomingReceived) { - if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || !ActivityCompat.shouldShowRequestPermissionRationale(LinphoneActivity.this, Manifest.permission.RECORD_AUDIO)) { - startActivity(new Intent(LinphoneActivity.instance(), CallIncomingActivity.class)); - } else { - checkAndRequestCallPermissions(true); - } + startActivity(new Intent(LinphoneActivity.instance(), CallIncomingActivity.class)); } else if (state == State.OutgoingInit || state == State.OutgoingProgress) { - if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || !ActivityCompat.shouldShowRequestPermissionRationale(LinphoneActivity.this, Manifest.permission.RECORD_AUDIO)) { - startActivity(new Intent(LinphoneActivity.instance(), CallOutgoingActivity.class)); - } else { - checkAndRequestCallPermissions(false); - } + startActivity(new Intent(LinphoneActivity.instance(), CallOutgoingActivity.class)); } else if (state == State.CallEnd || state == State.Error || state == State.CallReleased) { resetClassicMenuLayoutAndGoBackToCallIfStillRunning(); } @@ -1158,7 +1148,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta } public boolean checkAndRequestOverlayPermission() { + Log.i("[Permission] Draw overlays permission is " + (Compatibility.canDrawOverlays(this) ? "granted" : "denied")); if (!Compatibility.canDrawOverlays(this)) { + Log.i("[Permission] Asking for overlay"); Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, PERMISSIONS_REQUEST_OVERLAY); return false; @@ -1186,30 +1178,25 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta checkAndRequestPermission(Manifest.permission.WRITE_CONTACTS, 0); } - public void checkAndRequestCallPermissions(boolean isIncomingCall) { - ArrayList permissionsList = new ArrayList(); - if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO) && getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - permissionsList.add(Manifest.permission.RECORD_AUDIO); - } - if (LinphonePreferences.instance().shouldInitiateVideoCall() || LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { - if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) && getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - permissionsList.add(Manifest.permission.CAMERA); - } - } - if (permissionsList.size() > 0) { - String[] permissions = new String[permissionsList.size()]; - permissions = permissionsList.toArray(permissions); - ActivityCompat.requestPermissions(this, permissions, isIncomingCall ? PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL : PERMISSIONS_REQUEST_RECORD_AUDIO); - } - } - public void checkAndRequestPermissionsToSendImage() { ArrayList permissionsList = new ArrayList(); - if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE) && getPackageManager().checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - permissionsList.add(Manifest.permission.READ_EXTERNAL_STORAGE); + + int readExternalStorage = getPackageManager().checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, getPackageName()); + Log.i("[Permission] Read external storage permission is " + (readExternalStorage == 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")); + + if (readExternalStorage != PackageManager.PERMISSION_GRANTED) { + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.READ_EXTERNAL_STORAGE) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { + Log.i("[Permission] Asking for read external storage"); + permissionsList.add(Manifest.permission.READ_EXTERNAL_STORAGE); + } } - if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) && getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - permissionsList.add(Manifest.permission.CAMERA); + if (camera != PackageManager.PERMISSION_GRANTED) { + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { + Log.i("[Permission] Asking for camera"); + permissionsList.add(Manifest.permission.CAMERA); + } } if (permissionsList.size() > 0) { String[] permissions = new String[permissionsList.size()]; @@ -1223,20 +1210,24 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta } public void checkAndRequestPermission(String permission, int result) { - if (getPackageManager().checkPermission(permission, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, new String[]{permission}, result); + int permissionGranted = getPackageManager().checkPermission(permission, getPackageName()); + Log.i("[Permission] " + permission + " is " + (permissionGranted == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + + if (permissionGranted != PackageManager.PERMISSION_GRANTED) { + if (LinphonePreferences.instance().firstTimeAskingForPermission(permission) || ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) { + Log.i("[Permission] Asking for " + permission); + ActivityCompat.requestPermissions(this, new String[] { permission }, result); + } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + for (int i = 0; i < permissions.length; i++) { + Log.i("[Permission] " + permissions[i] + " is " + (grantResults[i] == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + } + switch (requestCode) { - case PERMISSIONS_REQUEST_RECORD_AUDIO: - startActivity(new Intent(this, CallOutgoingActivity.class)); - break; - case PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL: - startActivity(new Intent(this, CallIncomingActivity.class)); - break; case PERMISSIONS_REQUEST_SYNC: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { ContactsManager.getInstance().initializeSyncAccount(getApplicationContext(), getContentResolver()); @@ -1283,18 +1274,11 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta if (LinphoneManager.getLc().getCalls().length > 0) { LinphoneCall call = LinphoneManager.getLc().getCalls()[0]; LinphoneCall.State callState = call.getState(); + if (callState == State.IncomingReceived) { - if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || !ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { - startActivity(new Intent(this, CallIncomingActivity.class)); - } else { - checkAndRequestCallPermissions(true); - } + startActivity(new Intent(this, CallIncomingActivity.class)); } else if (callState == State.OutgoingInit || callState == State.OutgoingProgress || callState == State.OutgoingRinging) { - if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || !ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { - startActivity(new Intent(this, CallOutgoingActivity.class)); - } else { - checkAndRequestCallPermissions(false); - } + startActivity(new Intent(this, CallOutgoingActivity.class)); } else { if (call.getCurrentParamsCopy().getVideoEnabled()) { startVideoActivity(call); @@ -1373,11 +1357,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta if (CallActivity.isInstanciated()) { CallActivity.instance().startIncomingCallActivity(); } else { - if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || !ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { - startActivity(new Intent(this, CallIncomingActivity.class)); - } else { - checkAndRequestCallPermissions(true); - } + startActivity(new Intent(this, CallIncomingActivity.class)); } } } diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java index 43fc4a767..52f44440c 100644 --- a/src/org/linphone/LinphonePreferences.java +++ b/src/org/linphone/LinphonePreferences.java @@ -1319,4 +1319,12 @@ public class LinphonePreferences { public void setLimeEncryption(LinphoneLimeState lime) { getLc().setLimeEncryption(lime); } + + public boolean firstTimeAskingForPermission(String permission) { + boolean firstTime = getConfig().getBool("app", permission, true); + if (firstTime) { + getConfig().setBool("app", permission, false); + } + return firstTime; + } } diff --git a/src/org/linphone/assistant/AssistantActivity.java b/src/org/linphone/assistant/AssistantActivity.java index 9a0a99e59..a1b1216a5 100644 --- a/src/org/linphone/assistant/AssistantActivity.java +++ b/src/org/linphone/assistant/AssistantActivity.java @@ -27,7 +27,6 @@ import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneAddress.TransportType; import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCore.RegistrationState; -import org.linphone.core.LinphoneCore.RemoteProvisioningState; import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneCoreListenerBase; @@ -229,8 +228,12 @@ private static AssistantActivity instance; } public void checkAndRequestAudioPermission() { - if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) != PackageManager.PERMISSION_GRANTED) { - if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { + int recordAudio = getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()); + Log.i("[Permission] Record audio permission is " + (recordAudio == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + + if (recordAudio != PackageManager.PERMISSION_GRANTED) { + if (LinphonePreferences.instance().firstTimeAskingForPermission(Manifest.permission.RECORD_AUDIO) || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { + Log.i("[Permission] Asking for record audio"); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSIONS_REQUEST_RECORD_AUDIO); } } @@ -238,8 +241,12 @@ private static AssistantActivity instance; @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + for (int i = 0; i < permissions.length; i++) { + Log.i("[Permission] " + permissions[i] + " is " + (grantResults[i] == PackageManager.PERMISSION_GRANTED ? "granted" : "denied")); + } + if (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO) { - if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { launchEchoCancellerCalibration(true); } else { success();