From 8dfb0c2a8e98f29db1d358c113649d77f5b35728 Mon Sep 17 00:00:00 2001 From: Hans-Peter Lehmann Date: Sun, 14 Dec 2025 16:26:21 +0100 Subject: [PATCH] Enable bottom navigation for users who never touched the setting (#8158) * Enable bottom navigation for users who never opened the settings * Make tests more independent of navigation setting --- .../de/test/antennapod/EspressoTestUtils.java | 15 ++++++------ .../antennapod/dialogs/ShareDialogTest.java | 5 ---- .../antennapod/playback/PlaybackTest.java | 8 ++----- ...vityTest.java => AddFeedFragmentTest.java} | 12 ++++------ .../antennapod/ui/BottomNavigationTest.java | 24 +++++-------------- .../antennapod/ui/NavigationDrawerTest.java | 8 ++++++- .../test/antennapod/ui/TextOnlyFeedsTest.java | 10 ++------ .../antennapod/activity/MainActivity.java | 1 - .../storage/preferences/UserPreferences.java | 2 +- 9 files changed, 30 insertions(+), 55 deletions(-) rename app/src/androidTest/java/de/test/antennapod/ui/{MainActivityTest.java => AddFeedFragmentTest.java} (89%) diff --git a/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java index d6491c8a7..dd2ffefd5 100644 --- a/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java @@ -11,8 +11,6 @@ import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.espresso.PerformException; import androidx.test.espresso.UiController; import androidx.test.espresso.ViewAction; -import androidx.test.espresso.ViewInteraction; -import androidx.test.espresso.contrib.DrawerActions; import androidx.test.espresso.contrib.RecyclerViewActions; import androidx.test.espresso.util.HumanReadables; import androidx.test.espresso.util.TreeIterables; @@ -39,6 +37,7 @@ import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant; +import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.isRoot; import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription; @@ -218,13 +217,15 @@ public class EspressoTestUtils { click())); } - public static void openNavDrawer() { - onView(isRoot()).perform(waitForView(withId(R.id.drawer_layout), 1000)); - onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); + public static void clickBottomNavItem(@StringRes int text) { + onView(allOf(withText(text), + isDescendantOfA(withId(R.id.bottomNavigationView)), isDisplayed())).perform(click()); } - public static ViewInteraction onDrawerItem(Matcher viewMatcher) { - return onView(allOf(viewMatcher, withId(R.id.txtvTitle))); + public static void clickBottomNavOverflow(@StringRes int text) { + onView(allOf(withText(R.string.overflow_more), + isDescendantOfA(withId(R.id.bottomNavigationView)), isDisplayed())).perform(click()); + onView(allOf(withText(text), isDisplayed())).perform(click()); } public static void tryKillPlaybackService() { diff --git a/app/src/androidTest/java/de/test/antennapod/dialogs/ShareDialogTest.java b/app/src/androidTest/java/de/test/antennapod/dialogs/ShareDialogTest.java index 2afe196b1..7915af736 100644 --- a/app/src/androidTest/java/de/test/antennapod/dialogs/ShareDialogTest.java +++ b/app/src/androidTest/java/de/test/antennapod/dialogs/ShareDialogTest.java @@ -26,8 +26,6 @@ import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.isRoot; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static de.test.antennapod.EspressoTestUtils.onDrawerItem; -import static de.test.antennapod.EspressoTestUtils.openNavDrawer; import static de.test.antennapod.EspressoTestUtils.waitForView; import static de.test.antennapod.NthMatcher.first; import static org.hamcrest.CoreMatchers.allOf; @@ -55,9 +53,6 @@ public class ShareDialogTest { activityRule.launchActivity(new Intent()); - openNavDrawer(); - onDrawerItem(withText(R.string.episodes_label)).perform(click()); - Matcher allEpisodesMatcher; allEpisodesMatcher = Matchers.allOf(withId(R.id.recyclerView), isDisplayed(), hasMinimumChildCount(2)); onView(isRoot()).perform(waitForView(allEpisodesMatcher, 1000)); diff --git a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackTest.java b/app/src/androidTest/java/de/test/antennapod/playback/PlaybackTest.java index 1f1a5b432..a8752eb95 100644 --- a/app/src/androidTest/java/de/test/antennapod/playback/PlaybackTest.java +++ b/app/src/androidTest/java/de/test/antennapod/playback/PlaybackTest.java @@ -37,16 +37,13 @@ import java.util.List; import java.util.concurrent.TimeUnit; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition; import static androidx.test.espresso.matcher.ViewMatchers.hasMinimumChildCount; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.isRoot; import static androidx.test.espresso.matcher.ViewMatchers.withId; -import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static de.test.antennapod.EspressoTestUtils.clickBottomNavOverflow; import static de.test.antennapod.EspressoTestUtils.clickChildViewWithId; -import static de.test.antennapod.EspressoTestUtils.onDrawerItem; -import static de.test.antennapod.EspressoTestUtils.openNavDrawer; import static de.test.antennapod.EspressoTestUtils.waitForView; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static org.hamcrest.Matchers.allOf; @@ -232,8 +229,7 @@ public class PlaybackTest { } protected void startLocalPlayback() { - openNavDrawer(); - onDrawerItem(withText(R.string.episodes_label)).perform(click()); + clickBottomNavOverflow(R.string.episodes_label); final List episodes = DBReader.getEpisodes(0, 10, FeedItemFilter.unfiltered(), SortOrder.DATE_NEW_OLD); diff --git a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java b/app/src/androidTest/java/de/test/antennapod/ui/AddFeedFragmentTest.java similarity index 89% rename from app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java rename to app/src/androidTest/java/de/test/antennapod/ui/AddFeedFragmentTest.java index d7e29c676..ae81c7203 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/AddFeedFragmentTest.java @@ -9,6 +9,7 @@ import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.storage.database.PodDBAdapter; +import de.danoeh.antennapod.ui.screen.AddFeedFragment; import de.test.antennapod.EspressoTestUtils; import org.junit.After; import org.junit.Before; @@ -24,14 +25,10 @@ import static androidx.test.espresso.action.ViewActions.replaceText; import static androidx.test.espresso.action.ViewActions.scrollTo; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static de.test.antennapod.EspressoTestUtils.openNavDrawer; import static de.test.antennapod.EspressoTestUtils.waitForViewGlobally; -/** - * User interface tests for MainActivity. - */ @RunWith(AndroidJUnit4.class) -public class MainActivityTest { +public class AddFeedFragmentTest { private UITestUtils uiTestUtils; @@ -42,6 +39,7 @@ public class MainActivityTest { public void setUp() throws IOException { EspressoTestUtils.clearPreferences(); EspressoTestUtils.clearDatabase(); + EspressoTestUtils.setLaunchScreen(AddFeedFragment.TAG); activityRule.launchActivity(new Intent()); @@ -56,12 +54,10 @@ public class MainActivityTest { } @Test - public void testAddFeed() throws Exception { + public void testAddFeedByUrl() throws Exception { // connect to podcast feed uiTestUtils.addHostedFeedData(); final Feed feed = uiTestUtils.hostedFeeds.get(0); - openNavDrawer(); - onView(withText(R.string.add_feed_label)).perform(click()); onView(withId(R.id.addViaUrlButton)).perform(scrollTo(), click()); onView(withId(R.id.textInput)).perform(replaceText(feed.getDownloadUrl())); onView(withText(R.string.confirm_label)).perform(scrollTo(), click()); diff --git a/app/src/androidTest/java/de/test/antennapod/ui/BottomNavigationTest.java b/app/src/androidTest/java/de/test/antennapod/ui/BottomNavigationTest.java index a0fa5656c..b814842d9 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/BottomNavigationTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/BottomNavigationTest.java @@ -2,7 +2,6 @@ package de.test.antennapod.ui; import android.content.Intent; import android.os.Build; -import androidx.annotation.StringRes; import androidx.test.espresso.intent.rule.IntentsTestRule; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; @@ -20,12 +19,12 @@ import java.io.IOException; import java.util.Collections; import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA; -import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.isRoot; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static de.test.antennapod.EspressoTestUtils.clickBottomNavItem; +import static de.test.antennapod.EspressoTestUtils.clickBottomNavOverflow; import static de.test.antennapod.EspressoTestUtils.waitForView; import static org.hamcrest.Matchers.allOf; import static org.junit.Assume.assumeTrue; @@ -56,17 +55,6 @@ public class BottomNavigationTest { uiTestUtils.tearDown(); } - void clickBottomNavItem(@StringRes int text) { - onView(allOf(withText(text), - isDescendantOfA(withId(R.id.bottomNavigationView)), isDisplayed())).perform(click()); - } - - void clickBottomNavOverview(@StringRes int text) { - onView(allOf(withText(R.string.overflow_more), - isDescendantOfA(withId(R.id.bottomNavigationView)), isDisplayed())).perform(click()); - onView(allOf(withText(text), isDisplayed())).perform(click()); - } - @Test public void testClickBottomNavigation() throws Exception { assumeTrue(Build.VERSION.SDK_INT >= 30); // Unclear why this crashes on old Android versions @@ -90,19 +78,19 @@ public class BottomNavigationTest { onView(isRoot()).perform(waitForView(allOf(isDescendantOfA(withId(R.id.toolbar)), withText(R.string.subscriptions_label)), 1000)); - clickBottomNavOverview(R.string.episodes_label); + clickBottomNavOverflow(R.string.episodes_label); onView(isRoot()).perform(waitForView(allOf(isDescendantOfA(withId(R.id.toolbar)), withText(R.string.episodes_label)), 1000)); - clickBottomNavOverview(R.string.downloads_label); + clickBottomNavOverflow(R.string.downloads_label); onView(isRoot()).perform(waitForView(allOf(isDescendantOfA(withId(R.id.toolbar)), withText(R.string.downloads_label)), 1000)); - clickBottomNavOverview(R.string.playback_history_label); + clickBottomNavOverflow(R.string.playback_history_label); onView(isRoot()).perform(waitForView(allOf(isDescendantOfA(withId(R.id.toolbar)), withText(R.string.playback_history_label)), 1000)); - clickBottomNavOverview(R.string.add_feed_label); + clickBottomNavOverflow(R.string.add_feed_label); onView(isRoot()).perform(waitForView(allOf(isDescendantOfA(withId(R.id.toolbar)), withText(R.string.add_feed_label)), 1000)); } diff --git a/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java b/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java index 203a9cddf..36b439186 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java @@ -2,6 +2,8 @@ package de.test.antennapod.ui; import android.content.Intent; import android.os.Build; +import android.view.View; +import androidx.test.espresso.ViewInteraction; import androidx.test.espresso.contrib.DrawerActions; import androidx.test.espresso.intent.rule.IntentsTestRule; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -12,6 +14,7 @@ import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.ui.screen.preferences.PreferenceActivity; import de.test.antennapod.EspressoTestUtils; +import org.hamcrest.Matcher; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -31,7 +34,6 @@ import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.isRoot; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static de.test.antennapod.EspressoTestUtils.onDrawerItem; import static de.test.antennapod.EspressoTestUtils.waitForView; import static org.hamcrest.Matchers.allOf; import static org.junit.Assume.assumeTrue; @@ -67,6 +69,10 @@ public class NavigationDrawerTest { onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()); } + private ViewInteraction onDrawerItem(Matcher viewMatcher) { + return onView(allOf(viewMatcher, withId(R.id.txtvTitle))); + } + @Test public void testClickNavDrawer() throws Exception { uiTestUtils.addLocalFeedData(false); diff --git a/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java b/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java index 5f7e8e959..ae945c8d9 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java @@ -18,13 +18,9 @@ import java.io.IOException; import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; -import static androidx.test.espresso.action.ViewActions.swipeUp; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.isRoot; -import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; -import static de.test.antennapod.EspressoTestUtils.onDrawerItem; -import static de.test.antennapod.EspressoTestUtils.openNavDrawer; import static de.test.antennapod.EspressoTestUtils.waitForView; import static org.hamcrest.CoreMatchers.allOf; @@ -48,7 +44,6 @@ public class TextOnlyFeedsTest { uiTestUtils.setHostTextOnlyFeeds(true); uiTestUtils.setup(); - activityRule.launchActivity(new Intent()); } @After @@ -60,9 +55,8 @@ public class TextOnlyFeedsTest { public void testMarkAsPlayedList() throws Exception { uiTestUtils.addLocalFeedData(false); final Feed feed = uiTestUtils.hostedFeeds.get(0); - openNavDrawer(); - onView(withId(R.id.nav_list)).perform(swipeUp()); - onDrawerItem(withText(feed.getTitle())).perform(click()); + EspressoTestUtils.setLaunchScreen("" + feed.getId()); + activityRule.launchActivity(new Intent()); onView(withText(feed.getItemAtIndex(0).getTitle())).perform(click()); onView(isRoot()).perform(waitForView(withText(R.string.mark_read_no_media_label), 3000)); onView(allOf(withText(R.string.mark_read_no_media_label), isDisplayed())).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 9b124a26d..c80b62f4f 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -348,7 +348,6 @@ public class MainActivity extends CastEnabledActivity { SharedPreferences prefs = getSharedPreferences(PREF_NAME, MODE_PRIVATE); if (prefs.getBoolean(PREF_IS_FIRST_LAUNCH, true)) { FeedUpdateManager.getInstance().restartUpdateAlarm(this, true); - UserPreferences.setBottomNavigationEnabled(true); SharedPreferences.Editor edit = prefs.edit(); edit.putBoolean(PREF_IS_FIRST_LAUNCH, false); diff --git a/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java b/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java index c37de7a9d..3e43bbce8 100644 --- a/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java +++ b/storage/preferences/src/main/java/de/danoeh/antennapod/storage/preferences/UserPreferences.java @@ -757,7 +757,7 @@ public abstract class UserPreferences { } public static boolean isBottomNavigationEnabled() { - return prefs.getBoolean(PREF_BOTTOM_NAVIGATION, false); + return prefs.getBoolean(PREF_BOTTOM_NAVIGATION, true); } public static void setBottomNavigationEnabled(boolean enabled) {