Fixed issues with permissions + added logs

This commit is contained in:
Sylvain Berfini 2016-07-18 11:54:43 +02:00
parent 7f4fdba689
commit 4b00bfcb55
6 changed files with 175 additions and 84 deletions

View file

@ -87,6 +87,7 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
private final static int SECONDS_BEFORE_DENYING_CALL_UPDATE = 30000; private final static int SECONDS_BEFORE_DENYING_CALL_UPDATE = 30000;
private static final int PERMISSIONS_REQUEST_CAMERA = 202; private static final int PERMISSIONS_REQUEST_CAMERA = 202;
private static final int PERMISSIONS_ENABLED_CAMERA = 203; private static final int PERMISSIONS_ENABLED_CAMERA = 203;
private static final int PERMISSIONS_ENABLED_MIC = 204;
private static CallActivity instance; private static CallActivity instance;
@ -446,15 +447,23 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
} }
public void checkAndRequestPermission(String permission, int result) { public void checkAndRequestPermission(String permission, int result) {
if (getPackageManager().checkPermission(permission, getPackageName()) != PackageManager.PERMISSION_GRANTED) { int permissionGranted = getPackageManager().checkPermission(permission, getPackageName());
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,permission)){ Log.i("[Permission] " + permission + " is " + (permissionGranted == PackageManager.PERMISSION_GRANTED ? "granted" : "denied"));
ActivityCompat.requestPermissions(this, new String[]{permission}, result);
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 @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, final int[] grantResults) { 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) { switch (requestCode) {
case PERMISSIONS_REQUEST_CAMERA: case PERMISSIONS_REQUEST_CAMERA:
UIThreadDispatcher.dispatch(new Runnable() { UIThreadDispatcher.dispatch(new Runnable() {
@ -472,6 +481,16 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
} }
}); });
break; 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); video.setImageResource(R.drawable.camera_button);
} }
} }
if (getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
video.setImageResource(R.drawable.camera_button);
}
if (isSpeakerEnabled) { if (isSpeakerEnabled) {
speaker.setImageResource(R.drawable.speaker_selected); speaker.setImageResource(R.drawable.speaker_selected);
@ -525,6 +547,9 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
speaker.setImageResource(R.drawable.speaker_default); speaker.setImageResource(R.drawable.speaker_default);
} }
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
isMicMuted = true;
}
if (isMicMuted) { if (isMicMuted) {
micro.setImageResource(R.drawable.micro_selected); micro.setImageResource(R.drawable.micro_selected);
} else { } else {
@ -604,14 +629,28 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
} }
if (id == R.id.video) { 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())); disableVideo(isVideoEnabled(LinphoneManager.getLc().getCurrentCall()));
} else { } 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) { 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) { else if (id == R.id.speaker) {
toggleSpeaker(); toggleSpeaker();
@ -1378,10 +1417,17 @@ public class CallActivity extends Activity implements OnClickListener, SensorEve
delete.setOnClickListener(new OnClickListener() { delete.setOnClickListener(new OnClickListener() {
@Override @Override
public void onClick(View view) { 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); CallActivity.instance().acceptCallUpdate(true);
} else { } 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(); dialog.dismiss();

View file

@ -201,8 +201,6 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig
} }
} }
}; };
checkAndRequestCallPermissions();
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
instance = this; instance = this;
@ -235,6 +233,8 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig
finish(); finish();
return; return;
} }
LinphoneAddress address = mCall.getRemoteAddress(); LinphoneAddress address = mCall.getRemoteAddress();
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(address); LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(address);
if (contact != null) { if (contact != null) {
@ -245,6 +245,12 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig
} }
number.setText(address.asStringUriOnly()); number.setText(address.asStringUriOnly());
} }
@Override
protected void onStart() {
super.onStart();
checkAndRequestCallPermissions();
}
@Override @Override
protected void onPause() { protected void onPause() {
@ -324,18 +330,38 @@ public class CallIncomingActivity extends Activity implements LinphoneSliderTrig
private void checkAndRequestCallPermissions() { private void checkAndRequestCallPermissions() {
ArrayList<String> permissionsList = new ArrayList<String>(); ArrayList<String> permissionsList = new ArrayList<String>();
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO) && getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(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 (LinphonePreferences.instance().shouldInitiateVideoCall() || LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { int camera = getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName());
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) && getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) { Log.i("[Permission] Camera permission is " + (camera == PackageManager.PERMISSION_GRANTED ? "granted" : "denied"));
permissionsList.add(Manifest.permission.CAMERA);
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) { if (permissionsList.size() > 0) {
String[] permissions = new String[permissionsList.size()]; String[] permissions = new String[permissionsList.size()];
permissions = permissionsList.toArray(permissions); permissions = permissionsList.toArray(permissions);
ActivityCompat.requestPermissions(this, permissions, 0); 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"));
}
}
} }

View file

@ -128,8 +128,6 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{
} }
} }
}; };
checkAndRequestCallPermissions();
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
instance = this; instance = this;
@ -170,6 +168,12 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{
} }
number.setText(address.asStringUriOnly()); number.setText(address.asStringUriOnly());
} }
@Override
protected void onStart() {
super.onStart();
checkAndRequestCallPermissions();
}
@Override @Override
protected void onPause() { protected void onPause() {
@ -242,18 +246,38 @@ public class CallOutgoingActivity extends Activity implements OnClickListener{
private void checkAndRequestCallPermissions() { private void checkAndRequestCallPermissions() {
ArrayList<String> permissionsList = new ArrayList<String>(); ArrayList<String> permissionsList = new ArrayList<String>();
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO) && getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(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 (LinphonePreferences.instance().shouldInitiateVideoCall() || LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) { int camera = getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName());
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) && getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) { Log.i("[Permission] Camera permission is " + (camera == PackageManager.PERMISSION_GRANTED ? "granted" : "denied"));
permissionsList.add(Manifest.permission.CAMERA);
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) { if (permissionsList.size() > 0) {
String[] permissions = new String[permissionsList.size()]; String[] permissions = new String[permissionsList.size()];
permissions = permissionsList.toArray(permissions); permissions = permissionsList.toArray(permissions);
ActivityCompat.requestPermissions(this, permissions, 0); 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"));
}
}
} }

View file

@ -103,8 +103,6 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
private static final int FIRST_LOGIN_ACTIVITY = 101; private static final int FIRST_LOGIN_ACTIVITY = 101;
private static final int REMOTE_PROVISIONING_LOGIN_ACTIVITY = 102; private static final int REMOTE_PROVISIONING_LOGIN_ACTIVITY = 102;
private static final int CALL_ACTIVITY = 19; 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_OVERLAY = 206;
private static final int PERMISSIONS_REQUEST_SYNC = 207; private static final int PERMISSIONS_REQUEST_SYNC = 207;
@ -235,17 +233,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
@Override @Override
public void callState(LinphoneCore lc, LinphoneCall call, LinphoneCall.State state, String message) { public void callState(LinphoneCore lc, LinphoneCall call, LinphoneCall.State state, String message) {
if (state == State.IncomingReceived) { 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));
startActivity(new Intent(LinphoneActivity.instance(), CallIncomingActivity.class));
} else {
checkAndRequestCallPermissions(true);
}
} else if (state == State.OutgoingInit || state == State.OutgoingProgress) { } 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));
startActivity(new Intent(LinphoneActivity.instance(), CallOutgoingActivity.class));
} else {
checkAndRequestCallPermissions(false);
}
} else if (state == State.CallEnd || state == State.Error || state == State.CallReleased) { } else if (state == State.CallEnd || state == State.Error || state == State.CallReleased) {
resetClassicMenuLayoutAndGoBackToCallIfStillRunning(); resetClassicMenuLayoutAndGoBackToCallIfStillRunning();
} }
@ -1158,7 +1148,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
} }
public boolean checkAndRequestOverlayPermission() { public boolean checkAndRequestOverlayPermission() {
Log.i("[Permission] Draw overlays permission is " + (Compatibility.canDrawOverlays(this) ? "granted" : "denied"));
if (!Compatibility.canDrawOverlays(this)) { if (!Compatibility.canDrawOverlays(this)) {
Log.i("[Permission] Asking for overlay");
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, PERMISSIONS_REQUEST_OVERLAY); startActivityForResult(intent, PERMISSIONS_REQUEST_OVERLAY);
return false; return false;
@ -1186,30 +1178,25 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
checkAndRequestPermission(Manifest.permission.WRITE_CONTACTS, 0); checkAndRequestPermission(Manifest.permission.WRITE_CONTACTS, 0);
} }
public void checkAndRequestCallPermissions(boolean isIncomingCall) {
ArrayList<String> permissionsList = new ArrayList<String>();
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() { public void checkAndRequestPermissionsToSendImage() {
ArrayList<String> permissionsList = new ArrayList<String>(); ArrayList<String> permissionsList = new ArrayList<String>();
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) { if (camera != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(Manifest.permission.CAMERA); 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) { if (permissionsList.size() > 0) {
String[] permissions = new String[permissionsList.size()]; 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) { public void checkAndRequestPermission(String permission, int result) {
if (getPackageManager().checkPermission(permission, getPackageName()) != PackageManager.PERMISSION_GRANTED) { int permissionGranted = getPackageManager().checkPermission(permission, getPackageName());
ActivityCompat.requestPermissions(this, new String[]{permission}, result); 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 @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 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) { 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: case PERMISSIONS_REQUEST_SYNC:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
ContactsManager.getInstance().initializeSyncAccount(getApplicationContext(), getContentResolver()); ContactsManager.getInstance().initializeSyncAccount(getApplicationContext(), getContentResolver());
@ -1283,18 +1274,11 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
if (LinphoneManager.getLc().getCalls().length > 0) { if (LinphoneManager.getLc().getCalls().length > 0) {
LinphoneCall call = LinphoneManager.getLc().getCalls()[0]; LinphoneCall call = LinphoneManager.getLc().getCalls()[0];
LinphoneCall.State callState = call.getState(); LinphoneCall.State callState = call.getState();
if (callState == State.IncomingReceived) { 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));
startActivity(new Intent(this, CallIncomingActivity.class));
} else {
checkAndRequestCallPermissions(true);
}
} else if (callState == State.OutgoingInit || callState == State.OutgoingProgress || callState == State.OutgoingRinging) { } 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));
startActivity(new Intent(this, CallOutgoingActivity.class));
} else {
checkAndRequestCallPermissions(false);
}
} else { } else {
if (call.getCurrentParamsCopy().getVideoEnabled()) { if (call.getCurrentParamsCopy().getVideoEnabled()) {
startVideoActivity(call); startVideoActivity(call);
@ -1373,11 +1357,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
if (CallActivity.isInstanciated()) { if (CallActivity.isInstanciated()) {
CallActivity.instance().startIncomingCallActivity(); CallActivity.instance().startIncomingCallActivity();
} else { } 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));
startActivity(new Intent(this, CallIncomingActivity.class));
} else {
checkAndRequestCallPermissions(true);
}
} }
} }
} }

