diff options
-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 aa5fde3d2fc0..809142125031 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 faeebe6ee425..9e9d60283ddf 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 e9a256c3d065..fe876d7a4d30 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) { |