Removed code duplication from playback tests, added test for ExoPlayer

This commit is contained in:
ByteHamster 2019-10-20 23:47:47 +02:00
parent 6e35861a61
commit fea84424e3
7 changed files with 213 additions and 434 deletions

View File

@ -0,0 +1,17 @@
package de.test.antennapod.playback;
import androidx.test.filters.LargeTest;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import org.junit.Before;
/**
* Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity.
*/
@LargeTest
public class PlaybackBuiltinTest extends PlaybackTest {
@Before
public void setUp() throws Exception {
super.setUp();
UserPreferences.enableBuiltin();
}
}

View File

@ -0,0 +1,17 @@
package de.test.antennapod.playback;
import androidx.test.filters.LargeTest;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import org.junit.Before;
/**
* Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity.
*/
@LargeTest
public class PlaybackExoplayerTest extends PlaybackTest {
@Before
public void setUp() throws Exception {
super.setUp();
UserPreferences.enableExoplayer();
}
}

View File

@ -0,0 +1,17 @@
package de.test.antennapod.playback;
import androidx.test.filters.LargeTest;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import org.junit.Before;
/**
* Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity.
*/
@LargeTest
public class PlaybackSonicTest extends PlaybackTest {
@Before
public void setUp() throws Exception {
super.setUp();
UserPreferences.enableSonic();
}
}

View File

