Add repeat current song mode

This commit is contained in:
Christopher Eby 2011-09-21 22:20:39 -05:00
parent 5341772d0c
commit 84f0e02882
3 changed files with 44 additions and 13 deletions

View File

@ -34,8 +34,10 @@ THE SOFTWARE.
<string name="shuffle_enabling">Shuffle enabled</string> <string name="shuffle_enabling">Shuffle enabled</string>
<string name="shuffle_disabling">Shuffle disabled</string> <string name="shuffle_disabling">Shuffle disabled</string>
<string name="repeat_enable">Enable Repeat</string> <string name="repeat_enable">Enable Repeat</string>
<string name="repeat_current">Repeat Song</string>
<string name="repeat_disable">Disable Repeat</string> <string name="repeat_disable">Disable Repeat</string>
<string name="repeat_enabling">Repeat enabled</string> <string name="repeat_enabling">Repeating all songs</string>
<string name="repeat_current_enabling">Repeating current song</string>
<string name="repeat_disabling">Repeat disabled</string> <string name="repeat_disabling">Repeat disabled</string>
<string name="random_enable">Enable Random</string> <string name="random_enable">Enable Random</string>
<string name="random_disable">Disable Random</string> <string name="random_disable">Disable Random</string>

View File

@ -302,8 +302,14 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View
int state = mState; int state = mState;
boolean isShuffling = (state & PlaybackService.FLAG_SHUFFLE) != 0; boolean isShuffling = (state & PlaybackService.FLAG_SHUFFLE) != 0;
menu.findItem(MENU_SHUFFLE).setTitle(isShuffling ? R.string.shuffle_disable : R.string.shuffle_enable); menu.findItem(MENU_SHUFFLE).setTitle(isShuffling ? R.string.shuffle_disable : R.string.shuffle_enable);
boolean isRepeating = (state & PlaybackService.FLAG_REPEAT) != 0; int repeatRes;
menu.findItem(MENU_REPEAT).setTitle(isRepeating ? R.string.repeat_disable : R.string.repeat_enable); if ((state & PlaybackService.FLAG_REPEAT) != 0)
repeatRes = R.string.repeat_current;
else if ((state & PlaybackService.FLAG_REPEAT_CURRENT) != 0)
repeatRes = R.string.repeat_disable;
else
repeatRes = R.string.repeat_enable;
menu.findItem(MENU_REPEAT).setTitle(repeatRes);
boolean isRandom = (state & PlaybackService.FLAG_RANDOM) != 0; boolean isRandom = (state & PlaybackService.FLAG_RANDOM) != 0;
// TODO: find icon (dice? arrow pointing in many directions?) // TODO: find icon (dice? arrow pointing in many directions?)
menu.findItem(MENU_RANDOM).setTitle(isRandom ? R.string.random_disable : R.string.random_enable); menu.findItem(MENU_RANDOM).setTitle(isRandom ? R.string.random_disable : R.string.random_enable);
@ -318,7 +324,7 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View
toggleShuffle(); toggleShuffle();
return true; return true;
case MENU_REPEAT: case MENU_REPEAT:
toggleRepeat(); cycleRepeat();
return true; return true;
case MENU_RANDOM: case MENU_RANDOM:
toggleRandom(); toggleRandom();
@ -349,12 +355,18 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View
} }
/** /**
* Toggle repeat mode on/off * Cycle repeat mode.
*/ */
public void toggleRepeat() public void cycleRepeat()
{ {
int state = PlaybackService.get(this).toggleRepeat(); int state = PlaybackService.get(this).cycleRepeat();
int res = (state & PlaybackService.FLAG_REPEAT) == 0 ? R.string.repeat_disabling : R.string.repeat_enabling; int res;
if ((state & PlaybackService.FLAG_REPEAT) != 0)
res = R.string.repeat_enabling;
else if ((state & PlaybackService.FLAG_REPEAT_CURRENT) != 0)
res = R.string.repeat_current_enabling;
else
res = R.string.repeat_disabling;
Toast.makeText(this, res, Toast.LENGTH_SHORT).show(); Toast.makeText(this, res, Toast.LENGTH_SHORT).show();
setState(state); setState(state);
} }
@ -401,7 +413,7 @@ public class PlaybackActivity extends Activity implements Handler.Callback, View
previousSong(); previousSong();
break; break;
case ACTION_REPEAT: case ACTION_REPEAT:
toggleRepeat(); cycleRepeat();
break; break;
case ACTION_SHUFFLE: case ACTION_SHUFFLE:
toggleShuffle(); toggleShuffle();

