move onPlaybackStart and onPlaybackPause tasks to separate callback methods

This commit is contained in:
Domingos Lopes 2016-05-07 01:28:23 -04:00
parent d18cf41f20
commit 19a647226d
5 changed files with 137 additions and 679 deletions

View File

@ -1,6 +1,8 @@
package de.test.antennapod.service.playback; package de.test.antennapod.service.playback;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.test.InstrumentationTestCase; import android.test.InstrumentationTestCase;
import junit.framework.AssertionFailedError; import junit.framework.AssertionFailedError;
@ -113,7 +115,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
public void testInit() { public void testInit() {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, defaultCallback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, new DefaultPSMPCallback());
psmp.shutdown(); psmp.shutdown();
} }
@ -139,7 +141,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
public void testPlayMediaObjectStreamNoStartNoPrepare() throws InterruptedException { public void testPlayMediaObjectStreamNoStartNoPrepare() throws InterruptedException {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final CountDownLatch countDownLatch = new CountDownLatch(2); final CountDownLatch countDownLatch = new CountDownLatch(2);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
try { try {
@ -160,56 +162,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
assertionError = e; assertionError = e;
} }
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null);
@ -227,7 +179,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
public void testPlayMediaObjectStreamStartNoPrepare() throws InterruptedException { public void testPlayMediaObjectStreamStartNoPrepare() throws InterruptedException {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final CountDownLatch countDownLatch = new CountDownLatch(2); final CountDownLatch countDownLatch = new CountDownLatch(2);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
try { try {
@ -248,56 +200,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
assertionError = e; assertionError = e;
} }
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null);
@ -316,7 +218,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
public void testPlayMediaObjectStreamNoStartPrepare() throws InterruptedException { public void testPlayMediaObjectStreamNoStartPrepare() throws InterruptedException {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final CountDownLatch countDownLatch = new CountDownLatch(4); final CountDownLatch countDownLatch = new CountDownLatch(4);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
try { try {
@ -340,56 +242,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
assertionError = e; assertionError = e;
} }
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null);
@ -406,7 +258,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
public void testPlayMediaObjectStreamStartPrepare() throws InterruptedException { public void testPlayMediaObjectStreamStartPrepare() throws InterruptedException {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final CountDownLatch countDownLatch = new CountDownLatch(5); final CountDownLatch countDownLatch = new CountDownLatch(5);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
try { try {
@ -433,57 +285,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
assertionError = e; assertionError = e;
} }
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, null);
@ -499,7 +300,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
public void testPlayMediaObjectLocalNoStartNoPrepare() throws InterruptedException { public void testPlayMediaObjectLocalNoStartNoPrepare() throws InterruptedException {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final CountDownLatch countDownLatch = new CountDownLatch(2); final CountDownLatch countDownLatch = new CountDownLatch(2);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
try { try {
@ -520,57 +321,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
assertionError = e; assertionError = e;
} }
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL);
@ -587,7 +337,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
public void testPlayMediaObjectLocalStartNoPrepare() throws InterruptedException { public void testPlayMediaObjectLocalStartNoPrepare() throws InterruptedException {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final CountDownLatch countDownLatch = new CountDownLatch(2); final CountDownLatch countDownLatch = new CountDownLatch(2);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
try { try {
@ -608,56 +358,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
assertionError = e; assertionError = e;
} }
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL);
@ -674,7 +374,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
public void testPlayMediaObjectLocalNoStartPrepare() throws InterruptedException { public void testPlayMediaObjectLocalNoStartPrepare() throws InterruptedException {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final CountDownLatch countDownLatch = new CountDownLatch(4); final CountDownLatch countDownLatch = new CountDownLatch(4);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
try { try {
@ -698,56 +398,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
assertionError = e; assertionError = e;
} }
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL);
@ -763,7 +413,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
public void testPlayMediaObjectLocalStartPrepare() throws InterruptedException { public void testPlayMediaObjectLocalStartPrepare() throws InterruptedException {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final CountDownLatch countDownLatch = new CountDownLatch(5); final CountDownLatch countDownLatch = new CountDownLatch(5);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
try { try {
@ -791,56 +441,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
countDownLatch.countDown(); countDownLatch.countDown();
} }
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL);
@ -853,68 +453,12 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
psmp.shutdown(); psmp.shutdown();
} }
private final PlaybackServiceMediaPlayer.PSMPCallback defaultCallback = new PlaybackServiceMediaPlayer.PSMPCallback() {
@Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
checkPSMPInfo(newInfo);
}
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) { return false; }
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
};
private void pauseTestSkeleton(final PlayerStatus initialState, final boolean stream, final boolean abandonAudioFocus, final boolean reinit, long timeoutSeconds) throws InterruptedException { private void pauseTestSkeleton(final PlayerStatus initialState, final boolean stream, final boolean abandonAudioFocus, final boolean reinit, long timeoutSeconds) throws InterruptedException {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final int latchCount = (stream && reinit) ? 2 : 1; final int latchCount = (stream && reinit) ? 2 : 1;
final CountDownLatch countDownLatch = new CountDownLatch(latchCount); final CountDownLatch countDownLatch = new CountDownLatch(latchCount);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
checkPSMPInfo(newInfo); checkPSMPInfo(newInfo);
@ -953,52 +497,12 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
assertionError = new AssertionFailedError("Unexpected call to shouldStop"); assertionError = new AssertionFailedError("Unexpected call to shouldStop");
} }
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override @Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) { public boolean onMediaPlayerError(Object inObj, int what, int extra) {
if (assertionError == null) if (assertionError == null)
assertionError = new AssertionFailedError("Unexpected call to onMediaPlayerError"); assertionError = new AssertionFailedError("Unexpected call to onMediaPlayerError");
return false; return false;
} }
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL);
@ -1055,7 +559,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
(initialState == PlayerStatus.PREPARED) ? 1 : 0; (initialState == PlayerStatus.PREPARED) ? 1 : 0;
final CountDownLatch countDownLatch = new CountDownLatch(latchCount); final CountDownLatch countDownLatch = new CountDownLatch(latchCount);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
checkPSMPInfo(newInfo); checkPSMPInfo(newInfo);
@ -1073,36 +577,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override @Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) { public boolean onMediaPlayerError(Object inObj, int what, int extra) {
if (assertionError == null) { if (assertionError == null) {
@ -1110,21 +584,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
} }
return false; return false;
} }
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
if (initialState == PlayerStatus.PREPARED || initialState == PlayerStatus.PLAYING || initialState == PlayerStatus.PAUSED) { if (initialState == PlayerStatus.PREPARED || initialState == PlayerStatus.PLAYING || initialState == PlayerStatus.PAUSED) {
@ -1158,7 +617,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final int latchCount = 1; final int latchCount = 1;
final CountDownLatch countDownLatch = new CountDownLatch(latchCount); final CountDownLatch countDownLatch = new CountDownLatch(latchCount);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
checkPSMPInfo(newInfo); checkPSMPInfo(newInfo);
@ -1172,37 +631,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
countDownLatch.countDown(); countDownLatch.countDown();
} }
} }
}
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
} }
@Override @Override
@ -1211,21 +639,6 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
assertionError = new AssertionFailedError("Unexpected call to onMediaPlayerError"); assertionError = new AssertionFailedError("Unexpected call to onMediaPlayerError");
return false; return false;
} }
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL);
@ -1273,7 +686,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
final Context c = getInstrumentation().getTargetContext(); final Context c = getInstrumentation().getTargetContext();
final int latchCount = 2; final int latchCount = 2;
final CountDownLatch countDownLatch = new CountDownLatch(latchCount); final CountDownLatch countDownLatch = new CountDownLatch(latchCount);
PlaybackServiceMediaPlayer.PSMPCallback callback = new PlaybackServiceMediaPlayer.PSMPCallback() { PlaybackServiceMediaPlayer.PSMPCallback callback = new DefaultPSMPCallback() {
@Override @Override
public void statusChanged(LocalPSMP.PSMPInfo newInfo) { public void statusChanged(LocalPSMP.PSMPInfo newInfo) {
checkPSMPInfo(newInfo); checkPSMPInfo(newInfo);
@ -1289,57 +702,12 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
} }
} }
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public boolean onMediaPlayerInfo(int code, int resourceId) {
return false;
}
@Override @Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) { public boolean onMediaPlayerError(Object inObj, int what, int extra) {
if (assertionError == null) if (assertionError == null)
assertionError = new AssertionFailedError("Unexpected call to onMediaPlayerError"); assertionError = new AssertionFailedError("Unexpected call to onMediaPlayerError");
return false; return false;
} }
@Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}; };
PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback); PlaybackServiceMediaPlayer psmp = new LocalPSMP(c, callback);
Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL); Playable p = writeTestPlayable(PLAYABLE_FILE_URL, PLAYABLE_LOCAL_URL);
@ -1378,4 +746,71 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase {
super("Unexpected state change: " + status); super("Unexpected state change: " + status);
} }
} }
private class DefaultPSMPCallback implements PlaybackServiceMediaPlayer.PSMPCallback {
@Override
public void statusChanged(PlaybackServiceMediaPlayer.PSMPInfo newInfo) {
}
@Override
public void shouldStop() {
}
@Override
public void playbackSpeedChanged(float s) {
}
@Override
public void setSpeedAbilityChanged() {
}
@Override
public void onBufferingUpdate(int percent) {
}
@Override
public void onMediaChanged(boolean reloadUI) {
}
@Override
public boolean onMediaPlayerInfo(int code, @StringRes int resourceId) {
return false;
}
@Override
public boolean onMediaPlayerError(Object inObj, int what, int extra) {
return false;
}
@Override
public void onPostPlayback(@NonNull Playable media, boolean ended, boolean playingNext) {
}
@Override
public void onPlaybackStart(@NonNull Playable playable, int position) {
}
@Override
public void onPlaybackPause(@NonNull Playable playable, int position) {
}
@Override
public Playable getNextInQueue(Playable currentMedia) {
return null;
}
@Override
public void onPlaybackEnded(MediaType mediaType, boolean stopPlaying) {
}
}
} }

