diff options
author | Todd Kennedy <toddke@google.com> | 2015-07-20 13:32:40 -0700 |
---|---|---|
committer | Todd Kennedy <toddke@google.com> | 2015-07-20 17:24:15 -0700 |
commit | 68de157b7810be72a283b9e0db292895d96988a9 (patch) | |
tree | f6c610b20564e8cf98149797e86bb3a80fb3ce70 | |
parent | 2dcfc7a9972de3abfebdf2d84bcba0095e4fbae5 (diff) | |
download | frameworks_base-68de157b7810be72a283b9e0db292895d96988a9.zip frameworks_base-68de157b7810be72a283b9e0db292895d96988a9.tar.gz frameworks_base-68de157b7810be72a283b9e0db292895d96988a9.tar.bz2 |
Use RingtonePlayer to get ringtone title
Instead of requiring every application that calls Rintone.getTitle()
to request android.permission.READ_EXTERNAL_STORAGE, pass the call
through to the system UI process. We only do this for media store
URIs.
Bug: 22067670
Change-Id: I38cf3fb8d769ef6984c41a7b04afbbd4c57175ce
-rw-r--r-- | media/java/android/media/IRingtonePlayer.aidl | 3 | ||||
-rw-r--r-- | media/java/android/media/Ringtone.java | 48 | ||||
-rw-r--r-- | packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java | 7 |
3 files changed, 44 insertions, 14 deletions
diff --git a/media/java/android/media/IRingtonePlayer.aidl b/media/java/android/media/IRingtonePlayer.aidl index aa5fde3..8091421 100644 --- a/media/java/android/media/IRingtonePlayer.aidl +++ b/media/java/android/media/IRingtonePlayer.aidl @@ -33,4 +33,7 @@ interface IRingtonePlayer { /** Used for Notification sound playback. */ void playAsync(in Uri uri, in UserHandle user, boolean looping, in AudioAttributes aa); void stopAsync(); + + /** Return the title of the media. */ + String getTitle(in Uri uri); } diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java index faeebe6..9e9d602 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -27,6 +27,7 @@ import android.os.Binder; import android.os.RemoteException; import android.provider.MediaStore; import android.provider.Settings; +import android.provider.MediaStore.MediaColumns; import android.util.Log; import java.io.IOException; @@ -50,6 +51,8 @@ public class Ringtone { MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.TITLE }; + /** Selection that limits query results to just audio files */ + private static final String MEDIA_SELECTION = MediaColumns.MIME_TYPE + " LIKE 'audio/%'"; // keep references on active Ringtones until stopped or completion listener called. private static final ArrayList<Ringtone> sActiveRingtones = new ArrayList<Ringtone>(); @@ -193,11 +196,14 @@ public class Ringtone { */ public String getTitle(Context context) { if (mTitle != null) return mTitle; - return mTitle = getTitle(context, mUri, true); + return mTitle = getTitle(context, mUri, true /*followSettingsUri*/, mAllowRemote); } - private static String getTitle(Context context, Uri uri, boolean followSettingsUri) { - Cursor cursor = null; + /** + * @hide + */ + public static String getTitle( + Context context, Uri uri, boolean followSettingsUri, boolean allowRemote) { ContentResolver res = context.getContentResolver(); String title = null; @@ -209,31 +215,45 @@ public class Ringtone { if (followSettingsUri) { Uri actualUri = RingtoneManager.getActualDefaultRingtoneUri(context, RingtoneManager.getDefaultType(uri)); - String actualTitle = getTitle(context, actualUri, false); + String actualTitle = getTitle( + context, actualUri, false /*followSettingsUri*/, allowRemote); title = context .getString(com.android.internal.R.string.ringtone_default_with_actual, actualTitle); } } else { + Cursor cursor = null; try { if (MediaStore.AUTHORITY.equals(authority)) { - cursor = res.query(uri, MEDIA_COLUMNS, null, null, null); + final String mediaSelection = allowRemote ? null : MEDIA_SELECTION; + cursor = res.query(uri, MEDIA_COLUMNS, mediaSelection, null, null); + if (cursor != null && cursor.getCount() == 1) { + cursor.moveToFirst(); + return cursor.getString(2); + } + // missing cursor is handled below } } catch (SecurityException e) { - // missing cursor is handled below - } - - try { - if (cursor != null && cursor.getCount() == 1) { - cursor.moveToFirst(); - return cursor.getString(2); - } else { - title = uri.getLastPathSegment(); + IRingtonePlayer mRemotePlayer = null; + if (allowRemote) { + AudioManager audioManager = + (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + mRemotePlayer = audioManager.getRingtonePlayer(); + } + if (mRemotePlayer != null) { + try { + title = mRemotePlayer.getTitle(uri); + } catch (RemoteException re) { + } } } finally { if (cursor != null) { cursor.close(); } + cursor = null; + } + if (title == null) { + title = uri.getLastPathSegment(); } } } diff --git a/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java b/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java index e9a256c..fe876d7 100644 --- a/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java +++ b/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java @@ -171,6 +171,13 @@ public class RingtonePlayer extends SystemUI { } mAsyncPlayer.stop(); } + + @Override + public String getTitle(Uri uri) { + final UserHandle user = Binder.getCallingUserHandle(); + return Ringtone.getTitle(getContextForUser(user), uri, + false /*followSettingsUri*/, false /*allowRemote*/); + } }; private Context getContextForUser(UserHandle user) { |