Rewind songs
This commit is contained in:
parent
cce1727b8b
commit
655d071901
@ -158,7 +158,7 @@ public class MediaButtonReceiver extends BroadcastReceiver {
|
|||||||
break;
|
break;
|
||||||
case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
|
case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
|
||||||
if (action == KeyEvent.ACTION_DOWN)
|
if (action == KeyEvent.ACTION_DOWN)
|
||||||
act = PlaybackService.ACTION_REWIND_SONG;
|
act = PlaybackService.ACTION_PREVIOUS_SONG_AUTOPLAY;
|
||||||
break;
|
break;
|
||||||
case KeyEvent.KEYCODE_MEDIA_PLAY:
|
case KeyEvent.KEYCODE_MEDIA_PLAY:
|
||||||
if (action == KeyEvent.ACTION_DOWN)
|
if (action == KeyEvent.ACTION_DOWN)
|
||||||
|
@ -188,6 +188,12 @@ public abstract class PlaybackActivity extends Activity
|
|||||||
setState(state);
|
setState(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void rewindCurrentSong()
|
||||||
|
{
|
||||||
|
setSong(PlaybackService.get(this).rewindCurrentSong());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View view)
|
public void onClick(View view)
|
||||||
{
|
{
|
||||||
@ -199,7 +205,7 @@ public abstract class PlaybackActivity extends Activity
|
|||||||
playPause();
|
playPause();
|
||||||
break;
|
break;
|
||||||
case R.id.previous:
|
case R.id.previous:
|
||||||
shiftCurrentSong(SongTimeline.SHIFT_PREVIOUS_SONG);
|
rewindCurrentSong();
|
||||||
break;
|
break;
|
||||||
case R.id.end_action:
|
case R.id.end_action:
|
||||||
cycleFinishAction();
|
cycleFinishAction();
|
||||||
|
@ -154,9 +154,12 @@ public final class PlaybackService extends Service
|
|||||||
*/
|
*/
|
||||||
public static final String ACTION_PREVIOUS_SONG = "ch.blinkenlights.android.vanilla.action.PREVIOUS_SONG";
|
public static final String ACTION_PREVIOUS_SONG = "ch.blinkenlights.android.vanilla.action.PREVIOUS_SONG";
|
||||||
/**
|
/**
|
||||||
* Action for startService: go back to the previous song OR just rewind if it played for less than 5 seconds
|
* Action for startService: go back to the previous song.
|
||||||
|
*
|
||||||
|
* Like ACTION_PREVIOUS_SONG, but starts playing automatically if paused
|
||||||
|
* when this is called.
|
||||||
*/
|
*/
|
||||||
public static final String ACTION_REWIND_SONG = "ch.blinkenlights.android.vanilla.action.REWIND_SONG";
|
public static final String ACTION_PREVIOUS_SONG_AUTOPLAY = "ch.blinkenlights.android.vanilla.action.PREVIOUS_SONG_AUTOPLAY";
|
||||||
/**
|
/**
|
||||||
* Change the shuffle mode.
|
* Change the shuffle mode.
|
||||||
*/
|
*/
|
||||||
@ -533,10 +536,9 @@ public final class PlaybackService extends Service
|
|||||||
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CALL_GO, 0, 0, Integer.valueOf(0)), 400);
|
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CALL_GO, 0, 0, Integer.valueOf(0)), 400);
|
||||||
}
|
}
|
||||||
} else if (ACTION_NEXT_SONG.equals(action)) {
|
} else if (ACTION_NEXT_SONG.equals(action)) {
|
||||||
setCurrentSong(1);
|
shiftCurrentSong(SongTimeline.SHIFT_NEXT_SONG);
|
||||||
userActionTriggered();
|
|
||||||
} else if (ACTION_NEXT_SONG_AUTOPLAY.equals(action)) {
|
} else if (ACTION_NEXT_SONG_AUTOPLAY.equals(action)) {
|
||||||
setCurrentSong(1);
|
shiftCurrentSong(SongTimeline.SHIFT_NEXT_SONG);
|
||||||
play();
|
play();
|
||||||
} else if (ACTION_NEXT_SONG_DELAYED.equals(action)) {
|
} else if (ACTION_NEXT_SONG_DELAYED.equals(action)) {
|
||||||
if (mHandler.hasMessages(MSG_CALL_GO, Integer.valueOf(1))) {
|
if (mHandler.hasMessages(MSG_CALL_GO, Integer.valueOf(1))) {
|
||||||
@ -549,16 +551,9 @@ public final class PlaybackService extends Service
|
|||||||
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CALL_GO, 1, 0, Integer.valueOf(1)), 400);
|
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CALL_GO, 1, 0, Integer.valueOf(1)), 400);
|
||||||
}
|
}
|
||||||
} else if (ACTION_PREVIOUS_SONG.equals(action)) {
|
} else if (ACTION_PREVIOUS_SONG.equals(action)) {
|
||||||
setCurrentSong(-1);
|
rewindCurrentSong();
|
||||||
userActionTriggered();
|
} else if (ACTION_PREVIOUS_SONG_AUTOPLAY.equals(action)) {
|
||||||
} else if (ACTION_REWIND_SONG.equals(action)) {
|
rewindCurrentSong();
|
||||||
/* only rewind song IF we played more than 2.5 sec (and song is longer than 5 sec) */
|
|
||||||
if(getPosition() > REWIND_AFTER_PLAYED_MS &&
|
|
||||||
getDuration() > REWIND_AFTER_PLAYED_MS*2) {
|
|
||||||
setCurrentSong(0);
|
|
||||||
} else {
|
|
||||||
setCurrentSong(-1);
|
|
||||||
}
|
|
||||||
play();
|
play();
|
||||||
} else if (ACTION_PLAY.equals(action)) {
|
} else if (ACTION_PLAY.equals(action)) {
|
||||||
play();
|
play();
|
||||||
@ -1319,7 +1314,6 @@ public final class PlaybackService extends Service
|
|||||||
VanillaMediaPlayer tmpPlayer = mMediaPlayer;
|
VanillaMediaPlayer tmpPlayer = mMediaPlayer;
|
||||||
mMediaPlayer = mPreparedMediaPlayer;
|
mMediaPlayer = mPreparedMediaPlayer;
|
||||||
mPreparedMediaPlayer = tmpPlayer; // this was mMediaPlayer and is in reset() state
|
mPreparedMediaPlayer = tmpPlayer; // this was mMediaPlayer and is in reset() state
|
||||||
Log.v("VanillaMusic", "Swapped media players");
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
prepareMediaPlayer(mMediaPlayer, song.path);
|
prepareMediaPlayer(mMediaPlayer, song.path);
|
||||||
@ -1367,10 +1361,8 @@ public final class PlaybackService extends Service
|
|||||||
public void onCompletion(MediaPlayer player)
|
public void onCompletion(MediaPlayer player)
|
||||||
{
|
{
|
||||||
|
|
||||||
Song song = mTimeline.getSong(0);
|
|
||||||
|
|
||||||
// Count this song as played
|
// Count this song as played
|
||||||
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_PLAYCOUNTS, song), 2500);
|
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_PLAYCOUNTS, mCurrentSong), 2500);
|
||||||
|
|
||||||
if (finishAction(mState) == SongTimeline.FINISH_REPEAT_CURRENT) {
|
if (finishAction(mState) == SongTimeline.FINISH_REPEAT_CURRENT) {
|
||||||
setCurrentSong(0);
|
setCurrentSong(0);
|
||||||
@ -1550,7 +1542,6 @@ public final class PlaybackService extends Service
|
|||||||
case MSG_UPDATE_PLAYCOUNTS:
|
case MSG_UPDATE_PLAYCOUNTS:
|
||||||
Song song = (Song)message.obj;
|
Song song = (Song)message.obj;
|
||||||
mPlayCounts.countSong(song);
|
mPlayCounts.countSong(song);
|
||||||
|
|
||||||
// Update the playcounts playlist in ~20% of all cases if enabled
|
// Update the playcounts playlist in ~20% of all cases if enabled
|
||||||
if (mAutoPlPlaycounts > 0 && Math.random() > 0.8) {
|
if (mAutoPlPlaycounts > 0 && Math.random() > 0.8) {
|
||||||
ContentResolver resolver = getContentResolver();
|
ContentResolver resolver = getContentResolver();
|
||||||
@ -1686,6 +1677,24 @@ public final class PlaybackService extends Service
|
|||||||
return song;
|
return song;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Skips to the previous song OR rewinds the currently playing track
|
||||||
|
*
|
||||||
|
* @return The new current song
|
||||||
|
*/
|
||||||
|
public Song rewindCurrentSong() {
|
||||||
|
int delta = SongTimeline.SHIFT_PREVIOUS_SONG;
|
||||||
|
if(isPlaying() && getPosition() > REWIND_AFTER_PLAYED_MS && getDuration() > REWIND_AFTER_PLAYED_MS*2) {
|
||||||
|
delta = SongTimeline.SHIFT_KEEP_SONG;
|
||||||
|
// Count song as played if >= 80% were done
|
||||||
|
double pctPlayed = (double)getPosition()/getDuration();
|
||||||
|
if (pctPlayed >= 0.8) {
|
||||||
|
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_UPDATE_PLAYCOUNTS, mCurrentSong), 2500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return shiftCurrentSong(delta);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets the idle timeout countdown. Should be called by a user action
|
* Resets the idle timeout countdown. Should be called by a user action
|
||||||
* has been triggered (new song chosen or playback toggled).
|
* has been triggered (new song chosen or playback toggled).
|
||||||
|
Loading…
x
Reference in New Issue
Block a user