summaryrefslogtreecommitdiff
path: root/core/java/android/preference/VolumePreference.java
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:43 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2008-12-17 18:05:43 -0800
commitf013e1afd1e68af5e3b868c26a653bbfb39538f8 (patch)
tree7ad6c8fd9c7b55f4b4017171dec1cb760bbd26bf /core/java/android/preference/VolumePreference.java
parente70cfafe580c6f2994c4827cd8a534aabf3eb05c (diff)
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'core/java/android/preference/VolumePreference.java')
-rw-r--r--core/java/android/preference/VolumePreference.java200
1 files changed, 129 insertions, 71 deletions
diff --git a/core/java/android/preference/VolumePreference.java b/core/java/android/preference/VolumePreference.java
index 5a0a0893897e..6e215dcd7491 100644
--- a/core/java/android/preference/VolumePreference.java
+++ b/core/java/android/preference/VolumePreference.java
@@ -16,7 +16,6 @@
package android.preference;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.res.TypedArray;
import android.database.ContentObserver;
@@ -35,33 +34,15 @@ import android.widget.SeekBar.OnSeekBarChangeListener;
/**
* @hide
*/
-public class VolumePreference extends SeekBarPreference implements OnSeekBarChangeListener,
- Runnable, PreferenceManager.OnActivityStopListener {
+public class VolumePreference extends SeekBarPreference implements
+ PreferenceManager.OnActivityStopListener {
private static final String TAG = "VolumePreference";
- private ContentResolver mContentResolver;
- private Handler mHandler = new Handler();
-
- private AudioManager mVolume;
private int mStreamType;
- private int mOriginalStreamVolume;
- private Ringtone mRingtone;
-
- private int mLastProgress;
- private SeekBar mSeekBar;
- private ContentObserver mVolumeObserver = new ContentObserver(mHandler) {
- @Override
- public void onChange(boolean selfChange) {
- super.onChange(selfChange);
-
- if (mSeekBar != null) {
- mSeekBar.setProgress(System.getInt(mContentResolver,
- System.VOLUME_SETTINGS[mStreamType], 0));
- }
- }
- };
+ /** May be null if the dialog isn't visible. */
+ private SeekBarVolumizer mSeekBarVolumizer;
public VolumePreference(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -70,39 +51,32 @@ public class VolumePreference extends SeekBarPreference implements OnSeekBarChan
com.android.internal.R.styleable.VolumePreference, 0, 0);
mStreamType = a.getInt(android.R.styleable.VolumePreference_streamType, 0);
a.recycle();
-
- mContentResolver = context.getContentResolver();
-
- mVolume = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
}
+ public void setStreamType(int streamType) {
+ mStreamType = streamType;
+ }
+
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
- final SeekBar seekBar = mSeekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar);
- seekBar.setMax(mVolume.getStreamMaxVolume(mStreamType));
- mOriginalStreamVolume = mVolume.getStreamVolume(mStreamType);
- seekBar.setProgress(mOriginalStreamVolume);
- seekBar.setOnSeekBarChangeListener(this);
+ final SeekBar seekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar);
+ mSeekBarVolumizer = new SeekBarVolumizer(getContext(), seekBar, mStreamType);
- mContentResolver.registerContentObserver(System.getUriFor(System.VOLUME_SETTINGS[mStreamType]), false, mVolumeObserver);
-
getPreferenceManager().registerOnActivityStopListener(this);
- mRingtone = RingtoneManager.getRingtone(getContext(), Settings.System.DEFAULT_RINGTONE_URI);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
- if (!positiveResult) {
- mVolume.setStreamVolume(mStreamType, mOriginalStreamVolume, 0);
+ if (!positiveResult && mSeekBarVolumizer != null) {
+ mSeekBarVolumizer.revertVolume();
}
cleanup();
}
-
public void onActivityStop() {
cleanup();
@@ -112,50 +86,134 @@ public class VolumePreference extends SeekBarPreference implements OnSeekBarChan
* Do clean up. This can be called multiple times!
*/
private void cleanup() {
- stopSample();
- if (mVolumeObserver != null) {
- mContentResolver.unregisterContentObserver(mVolumeObserver);
+ getPreferenceManager().unregisterOnActivityStopListener(this);
+
+ if (mSeekBarVolumizer != null) {
+ mSeekBarVolumizer.stop();
+ mSeekBarVolumizer = null;
+ }
+ }
+
+ protected void onSampleStarting(SeekBarVolumizer volumizer) {
+ if (mSeekBarVolumizer != null && volumizer != mSeekBarVolumizer) {
+ mSeekBarVolumizer.stopSample();
}
- getPreferenceManager().unregisterOnActivityStopListener(this);
- mSeekBar = null;
}
+
+ /**
+ * Turns a {@link SeekBar} into a volume control.
+ */
+ public class SeekBarVolumizer implements OnSeekBarChangeListener, Runnable {
- public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
- if (!fromTouch) {
- return;
+ private Context mContext;
+ private Handler mHandler = new Handler();
+
+ private AudioManager mAudioManager;
+ private int mStreamType;
+ private int mOriginalStreamVolume;
+ private Ringtone mRingtone;
+
+ private int mLastProgress;
+ private SeekBar mSeekBar;
+
+ private ContentObserver mVolumeObserver = new ContentObserver(mHandler) {
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+
+ if (mSeekBar != null) {
+ mSeekBar.setProgress(System.getInt(mContext.getContentResolver(),
+ System.VOLUME_SETTINGS[mStreamType], 0));
+ }
+ }
+ };
+
+ public SeekBarVolumizer(Context context, SeekBar seekBar, int streamType) {
+ mContext = context;
+ mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
+ mStreamType = streamType;
+ mSeekBar = seekBar;
+
+ initSeekBar(seekBar);
}
- postSetVolume(progress);
- }
-
- private void postSetVolume(int progress) {
- // Do the volume changing separately to give responsive UI
- mLastProgress = progress;
- mHandler.removeCallbacks(this);
- mHandler.post(this);
- }
+ private void initSeekBar(SeekBar seekBar) {
+ seekBar.setMax(mAudioManager.getStreamMaxVolume(mStreamType));
+ mOriginalStreamVolume = mAudioManager.getStreamVolume(mStreamType);
+ seekBar.setProgress(mOriginalStreamVolume);
+ seekBar.setOnSeekBarChangeListener(this);
+
+ mContext.getContentResolver().registerContentObserver(
+ System.getUriFor(System.VOLUME_SETTINGS[mStreamType]),
+ false, mVolumeObserver);
- public void onStartTrackingTouch(SeekBar seekBar) {
- }
+ mRingtone = RingtoneManager.getRingtone(mContext,
+ mStreamType == AudioManager.STREAM_NOTIFICATION
+ ? Settings.System.DEFAULT_NOTIFICATION_URI
+ : Settings.System.DEFAULT_RINGTONE_URI);
+ mRingtone.setStreamType(mStreamType);
+ }
+
+ public void stop() {
+ stopSample();
+ mContext.getContentResolver().unregisterContentObserver(mVolumeObserver);
+ mSeekBar.setOnSeekBarChangeListener(null);
+ }
+
+ public void revertVolume() {
+ mAudioManager.setStreamVolume(mStreamType, mOriginalStreamVolume, 0);
+ }
+
+ public void onProgressChanged(SeekBar seekBar, int progress,
+ boolean fromTouch) {
+ if (!fromTouch) {
+ return;
+ }
+
+ postSetVolume(progress);
+ }
- public void onStopTrackingTouch(SeekBar seekBar) {
- if (mRingtone != null && !mRingtone.isPlaying()) {
- sample();
+ private void postSetVolume(int progress) {
+ // Do the volume changing separately to give responsive UI
+ mLastProgress = progress;
+ mHandler.removeCallbacks(this);
+ mHandler.post(this);
+ }
+
+ public void onStartTrackingTouch(SeekBar seekBar) {
}
- }
- public void run() {
- mVolume.setStreamVolume(mStreamType, mLastProgress, 0);
- }
+ public void onStopTrackingTouch(SeekBar seekBar) {
+ if (mRingtone != null && !mRingtone.isPlaying()) {
+ sample();
+ }
+ }
+
+ public void run() {
+ mAudioManager.setStreamVolume(mStreamType, mLastProgress, 0);
+ }
+
+ private void sample() {
- private void sample() {
- mRingtone.play();
- }
+ // Only play a preview sample when controlling the ringer stream
+ if (mStreamType != AudioManager.STREAM_RING
+ && mStreamType != AudioManager.STREAM_NOTIFICATION) {
+ return;
+ }
+
+ onSampleStarting(this);
+ mRingtone.play();
+ }
+
+ public void stopSample() {
+ if (mRingtone != null) {
+ mRingtone.stop();
+ }
+ }
- private void stopSample() {
- if (mRingtone != null) {
- mRingtone.stop();
+ public SeekBar getSeekBar() {
+ return mSeekBar;
}
+
}
-
}