diff --git a/res/drawable/ic_menu_shuffle.png b/res/drawable/ic_menu_shuffle.png
new file mode 100755
index 00000000..cb7009de
Binary files /dev/null and b/res/drawable/ic_menu_shuffle.png differ
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2bd5f0fc..b19358dd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -8,6 +8,10 @@
Choose 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;