From 87d76f6a3e407925c40bdebbfe851919cca58e68 Mon Sep 17 00:00:00 2001
From: Jeff Sharkey <jsharkey@android.com>
Date: Tue, 9 Dec 2014 15:27:19 -0800
Subject: Throw IOException when missing default ringtone.

This is caught by Ringtone, and we then fall back to built-in
ringtone, which matches the expected CTS behavior.

Bug: 18610451
Change-Id: I234d17f7cf623b9b0af434e5d367aed28f203b14
---
 media/java/android/media/MediaPlayer.java |  4 ++++
 media/java/android/media/Ringtone.java    | 13 +++++++------
 2 files changed, 11 insertions(+), 6 deletions(-)

(limited to 'media')

diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index acf1b43..615dac2 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -61,6 +61,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -979,6 +980,9 @@ public class MediaPlayer implements SubtitleController.Listener
             // Redirect ringtones to go directly to underlying provider
             uri = RingtoneManager.getActualDefaultRingtoneUri(context,
                     RingtoneManager.getDefaultType(uri));
+            if (uri == null) {
+                throw new FileNotFoundException("Failed to resolve default ringtone");
+            }
         }
 
         AssetFileDescriptor fd = null;
diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java
index 7d075ba..8441541 100644
--- a/media/java/android/media/Ringtone.java
+++ b/media/java/android/media/Ringtone.java
@@ -51,6 +51,12 @@ public class Ringtone {
 
     private final Context mContext;
     private final AudioManager mAudioManager;
+
+    /**
+     * Flag indicating if we're allowed to fall back to remote playback using
+     * {@link #mRemotePlayer}. Typically this is false when we're the remote
+     * player and there is nobody else to delegate to.
+     */
     private final boolean mAllowRemote;
     private final IRingtonePlayer mRemotePlayer;
     private final Binder mRemoteToken;
@@ -211,12 +217,7 @@ public class Ringtone {
             mLocalPlayer.setAudioAttributes(mAudioAttributes);
             mLocalPlayer.prepare();
 
-        } catch (SecurityException e) {
-            destroyLocalPlayer();
-            if (!mAllowRemote) {
-                Log.w(TAG, "Remote playback not allowed: " + e);
-            }
-        } catch (IOException e) {
+        } catch (SecurityException | IOException e) {
             destroyLocalPlayer();
             if (!mAllowRemote) {
                 Log.w(TAG, "Remote playback not allowed: " + e);
-- 
cgit v1.1