Volume: Disable seekbar prefs when zen muted.

 - And display the last audible value.

Bug: 21267436
Change-Id: I667d0680811b48a51eab22c837933e493f1d5c44
diff --git a/core/java/android/preference/SeekBarVolumizer.java b/core/java/android/preference/SeekBarVolumizer.java
index 4bd085f..979c828 100644
--- a/core/java/android/preference/SeekBarVolumizer.java
+++ b/core/java/android/preference/SeekBarVolumizer.java
@@ -16,6 +16,7 @@
 
 package android.preference;
 
+import android.app.NotificationManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -31,6 +32,7 @@
 import android.os.Message;
 import android.preference.VolumePreference.VolumeStore;
 import android.provider.Settings;
+import android.provider.Settings.Global;
 import android.provider.Settings.System;
 import android.util.Log;
 import android.widget.SeekBar;
@@ -46,7 +48,7 @@
     public interface Callback {
         void onSampleStarting(SeekBarVolumizer sbv);
         void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch);
-        void onMuted(boolean muted);
+        void onMuted(boolean muted, boolean zenMuted);
     }
 
     private final Context mContext;
@@ -54,6 +56,7 @@
     private final Callback mCallback;
     private final Uri mDefaultUri;
     private final AudioManager mAudioManager;
+    private final NotificationManager mNotificationManager;
     private final int mStreamType;
     private final int mMaxStreamVolume;
     private boolean mAffectedByRingerMode;
@@ -63,12 +66,14 @@
     private Handler mHandler;
     private Observer mVolumeObserver;
     private int mOriginalStreamVolume;
+    private int mLastAudibleStreamVolume;
     private Ringtone mRingtone;
     private int mLastProgress = -1;
     private boolean mMuted;
     private SeekBar mSeekBar;
     private int mVolumeBeforeMute = -1;
     private int mRingerMode;
+    private int mZenMode;
 
     private static final int MSG_SET_STREAM_VOLUME = 0;
     private static final int MSG_START_SAMPLE = 1;
@@ -78,19 +83,22 @@
 
     public SeekBarVolumizer(Context context, int streamType, Uri defaultUri, Callback callback) {
         mContext = context;
-        mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+        mAudioManager = context.getSystemService(AudioManager.class);
+        mNotificationManager = context.getSystemService(NotificationManager.class);
         mStreamType = streamType;
         mAffectedByRingerMode = mAudioManager.isStreamAffectedByRingerMode(mStreamType);
         mNotificationOrRing = isNotificationOrRing(mStreamType);
         if (mNotificationOrRing) {
             mRingerMode = mAudioManager.getRingerModeInternal();
         }
+        mZenMode = mNotificationManager.getZenMode();
         mMaxStreamVolume = mAudioManager.getStreamMaxVolume(mStreamType);
         mCallback = callback;
         mOriginalStreamVolume = mAudioManager.getStreamVolume(mStreamType);
+        mLastAudibleStreamVolume = mAudioManager.getLastAudibleStreamVolume(mStreamType);
         mMuted = mAudioManager.isStreamMute(mStreamType);
         if (mCallback != null) {
-            mCallback.onMuted(mMuted);
+            mCallback.onMuted(mMuted, isZenMuted());
         }
         if (defaultUri == null) {
             if (mStreamType == AudioManager.STREAM_RING) {
@@ -119,8 +127,17 @@
         mSeekBar.setOnSeekBarChangeListener(this);
     }
 
+    private boolean isZenMuted() {
+        return mNotificationOrRing && mZenMode == Global.ZEN_MODE_ALARMS
+                || mZenMode == Global.ZEN_MODE_NO_INTERRUPTIONS;
+    }
+
     protected void updateSeekBar() {
-        if (mNotificationOrRing && mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
+        final boolean zenMuted = isZenMuted();
+        mSeekBar.setEnabled(!zenMuted);
+        if (zenMuted) {
+            mSeekBar.setProgress(mLastAudibleStreamVolume);
+        } else if (mNotificationOrRing && mRingerMode == AudioManager.RINGER_MODE_VIBRATE) {
             mSeekBar.setProgress(0);
         } else if (mMuted) {
             mSeekBar.setProgress(0);
@@ -316,11 +333,12 @@
             if (msg.what == UPDATE_SLIDER) {
                 if (mSeekBar != null) {
                     mLastProgress = msg.arg1;
-                    final boolean muted = msg.arg2 != 0;
+                    mLastAudibleStreamVolume = Math.abs(msg.arg2);
+                    final boolean muted = msg.arg2 < 0;
                     if (muted != mMuted) {
                         mMuted = muted;
                         if (mCallback != null) {
-                            mCallback.onMuted(mMuted);
+                            mCallback.onMuted(mMuted, isZenMuted());
                         }
                     }
                     updateSeekBar();
@@ -328,16 +346,18 @@
             }
         }
 
-        public void postUpdateSlider(int volume, boolean mute) {
-            obtainMessage(UPDATE_SLIDER, volume, mute ? 1 : 0).sendToTarget();
+        public void postUpdateSlider(int volume, int lastAudibleVolume, boolean mute) {
+            final int arg2 = lastAudibleVolume * (mute ? -1 : 1);
+            obtainMessage(UPDATE_SLIDER, volume, arg2).sendToTarget();
         }
     }
 
     private void updateSlider() {
         if (mSeekBar != null && mAudioManager != null) {
             final int volume = mAudioManager.getStreamVolume(mStreamType);
+            final int lastAudibleVolume = mAudioManager.getLastAudibleStreamVolume(mStreamType);
             final boolean mute = mAudioManager.isStreamMute(mStreamType);
-            mUiHandler.postUpdateSlider(volume, mute);
+            mUiHandler.postUpdateSlider(volume, lastAudibleVolume, mute);
         }
     }
 
@@ -362,6 +382,7 @@
             if (listening) {
                 final IntentFilter filter = new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION);
                 filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
+                filter.addAction(NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED);
                 mContext.registerReceiver(this, filter);
             } else {
                 mContext.unregisterReceiver(this);
@@ -379,7 +400,7 @@
                 if (mSeekBar != null && streamMatch && streamValue != -1) {
                     final boolean muted = mAudioManager.isStreamMute(mStreamType)
                             || streamValue == 0;
-                    mUiHandler.postUpdateSlider(streamValue, muted);
+                    mUiHandler.postUpdateSlider(streamValue, mLastAudibleStreamVolume, muted);
                 }
             } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) {
                 if (mNotificationOrRing) {
@@ -388,6 +409,9 @@
                 if (mAffectedByRingerMode) {
                     updateSlider();
                 }
+            } else if (NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED.equals(action)) {
+                mZenMode = mNotificationManager.getZenMode();
+                updateSlider();
             }
         }
     }