diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:43 -0800 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2008-12-17 18:05:43 -0800 |
| commit | f013e1afd1e68af5e3b868c26a653bbfb39538f8 (patch) | |
| tree | 7ad6c8fd9c7b55f4b4017171dec1cb760bbd26bf /core/java/android/preference/VolumePreference.java | |
| parent | e70cfafe580c6f2994c4827cd8a534aabf3eb05c (diff) | |
Code drop from //branches/cupcake/...@124589
Diffstat (limited to 'core/java/android/preference/VolumePreference.java')
| -rw-r--r-- | core/java/android/preference/VolumePreference.java | 200 |
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; } + } - } |
