From 95caba127051845ff1e26d7e64909db89408e8e7 Mon Sep 17 00:00:00 2001 From: John Spurlock Date: Tue, 27 May 2014 13:10:38 -0400 Subject: [PATCH] frameworks/base: Performance tweaks for SeekBarVolumizer. Move ringtone init to the worker thread. Allow the volumizer instance to be reused by making the seekbar settable. Bug:15091992 Change-Id: Ib616ae0fbb9a45c63391f8335e48ec2754dbdcd5 --- core/java/android/preference/SeekBarVolumizer.java | 57 ++++++++++++---------- core/java/android/preference/VolumePreference.java | 3 +- 2 files changed, 34 insertions(+), 26 deletions(-) diff --git a/core/java/android/preference/SeekBarVolumizer.java b/core/java/android/preference/SeekBarVolumizer.java index d2d6ade20b15..5e005d0c6264 100644 --- a/core/java/android/preference/SeekBarVolumizer.java +++ b/core/java/android/preference/SeekBarVolumizer.java @@ -37,20 +37,22 @@ import android.widget.SeekBar.OnSeekBarChangeListener; * @hide */ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callback { + private static final String TAG = "SeekBarVolumizer"; public interface Callback { void onSampleStarting(SeekBarVolumizer sbv); } - private Context mContext; - private Handler mHandler; + private final Context mContext; + private final Handler mHandler; private final Callback mCallback; + private final Uri mDefaultUri; + private final AudioManager mAudioManager; + private final int mStreamType; + private final int mMaxStreamVolume; - private AudioManager mAudioManager; - private int mStreamType; private int mOriginalStreamVolume; private Ringtone mRingtone; - private int mLastProgress = -1; private SeekBar mSeekBar; private int mVolumeBeforeMute = -1; @@ -58,9 +60,10 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba private static final int MSG_SET_STREAM_VOLUME = 0; private static final int MSG_START_SAMPLE = 1; private static final int MSG_STOP_SAMPLE = 2; + private static final int MSG_INIT_SAMPLE = 3; private static final int CHECK_RINGTONE_PLAYBACK_DELAY_MS = 1000; - private ContentObserver mVolumeObserver = new ContentObserver(mHandler) { + private ContentObserver mVolumeObserver = new ContentObserver(new Handler()) { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); @@ -71,27 +74,17 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba } }; - public SeekBarVolumizer(Context context, SeekBar seekBar, int streamType, Uri defaultUri, + public SeekBarVolumizer(Context context, int streamType, Uri defaultUri, Callback callback) { mContext = context; mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mStreamType = streamType; - mSeekBar = seekBar; - - HandlerThread thread = new HandlerThread(VolumePreference.TAG + ".CallbackHandler"); + mMaxStreamVolume = mAudioManager.getStreamMaxVolume(mStreamType); + HandlerThread thread = new HandlerThread(TAG + ".CallbackHandler"); thread.start(); mHandler = new Handler(thread.getLooper(), this); mCallback = callback; - - initSeekBar(seekBar, defaultUri); - } - - private void initSeekBar(SeekBar seekBar, Uri defaultUri) { - 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); @@ -105,12 +98,16 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba defaultUri = Settings.System.DEFAULT_ALARM_ALERT_URI; } } + mDefaultUri = defaultUri; + mHandler.sendEmptyMessage(MSG_INIT_SAMPLE); + } - mRingtone = RingtoneManager.getRingtone(mContext, defaultUri); - - if (mRingtone != null) { - mRingtone.setStreamType(mStreamType); - } + public void setSeekBar(SeekBar seekBar) { + mSeekBar = seekBar; + mSeekBar.setOnSeekBarChangeListener(null); + mSeekBar.setMax(mMaxStreamVolume); + mSeekBar.setProgress(mLastProgress > -1 ? mLastProgress : mOriginalStreamVolume); + mSeekBar.setOnSeekBarChangeListener(this); } @Override @@ -125,12 +122,22 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba case MSG_STOP_SAMPLE: onStopSample(); break; + case MSG_INIT_SAMPLE: + onInitSample(); + break; default: - Log.e(VolumePreference.TAG, "invalid SeekBarVolumizer message: "+msg.what); + Log.e(TAG, "invalid SeekBarVolumizer message: "+msg.what); } return true; } + private void onInitSample() { + mRingtone = RingtoneManager.getRingtone(mContext, mDefaultUri); + if (mRingtone != null) { + mRingtone.setStreamType(mStreamType); + } + } + private void postStartSample() { mHandler.removeMessages(MSG_START_SAMPLE); mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_START_SAMPLE), diff --git a/core/java/android/preference/VolumePreference.java b/core/java/android/preference/VolumePreference.java index 171e5c3a9593..df9e10e6d261 100644 --- a/core/java/android/preference/VolumePreference.java +++ b/core/java/android/preference/VolumePreference.java @@ -66,7 +66,8 @@ public class VolumePreference extends SeekBarDialogPreference implements super.onBindDialogView(view); final SeekBar seekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar); - mSeekBarVolumizer = new SeekBarVolumizer(getContext(), seekBar, mStreamType, null, this); + mSeekBarVolumizer = new SeekBarVolumizer(getContext(), mStreamType, null, this); + mSeekBarVolumizer.setSeekBar(seekBar); getPreferenceManager().registerOnActivityStopListener(this); -- 2.11.0