summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java9
-rw-r--r--app/src/androidTest/java/de/test/antennapod/ui/QueueFragmentTest.java58
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java6
-rw-r--r--app/src/main/res/layout/feeditemlist_header.xml14
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java40
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;