From bccc23c59b731c94b56c7fa4b9f8276c1532e784 Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Sat, 27 Feb 2010 23:11:55 -0600 Subject: [PATCH] Update CoverViews sooner So it feels faster --- src/org/kreed/vanilla/CoverView.java | 21 ++++- src/org/kreed/vanilla/NowPlayingActivity.java | 1 + src/org/kreed/vanilla/PlaybackService.java | 78 ++++++++++--------- 3 files changed, 62 insertions(+), 38 deletions(-) diff --git a/src/org/kreed/vanilla/CoverView.java b/src/org/kreed/vanilla/CoverView.java index a1ae833a..2a1b7d4f 100644 --- a/src/org/kreed/vanilla/CoverView.java +++ b/src/org/kreed/vanilla/CoverView.java @@ -233,6 +233,17 @@ public class CoverView extends View { oldBitmap.recycle(); } + public void clearSongs() + { + for (int i = STORE_SIZE; --i != -1; ) { + mSongs[i] = null; + if (mBitmaps[i] != null) { + mBitmaps[i].recycle(); + mBitmaps[i] = null; + } + } + } + private void refreshSongs() { mHandler.sendMessage(mHandler.obtainMessage(QUERY_SONG, 1, 0)); @@ -439,8 +450,14 @@ public class CoverView extends View { private IMusicPlayerWatcher mWatcher = new IMusicPlayerWatcher.Stub() { public void songChanged(Song playingSong) { - if (!playingSong.equals(mSongs[STORE_SIZE / 2])) - refreshSongs(); + Song currentSong = mSongs[STORE_SIZE / 2]; + if (currentSong == null) { + mSongs[STORE_SIZE / 2] = currentSong; + createBitmap(STORE_SIZE / 2); + reset(); + } else if (currentSong.equals(playingSong)) + return; + refreshSongs(); } public void stateChanged(int oldState, int newState) diff --git a/src/org/kreed/vanilla/NowPlayingActivity.java b/src/org/kreed/vanilla/NowPlayingActivity.java index 55814a00..f611541a 100644 --- a/src/org/kreed/vanilla/NowPlayingActivity.java +++ b/src/org/kreed/vanilla/NowPlayingActivity.java @@ -220,6 +220,7 @@ public class NowPlayingActivity extends Activity implements ServiceConnection, V mService.unregisterWatcher(mWatcher); } catch (RemoteException e) { } + mCoverView.clearSongs(); } else { try { service.registerWatcher(mWatcher); diff --git a/src/org/kreed/vanilla/PlaybackService.java b/src/org/kreed/vanilla/PlaybackService.java index d3c3dd65..067385d8 100644 --- a/src/org/kreed/vanilla/PlaybackService.java +++ b/src/org/kreed/vanilla/PlaybackService.java @@ -324,25 +324,18 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On { Looper.prepare(); + retrieveSongs(); + broadcastSongChange(getSong(1)); + mMediaPlayer = new MediaPlayer(); mSongTimeline = new ArrayList(); mRandom = new Random(); mHandler = new MusicHandler(); - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_HEADSET_PLUG); - filter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); - filter.addAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); - filter.addAction(TOGGLE_PLAYBACK); - filter.addAction(NEXT_SONG); - filter.addAction(APPWIDGET_SMALL_UPDATE); - registerReceiver(mReceiver, filter); - - PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE); - mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "VanillaMusicSongChangeLock"); - - TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); - telephonyManager.listen(mCallListener, PhoneStateListener.LISTEN_CALL_STATE); + mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mMediaPlayer.setWakeMode(this, PowerManager.PARTIAL_WAKE_LOCK); + mMediaPlayer.setOnCompletionListener(this); + mMediaPlayer.setOnErrorListener(this); mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); try { @@ -352,7 +345,7 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On } catch (NoSuchMethodException e) { Log.d("VanillaMusic", "falling back to pre-2.0 AudioManager APIs"); } - + mNotificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); try { mStartForeground = getClass().getMethod("startForeground", int.class, Notification.class); @@ -361,12 +354,6 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On Log.d("VanillaMusic", "falling back to pre-2.0 Service APIs"); } - mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); - mMediaPlayer.setWakeMode(this, PowerManager.PARTIAL_WAKE_LOCK); - mMediaPlayer.setOnCompletionListener(this); - mMediaPlayer.setOnErrorListener(this); - retrieveSongs(); - mSettings = PreferenceManager.getDefaultSharedPreferences(this); mSettings.registerOnSharedPreferenceChangeListener(this); mHeadsetPause = mSettings.getBoolean("headset_pause", true); @@ -377,6 +364,21 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On setCurrentSong(1); + PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE); + mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "VanillaMusicSongChangeLock"); + + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_HEADSET_PLUG); + filter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); + filter.addAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); + filter.addAction(TOGGLE_PLAYBACK); + filter.addAction(NEXT_SONG); + filter.addAction(APPWIDGET_SMALL_UPDATE); + registerReceiver(mReceiver, filter); + + TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); + telephonyManager.listen(mCallListener, PhoneStateListener.LISTEN_CALL_STATE); + Looper.loop(); } @@ -506,6 +508,19 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On pause(); } + private void broadcastSongChange(Song song) + { + int i = mWatchers.beginBroadcast(); + while (--i != -1) { + try { + mWatchers.getBroadcastItem(i).songChanged(song); + } catch (RemoteException e) { + // Null elements will be removed automatically + } + } + mWatchers.finishBroadcast(); + } + private void setCurrentSong(int delta) { Song song = getSong(delta); @@ -514,8 +529,6 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On mCurrentSong += delta; - updateNotification(); - try { mMediaPlayer.reset(); mMediaPlayer.setDataSource(song.path); @@ -526,15 +539,9 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On Log.e("VanillaMusic", "IOException", e); } - int i = mWatchers.beginBroadcast(); - while (--i != -1) { - try { - mWatchers.getBroadcastItem(i).songChanged(song); - } catch (RemoteException e) { - // Null elements will be removed automatically - } - } - mWatchers.finishBroadcast(); + broadcastSongChange(song); + updateNotification(); + updateWidgets(); getSong(+2); @@ -542,13 +549,12 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On mSongTimeline.remove(0); --mCurrentSong; } - - updateWidgets(); } public void onCompletion(MediaPlayer player) { - mWakeLock.acquire(); + if (mWakeLock != null) + mWakeLock.acquire(); mHandler.sendEmptyMessage(TRACK_CHANGED); mHandler.sendEmptyMessage(RELEASE_WAKE_LOCK); } @@ -640,7 +646,7 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On setCurrentSong(+1); break; case RELEASE_WAKE_LOCK: - if (mWakeLock.isHeld()) + if (mWakeLock != null && mWakeLock.isHeld()) mWakeLock.release(); break; case HANDLE_PLAY: