Improvements on how we handle permission requests
This commit is contained in:
parent
7a86beeb6c
commit
b940ef0ee5
2 changed files with 101 additions and 20 deletions
|
@ -97,7 +97,7 @@ 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_READ_CONTACTS = 200;
|
private static final int PERMISSIONS_REQUEST_CONTACTS = 200;
|
||||||
private static final int PERMISSIONS_REQUEST_RECORD_AUDIO = 201;
|
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_RECORD_AUDIO_INCOMING_CALL = 203;
|
||||||
private static final int PERMISSIONS_REQUEST_EXTERNAL_FILE_STORAGE = 204;
|
private static final int PERMISSIONS_REQUEST_EXTERNAL_FILE_STORAGE = 204;
|
||||||
|
@ -115,7 +115,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
|
||||||
private List<FragmentsAvailable> fragmentsHistory;
|
private List<FragmentsAvailable> fragmentsHistory;
|
||||||
private Fragment.SavedState dialerSavedState;
|
private Fragment.SavedState dialerSavedState;
|
||||||
private boolean newProxyConfig;
|
private boolean newProxyConfig;
|
||||||
private boolean isAnimationDisabled = true, emptyFragment = false, permissionAsked = false;
|
private boolean isAnimationDisabled = true, emptyFragment = false;
|
||||||
private OrientationEventListener mOrientationHelper;
|
private OrientationEventListener mOrientationHelper;
|
||||||
private LinphoneCoreListenerBase mListener;
|
private LinphoneCoreListenerBase mListener;
|
||||||
private LinearLayout mTabBar;
|
private LinearLayout mTabBar;
|
||||||
|
@ -229,13 +229,13 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
|
||||||
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || LinphonePreferences.instance().audioPermAsked()) {
|
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || LinphonePreferences.instance().audioPermAsked()) {
|
||||||
startActivity(new Intent(LinphoneActivity.instance(), CallIncomingActivity.class));
|
startActivity(new Intent(LinphoneActivity.instance(), CallIncomingActivity.class));
|
||||||
} else {
|
} else {
|
||||||
checkAndRequestPermission(Manifest.permission.RECORD_AUDIO, PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL);
|
checkAndRequestAudioPermission(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 || LinphonePreferences.instance().audioPermAsked()) {
|
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || LinphonePreferences.instance().audioPermAsked()) {
|
||||||
startActivity(new Intent(LinphoneActivity.instance(), CallOutgoingActivity.class));
|
startActivity(new Intent(LinphoneActivity.instance(), CallOutgoingActivity.class));
|
||||||
} else {
|
} else {
|
||||||
checkAndRequestPermission(Manifest.permission.RECORD_AUDIO, PERMISSIONS_REQUEST_RECORD_AUDIO);
|
checkAndRequestAudioPermission(false);
|
||||||
}
|
}
|
||||||
} else if (state == State.CallEnd || state == State.Error || state == State.CallReleased) {
|
} else if (state == State.CallEnd || state == State.Error || state == State.CallReleased) {
|
||||||
// Convert LinphoneCore message for internalization
|
// Convert LinphoneCore message for internalization
|
||||||
|
@ -1146,44 +1146,101 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkAndRequestExternalStoragePermission() {
|
public void checkAndRequestExternalStoragePermission() {
|
||||||
|
if (LinphonePreferences.instance().writeExternalStoragePermAsked()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
|
if (getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
|
||||||
checkAndRequestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, PERMISSIONS_REQUEST_EXTERNAL_FILE_STORAGE);
|
checkAndRequestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, PERMISSIONS_REQUEST_EXTERNAL_FILE_STORAGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkAndRequestCameraPermission() {
|
public void checkAndRequestCameraPermission() {
|
||||||
|
if (LinphonePreferences.instance().cameraPermAsked()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
|
if (getPackageManager().checkPermission(Manifest.permission.CAMERA, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
|
||||||
checkAndRequestPermission(Manifest.permission.CAMERA, PERMISSIONS_REQUEST_CAMERA);
|
checkAndRequestPermission(Manifest.permission.CAMERA, PERMISSIONS_REQUEST_CAMERA);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void checkAndRequestReadContactsPermission() {
|
||||||
|
if (LinphonePreferences.instance().readContactsPermAsked()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (getPackageManager().checkPermission(Manifest.permission.READ_CONTACTS, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
checkAndRequestPermission(Manifest.permission.READ_CONTACTS, PERMISSIONS_REQUEST_CONTACTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkAndRequestWriteContactsPermission() {
|
||||||
|
if (LinphonePreferences.instance().writeContactsPermAsked()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (getPackageManager().checkPermission(Manifest.permission.WRITE_CONTACTS, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
checkAndRequestPermission(Manifest.permission.WRITE_CONTACTS, PERMISSIONS_REQUEST_CONTACTS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void checkAndRequestAudioPermission(boolean isIncomingCall) {
|
||||||
|
if (LinphonePreferences.instance().audioPermAsked()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.RECORD_AUDIO }, isIncomingCall ? PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL : PERMISSIONS_REQUEST_RECORD_AUDIO);
|
||||||
|
if (LinphonePreferences.instance().shouldInitiateVideoCall() ||
|
||||||
|
LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) {
|
||||||
|
checkAndRequestCameraPermission();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void checkAndRequestPermission(String permission, int result) {
|
public void checkAndRequestPermission(String permission, int result) {
|
||||||
if (getPackageManager().checkPermission(permission, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
|
if (getPackageManager().checkPermission(permission, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
|
||||||
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,permission) && !permissionAsked) {
|
ActivityCompat.requestPermissions(this, new String[]{ permission }, result);
|
||||||
permissionAsked = true;
|
|
||||||
if(LinphonePreferences.instance().shouldInitiateVideoCall() ||
|
|
||||||
LinphonePreferences.instance().shouldAutomaticallyAcceptVideoRequests()) {
|
|
||||||
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, permission}, result);
|
|
||||||
} else {
|
|
||||||
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) {
|
||||||
|
if (grantResults.length > 0) {
|
||||||
|
for (int i = 0; i < grantResults.length; i++) {
|
||||||
|
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
|
||||||
|
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {
|
||||||
|
if (permissions[i] == Manifest.permission.RECORD_AUDIO) {
|
||||||
|
LinphonePreferences.instance().neverAskAudioPerm();
|
||||||
|
} else if (permissions[i] == Manifest.permission.CAMERA) {
|
||||||
|
LinphonePreferences.instance().neverAskCameraPerm();
|
||||||
|
} else if (permissions[i] == Manifest.permission.READ_CONTACTS) {
|
||||||
|
LinphonePreferences.instance().neverAskReadContactsPerm();
|
||||||
|
} else if (permissions[i] == Manifest.permission.WRITE_CONTACTS) {
|
||||||
|
LinphonePreferences.instance().neverAskWriteContactsPerm();
|
||||||
|
} else if (permissions[i] == Manifest.permission.WRITE_EXTERNAL_STORAGE) {
|
||||||
|
LinphonePreferences.instance().neverAskWriteExternalStoragePerm();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//TODO: show dialog explaining what we need the permission for
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (permissions[i] == Manifest.permission.RECORD_AUDIO) {
|
||||||
|
LinphonePreferences.instance().neverAskAudioPerm();
|
||||||
|
} else if (permissions[i] == Manifest.permission.CAMERA) {
|
||||||
|
LinphonePreferences.instance().neverAskCameraPerm();
|
||||||
|
} else if (permissions[i] == Manifest.permission.READ_CONTACTS) {
|
||||||
|
LinphonePreferences.instance().neverAskReadContactsPerm();
|
||||||
|
} else if (permissions[i] == Manifest.permission.WRITE_CONTACTS) {
|
||||||
|
LinphonePreferences.instance().neverAskWriteContactsPerm();
|
||||||
|
} else if (permissions[i] == Manifest.permission.WRITE_EXTERNAL_STORAGE) {
|
||||||
|
LinphonePreferences.instance().neverAskWriteExternalStoragePerm();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
switch (requestCode) {
|
switch (requestCode) {
|
||||||
case PERMISSIONS_REQUEST_RECORD_AUDIO:
|
case PERMISSIONS_REQUEST_RECORD_AUDIO:
|
||||||
startActivity(new Intent(this, CallOutgoingActivity.class));
|
startActivity(new Intent(this, CallOutgoingActivity.class));
|
||||||
LinphonePreferences.instance().neverAskAudioPerm();
|
|
||||||
break;
|
break;
|
||||||
case PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL:
|
case PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL:
|
||||||
startActivity(new Intent(this, CallIncomingActivity.class));
|
startActivity(new Intent(this, CallIncomingActivity.class));
|
||||||
LinphonePreferences.instance().neverAskAudioPerm();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
permissionAsked = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1204,7 +1261,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
|
||||||
ContactsManager.getInstance().fetchContacts();
|
ContactsManager.getInstance().fetchContacts();
|
||||||
fetchedContactsOnce = true;
|
fetchedContactsOnce = true;
|
||||||
} else {
|
} else {
|
||||||
checkAndRequestPermission(Manifest.permission.READ_CONTACTS, PERMISSIONS_REQUEST_READ_CONTACTS);
|
checkAndRequestReadContactsPermission();
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshAccounts();
|
refreshAccounts();
|
||||||
|
@ -1223,13 +1280,13 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
|
||||||
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || LinphonePreferences.instance().audioPermAsked()) {
|
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || LinphonePreferences.instance().audioPermAsked()) {
|
||||||
startActivity(new Intent(this, CallIncomingActivity.class));
|
startActivity(new Intent(this, CallIncomingActivity.class));
|
||||||
} else {
|
} else {
|
||||||
checkAndRequestPermission(Manifest.permission.RECORD_AUDIO, PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL);
|
checkAndRequestAudioPermission(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 || LinphonePreferences.instance().audioPermAsked()) {
|
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || LinphonePreferences.instance().audioPermAsked()) {
|
||||||
startActivity(new Intent(this, CallOutgoingActivity.class));
|
startActivity(new Intent(this, CallOutgoingActivity.class));
|
||||||
} else {
|
} else {
|
||||||
checkAndRequestPermission(Manifest.permission.RECORD_AUDIO, PERMISSIONS_REQUEST_RECORD_AUDIO);
|
checkAndRequestAudioPermission(false);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (call.getCurrentParamsCopy().getVideoEnabled()) {
|
if (call.getCurrentParamsCopy().getVideoEnabled()) {
|
||||||
|
@ -1323,7 +1380,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
|
||||||
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || LinphonePreferences.instance().audioPermAsked()) {
|
if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED || LinphonePreferences.instance().audioPermAsked()) {
|
||||||
startActivity(new Intent(this, CallIncomingActivity.class));
|
startActivity(new Intent(this, CallIncomingActivity.class));
|
||||||
} else {
|
} else {
|
||||||
checkAndRequestPermission(Manifest.permission.RECORD_AUDIO, PERMISSIONS_REQUEST_RECORD_AUDIO_INCOMING_CALL);
|
checkAndRequestAudioPermission(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1241,6 +1241,30 @@ public class LinphonePreferences {
|
||||||
public void neverAskCameraPerm(){
|
public void neverAskCameraPerm(){
|
||||||
getConfig().setBool("app", "camera_perm", true);
|
getConfig().setBool("app", "camera_perm", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Boolean readContactsPermAsked(){
|
||||||
|
return getConfig().getBool("app", "read_contacts_perm", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void neverAskReadContactsPerm(){
|
||||||
|
getConfig().setBool("app", "read_contacts_perm", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean writeContactsPermAsked(){
|
||||||
|
return getConfig().getBool("app", "write_contacts_perm", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void neverAskWriteContactsPerm(){
|
||||||
|
getConfig().setBool("app", "write_contacts_perm", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean writeExternalStoragePermAsked(){
|
||||||
|
return getConfig().getBool("app", "write_external_storage_perm", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void neverAskWriteExternalStoragePerm(){
|
||||||
|
getConfig().setBool("app", "write_external_storage_perm", true);
|
||||||
|
}
|
||||||
|
|
||||||
public String getActivityToLaunchOnIncomingReceived() {
|
public String getActivityToLaunchOnIncomingReceived() {
|
||||||
return getConfig().getString("app", "incoming_call_activity", "org.linphone.LinphoneActivity");
|
return getConfig().getString("app", "incoming_call_activity", "org.linphone.LinphoneActivity");
|
||||||
|
|
Loading…
Reference in a new issue