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
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 @@
/** 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.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 @@
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 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 @@
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 @@
}
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) {