@ -1,23 +1,11 @@
package de.test.antennapod.ui; package de.test.antennapod.playback;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import androidx.test.filters.LargeTest;
import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule; import androidx.test.rule.ActivityTestRule;
import de.test.antennapod.EspressoTestUtils;
import org.awaitility.Awaitility;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import java.util.List;
import java.util.concurrent.TimeUnit;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedItem;
@ -26,6 +14,16 @@ import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.service.playback.PlayerStatus; import de.danoeh.antennapod.core.service.playback.PlayerStatus;
import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DBWriter;
import de.test.antennapod.EspressoTestUtils;
import de.test.antennapod.ui.UITestUtils;
import org.awaitility.Awaitility;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.click;
@ -41,21 +39,19 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.hasItems;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
/** /**
* test cases for starting and ending playback from the MainActivity and AudioPlayerActivity * test cases for starting and ending playback from the MainActivity and AudioPlayerActivity
*/ */
@LargeTest public abstract class PlaybackTest {
public class PlaybackTest {
@Rule @Rule
public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(MainActivity.class, false, false); public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(MainActivity.class, false, false);
private UITestUtils uiTestUtils; private UITestUtils uiTestUtils;
private Context context; protected Context context;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
@ -77,93 +73,6 @@ public class PlaybackTest {
context.sendBroadcast(new Intent(PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE)); context.sendBroadcast(new Intent(PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE));
} }
private MainActivity getActivity() {
return activityTestRule.getActivity();
}
private void setContinuousPlaybackPreference(boolean value) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putBoolean(UserPreferences.PREF_FOLLOW_QUEUE, value).commit();
}
private void setSkipKeepsEpisodePreference(boolean value) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putBoolean(UserPreferences.PREF_SKIP_KEEPS_EPISODE, value).commit();
}
private void setSmartMarkAsPlayedPreference(int smartMarkAsPlayedSecs) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putString(UserPreferences.PREF_SMART_MARK_AS_PLAYED_SECS,
Integer.toString(smartMarkAsPlayedSecs, 10))
.commit();
}
private void skipEpisode() {
Intent skipIntent = new Intent(PlaybackService.ACTION_SKIP_CURRENT_EPISODE);
context.sendBroadcast(skipIntent);
}
private void pauseEpisode() {
Intent pauseIntent = new Intent(PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE);
context.sendBroadcast(pauseIntent);
}
private void startLocalPlayback() {
openNavDrawer();
onDrawerItem(withText(R.string.episodes_label)).perform(click());
onView(isRoot()).perform(waitForView(withId(R.id.emptyViewTitle), 1000));
onView(withText(R.string.all_episodes_short_label)).perform(click());
final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(0, 10);
onView(isRoot()).perform(waitForView(withId(R.id.butSecondaryAction), 1000));
onView(first(withId(R.id.butSecondaryAction))).perform(click());
long mediaId = episodes.get(0).getMedia().getId();
Awaitility.await().atMost(1, TimeUnit.SECONDS).until(() -> {
if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
} else {
return false;
}
});
}
/**
*
* @param itemIdx The 0-based index of the episode to be played in the queue.
*/
private void playFromQueue(int itemIdx) {
final List<FeedItem> queue = DBReader.getQueue();
onView(nth(withId(R.id.butSecondaryAction), itemIdx + 1)).perform(click());
onView(isRoot()).perform(waitForView(withId(R.id.butPlay), 1000));
long mediaId = queue.get(itemIdx).getMedia().getId();
Awaitility.await().atMost(1, TimeUnit.SECONDS).until(() -> {
if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
} else {
return false;
}
});
}
@Test
public void testStartLocal() throws Exception {
uiTestUtils.addLocalFeedData(true);
activityTestRule.launchActivity(new Intent());
DBWriter.clearQueue().get();
startLocalPlayback();
}
@Test
public void testContinousPlaybackOffSingleEpisode() throws Exception {
setContinuousPlaybackPreference(false);
uiTestUtils.addLocalFeedData(true);
activityTestRule.launchActivity(new Intent());
DBWriter.clearQueue().get();
startLocalPlayback();
}
@Test @Test
public void testContinousPlaybackOffMultipleEpisodes() throws Exception { public void testContinousPlaybackOffMultipleEpisodes() throws Exception {
setContinuousPlaybackPreference(false); setContinuousPlaybackPreference(false);
@ -199,7 +108,7 @@ public class PlaybackTest {
final FeedItem second = queue.get(1); final FeedItem second = queue.get(1);
playFromQueue(0); playFromQueue(0);
Awaitility.await().atMost(1, TimeUnit.SECONDS).until(() -> { Awaitility.await().atMost(2, TimeUnit.SECONDS).until(() -> {
if (uiTestUtils.getCurrentMedia(getActivity()) != null) { if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId() return uiTestUtils.getCurrentMedia(getActivity()).getId()
== first.getMedia().getId(); == first.getMedia().getId();
@ -217,10 +126,145 @@ public class PlaybackTest {
}); });
} }
@Test
public void testReplayEpisodeContinuousPlaybackOn() throws Exception {
replayEpisodeCheck(true);
}
@Test
public void testReplayEpisodeContinuousPlaybackOff() throws Exception {
replayEpisodeCheck(false);
}
@Test
public void testSmartMarkAsPlayed_Skip_Average() throws Exception {
doTestSmartMarkAsPlayed_Skip_ForEpisode(0);
}
@Test
public void testSmartMarkAsPlayed_Skip_LastEpisodeInQueue() throws Exception {
doTestSmartMarkAsPlayed_Skip_ForEpisode(-1);
}
@Test
public void testSmartMarkAsPlayed_Pause_WontAffectItem() throws Exception {
setSmartMarkAsPlayedPreference(60);
uiTestUtils.addLocalFeedData(true);
activityTestRule.launchActivity(new Intent());
final int fiIdx = 0;
final FeedItem feedItem = DBReader.getQueue().get(fiIdx);
playFromQueue(fiIdx);
// let playback run a bit then pause
Awaitility.await()
.atMost(1000, MILLISECONDS)
.until(() -> PlayerStatus.PLAYING == uiTestUtils.getPlaybackController(getActivity()).getStatus());
pauseEpisode();
Awaitility.await()
.atMost(1000, MILLISECONDS)
.until(() -> PlayerStatus.PAUSED == uiTestUtils.getPlaybackController(getActivity()).getStatus());
assertThat("Ensure even with smart mark as play, after pause, the item remains in the queue.",
DBReader.getQueue(), hasItems(feedItem));
assertThat("Ensure even with smart mark as play, after pause, the item played status remains false.",
DBReader.getFeedItem(feedItem.getId()).isPlayed(), is(false));
}
@Test
public void testStartLocal() throws Exception {
uiTestUtils.addLocalFeedData(true);
activityTestRule.launchActivity(new Intent());
DBWriter.clearQueue().get();
startLocalPlayback();
}
@Test
public void testContinousPlaybackOffSingleEpisode() throws Exception {
setContinuousPlaybackPreference(false);
uiTestUtils.addLocalFeedData(true);
activityTestRule.launchActivity(new Intent());
DBWriter.clearQueue().get();
startLocalPlayback();
}
protected MainActivity getActivity() {
return activityTestRule.getActivity();
}
protected void setContinuousPlaybackPreference(boolean value) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putBoolean(UserPreferences.PREF_FOLLOW_QUEUE, value).commit();
}
protected void setSkipKeepsEpisodePreference(boolean value) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putBoolean(UserPreferences.PREF_SKIP_KEEPS_EPISODE, value).commit();
}
protected void setSmartMarkAsPlayedPreference(int smartMarkAsPlayedSecs) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putString(UserPreferences.PREF_SMART_MARK_AS_PLAYED_SECS,
Integer.toString(smartMarkAsPlayedSecs, 10))
.commit();
}
private void skipEpisode() {
Intent skipIntent = new Intent(PlaybackService.ACTION_SKIP_CURRENT_EPISODE);
context.sendBroadcast(skipIntent);
}
protected void pauseEpisode() {
Intent pauseIntent = new Intent(PlaybackService.ACTION_PAUSE_PLAY_CURRENT_EPISODE);
context.sendBroadcast(pauseIntent);
}
protected void startLocalPlayback() {
openNavDrawer();
onDrawerItem(withText(R.string.episodes_label)).perform(click());
onView(isRoot()).perform(waitForView(withId(R.id.emptyViewTitle), 1000));
onView(withText(R.string.all_episodes_short_label)).perform(click());
final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(0, 10);
onView(isRoot()).perform(waitForView(withId(R.id.butSecondaryAction), 1000));
onView(first(withId(R.id.butSecondaryAction))).perform(click());
long mediaId = episodes.get(0).getMedia().getId();
Awaitility.await().atMost(1, TimeUnit.SECONDS).until(() -> {
if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
} else {
return false;
}
});
}
/**
*
* @param itemIdx The 0-based index of the episode to be played in the queue.
*/
protected void playFromQueue(int itemIdx) {
final List<FeedItem> queue = DBReader.getQueue();
onView(nth(withId(R.id.butSecondaryAction), itemIdx + 1)).perform(click());
onView(isRoot()).perform(waitForView(withId(R.id.butPlay), 1000));
long mediaId = queue.get(itemIdx).getMedia().getId();
Awaitility.await().atMost(1, TimeUnit.SECONDS).until(() -> {
if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
} else {
return false;
}
});
}
/** /**
* Check if an episode can be played twice without problems. * Check if an episode can be played twice without problems.
*/ */
private void replayEpisodeCheck(boolean followQueue) throws Exception { protected void replayEpisodeCheck(boolean followQueue) throws Exception {
setContinuousPlaybackPreference(followQueue); setContinuousPlaybackPreference(followQueue);
uiTestUtils.addLocalFeedData(true); uiTestUtils.addLocalFeedData(true);
DBWriter.clearQueue().get(); DBWriter.clearQueue().get();
@ -251,27 +295,7 @@ public class PlaybackTest {
}); });
} }
@Test protected void doTestSmartMarkAsPlayed_Skip_ForEpisode(int itemIdxNegAllowed) throws Exception {
public void testReplayEpisodeContinuousPlaybackOn() throws Exception {
replayEpisodeCheck(true);
}
@Test
public void testReplayEpisodeContinuousPlaybackOff() throws Exception {
replayEpisodeCheck(false);
}
@Test
public void testSmartMarkAsPlayed_Skip_Average() throws Exception {
doTestSmartMarkAsPlayed_Skip_ForEpisode(0);
}
@Test
public void testSmartMarkAsPlayed_Skip_LastEpisodeInQueue() throws Exception {
doTestSmartMarkAsPlayed_Skip_ForEpisode(-1);
}
private void doTestSmartMarkAsPlayed_Skip_ForEpisode(int itemIdxNegAllowed) throws Exception {
setSmartMarkAsPlayedPreference(60); setSmartMarkAsPlayedPreference(60);
// ensure when an episode is skipped, it is removed due to smart as played // ensure when an episode is skipped, it is removed due to smart as played
setSkipKeepsEpisodePreference(false); setSkipKeepsEpisodePreference(false);
@ -299,32 +323,4 @@ public class PlaybackTest {
}); });
assertThat(DBReader.getFeedItem(feedItem.getId()).isPlayed(), is(true)); assertThat(DBReader.getFeedItem(feedItem.getId()).isPlayed(), is(true));
} }
@Test
public void testSmartMarkAsPlayed_Pause_WontAffectItem() throws Exception {
setSmartMarkAsPlayedPreference(60);
uiTestUtils.addLocalFeedData(true);
activityTestRule.launchActivity(new Intent());
final int fiIdx = 0;
final FeedItem feedItem = DBReader.getQueue().get(fiIdx);
playFromQueue(fiIdx);
// let playback run a bit then pause
Awaitility.await()
.atMost(1000, MILLISECONDS)
.until(() -> PlayerStatus.PLAYING == uiTestUtils.getPlaybackController(getActivity()).getStatus());
pauseEpisode();
Awaitility.await()
.atMost(1000, MILLISECONDS)
.until(() -> PlayerStatus.PAUSED == uiTestUtils.getPlaybackController(getActivity()).getStatus());
assertThat("Ensure even with smart mark as play, after pause, the item remains in the queue.",
DBReader.getQueue(), hasItems(feedItem));
assertThat("Ensure even with smart mark as play, after pause, the item played status remains false.",
DBReader.getFeedItem(feedItem.getId()).isPlayed(), is(false));
}
} }

