diff options
author | Mao Jinlong <c_jmao@codeaurora.org> | 2016-08-04 17:42:15 +0800 |
---|---|---|
committer | Linux Build Service Account <lnxbuild@localhost> | 2016-08-24 08:07:04 -0600 |
commit | 56cac009214f23e16ee8556bf969308d2fd3b90f (patch) | |
tree | 458844816350df9db24ee4bc282e75207f5693ab | |
parent | 2eabe191ce541b030cdee36fc3341bf75028b533 (diff) | |
download | android_packages_apps_DeskClock-56cac009214f23e16ee8556bf969308d2fd3b90f.tar.gz android_packages_apps_DeskClock-56cac009214f23e16ee8556bf969308d2fd3b90f.tar.bz2 android_packages_apps_DeskClock-56cac009214f23e16ee8556bf969308d2fd3b90f.zip |
Take persistable uri permission for document providerstaging/cm-14.0-caf
ACTION_GET_CONTENT is to simply read/import data.ACTION_OPEN_DOCUMENT
is to have long term, persistent access to documents owned by a
document provider. When user select music as alarm ringtone from
external storage, the music file is possible to be a document provider
file. DeskClock will lose access to document provider file after reboot.
DeskClock need long term, persistent access to documents owned by
document provider. So Take persistable uri permission for document
provider.
Change-Id: I110873d4c49eed34d9cabc8bd457e12eba9ced1f
CRs-Fixed: 1046238
3 files changed, 75 insertions, 2 deletions
diff --git a/src/com/android/deskclock/AlarmClockFragment.java b/src/com/android/deskclock/AlarmClockFragment.java index 47cf3dd98..29f472857 100644 --- a/src/com/android/deskclock/AlarmClockFragment.java +++ b/src/com/android/deskclock/AlarmClockFragment.java @@ -26,10 +26,12 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.Loader; import android.content.pm.PackageManager; +import android.content.SharedPreferences; import android.database.Cursor; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; +import android.provider.DocumentsContract; import android.provider.Settings; import android.support.design.widget.Snackbar; import android.support.v7.widget.LinearLayoutManager; @@ -52,6 +54,8 @@ import com.android.deskclock.widget.EmptyViewController; import com.android.deskclock.widget.toast.SnackbarManager; import com.android.deskclock.widget.toast.ToastManager; +import java.util.List; + /** * A fragment that displays a list of alarm time and allows interaction with them. */ @@ -382,6 +386,12 @@ public final class AlarmClockFragment extends DeskClockFragment implements } } + private List<Alarm> getAlarmsByUri(Context context, Uri uri) { + final String selection = String.format("%s=?", Alarm.RINGTONE); + final String[] args = { uri.toString() }; + return Alarm.getAlarms(context.getContentResolver(), selection, args); + } + private void updateSelectAlarmRingToneUri(Uri uri) { if (uri == null) { uri = Alarm.NO_RINGTONE_URI; @@ -393,6 +403,43 @@ public final class AlarmClockFragment extends DeskClockFragment implements LogUtils.e("Could not get selected alarm to set ringtone"); return; } + + // If the selected uri doesn't equals to the original uri, we need + // to check if the new uir is document uri and take the persistable + // permission. + // If there is no other alarm which uses the original uri and it is + // not the default alarm ringtone uri, then we need to release the + // permission of the orignal uri. + if (uri != alarm.alert) { + Context context = getActivity().getApplicationContext(); + ContentResolver resolver = context.getContentResolver(); + final int takeFlag = Intent.FLAG_GRANT_READ_URI_PERMISSION; + + SharedPreferences sharedPref = Utils.getCESharedPreferences(context); + String defaultRingTone = sharedPref.getString( + DefaultAlarmToneDialog.DEFAULT_RING_TONE_URI_KEY, + DefaultAlarmToneDialog.DEFAULT_RING_TONE_DEFAULT); + Uri defaultUri = Uri.parse(defaultRingTone); + + if (DocumentsContract.isDocumentUri(context, alarm.alert) && + alarm.alert != defaultUri && getAlarmsByUri(context, alarm.alert).size() == 1) { + try { + resolver.releasePersistableUriPermission(alarm.alert, takeFlag); + } catch (Exception ex) { + LogUtils.e("releasePersistableUriPermission exception : "+ ex); + } + } + + if (DocumentsContract.isDocumentUri(context, uri)) { + // Check for the freshest data and take persist permission. + try { + resolver.takePersistableUriPermission(uri, takeFlag); + } catch (Exception ex) { + LogUtils.e("takePersistableUriPermission exception : " + ex); + } + } + } + alarm.alert = uri; // Save the change to alarm. diff --git a/src/com/android/deskclock/alarms/AlarmTimeClickHandler.java b/src/com/android/deskclock/alarms/AlarmTimeClickHandler.java index 779a38cde..82952eb5d 100755 --- a/src/com/android/deskclock/alarms/AlarmTimeClickHandler.java +++ b/src/com/android/deskclock/alarms/AlarmTimeClickHandler.java @@ -253,7 +253,9 @@ public final class AlarmTimeClickHandler { LogUtils.d(TAG, "Showing ringtone picker."); mFragment.startActivityForResult(intent, AlarmClockFragment.REQUEST_CODE_RINGTONE); } else { - final Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + // As the minSdkVersion for this app is 19, we don't need to add sdk version check + // here to use ACTION_OPEN_DOCUMENT. + final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, mSelectedAlarm.alert); intent.setType(AlarmClockFragment.SEL_AUDIO_SRC); mFragment.startActivityForResult(intent, AlarmClockFragment.REQUEST_CODE_EXTERN_AUDIO); diff --git a/src/com/android/deskclock/settings/DefaultAlarmToneDialog.java b/src/com/android/deskclock/settings/DefaultAlarmToneDialog.java index 6435e59f4..353557ad3 100755 --- a/src/com/android/deskclock/settings/DefaultAlarmToneDialog.java +++ b/src/com/android/deskclock/settings/DefaultAlarmToneDialog.java @@ -37,6 +37,7 @@ import com.android.deskclock.data.DataModel; import com.android.deskclock.provider.Alarm; import android.app.AlertDialog.Builder; import android.content.Context; +import android.content.ContentResolver; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; @@ -44,6 +45,7 @@ import android.content.DialogInterface.OnClickListener; import android.media.RingtoneManager; import android.net.Uri; import android.preference.DialogPreference; +import android.provider.DocumentsContract; import android.util.AttributeSet; public class DefaultAlarmToneDialog extends DialogPreference { @@ -142,7 +144,9 @@ public class DefaultAlarmToneDialog extends DialogPreference { activity.startActivityForResult(intent, AlarmClockFragment.REQUEST_CODE_RINGTONE); } else { - final Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + // As the minSdkVersion for this app is 19, we don't need to add sdk version check + // here to use ACTION_OPEN_DOCUMENT. + final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, oldRingTone); intent.setType(AlarmClockFragment.SEL_AUDIO_SRC); @@ -166,6 +170,26 @@ public class DefaultAlarmToneDialog extends DialogPreference { } if (uri != oldRingTone) { + ContentResolver resolver = mContext.getContentResolver(); + final int takeFlags = intent.getFlags() & Intent.FLAG_GRANT_READ_URI_PERMISSION; + + if (DocumentsContract.isDocumentUri(mContext, oldRingTone)) { + try { + resolver.releasePersistableUriPermission(oldRingTone, takeFlags); + } catch (Exception ex) { + LogUtils.e(LogUtils.LOGTAG, "releasePersistableUriPermission exception : "+ ex); + } + } + + if (DocumentsContract.isDocumentUri(mContext, uri)) { + // Check for the freshest data and take persist permission. + try { + resolver.takePersistableUriPermission(uri, takeFlags); + } catch (Exception ex) { + LogUtils.e(LogUtils.LOGTAG, "takePersistableUriPermission exception : "+ ex); + } + } + // sendBroadcast to refresh Alarm's ringtone which is default sendRefreshBroadcast(uri); } |