View file

@ -1319,4 +1319,12 @@ public class LinphonePreferences {
public void setLimeEncryption(LinphoneLimeState lime) { public void setLimeEncryption(LinphoneLimeState lime) {
getLc().setLimeEncryption(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;
}
} }

View file

@ -27,7 +27,6 @@ import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneAddress.TransportType; import org.linphone.core.LinphoneAddress.TransportType;
import org.linphone.core.LinphoneCore; import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCore.RegistrationState; import org.linphone.core.LinphoneCore.RegistrationState;
import org.linphone.core.LinphoneCore.RemoteProvisioningState;
import org.linphone.core.LinphoneCoreException; import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LinphoneCoreListenerBase; import org.linphone.core.LinphoneCoreListenerBase;
@ -229,8 +228,12 @@ private static AssistantActivity instance;
} }
public void checkAndRequestAudioPermission() { public void checkAndRequestAudioPermission() {
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) != PackageManager.PERMISSION_GRANTED) { int recordAudio = getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName());
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) { 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); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSIONS_REQUEST_RECORD_AUDIO);
} }
} }
@ -238,8 +241,12 @@ private static AssistantActivity instance;
@Override @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 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 (requestCode == PERMISSIONS_REQUEST_RECORD_AUDIO) {
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
launchEchoCancellerCalibration(true); launchEchoCancellerCalibration(true);
} else { } else {
success(); success();