diff --git a/frameworks/base/media/java/android/media/AudioService.java b/frameworks/base/media/java/android/media/AudioService.java
--- a/frameworks/base/media/java/android/media/AudioService.java
+++ b/frameworks/base/media/java/android/media/AudioService.java
@@ -1139,10 +1139,18 @@
                     ? AudioManager.RINGER_MODE_VIBRATE
                     : AudioManager.RINGER_MODE_SILENT;
             }
+        } else if (mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
+            if (direction == AudioManager.ADJUST_RAISE) {
+                newRingerMode = AudioManager.RINGER_MODE_NORMAL;
+            } else if (direction == AudioManager.ADJUST_LOWER) {
+                newRingerMode = AudioManager.RINGER_MODE_SILENT;
+            }
         } else {
             if (direction == AudioManager.ADJUST_RAISE) {
                 // exiting silent mode
-                newRingerMode = AudioManager.RINGER_MODE_NORMAL;
+                newRingerMode = System.getInt(mContentResolver, System.VIBRATE_IN_SILENT, 1) == 1
+                    ? AudioManager.RINGER_MODE_VIBRATE
+                    : AudioManager.RINGER_MODE_NORMAL;
             } else {
                 // prevent last audible index to reach 0
                 adjustVolumeIndex = false;
