Fix issues 3425035 and 3423785.

- Make sure that STREAM_MUSIC is affected by ringer mode on non voice capable
devices whatever the saved settings say.

- Added a hidden method to AudioManager for VolumePanel to override
the stream selection logic while the panel is showing.

Change-Id: Ib2ff2a7af63decb4e29c45700c41e5058f79d877
diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java
index 2aa94dc..3bab29f 100644
--- a/core/java/android/view/VolumePanel.java
+++ b/core/java/android/view/VolumePanel.java
@@ -190,6 +190,7 @@
         mDialog.setOnDismissListener(new OnDismissListener() {
             public void onDismiss(DialogInterface dialog) {
                 mActiveStreamType = -1;
+                mAudioManager.forceVolumeControlStream(mActiveStreamType);
             }
         });
         // Change some window properties
@@ -483,6 +484,7 @@
         }
 
         if (!mDialog.isShowing()) {
+            mAudioManager.forceVolumeControlStream(streamType);
             mDialog.setContentView(mView);
             // Showing dialog - use collapsed state
             collapse();
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 051a0fc..5a59ef6 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -48,7 +48,7 @@
     private final Context mContext;
     private final Handler mHandler;
     private long mVolumeKeyUpTime;
-
+    private int  mVolumeControlStream = -1;
     private static String TAG = "AudioManager";
     private static boolean DEBUG = false;
     private static boolean localLOGV = DEBUG || android.util.Config.LOGV;
@@ -263,6 +263,13 @@
     public static final int FLAG_VIBRATE = 1 << 4;
 
     /**
+     * forces use of specified stream
+     * @hide
+     */
+    public static final int FLAG_FORCE_STREAM = 1 << 5;
+
+
+    /**
      * Ringer mode that will be silent and will not vibrate. (This overrides the
      * vibrate setting.)
      *
@@ -392,12 +399,17 @@
                  * Adjust the volume in on key down since it is more
                  * responsive to the user.
                  */
+                int flags = FLAG_SHOW_UI | FLAG_VIBRATE;
+                if (mVolumeControlStream != -1) {
+                    stream = mVolumeControlStream;
+                    flags |= FLAG_FORCE_STREAM;
+                }
                 adjustSuggestedStreamVolume(
                         keyCode == KeyEvent.KEYCODE_VOLUME_UP
                                 ? ADJUST_RAISE
                                 : ADJUST_LOWER,
                         stream,
-                        FLAG_SHOW_UI | FLAG_VIBRATE);
+                        flags);
                 break;
             case KeyEvent.KEYCODE_VOLUME_MUTE:
                 // TODO: Actually handle MUTE.
@@ -416,10 +428,15 @@
                  * Play a sound. This is done on key up since we don't want the
                  * sound to play when a user holds down volume down to mute.
                  */
+                int flags = FLAG_PLAY_SOUND;
+                if (mVolumeControlStream != -1) {
+                    stream = mVolumeControlStream;
+                    flags |= FLAG_FORCE_STREAM;
+                }
                 adjustSuggestedStreamVolume(
                         ADJUST_SAME,
                         stream,
-                        FLAG_PLAY_SOUND);
+                        flags);
 
                 mVolumeKeyUpTime = SystemClock.uptimeMillis();
                 break;
@@ -683,6 +700,17 @@
     }
 
     /**
+     * forces the stream controlled by hard volume keys
+     * specifying streamType == -1 releases control to the
+     * logic.
+     *
+     * @hide
+     */
+    public void forceVolumeControlStream(int streamType) {
+        mVolumeControlStream = streamType;
+    }
+
+    /**
      * Returns whether a particular type should vibrate according to user
      * settings and the current ringer mode.
      * <p>
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index e18220a..ba6f548 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -417,6 +417,9 @@
                  (1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)|
                  (1 << AudioSystem.STREAM_MUSIC)));
 
+        if (!mVoiceCapable) {
+            mRingerModeAffectedStreams |= (1 << AudioSystem.STREAM_MUSIC);
+        }
         mMuteAffectedStreams = System.getInt(cr,
                 System.MUTE_STREAMS_AFFECTED,
                 ((1 << AudioSystem.STREAM_MUSIC)|(1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_SYSTEM)));
@@ -461,7 +464,12 @@
     /** @see AudioManager#adjustVolume(int, int, int) */
     public void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags) {
 
-        int streamType = getActiveStreamType(suggestedStreamType);
+        int streamType;
+        if ((flags & AudioManager.FLAG_FORCE_STREAM) != 0) {
+            streamType = suggestedStreamType;
+        } else {
+            streamType = getActiveStreamType(suggestedStreamType);
+        }
 
         // Don't play sound on other streams
         if (streamType != AudioSystem.STREAM_RING && (flags & AudioManager.FLAG_PLAY_SOUND) != 0) {
@@ -2025,6 +2033,10 @@
                 int ringerModeAffectedStreams = Settings.System.getInt(mContentResolver,
                         Settings.System.MODE_RINGER_STREAMS_AFFECTED,
                         0);
+                if (!mVoiceCapable) {
+                    ringerModeAffectedStreams |= (1 << AudioSystem.STREAM_MUSIC);
+                }
+
                 if (ringerModeAffectedStreams != mRingerModeAffectedStreams) {
                     /*
                      * Ensure all stream types that should be affected by ringer mode