View File

@ -65,7 +65,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
/** /**
* State file version that indicates data order. * State file version that indicates data order.
*/ */
private static final int STATE_VERSION = 1; private static final int STATE_VERSION = 2;
private static final int NOTIFICATION_ID = 2; private static final int NOTIFICATION_ID = 2;
@ -145,6 +145,11 @@ public final class PlaybackService extends Service implements Handler.Callback,
* Set when the user needs to select songs to play. * Set when the user needs to select songs to play.
*/ */
public static final int FLAG_EMPTY_QUEUE = 0x40; public static final int FLAG_EMPTY_QUEUE = 0x40;
/**
* If set, replay the current song when the end of the song is reached
* instead of advancing to the next song.
*/
public static final int FLAG_REPEAT_CURRENT = 0x80;
public static final int NEVER = 0; public static final int NEVER = 0;
public static final int WHEN_PLAYING = 1; public static final int WHEN_PLAYING = 1;
@ -573,14 +578,21 @@ public final class PlaybackService extends Service implements Handler.Callback,
} }
/** /**
* Toggle repeat mode. Disables random mode. * Cycle repeat mode. Disables random mode.
* *
* @return The new state after this is called. * @return The new state after this is called.
*/ */
public int toggleRepeat() public int cycleRepeat()
{ {
synchronized (mStateLock) { synchronized (mStateLock) {
return updateState((mState ^ FLAG_REPEAT) & ~FLAG_RANDOM); int state = mState & ~FLAG_RANDOM;
if ((state & FLAG_REPEAT_CURRENT) != 0)
state &= ~(FLAG_REPEAT|FLAG_REPEAT_CURRENT);
else if ((state & FLAG_REPEAT) == 0)
state |= FLAG_REPEAT;
else if ((state & FLAG_REPEAT) != 0)
state = (state | FLAG_REPEAT_CURRENT) & ~FLAG_REPEAT;;
return updateState(state);
} }
} }
@ -678,6 +690,8 @@ public final class PlaybackService extends Service implements Handler.Callback,
{ {
if (mTimeline.isEndOfQueue()) if (mTimeline.isEndOfQueue())
unsetFlag(FLAG_PLAYING); unsetFlag(FLAG_PLAYING);
else if ((mState & FLAG_REPEAT_CURRENT) != 0)
setCurrentSong(0);
else else
setCurrentSong(+1); setCurrentSong(+1);
} }
@ -1160,6 +1174,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
if (in.readLong() == STATE_FILE_MAGIC && in.readInt() == STATE_VERSION) { if (in.readLong() == STATE_FILE_MAGIC && in.readInt() == STATE_VERSION) {
mPendingSeek = in.readInt(); mPendingSeek = in.readInt();
int savedState = in.readInt();
mTimeline.readState(in); mTimeline.readState(in);
int finishAction = mTimeline.getFinishAction(); int finishAction = mTimeline.getFinishAction();
@ -1169,6 +1184,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
state |= FLAG_REPEAT; state |= FLAG_REPEAT;
if (mTimeline.isShuffling()) if (mTimeline.isShuffling())
state |= FLAG_SHUFFLE; state |= FLAG_SHUFFLE;
state |= savedState & FLAG_REPEAT_CURRENT;
} }
in.close(); in.close();
@ -1194,6 +1210,7 @@ public final class PlaybackService extends Service implements Handler.Callback,
out.writeLong(STATE_FILE_MAGIC); out.writeLong(STATE_FILE_MAGIC);
out.writeInt(STATE_VERSION); out.writeInt(STATE_VERSION);
out.writeInt(pendingSeek); out.writeInt(pendingSeek);
out.writeInt(mState);
mTimeline.writeState(out); mTimeline.writeState(out);
out.close(); out.close();
} catch (IOException e) { } catch (IOException e) {