View File

@ -1,277 +0,0 @@
package de.test.antennapod.ui;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import android.view.View;
import android.widget.ListView;
import com.robotium.solo.Solo;
import com.robotium.solo.Timeout;
import java.util.List;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.service.playback.PlayerStatus;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.DBWriter;
import de.test.antennapod.EspressoTestUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import static androidx.test.InstrumentationRegistry.getInstrumentation;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* test cases for starting and ending playback from the MainActivity and AudioPlayerActivity
*/
@LargeTest
public class PlaybackSonicTest {
private static final int EPISODES_DRAWER_LIST_INDEX = 1;
private static final int QUEUE_DRAWER_LIST_INDEX = 0;
private Solo solo;
private UITestUtils uiTestUtils;
private Context context;
@Rule
public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(MainActivity.class, false, false);
@Before
public void setUp() throws Exception {
EspressoTestUtils.clearPreferences();
EspressoTestUtils.makeNotFirstRun();
EspressoTestUtils.clearDatabase();
context = InstrumentationRegistry.getTargetContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit()
.clear()
.putBoolean(UserPreferences.PREF_UNPAUSE_ON_HEADSET_RECONNECT, false)
.putBoolean(UserPreferences.PREF_PAUSE_ON_HEADSET_DISCONNECT, false)
.putString(UserPreferences.PREF_MEDIA_PLAYER, "sonic")
.commit();
activityTestRule.launchActivity(new Intent());
solo = new Solo(getInstrumentation(), activityTestRule.getActivity());
uiTestUtils = new UITestUtils(context);
uiTestUtils.setup();
}
@After
public void tearDown() throws Exception {
solo.finishOpenedActivities();
uiTestUtils.tearDown();
// shut down playback service
skipEpisode();
context.sendBroadcast(new Intent(PlaybackService.ACTION_SHUTDOWN_PLAYBACK_SERVICE));
}
private MainActivity getActivity() {
return activityTestRule.getActivity();
}
private void openNavDrawer() {
solo.clickOnImageButton(0);
getInstrumentation().waitForIdleSync();
}
private void setContinuousPlaybackPreference(boolean value) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putBoolean(UserPreferences.PREF_FOLLOW_QUEUE, value).commit();
}
private void skipEpisode() {
Intent skipIntent = new Intent(PlaybackService.ACTION_SKIP_CURRENT_EPISODE);
context.sendBroadcast(skipIntent);
}
private void startLocalPlayback() {
openNavDrawer();
// if we try to just click on plain old text then
// we might wind up clicking on the fragment title and not
// the drawer element like we want.
ListView drawerView = (ListView)solo.getView(R.id.nav_list);
// this should be 'Episodes'
View targetView = drawerView.getChildAt(EPISODES_DRAWER_LIST_INDEX);
solo.waitForView(targetView);
solo.clickOnView(targetView);
getInstrumentation().waitForIdleSync();
solo.waitForText(solo.getString(R.string.all_episodes_short_label));
solo.clickOnText(solo.getString(R.string.all_episodes_short_label));
getInstrumentation().waitForIdleSync();
final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(0, 10);
assertTrue(solo.waitForView(solo.getView(R.id.butSecondaryAction)));
solo.clickOnView(solo.getView(R.id.butSecondaryAction));
long mediaId = episodes.get(0).getMedia().getId();
boolean playing = solo.waitForCondition(() -> {
if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
} else {
return false;
}
}, Timeout.getSmallTimeout());
assertTrue(playing);
}
private void startLocalPlaybackFromQueue() {
openNavDrawer();
// if we try to just click on plain old text then
// we might wind up clicking on the fragment title and not
// the drawer element like we want.
ListView drawerView = (ListView)solo.getView(R.id.nav_list);
// this should be 'Queue'
View targetView = drawerView.getChildAt(QUEUE_DRAWER_LIST_INDEX);
solo.waitForView(targetView);
getInstrumentation().waitForIdleSync();
solo.clickOnView(targetView);
assertTrue(solo.waitForView(solo.getView(R.id.butSecondaryAction)));
final List<FeedItem> queue = DBReader.getQueue();
solo.clickOnImageButton(1);
assertTrue(solo.waitForView(solo.getView(R.id.butPlay)));
long mediaId = queue.get(0).getMedia().getId();
boolean playing = solo.waitForCondition(() -> {
if(uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
} else {
return false;
}
}, Timeout.getSmallTimeout());
assertTrue(playing);
}
@Test
public void testStartLocal() throws Exception {
uiTestUtils.addLocalFeedData(true);
DBWriter.clearQueue().get();
startLocalPlayback();
}
@Test
public void testContinousPlaybackOffSingleEpisode() throws Exception {
setContinuousPlaybackPreference(false);
uiTestUtils.addLocalFeedData(true);
DBWriter.clearQueue().get();
startLocalPlayback();
}
@Test
public void testContinousPlaybackOffMultipleEpisodes() throws Exception {
setContinuousPlaybackPreference(false);
uiTestUtils.addLocalFeedData(true);
List<FeedItem> queue = DBReader.getQueue();
final FeedItem first = queue.get(0);
startLocalPlaybackFromQueue();
boolean stopped = solo.waitForCondition(() -> {
if (uiTestUtils.getPlaybackController(getActivity()).getStatus()
!= PlayerStatus.PLAYING) {
return true;
} else if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId()
!= first.getMedia().getId();
} else {
return true;
}
}, Timeout.getSmallTimeout());
assertTrue(stopped);
Thread.sleep(1000);
PlayerStatus status = uiTestUtils.getPlaybackController(getActivity()).getStatus();
assertFalse(status.equals(PlayerStatus.PLAYING));
}
@Test
public void testContinuousPlaybackOnMultipleEpisodes() throws Exception {
setContinuousPlaybackPreference(true);
uiTestUtils.addLocalFeedData(true);
List<FeedItem> queue = DBReader.getQueue();
final FeedItem first = queue.get(0);
final FeedItem second = queue.get(1);
startLocalPlaybackFromQueue();
boolean firstPlaying = solo.waitForCondition(() -> {
if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId()
== first.getMedia().getId();
} else {
return false;
}
}, Timeout.getSmallTimeout());
assertTrue(firstPlaying);
boolean secondPlaying = solo.waitForCondition(() -> {
if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId()
== second.getMedia().getId();
} else {
return false;
}
}, Timeout.getLargeTimeout());
assertTrue(secondPlaying);
}
/**
* Check if an episode can be played twice without problems.
*/
private void replayEpisodeCheck(boolean followQueue) throws Exception {
setContinuousPlaybackPreference(followQueue);
uiTestUtils.addLocalFeedData(true);
DBWriter.clearQueue().get();
final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(0, 10);
startLocalPlayback();
long mediaId = episodes.get(0).getMedia().getId();
boolean startedPlaying = solo.waitForCondition(() -> {
if (uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
} else {
return false;
}
}, Timeout.getSmallTimeout());
assertTrue(startedPlaying);
boolean stoppedPlaying = solo.waitForCondition(() ->
uiTestUtils.getCurrentMedia(getActivity()) == null
|| uiTestUtils.getCurrentMedia(getActivity()).getId() != mediaId
, Timeout.getLargeTimeout());
assertTrue(stoppedPlaying);
startLocalPlayback();
boolean startedReplay = solo.waitForCondition(() -> {
if(uiTestUtils.getCurrentMedia(getActivity()) != null) {
return uiTestUtils.getCurrentMedia(getActivity()).getId() == mediaId;
} else {
return false;
}
}, Timeout.getLargeTimeout());
assertTrue(startedReplay);
}
@Test
public void testReplayEpisodeContinuousPlaybackOn() throws Exception {
replayEpisodeCheck(true);
}
@Test
public void testReplayEpisodeContinuousPlaybackOff() throws Exception {
replayEpisodeCheck(false);
}
}

