summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorJohn Spurlock <jspurlock@google.com>2014-12-01 17:06:12 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-12-01 17:06:14 +0000
commit21d68f4808db02aa3252ba5dec8b0220d053cab3 (patch)
tree16841dc91979f54435ff9097fed2f0edcd51fb58 /core/java/android
parent6cacf44e7ecfe50097adc99dab97c3fb9770a1af (diff)
parentbcc1087af40a0e1bb35dbe8a39c830ecdea8280b (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.java100
-rw-r--r--core/java/android/preference/VolumePreference.java10
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()) {