diff options
6 files changed, 107 insertions, 22 deletions
diff --git a/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java index 02ee9a487..9e86275fc 100644 --- a/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java @@ -1,6 +1,7 @@ package de.test.antennapod; import android.content.Context; +import android.content.SharedPreferences; import android.support.annotation.StringRes; import android.support.test.InstrumentationRegistry; import android.support.test.espresso.PerformException; @@ -15,6 +16,7 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.dialog.RatingDialog; +import de.danoeh.antennapod.fragment.QueueFragment; import org.hamcrest.Matcher; import java.io.File; @@ -97,6 +99,13 @@ public class EspressoTestUtils { RatingDialog.saveRated(); } + public static void setLastNavFragment(String tag) { + InstrumentationRegistry.getTargetContext().getSharedPreferences(MainActivity.PREF_NAME, Context.MODE_PRIVATE) + .edit() + .putString(MainActivity.PREF_LAST_FRAGMENT_TAG, tag) + .commit(); + } + public static void clearDatabase() { PodDBAdapter.init(InstrumentationRegistry.getTargetContext()); PodDBAdapter.deleteDatabase(); diff --git a/app/src/androidTest/java/de/test/antennapod/ui/QueueFragmentTest.java b/app/src/androidTest/java/de/test/antennapod/ui/QueueFragmentTest.java new file mode 100644 index 000000000..d1023dd9e --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/ui/QueueFragmentTest.java @@ -0,0 +1,58 @@ +package de.test.antennapod.ui; + +import android.content.Intent; +import android.support.test.espresso.Espresso; +import android.support.test.espresso.intent.rule.IntentsTestRule; +import android.support.test.runner.AndroidJUnit4; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.fragment.QueueFragment; +import de.test.antennapod.EspressoTestUtils; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; +import static android.support.test.espresso.matcher.ViewMatchers.withText; + +/** + * User interface tests for queue fragment + */ +@RunWith(AndroidJUnit4.class) +public class QueueFragmentTest { + + @Rule + public IntentsTestRule<MainActivity> mActivityRule = new IntentsTestRule<>(MainActivity.class, false, false); + + @Before + public void setUp() { + EspressoTestUtils.clearPreferences(); + EspressoTestUtils.makeNotFirstRun(); + EspressoTestUtils.clearDatabase(); + EspressoTestUtils.setLastNavFragment(QueueFragment.TAG); + mActivityRule.launchActivity(new Intent()); + } + + @Test + public void testLockEmptyQueue() { + onView(withContentDescription(R.string.lock_queue)).perform(click()); + onView(withContentDescription(R.string.unlock_queue)).perform(click()); + } + + @Test + public void testSortEmptyQueue() { + Espresso.openContextualActionModeOverflowMenu(); + onView(withText(R.string.sort)).perform(click()); + onView(withText(R.string.random)).perform(click()); + } + + @Test + public void testKeepEmptyQueueSorted() { + Espresso.openContextualActionModeOverflowMenu(); + onView(withText(R.string.sort)).perform(click()); + onView(withText(R.string.keep_sorted)).perform(click()); + } +} diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index ab4f584fe..339ce01c2 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -87,7 +87,7 @@ public class MainActivity extends CastEnabledActivity implements NavDrawerActivi public static final String PREF_NAME = "MainActivityPrefs"; public static final String PREF_IS_FIRST_LAUNCH = "prefMainActivityIsFirstLaunch"; - private static final String PREF_LAST_FRAGMENT_TAG = "prefMainActivityLastFragmentTag"; + public static final String PREF_LAST_FRAGMENT_TAG = "prefMainActivityLastFragmentTag"; public static final String EXTRA_NAV_TYPE = "nav_type"; public static final String EXTRA_NAV_INDEX = "nav_index"; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java index 4f07e1b59..9763f8f2d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -378,8 +378,10 @@ public class QueueFragment extends Fragment { if (keepSortedNew) { SortOrder sortOrder = UserPreferences.getQueueKeepSortedOrder(); QueueSorter.sort(sortOrder, true); - recyclerAdapter.setLocked(true); - } else { + if (recyclerAdapter != null) { + recyclerAdapter.setLocked(true); + } + } else if (recyclerAdapter != null) { recyclerAdapter.setLocked(UserPreferences.isQueueLocked()); } getActivity().invalidateOptionsMenu(); diff --git a/app/src/main/res/layout/feeditemlist_header.xml b/app/src/main/res/layout/feeditemlist_header.xml index e1f451e9e..ba39307b0 100644 --- a/app/src/main/res/layout/feeditemlist_header.xml +++ b/app/src/main/res/layout/feeditemlist_header.xml @@ -37,9 +37,11 @@ android:layout_alignParentRight="true" android:layout_alignParentEnd="true" android:layout_alignParentTop="true" - android:layout_marginLeft="16dp" - android:layout_marginStart="16dp" - android:layout_marginTop="8dp" + android:layout_marginLeft="8dp" + android:layout_marginStart="8dp" + android:layout_marginTop="16dp" + android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" android:background="?attr/selectableItemBackground" android:contentDescription="@string/show_info_label" android:src="@drawable/ic_info_white_24dp" @@ -55,6 +57,8 @@ tools:background="@android:color/holo_green_dark" android:layout_below="@+id/butShowInfo" android:layout_marginBottom="16dp" + android:layout_marginRight="16dp" + android:layout_marginEnd="16dp" android:layout_alignParentRight="true" android:layout_alignParentEnd="true"/> @@ -88,8 +92,8 @@ android:layout_marginBottom="16dp" android:layout_marginLeft="16dp" android:layout_marginStart="16dp" - android:layout_marginRight="16dp" - android:layout_marginEnd="16dp" + android:layout_marginRight="8dp" + android:layout_marginEnd="8dp" android:layout_toLeftOf="@id/butShowSettings" android:layout_toStartOf="@id/butShowSettings" android:layout_toRightOf="@id/imgvCover" diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index 6bd736de7..5177fa6be 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -12,6 +12,7 @@ import android.util.Log; import android.util.Pair; import android.view.SurfaceHolder; +import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; import org.antennapod.audio.MediaPlayer; import java.io.File; @@ -350,13 +351,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { setPlayerStatus(PlayerStatus.PAUSED, media, getPosition()); if (abandonFocus) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - AudioFocusRequest.Builder builder = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) - .setOnAudioFocusChangeListener(audioFocusChangeListener); - audioManager.abandonAudioFocusRequest(builder.build()); - } else { - audioManager.abandonAudioFocus(audioFocusChangeListener); - } + abandonAudioFocus(); pausedBecauseOfTransientAudiofocusLoss = false; } if (stream && reinit) { @@ -370,6 +365,16 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { }); } + private void abandonAudioFocus() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + AudioFocusRequest.Builder builder = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) + .setOnAudioFocusChangeListener(audioFocusChangeListener); + audioManager.abandonAudioFocusRequest(builder.build()); + } else { + audioManager.abandonAudioFocus(audioFocusChangeListener); + } + } + /** * Prepares media player for playback if the service is in the INITALIZED * state. @@ -834,6 +839,19 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { @Override public void onAudioFocusChange(final int focusChange) { + if (!PlaybackService.isRunning) { + abandonAudioFocus(); + Log.d(TAG, "onAudioFocusChange: PlaybackService is no longer running"); + if (focusChange == AudioManager.AUDIOFOCUS_GAIN && pausedBecauseOfTransientAudiofocusLoss) { + new PlaybackServiceStarter(context, getPlayable()) + .startWhenPrepared(true) + .streamIfLastWasStream() + .callEvenIfRunning(false) + .start(); + } + return; + } + executor.submit(() -> { playerLock.lock(); @@ -907,13 +925,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { mediaPlayer.reset(); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - AudioFocusRequest.Builder builder = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) - .setOnAudioFocusChangeListener(audioFocusChangeListener); - audioManager.abandonAudioFocusRequest(builder.build()); - } else { - audioManager.abandonAudioFocus(audioFocusChangeListener); - } + abandonAudioFocus(); final Playable currentMedia = media; Playable nextMedia = null; |