diff options
| author | John Spurlock <jspurlock@google.com> | 2014-12-01 17:06:12 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-12-01 17:06:14 +0000 |
| commit | 21d68f4808db02aa3252ba5dec8b0220d053cab3 (patch) | |
| tree | 16841dc91979f54435ff9097fed2f0edcd51fb58 /core/java/android | |
| parent | 6cacf44e7ecfe50097adc99dab97c3fb9770a1af (diff) | |
| parent | bcc1087af40a0e1bb35dbe8a39c830ecdea8280b (diff) | |
Merge "Volume: Improve inline volume controls used in settings." into lmp-mr1-dev
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/preference/SeekBarVolumizer.java | 100 | ||||
| -rw-r--r-- | core/java/android/preference/VolumePreference.java | 10 |
2 files changed, 88 insertions, 22 deletions
diff --git a/core/java/android/preference/SeekBarVolumizer.java b/core/java/android/preference/SeekBarVolumizer.java index 3130b6465621..c3dd4cec72ff 100644 --- a/core/java/android/preference/SeekBarVolumizer.java +++ b/core/java/android/preference/SeekBarVolumizer.java @@ -44,6 +44,8 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba public interface Callback { void onSampleStarting(SeekBarVolumizer sbv); + void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch); + void onMuted(boolean muted); } private final Context mContext; @@ -53,6 +55,8 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba private final AudioManager mAudioManager; private final int mStreamType; private final int mMaxStreamVolume; + private boolean mAffectedByRingerMode; + private boolean mNotificationOrRing; private final Receiver mReceiver = new Receiver(); private Handler mHandler; @@ -60,8 +64,10 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba private int mOriginalStreamVolume; private Ringtone mRingtone; private int mLastProgress = -1; + private boolean mMuted; private SeekBar mSeekBar; private int mVolumeBeforeMute = -1; + private int mRingerMode; private static final int MSG_SET_STREAM_VOLUME = 0; private static final int MSG_START_SAMPLE = 1; @@ -69,14 +75,22 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba private static final int MSG_INIT_SAMPLE = 3; private static final int CHECK_RINGTONE_PLAYBACK_DELAY_MS = 1000; - public SeekBarVolumizer(Context context, int streamType, Uri defaultUri, - Callback callback) { + public SeekBarVolumizer(Context context, int streamType, Uri defaultUri, Callback callback) { mContext = context; mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mStreamType = streamType; + mAffectedByRingerMode = mAudioManager.isStreamAffectedByRingerMode(mStreamType); + mNotificationOrRing = isNotificationOrRing(mStreamType); + if (mNotificationOrRing) { + mRingerMode = mAudioManager.getRingerModeInternal(); + } mMaxStreamVolume = mAudioManager.getStreamMaxVolume(mStreamType); mCallback = callback; mOriginalStreamVolume = mAudioManager.getStreamVolume(mStreamType); + mMuted = mAudioManager.isStreamMute(mStreamType); + if (mCallback != null) { + mCallback.onMuted(mMuted); + } if (defaultUri == null) { if (mStreamType == AudioManager.STREAM_RING) { defaultUri = Settings.System.DEFAULT_RINGTONE_URI; @@ -89,6 +103,10 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mDefaultUri = defaultUri; } + private static boolean isNotificationOrRing(int stream) { + return stream == AudioManager.STREAM_RING || stream == AudioManager.STREAM_NOTIFICATION; + } + public void setSeekBar(SeekBar seekBar) { if (mSeekBar != null) { mSeekBar.setOnSeekBarChangeListener(null); @@ -96,10 +114,23 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mSeekBar = seekBar; mSeekBar.setOnSeekBarChangeListener(null); mSeekBar.setMax(mMaxStreamVolume); - mSeekBar.setProgress(mLastProgress > -1 ? mLastProgress : mOriginalStreamVolume); + updateSeekBar(); mSeekBar.setOnSeekBarChangeListener(this); } + protected void updateSeekBar() { + if (mNotificationOrRing && mRingerMode == AudioManager.RINGER_MODE_VIBRATE) { + mSeekBar.setEnabled(true); + mSeekBar.setProgress(0); + } else if (mMuted) { + mSeekBar.setEnabled(false); + mSeekBar.setProgress(0); + } else { + mSeekBar.setEnabled(true); + mSeekBar.setProgress(mLastProgress > -1 ? mLastProgress : mOriginalStreamVolume); + } + } + @Override public boolean handleMessage(Message msg) { switch (msg.what) { @@ -193,13 +224,13 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mAudioManager.setStreamVolume(mStreamType, mOriginalStreamVolume, 0); } - public void onProgressChanged(SeekBar seekBar, int progress, - boolean fromTouch) { - if (!fromTouch) { - return; + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { + if (fromTouch) { + postSetVolume(progress); + } + if (mCallback != null) { + mCallback.onProgressChanged(seekBar, progress, fromTouch); } - - postSetVolume(progress); } private void postSetVolume(int progress) { @@ -276,14 +307,29 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba public void handleMessage(Message msg) { if (msg.what == UPDATE_SLIDER) { if (mSeekBar != null) { - mSeekBar.setProgress(msg.arg1); - mLastProgress = mSeekBar.getProgress(); + mLastProgress = msg.arg1; + final boolean muted = msg.arg2 != 0; + if (muted != mMuted) { + mMuted = muted; + if (mCallback != null) { + mCallback.onMuted(mMuted); + } + } + updateSeekBar(); } } } - public void postUpdateSlider(int volume) { - obtainMessage(UPDATE_SLIDER, volume, 0).sendToTarget(); + public void postUpdateSlider(int volume, boolean mute) { + obtainMessage(UPDATE_SLIDER, volume, mute ? 1 : 0).sendToTarget(); + } + } + + private void updateSlider() { + if (mSeekBar != null && mAudioManager != null) { + final int volume = mAudioManager.getStreamVolume(mStreamType); + final boolean mute = mAudioManager.isStreamMute(mStreamType); + mUiHandler.postUpdateSlider(volume, mute); } } @@ -295,10 +341,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba @Override public void onChange(boolean selfChange) { super.onChange(selfChange); - if (mSeekBar != null && mAudioManager != null) { - final int volume = mAudioManager.getStreamVolume(mStreamType); - mUiHandler.postUpdateSlider(volume); - } + updateSlider(); } } @@ -310,6 +353,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba mListening = listening; if (listening) { final IntentFilter filter = new IntentFilter(AudioManager.VOLUME_CHANGED_ACTION); + filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION); mContext.registerReceiver(this, filter); } else { mContext.unregisterReceiver(this); @@ -318,11 +362,23 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba @Override public void onReceive(Context context, Intent intent) { - if (!AudioManager.VOLUME_CHANGED_ACTION.equals(intent.getAction())) return; - final int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); - final int streamValue = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); - if (mSeekBar != null && streamType == mStreamType && streamValue != -1) { - mUiHandler.postUpdateSlider(streamValue); + final String action = intent.getAction(); + if (AudioManager.VOLUME_CHANGED_ACTION.equals(action)) { + int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); + int streamValue = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, -1); + final boolean streamMatch = mNotificationOrRing ? isNotificationOrRing(streamType) + : (streamType == mStreamType); + if (mSeekBar != null && streamMatch && streamValue != -1) { + final boolean muted = mAudioManager.isStreamMute(mStreamType); + mUiHandler.postUpdateSlider(streamValue, muted); + } + } else if (AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION.equals(action)) { + if (mNotificationOrRing) { + mRingerMode = mAudioManager.getRingerModeInternal(); + } + if (mAffectedByRingerMode) { + updateSlider(); + } } } } diff --git a/core/java/android/preference/VolumePreference.java b/core/java/android/preference/VolumePreference.java index 0d4c0b6d0152..a2da01bffc2b 100644 --- a/core/java/android/preference/VolumePreference.java +++ b/core/java/android/preference/VolumePreference.java @@ -150,6 +150,16 @@ public class VolumePreference extends SeekBarDialogPreference implements } @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { + // noop + } + + @Override + public void onMuted(boolean muted) { + // noop + } + + @Override protected Parcelable onSaveInstanceState() { final Parcelable superState = super.onSaveInstanceState(); if (isPersistent()) { |
