OSDN Git Service

AudioService: Restore ringer-mode validation check.
authorJohn Spurlock <jspurlock@google.com>
Fri, 24 Oct 2014 20:27:36 +0000 (16:27 -0400)
committerJohn Spurlock <jspurlock@google.com>
Fri, 24 Oct 2014 20:45:33 +0000 (16:45 -0400)
Ensure the ringer-mode is valid when set, and forward client calls
to service method to centralize validation.

Bug: 17884168
Change-Id: I500f9beefbce5b7a8bc01ca9eb7b4a7a16114160

media/java/android/media/AudioManager.java
media/java/android/media/AudioService.java
media/java/android/media/IAudioService.aidl

index 69c1142..c100df2 100644 (file)
@@ -512,8 +512,11 @@ public class AudioManager {
      */
     public static final int RINGER_MODE_NORMAL = 2;
 
-    // maximum valid ringer mode value. Values must start from 0 and be contiguous.
-    private static final int RINGER_MODE_MAX = RINGER_MODE_NORMAL;
+    /**
+     * Maximum valid ringer mode value. Values must start from 0 and be contiguous.
+     * @hide
+     */
+    public static final int RINGER_MODE_MAX = RINGER_MODE_NORMAL;
 
     /**
      * Vibrate type that corresponds to the ringer.
@@ -887,7 +890,13 @@ public class AudioManager {
         if (ringerMode < 0 || ringerMode > RINGER_MODE_MAX) {
             return false;
         }
-        return true;
+        IAudioService service = getService();
+        try {
+            return service.isValidRingerMode(ringerMode);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Dead object in isValidRingerMode", e);
+            return false;
+        }
     }
 
     /**
index b0bf4a1..bbeeac0 100644 (file)
@@ -843,7 +843,7 @@ public class AudioService extends IAudioService.Stub {
         int ringerMode = ringerModeFromSettings;
         // sanity check in case the settings are restored from a device with incompatible
         // ringer modes
-        if (!AudioManager.isValidRingerMode(ringerMode)) {
+        if (!isValidRingerMode(ringerMode)) {
             ringerMode = AudioManager.RINGER_MODE_NORMAL;
         }
         if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) {
@@ -1733,17 +1733,22 @@ public class AudioService extends IAudioService.Stub {
     }
 
     private void ensureValidRingerMode(int ringerMode) {
-        if (!AudioManager.isValidRingerMode(ringerMode)) {
+        if (!isValidRingerMode(ringerMode)) {
             throw new IllegalArgumentException("Bad ringer mode " + ringerMode);
         }
     }
 
+    /** @see AudioManager#isValidRingerMode(int) */
+    public boolean isValidRingerMode(int ringerMode) {
+        return ringerMode >= 0 && ringerMode <= AudioManager.RINGER_MODE_MAX;
+    }
+
     /** @see AudioManager#setRingerMode(int) */
     public void setRingerMode(int ringerMode, boolean checkZen) {
         if (mUseFixedVolume || isPlatformTelevision()) {
             return;
         }
-
+        ensureValidRingerMode(ringerMode);
         if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) {
             ringerMode = AudioManager.RINGER_MODE_SILENT;
         }
index 39b074e..2d8042c 100644 (file)
@@ -80,6 +80,8 @@ interface IAudioService {
 
     int getRingerMode();
 
+    boolean isValidRingerMode(int ringerMode);
+
     void setVibrateSetting(int vibrateType, int vibrateSetting);
 
     int getVibrateSetting(int vibrateType);