View File

@ -34,7 +34,7 @@ import org.junit.Assert;
* Utility methods for UI tests. * Utility methods for UI tests.
* Starts a web server that hosts feeds, episodes and images. * Starts a web server that hosts feeds, episodes and images.
*/ */
class UITestUtils { public class UITestUtils {
private static final String TAG = UITestUtils.class.getSimpleName(); private static final String TAG = UITestUtils.class.getSimpleName();

View File

@ -741,7 +741,8 @@ public class UserPreferences {
} }
public static String getMediaPlayer() { public static String getMediaPlayer() {
return prefs.getString(PREF_MEDIA_PLAYER, PREF_MEDIA_PLAYER_EXOPLAYER); String s = prefs.getString(PREF_MEDIA_PLAYER, "blaah");
return s;
} }
public static boolean useSonic() { public static boolean useSonic() {
@ -756,6 +757,14 @@ public class UserPreferences {
prefs.edit().putString(PREF_MEDIA_PLAYER, "sonic").apply(); prefs.edit().putString(PREF_MEDIA_PLAYER, "sonic").apply();
} }
public static void enableExoplayer() {
prefs.edit().putString(PREF_MEDIA_PLAYER, PREF_MEDIA_PLAYER_EXOPLAYER).apply();
}
public static void enableBuiltin() {
prefs.edit().putString(PREF_MEDIA_PLAYER, "builtin").apply();
}
public static boolean stereoToMono() { public static boolean stereoToMono() {
return prefs.getBoolean(PREF_STEREO_TO_MONO, false); return prefs.getBoolean(PREF_STEREO_TO_MONO, false);
} }