From 69bbfbb255322f8ea531787a9d7ca6ed06f1bd5e Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Tue, 30 Aug 2011 01:35:18 -0500 Subject: [PATCH] Run playback activity song/state change methods on UI thread This allows CoverView and song info views to be updated in one go, rather than in multiple posts to the UI thread. --- .../kreed/vanilla/FullPlaybackActivity.java | 66 ++++++++---------- src/org/kreed/vanilla/PlaybackActivity.java | 69 ++++++++++--------- src/org/kreed/vanilla/SongSelector.java | 19 ++--- 3 files changed, 72 insertions(+), 82 deletions(-) diff --git a/src/org/kreed/vanilla/FullPlaybackActivity.java b/src/org/kreed/vanilla/FullPlaybackActivity.java index 482483db..6eaed8b3 100644 --- a/src/org/kreed/vanilla/FullPlaybackActivity.java +++ b/src/org/kreed/vanilla/FullPlaybackActivity.java @@ -145,7 +145,7 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On * Show the message view overlay, creating it if necessary and clearing * it of all content. */ - void showMessageOverlay() + private void showMessageOverlay() { if (mMessageOverlay == null) { mMessageOverlay = new RelativeLayout(this); @@ -162,7 +162,7 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On /** * Hide the message overlay, if it exists. */ - void hideMessageOverlay() + private void hideMessageOverlay() { if (mMessageOverlay != null) mMessageOverlay.setVisibility(View.GONE); @@ -173,7 +173,7 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On * must have been created with showMessageOverlay before this method is * called. */ - void setNoMediaOverlayMessage() + private void setNoMediaOverlayMessage() { RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, @@ -187,52 +187,40 @@ public class FullPlaybackActivity extends PlaybackActivity implements SeekBar.On } @Override - protected void setState(final int state) + protected void onStateChange(int state, int toggled) { - int toggled = mState ^ state; + super.onStateChange(state, toggled); if ((toggled & PlaybackService.FLAG_NO_MEDIA) != 0) { - runOnUiThread(new Runnable() { - @Override - public void run() - { - if ((state & PlaybackService.FLAG_NO_MEDIA) != 0) { - showMessageOverlay(); - setNoMediaOverlayMessage(); - } else { - hideMessageOverlay(); - } - } - }); + if ((state & PlaybackService.FLAG_NO_MEDIA) != 0) { + showMessageOverlay(); + setNoMediaOverlayMessage(); + } else { + hideMessageOverlay(); + } } - - super.setState(state); } @Override protected void onSongChange(final Song song) { - mDuration = song == null ? 0 : song.duration; - if (mTitle != null) { - runOnUiThread(new Runnable() { - @Override - public void run() - { - if (song == null) { - mTitle.setText(null); - mAlbum.setText(null); - mArtist.setText(null); - } else { - mTitle.setText(song.title); - mAlbum.setText(song.album); - mArtist.setText(song.artist); - } - } - }); - } - mUiHandler.sendEmptyMessage(MSG_UPDATE_PROGRESS); - super.onSongChange(song); + + mDuration = song == null ? 0 : song.duration; + + if (mTitle != null) { + if (song == null) { + mTitle.setText(null); + mAlbum.setText(null); + mArtist.setText(null); + } else { + mTitle.setText(song.title); + mAlbum.setText(song.album); + mArtist.setText(song.artist); + } + } + + updateProgress(); } @Override diff --git a/src/org/kreed/vanilla/PlaybackActivity.java b/src/org/kreed/vanilla/PlaybackActivity.java index 78a56c84..067af90c 100644 --- a/src/org/kreed/vanilla/PlaybackActivity.java +++ b/src/org/kreed/vanilla/PlaybackActivity.java @@ -36,13 +36,13 @@ import android.view.MenuItem; import android.view.View; public class PlaybackActivity extends Activity implements Handler.Callback, View.OnClickListener, CoverView.Callback { - Handler mHandler; - Looper mLooper; + protected Handler mHandler; + protected Looper mLooper; - CoverView mCoverView; - ControlButton mPlayPauseButton; - int mState; + protected CoverView mCoverView; + protected ControlButton mPlayPauseButton; + protected int mState; private long mLastStateEvent; private long mLastSongEvent; @@ -139,12 +139,12 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View public void nextSong() { - onSongChange(ContextApplication.getService().nextSong()); + setSong(ContextApplication.getService().nextSong()); } public void previousSong() { - onSongChange(ContextApplication.getService().previousSong()); + setSong(ContextApplication.getService().previousSong()); } public void onClick(View view) @@ -163,31 +163,32 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View } /** - * Updates mState and the play/pause button. Override to - * implement further behavior in subclasses. + * Called when the PlaybackService state has changed. * * @param state PlaybackService state + * @param toggled The flags that have changed from the previous state */ - protected void setState(int state) + protected void onStateChange(int state, int toggled) + { + if ((toggled & PlaybackService.FLAG_PLAYING) != 0 && mPlayPauseButton != null) + mPlayPauseButton.setImageResource((state & PlaybackService.FLAG_PLAYING) == 0 ? R.drawable.play : R.drawable.pause); + + } + + protected void setState(final int state) { mLastStateEvent = SystemClock.uptimeMillis(); - if (mState == state) - return; - - int toggled = mState ^ state; - - if ((toggled & PlaybackService.FLAG_PLAYING) != 0 && mPlayPauseButton != null) { - final int res = (state & PlaybackService.FLAG_PLAYING) == 0 ? R.drawable.play : R.drawable.pause; + if (mState != state) { + final int toggled = mState ^ state; + mState = state; runOnUiThread(new Runnable() { public void run() { - mPlayPauseButton.setImageResource(res); + onStateChange(state, toggled); } }); } - - mState = state; } /** @@ -197,24 +198,30 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View protected void onServiceReady() { PlaybackService service = ContextApplication.getService(); - onSongChange(service.getSong(0)); + setSong(service.getSong(0)); setState(service.getState()); } /** * Called when the current song changes. + * + * @param song The new song */ - protected void onSongChange(final Song song) + protected void onSongChange(Song song) + { + if (mCoverView != null) + mCoverView.setCurrentSong(song); + } + + protected void setSong(final Song song) { mLastSongEvent = SystemClock.uptimeMillis(); - if (mCoverView != null) { - runOnUiThread(new Runnable() { - public void run() - { - mCoverView.setCurrentSong(song); - } - }); - } + runOnUiThread(new Runnable() { + public void run() + { + onSongChange(song); + } + }); } /** @@ -236,7 +243,7 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View if (intent.hasExtra("song") && time > mLastSongEvent) { Song song = intent.getParcelableExtra("song"); - onSongChange(song); + setSong(song); } } if (mCoverView != null) diff --git a/src/org/kreed/vanilla/SongSelector.java b/src/org/kreed/vanilla/SongSelector.java index befbc3cf..47131e51 100644 --- a/src/org/kreed/vanilla/SongSelector.java +++ b/src/org/kreed/vanilla/SongSelector.java @@ -71,8 +71,8 @@ public class SongSelector extends PlaybackActivity implements AdapterView.OnItem private View mClearButton; private View mControls; - TextView mStatusText; - ImageView mCover; + private TextView mStatusText; + private ImageView mCover; private ViewGroup mLimiterViews; @@ -686,20 +686,15 @@ public class SongSelector extends PlaybackActivity implements AdapterView.OnItem text = res.getString(R.string.title_by_artist, title, artist); } + mStatusText.setText(text); + if (mCoverSize == -1) { DisplayMetrics metrics = ContextApplication.getContext().getResources().getDisplayMetrics(); mCoverSize = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 64, metrics); } - final CharSequence result = text; - final Bitmap cover = CoverBitmap.createScaledBitmap(song, mCoverSize); - runOnUiThread(new Runnable() { - public void run() - { - mStatusText.setText(result); - mCover.setImageBitmap(cover); - mCover.setVisibility(cover == null ? View.GONE : View.VISIBLE); - } - }); + Bitmap cover = CoverBitmap.createScaledBitmap(song, mCoverSize); + mCover.setImageBitmap(cover); + mCover.setVisibility(cover == null ? View.GONE : View.VISIBLE); } }