Automated import from //branches/donutburger/...@140507,140507
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 83ede0d..f30aebe 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.database.ContentObserver;
 import android.media.MediaPlayer.OnCompletionListener;
 import android.media.MediaPlayer.OnErrorListener;
 import android.os.Binder;
@@ -92,7 +93,8 @@
     private AudioHandler mAudioHandler;
     /** @see VolumeStreamState */
     private VolumeStreamState[] mStreamStates;
-
+    private SettingsObserver mSettingsObserver;
+    
     private boolean mMicMute;
     private int mMode;
     private int[] mRoutes = new int[AudioSystem.NUM_MODES];
@@ -157,9 +159,6 @@
      */
     private int mRingerMode;
 
-    /** @see System#MODE_RINGER_STREAMS_AFFECTED */
-    private int mRingerModeAffectedStreams;
-
     /** @see System#MUTE_STREAMS_AFFECTED */
     private int mMuteAffectedStreams;
 
@@ -181,7 +180,8 @@
         mContext = context;
         mContentResolver = context.getContentResolver();
         mVolumePanel = new VolumePanel(context, this);
-
+        mSettingsObserver = new SettingsObserver();
+        
         createAudioSystemThread();
         createStreamStates();
         readPersistedSettings();
@@ -275,8 +275,6 @@
         final ContentResolver cr = mContentResolver;
 
         mRingerMode = System.getInt(cr, System.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL);
-        mRingerModeAffectedStreams = System.getInt(mContentResolver,
-                System.MODE_RINGER_STREAMS_AFFECTED, 1 << AudioSystem.STREAM_RING);
 
         mVibrateSetting = System.getInt(cr, System.VIBRATE_ON, 0);
 
@@ -494,34 +492,38 @@
     /** @see AudioManager#setRingerMode(int) */
     public void setRingerMode(int ringerMode) {
         if (ringerMode != mRingerMode) {
-            mRingerMode = ringerMode;
-
-            // Adjust volumes via posting message
-            int numStreamTypes = AudioSystem.getNumStreamTypes();
-            if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
-                for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
-                    if (!isStreamAffectedByRingerMode(streamType)) continue;
-                    // Bring back last audible volume
-                    setStreamVolumeInt(streamType, mStreamStates[streamType].mLastAudibleIndex,
-                                       false);
-                }
-            } else {
-                for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
-                    if (!isStreamAffectedByRingerMode(streamType)) continue;
-                    // Either silent or vibrate, either way volume is 0
-                    setStreamVolumeInt(streamType, 0, false);
-                }
-            }
+            setRingerModeInt(ringerMode);
 
             // Send sticky broadcast
             broadcastRingerMode();
-
-            // Post a persist ringer mode msg
-            sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE, SHARED_MSG,
-                    SENDMSG_REPLACE, 0, 0, null, PERSIST_DELAY);
         }
     }
 
+    private void setRingerModeInt(int ringerMode) {
+        mRingerMode = ringerMode;
+
+        // Adjust volumes via posting message
+        int numStreamTypes = AudioSystem.getNumStreamTypes();
+        if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
+            for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
+                if (!isStreamAffectedByRingerMode(streamType)) continue;
+                // Bring back last audible volume
+                setStreamVolumeInt(streamType, mStreamStates[streamType].mLastAudibleIndex,
+                                   false);
+            }
+        } else {
+            for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
+                if (!isStreamAffectedByRingerMode(streamType)) continue;
+                // Either silent or vibrate, either way volume is 0
+                setStreamVolumeInt(streamType, 0, false);
+            }
+        }
+        
+        // Post a persist ringer mode msg
+        sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE, SHARED_MSG,
+                SENDMSG_REPLACE, 0, 0, null, PERSIST_DELAY);
+    }
+
     /** @see AudioManager#shouldVibrate(int) */
     public boolean shouldVibrate(int vibrateType) {
 
@@ -783,7 +785,9 @@
     }
 
     public boolean isStreamAffectedByRingerMode(int streamType) {
-        return (mRingerModeAffectedStreams & (1 << streamType)) != 0;
+        int ringerModeAffectedStreams = Settings.System.getInt(mContentResolver,
+                Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);
+        return (ringerModeAffectedStreams & (1 << streamType)) != 0;
     }
 
     public boolean isStreamAffectedByMute(int streamType) {
@@ -1233,4 +1237,25 @@
         }
     }
 
+    private class SettingsObserver extends ContentObserver {
+        
+        SettingsObserver() {
+            super(new Handler());
+            mContentResolver.registerContentObserver(Settings.System.getUriFor(
+                Settings.System.MODE_RINGER_STREAMS_AFFECTED), false, this);
+        }
+
+        @Override
+        public void onChange(boolean selfChange) {
+            super.onChange(selfChange);
+            
+            /*
+             * Ensure all stream types that should be affected by ringer mode
+             * are in the proper state.
+             */
+            setRingerModeInt(getRingerMode());
+        }
+        
+    }
+    
 }