View File

@ -140,14 +140,12 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
} }
// set temporarily to pause in order to update list with current position // set temporarily to pause in order to update list with current position
if (playerStatus == PlayerStatus.PLAYING) { if (playerStatus == PlayerStatus.PLAYING) {
setPlayerStatus(PlayerStatus.PAUSED, media); callback.onPlaybackPause(media, getPosition());
} }
if (!media.getIdentifier().equals(playable.getIdentifier())) { if (!media.getIdentifier().equals(playable.getIdentifier())) {
final Playable oldMedia = media; final Playable oldMedia = media;
executor.submit(() -> callback.onPostPlayback(oldMedia, false, true)); executor.submit(() -> callback.onPostPlayback(oldMedia, false, true));
} else {
media.onPlaybackPause(context);
} }
setPlayerStatus(PlayerStatus.INDETERMINATE, null); setPlayerStatus(PlayerStatus.INDETERMINATE, null);
@ -204,6 +202,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
audioFocusChangeListener, AudioManager.STREAM_MUSIC, audioFocusChangeListener, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN); AudioManager.AUDIOFOCUS_GAIN);
if (focusGained == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { if (focusGained == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d(TAG, "Audiofocus successfully requested");
Log.d(TAG, "Resuming/Starting playback");
acquireWifiLockIfNecessary(); acquireWifiLockIfNecessary();
float speed = 1.0f; float speed = 1.0f;
try { try {
@ -223,10 +223,9 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
} }
mediaPlayer.start(); mediaPlayer.start();
callback.onPlaybackStart(media, INVALID_TIME);
setPlayerStatus(PlayerStatus.PLAYING, media); setPlayerStatus(PlayerStatus.PLAYING, media);
pausedBecauseOfTransientAudiofocusLoss = false; pausedBecauseOfTransientAudiofocusLoss = false;
media.onPlaybackStart();
} else { } else {
Log.e(TAG, "Failed to request audio focus"); Log.e(TAG, "Failed to request audio focus");
} }
@ -254,8 +253,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
if (playerStatus == PlayerStatus.PLAYING) { if (playerStatus == PlayerStatus.PLAYING) {
Log.d(TAG, "Pausing playback."); Log.d(TAG, "Pausing playback.");
mediaPlayer.pause(); mediaPlayer.pause();
callback.onPlaybackPause(media, getPosition());
setPlayerStatus(PlayerStatus.PAUSED, media); setPlayerStatus(PlayerStatus.PAUSED, media);
media.onPlaybackPause(context.getApplicationContext());
if (abandonFocus) { if (abandonFocus) {
audioManager.abandonAudioFocus(audioFocusChangeListener); audioManager.abandonAudioFocus(audioFocusChangeListener);
@ -384,8 +383,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
} }
seekLatch = new CountDownLatch(1); seekLatch = new CountDownLatch(1);
if (statusBeforeSeeking == PlayerStatus.PLAYING) { if (statusBeforeSeeking == PlayerStatus.PLAYING) {
media.setPosition(getPosition()); callback.onPlaybackPause(media, getPosition());
media.onPlaybackPause(context);
} }
mediaPlayer.seekTo(t); mediaPlayer.seekTo(t);
try { try {
@ -931,13 +929,12 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
seekLatch.countDown(); seekLatch.countDown();
} }
playerLock.lock(); playerLock.lock();
media.setPosition(getPosition());
if (playerStatus == PlayerStatus.PLAYING) { if (playerStatus == PlayerStatus.PLAYING) {
media.onPlaybackStart(); callback.onPlaybackStart(media, getPosition());
} }
if (playerStatus == PlayerStatus.SEEKING) { if (playerStatus == PlayerStatus.SEEKING) {
if (statusBeforeSeeking == PlayerStatus.PLAYING) { if (statusBeforeSeeking == PlayerStatus.PLAYING) {
media.onPlaybackStart(); callback.onPlaybackStart(media, getPosition());
} }
setPlayerStatus(statusBeforeSeeking, media); setPlayerStatus(statusBeforeSeeking, media);
} }

View File

@ -524,7 +524,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
private final PlaybackServiceTaskManager.PSTMCallback taskManagerCallback = new PlaybackServiceTaskManager.PSTMCallback() { private final PlaybackServiceTaskManager.PSTMCallback taskManagerCallback = new PlaybackServiceTaskManager.PSTMCallback() {
@Override @Override
public void positionSaverTick() { public void positionSaverTick() {
saveCurrentPosition(); saveCurrentPosition(true, null, PlaybackServiceMediaPlayer.INVALID_TIME);
} }
@Override @Override
@ -576,9 +576,6 @@ public class PlaybackService extends MediaBrowserServiceCompat {
break; break;
case PAUSED: case PAUSED:
taskManager.cancelPositionSaver();
saveCurrentPosition();
taskManager.cancelWidgetUpdater();
if ((UserPreferences.isPersistNotify() || isCasting) && if ((UserPreferences.isPersistNotify() || isCasting) &&
android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
// do not remove notification on pause based on user pref and whether android version supports expanded notifications // do not remove notification on pause based on user pref and whether android version supports expanded notifications
@ -597,12 +594,6 @@ public class PlaybackService extends MediaBrowserServiceCompat {
break; break;
case PLAYING: case PLAYING:
Log.d(TAG, "Audiofocus successfully requested");
Log.d(TAG, "Resuming/Starting playback");
taskManager.startPositionSaver();
taskManager.startWidgetUpdater();
writePlayerStatusPlaybackPreferences();
setupNotification(newInfo); setupNotification(newInfo);
started = true; started = true;
break; break;
@ -677,10 +668,30 @@ public class PlaybackService extends MediaBrowserServiceCompat {
} }
@Override @Override
public void onPostPlayback(Playable media, boolean ended, boolean playingNext) { public void onPostPlayback(@NonNull Playable media, boolean ended, boolean playingNext) {
PlaybackService.this.onPostPlayback(media, ended, playingNext); PlaybackService.this.onPostPlayback(media, ended, playingNext);
} }
@Override
public void onPlaybackStart(@NonNull Playable playable, int position) {
taskManager.startWidgetUpdater();
writePlayerStatusPlaybackPreferences();
if (position != PlaybackServiceMediaPlayer.INVALID_TIME) {
playable.setPosition(position);
}
playable.onPlaybackStart();
taskManager.startPositionSaver();
}
@Override
public void onPlaybackPause(@NonNull Playable playable, int position) {
taskManager.cancelPositionSaver();
saveCurrentPosition(position == PlaybackServiceMediaPlayer.INVALID_TIME,
playable, position);
taskManager.cancelWidgetUpdater();
playable.onPlaybackPause(getApplicationContext());
}
@Override @Override
public Playable getNextInQueue(Playable currentMedia) { public Playable getNextInQueue(Playable currentMedia) {
return PlaybackService.this.getNextInQueue(currentMedia); return PlaybackService.this.getNextInQueue(currentMedia);
@ -1200,11 +1211,22 @@ public class PlaybackService extends MediaBrowserServiceCompat {
/** /**
* Persists the current position and last played time of the media file. * Persists the current position and last played time of the media file.
*
* @param fromMediaPlayer if true, the information is gathered from the current Media Player
* and {@param playable} and {@param position} become irrelevant.
* @param playable the playable for which the current position should be saved, unless
* {@param fromMediaPlayer} is true.
* @param position the position that should be saved, unless {@param fromMediaPlayer} is true.
*/ */
private synchronized void saveCurrentPosition() { private synchronized void saveCurrentPosition(boolean fromMediaPlayer, Playable playable, int position) {
int position = getCurrentPosition(); int duration;
int duration = getDuration(); if (fromMediaPlayer) {
final Playable playable = mediaPlayer.getPlayable(); position = getCurrentPosition();
duration = getDuration();
playable = mediaPlayer.getPlayable();
} else {
duration = playable.getDuration();
}
if (position != INVALID_TIME && duration != INVALID_TIME && playable != null) { if (position != INVALID_TIME && duration != INVALID_TIME && playable != null) {
Log.d(TAG, "Saving current position to " + position); Log.d(TAG, "Saving current position to " + position);
playable.saveCurrentPosition( playable.saveCurrentPosition(
@ -1621,7 +1643,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
PlaybackServiceMediaPlayer getMediaPlayer(); PlaybackServiceMediaPlayer getMediaPlayer();
void setIsCasting(boolean isCasting); void setIsCasting(boolean isCasting);
void sendNotificationBroadcast(int type, int code); void sendNotificationBroadcast(int type, int code);
void saveCurrentPosition(); void saveCurrentPosition(boolean fromMediaPlayer, Playable playable, int position);
void setupNotification(boolean connected, PlaybackServiceMediaPlayer.PSMPInfo info); void setupNotification(boolean connected, PlaybackServiceMediaPlayer.PSMPInfo info);
MediaSessionCompat getMediaSession(); MediaSessionCompat getMediaSession();
Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter); Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter);
@ -1655,8 +1677,8 @@ public class PlaybackService extends MediaBrowserServiceCompat {
} }
@Override @Override
public void saveCurrentPosition() { public void saveCurrentPosition(boolean fromMediaPlayer, Playable playable, int position) {
PlaybackService.this.saveCurrentPosition(); PlaybackService.this.saveCurrentPosition(fromMediaPlayer, playable, position);
} }
@Override @Override

View File

@ -301,7 +301,11 @@ public abstract class PlaybackServiceMediaPlayer {
boolean onMediaPlayerError(Object inObj, int what, int extra); boolean onMediaPlayerError(Object inObj, int what, int extra);
void onPostPlayback(Playable media, boolean ended, boolean playingNext); void onPostPlayback(@NonNull Playable media, boolean ended, boolean playingNext);
void onPlaybackStart(@NonNull Playable playable, int position);
void onPlaybackPause(@NonNull Playable playable, int position);
Playable getNextInQueue(Playable currentMedia); Playable getNextInQueue(Playable currentMedia);

View File

@ -108,7 +108,7 @@ public class PlaybackServiceFlavorHelper {
// to the latest position. // to the latest position.
PlaybackServiceMediaPlayer mediaPlayer = callback.getMediaPlayer(); PlaybackServiceMediaPlayer mediaPlayer = callback.getMediaPlayer();
if (mediaPlayer != null) { if (mediaPlayer != null) {
callback.saveCurrentPosition(); callback.saveCurrentPosition(true, null, PlaybackServiceMediaPlayer.INVALID_TIME);
infoBeforeCastDisconnection = mediaPlayer.getPSMPInfo(); infoBeforeCastDisconnection = mediaPlayer.getPSMPInfo();
if (reason != BaseCastManager.DISCONNECT_REASON_EXPLICIT && if (reason != BaseCastManager.DISCONNECT_REASON_EXPLICIT &&
infoBeforeCastDisconnection.playerStatus == PlayerStatus.PLAYING) { infoBeforeCastDisconnection.playerStatus == PlayerStatus.PLAYING) {
@ -160,7 +160,7 @@ public class PlaybackServiceFlavorHelper {
// could be pause, but this way we make sure the new player will get the correct position, // could be pause, but this way we make sure the new player will get the correct position,
// since pause runs asynchronously and we could be directing the new player to play even before // since pause runs asynchronously and we could be directing the new player to play even before
// the old player gives us back the position. // the old player gives us back the position.
callback.saveCurrentPosition(); callback.saveCurrentPosition(true, null, PlaybackServiceMediaPlayer.INVALID_TIME);
} }
} }
if (info == null) { if (info == null) {