From 003014945a9c5646fbd2916796186d858354f896 Mon Sep 17 00:00:00 2001 From: Christopher Eby Date: Sun, 11 Apr 2010 10:26:42 -0500 Subject: [PATCH] Add shuffle option --- res/drawable/ic_menu_shuffle.png | Bin 0 -> 2384 bytes res/values/strings.xml | 4 +++ .../kreed/vanilla/FullPlaybackActivity.java | 30 ++++++++++++++++++ src/org/kreed/vanilla/PlaybackService.java | 17 ++++++---- 4 files changed, 44 insertions(+), 7 deletions(-) create mode 100755 res/drawable/ic_menu_shuffle.png diff --git a/res/drawable/ic_menu_shuffle.png b/res/drawable/ic_menu_shuffle.png new file mode 100755 index 0000000000000000000000000000000000000000..cb7009deaa2c13f10987565fad4c9e1ebe66c5aa GIT binary patch literal 2384 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 Songs Stop and Exit Display Mode + Enable Shuffle + Disable Shuffle + Shuffle enabled for newly added songs + Shuffle disabled Starting up... diff --git a/src/org/kreed/vanilla/FullPlaybackActivity.java b/src/org/kreed/vanilla/FullPlaybackActivity.java index 25afcc68..dc4d2409 100644 --- a/src/org/kreed/vanilla/FullPlaybackActivity.java +++ b/src/org/kreed/vanilla/FullPlaybackActivity.java @@ -40,6 +40,7 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; +import android.widget.Toast; public class FullPlaybackActivity extends PlaybackActivity implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, View.OnFocusChangeListener { private IPlaybackService mService; @@ -62,6 +63,7 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli private static final int MENU_DISPLAY = 1; private static final int MENU_PREFS = 2; private static final int MENU_LIBRARY = 3; + private static final int MENU_SHUFFLE = 4; @Override public void onCreate(Bundle icicle) @@ -177,11 +179,20 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli { menu.add(0, MENU_DISPLAY, 0, R.string.display_mode).setIcon(android.R.drawable.ic_menu_gallery); menu.add(0, MENU_LIBRARY, 0, R.string.library).setIcon(android.R.drawable.ic_menu_add); + menu.add(0, MENU_SHUFFLE, 0, R.string.shuffle_enable).setIcon(R.drawable.ic_menu_shuffle); menu.add(0, MENU_PREFS, 0, R.string.settings).setIcon(android.R.drawable.ic_menu_preferences); menu.add(0, MENU_QUIT, 0, R.string.quit).setIcon(android.R.drawable.ic_menu_close_clear_cancel); return true; } + @Override + public boolean onPrepareOptionsMenu(Menu menu) + { + boolean isShuffling = (mState & PlaybackService.FLAG_SHUFFLE) != 0; + menu.findItem(MENU_SHUFFLE).setTitle(isShuffling ? R.string.shuffle_disable : R.string.shuffle_enable); + return true; + } + @Override public boolean onOptionsItemSelected(MenuItem item) { @@ -189,6 +200,9 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli case MENU_QUIT: ContextApplication.quit(this); break; + case MENU_SHUFFLE: + mHandler.sendMessage(mHandler.obtainMessage(TOGGLE_FLAG, PlaybackService.FLAG_SHUFFLE, 0)); + break; case MENU_PREFS: startActivity(new Intent(this, PreferencesActivity.class)); break; @@ -300,6 +314,7 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli private static final int HIDE = 0; private static final int UPDATE_PROGRESS = 1; private static final int SAVE_DISPLAY_MODE = 2; + private static final int TOGGLE_FLAG = 3; private Handler mHandler = new Handler() { public void handleMessage(Message message) { @@ -318,6 +333,21 @@ public class FullPlaybackActivity extends PlaybackActivity implements View.OnCli editor.putBoolean("separate_info", mCoverView.hasSeparateInfo()); editor.commit(); break; + case TOGGLE_FLAG: + int flag = message.arg1; + boolean enabling = (mState & flag) == 0; + int text = -1; + if (flag == PlaybackService.FLAG_SHUFFLE) + text = enabling ? R.string.shuffle_enabling : R.string.shuffle_disabling; + + if (text != -1) + Toast.makeText(FullPlaybackActivity.this, text, Toast.LENGTH_SHORT).show(); + + try { + mService.toggleFlag(flag); + } catch (RemoteException e) { + setService(null); + } } } }; diff --git a/src/org/kreed/vanilla/PlaybackService.java b/src/org/kreed/vanilla/PlaybackService.java index d16af697..00120c71 100644 --- a/src/org/kreed/vanilla/PlaybackService.java +++ b/src/org/kreed/vanilla/PlaybackService.java @@ -70,7 +70,8 @@ public class PlaybackService extends Service implements Handler.Callback, MediaP public static final int FLAG_NO_MEDIA = 0x2; public static final int FLAG_PLAYING = 0x1; - public static final int ALL_FLAGS = FLAG_NO_MEDIA + FLAG_PLAYING; + public static final int FLAG_SHUFFLE = 0x4; + public static final int ALL_FLAGS = FLAG_NO_MEDIA + FLAG_PLAYING + FLAG_SHUFFLE; public static final int NEVER = 0; public static final int WHEN_PLAYING = 1; @@ -529,12 +530,14 @@ public class PlaybackService extends Service implements Handler.Callback, MediaP if (songs == null || songs.length == 0) return; - Random random = ContextApplication.getRandom(); - for (int i = songs.length; --i != 0; ) { - int j = random.nextInt(i + 1); - long tmp = songs[j]; - songs[j] = songs[i]; - songs[i] = tmp; + if ((mState & FLAG_SHUFFLE) != 0) { + Random random = ContextApplication.getRandom(); + for (int i = songs.length; --i != 0; ) { + int j = random.nextInt(i + 1); + long tmp = songs[j]; + songs[j] = songs[i]; + songs[i] = tmp; + } } boolean changed = false;