From fdb3e0b23802cca6abbf03ce41d0cfc47287102a Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Wed, 7 Sep 2011 01:47:21 -0500 Subject: [PATCH] Attempt to fix ever-lasting Toasts. I'm not actually able to reproduce this issue, so I'm not certain of what the cause might be. Apparently this can happen when Toasts aren't created on the UI thread. I've attempted to mimimize that... --- src/org/kreed/vanilla/PlaybackActivity.java | 17 ++++-- src/org/kreed/vanilla/PlaybackService.java | 68 +++++++-------------- 2 files changed, 36 insertions(+), 49 deletions(-) diff --git a/src/org/kreed/vanilla/PlaybackActivity.java b/src/org/kreed/vanilla/PlaybackActivity.java index c2a060e9..9096e5b4 100644 --- a/src/org/kreed/vanilla/PlaybackActivity.java +++ b/src/org/kreed/vanilla/PlaybackActivity.java @@ -171,7 +171,11 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View public void playPause() { - setState(ContextApplication.getService().toggleFlag(PlaybackService.FLAG_PLAYING)); + PlaybackService service = ContextApplication.getService(); + int state = service.toggleFlag(PlaybackService.FLAG_PLAYING); + if ((state & PlaybackService.FLAG_ERROR) != 0) + Toast.makeText(this, service.getErrorMessage(), Toast.LENGTH_LONG).show(); + setState(state); } public void onClick(View view) @@ -199,7 +203,6 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View { 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) @@ -347,7 +350,10 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View */ public void toggleShuffle() { - setState(ContextApplication.getService().toggleFlag(PlaybackService.FLAG_SHUFFLE)); + int state = ContextApplication.getService().toggleFlag(PlaybackService.FLAG_SHUFFLE); + int res = (state & PlaybackService.FLAG_SHUFFLE) == 0 ? R.string.shuffle_disabling : R.string.shuffle_enabling; + Toast.makeText(this, res, Toast.LENGTH_LONG).show(); + setState(state); } /** @@ -355,7 +361,10 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View */ public void toggleRepeat() { - setState(ContextApplication.getService().toggleFlag(PlaybackService.FLAG_REPEAT)); + int state = ContextApplication.getService().toggleFlag(PlaybackService.FLAG_REPEAT); + int res = (state & PlaybackService.FLAG_REPEAT) == 0 ? R.string.repeat_disabling : R.string.repeat_enabling; + Toast.makeText(this, res, Toast.LENGTH_LONG).show(); + setState(state); } /** diff --git a/src/org/kreed/vanilla/PlaybackService.java b/src/org/kreed/vanilla/PlaybackService.java index 6de42ca4..6829df4e 100644 --- a/src/org/kreed/vanilla/PlaybackService.java +++ b/src/org/kreed/vanilla/PlaybackService.java @@ -50,7 +50,7 @@ import android.telephony.TelephonyManager; import android.util.Log; import android.widget.Toast; -public final class PlaybackService extends Service implements Handler.Callback, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener, SharedPreferences.OnSharedPreferenceChangeListener, SongTimeline.Callback { +public final class PlaybackService extends Service implements Handler.Callback, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener, SharedPreferences.OnSharedPreferenceChangeListener, SongTimeline.Callback { private static final int NOTIFICATION_ID = 2; /** @@ -141,6 +141,7 @@ public final class PlaybackService extends Service implements Handler.Callback, public Receiver mReceiver; public InCallListener mCallListener; private boolean mLoaded; + private String mErrorMessage; /** * The volume set by the user in the preferences. */ @@ -183,16 +184,6 @@ public final class PlaybackService extends Service implements Handler.Callback, mHandler.sendEmptyMessage(CREATE); } - /** - * Show a Toast that notifies the user the Service is starting up. Useful - * to provide a quick response to play/pause and next events from widgets - * when we must initialize the service before acting on the event. - */ - private void showStartupToast() - { - Toast.makeText(this, R.string.starting, Toast.LENGTH_SHORT).show(); - } - @Override public void onStart(Intent intent, int flags) { @@ -421,16 +412,9 @@ public final class PlaybackService extends Service implements Handler.Callback, { state &= ALL_FLAGS; - if ((state & FLAG_NO_MEDIA) != 0) + if ((state & FLAG_NO_MEDIA) != 0 || (state & FLAG_ERROR) != 0) state &= ~FLAG_PLAYING; - if ((state & FLAG_ERROR) != 0 && (state & FLAG_PLAYING) != 0) { - state &= ~FLAG_PLAYING; - Song song = mCurrentSong; - String text = getResources().getString(R.string.song_load_failed, song == null ? null : song.path); - Toast.makeText(this, text, Toast.LENGTH_LONG).show(); - } - int oldState = mState; mState = state; @@ -470,25 +454,10 @@ public final class PlaybackService extends Service implements Handler.Callback, } } - if ((toggled & FLAG_SHUFFLE) != 0) { - if ((state & FLAG_SHUFFLE) != 0) { - mTimeline.setShuffle(true); - Toast.makeText(this, R.string.shuffle_enabling, Toast.LENGTH_LONG).show(); - } else { - mTimeline.setShuffle(false); - Toast.makeText(this, R.string.shuffle_disabling, Toast.LENGTH_SHORT).show(); - } - } - - if ((toggled & FLAG_REPEAT) != 0) { - if ((state & FLAG_REPEAT) != 0) { - mTimeline.setRepeat(true); - Toast.makeText(this, R.string.repeat_enabling, Toast.LENGTH_LONG).show(); - } else { - mTimeline.setRepeat(false); - Toast.makeText(this, R.string.repeat_disabling, Toast.LENGTH_SHORT).show(); - } - } + if ((toggled & FLAG_SHUFFLE) != 0) + mTimeline.setShuffle((state & FLAG_SHUFFLE) != 0); + if ((toggled & FLAG_REPEAT) != 0) + mTimeline.setRepeat((state & FLAG_REPEAT) != 0); } private void broadcastChange(int state, Song song, long uptime) @@ -598,11 +567,15 @@ public final class PlaybackService extends Service implements Handler.Callback, if ((mState & FLAG_PLAYING) != 0) mMediaPlayer.start(); - updateState(mState & ~FLAG_ERROR); + + if ((mState & FLAG_ERROR) != 0) { + mErrorMessage = null; + updateState(mState & ~FLAG_ERROR); + } } catch (IOException e) { - // FLAG_PLAYING is set to force showing the Toast. updateState() - // will unset it. - updateState(mState | FLAG_PLAYING | FLAG_ERROR); + mErrorMessage = getResources().getString(R.string.song_load_failed, song == null ? null : song.path); + updateState(mState | FLAG_ERROR); + Toast.makeText(this, mErrorMessage, Toast.LENGTH_LONG).show(); Log.e("VanillaMusic", "IOException", e); } @@ -644,9 +617,6 @@ public final class PlaybackService extends Service implements Handler.Callback, private void go(int delta, boolean autoPlay) { - if (!mLoaded) - showStartupToast(); - if (autoPlay) { synchronized (mStateLock) { mState |= FLAG_PLAYING; @@ -1054,4 +1024,12 @@ public final class PlaybackService extends Service implements Handler.Callback, { mTimeline.finishEnqueueing(); } + + /** + * Return the error message set when FLAG_ERROR is set. + */ + public String getErrorMessage() + { + return mErrorMessage; + } }