From 3244418765f3185d806cc9378dc7d252d3b3c10f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 20 Jul 2016 17:41:52 +0200 Subject: [PATCH] Request read external storage permission needed to access device ringtone --- src/org/linphone/LinphoneActivity.java | 8 ++++++++ src/org/linphone/LinphonePreferences.java | 5 ++++- src/org/linphone/SettingsFragment.java | 21 +++++++++++++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 4c62398ad..43050a038 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -106,6 +106,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta private static final int PERMISSIONS_REQUEST_SYNC = 207; private static final int PERMISSIONS_REQUEST_CONTACTS = 208; private static final int PERMISSIONS_RECORD_AUDIO_ECHO_CANCELLER = 209; + private static final int PERMISSIONS_READ_EXTERNAL_STORAGE_DEVICE_RINGTONE = 210; private static LinphoneActivity instance; @@ -1198,6 +1199,10 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta checkAndRequestPermission(Manifest.permission.RECORD_AUDIO, PERMISSIONS_RECORD_AUDIO_ECHO_CANCELLER); } + public void checkAndRequestReadExternalStoragePermissionForDeviceRingtone() { + checkAndRequestPermission(Manifest.permission.READ_EXTERNAL_STORAGE, PERMISSIONS_READ_EXTERNAL_STORAGE_DEVICE_RINGTONE); + } + public void checkAndRequestPermissionsToSendImage() { ArrayList permissionsList = new ArrayList(); @@ -1269,6 +1274,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta ((SettingsFragment) fragment).echoCalibrationFail(); } break; + case PERMISSIONS_READ_EXTERNAL_STORAGE_DEVICE_RINGTONE: + ((SettingsFragment) fragment).enableDeviceRingtone(grantResults[0] == PackageManager.PERMISSION_GRANTED); + break; } } diff --git a/src/org/linphone/LinphonePreferences.java b/src/org/linphone/LinphonePreferences.java index e9b330ad5..77cec0ec3 100644 --- a/src/org/linphone/LinphonePreferences.java +++ b/src/org/linphone/LinphonePreferences.java @@ -43,7 +43,9 @@ import org.linphone.core.TunnelConfig; import org.linphone.mediastream.Log; import org.linphone.purchase.Purchasable; +import android.Manifest; import android.content.Context; +import android.content.pm.PackageManager; /** * @author Sylvain Berfini @@ -1339,7 +1341,8 @@ public class LinphonePreferences { } public boolean isDeviceRingtoneEnabled() { - return getConfig().getBool("app", "device_ringtone", true); + int readExternalStorage = mContext.getPackageManager().checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, mContext.getPackageName()); + return getConfig().getBool("app", "device_ringtone", true) && readExternalStorage == PackageManager.PERMISSION_GRANTED; } public void enableDeviceRingtone(boolean enable) { diff --git a/src/org/linphone/SettingsFragment.java b/src/org/linphone/SettingsFragment.java index 5ec59e13a..e8ee2b22a 100644 --- a/src/org/linphone/SettingsFragment.java +++ b/src/org/linphone/SettingsFragment.java @@ -804,13 +804,30 @@ public class SettingsFragment extends PreferencesListFragment { setPreferenceDefaultValueAndSummary(R.string.pref_voice_mail_key, mPrefs.getVoiceMailUri()); } + public void enableDeviceRingtone(boolean enabled) { + LinphonePreferences.instance().enableDeviceRingtone(enabled); + LinphoneManager.getInstance().enableDeviceRingtone(enabled); + ((CheckBoxPreference)findPreference(getString(R.string.pref_device_ringtone_key))).setChecked(enabled); + } + private void setCallPreferencesListener() { findPreference(getString(R.string.pref_device_ringtone_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean use = (Boolean) newValue; - mPrefs.enableDeviceRingtone(use); - LinphoneManager.getInstance().enableDeviceRingtone(use); + if (use) { + int readExternalStorage = getActivity().getPackageManager().checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE, getActivity().getPackageName()); + if (readExternalStorage == PackageManager.PERMISSION_GRANTED) { + mPrefs.enableDeviceRingtone(true); + LinphoneManager.getInstance().enableDeviceRingtone(true); + } else { + LinphoneActivity.instance().checkAndRequestReadExternalStoragePermissionForDeviceRingtone(); + } + } else { + mPrefs.enableDeviceRingtone(false); + LinphoneManager.getInstance().enableDeviceRingtone(false); + } + return true; } });