diff options
Diffstat (limited to 'app')
79 files changed, 725 insertions, 511 deletions
diff --git a/app/build.gradle b/app/build.gradle index 181ad3bfb..f07766ff1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -98,7 +98,14 @@ android { } lintOptions { - abortOnError false + disable 'ObsoleteLintCustomCheck', 'CheckResult', 'UnusedAttribute', 'BatteryLife', 'InflateParams', + 'GradleDependency', 'RestrictedApi', 'TrustAllX509TrustManager', 'ExportedReceiver', 'AllowBackup', + 'StaticFieldLeak', 'UseCompoundDrawables', 'NestedWeights', 'Overdraw', 'UselessParent', 'TextFields', + 'AlwaysShowAction', 'Autofill', 'ClickableViewAccessibility', 'ContentDescription', + 'KeyboardInaccessibleWidget', 'LabelFor', 'SetTextI18n', 'HardcodedText', 'RelativeOverlap', + 'RtlCompat', 'RtlHardcoded', 'MissingMediaBrowserServiceIntentFilter' + warningsAsErrors true + abortOnError true } compileOptions { @@ -182,6 +189,7 @@ dependencies { androidTestImplementation "androidx.test.espresso:espresso-intents:$espressoVersion" androidTestImplementation "androidx.test:runner:$runnerVersion" androidTestImplementation "androidx.test:rules:$rulesVersion" + androidTestImplementation 'androidx.test.ext:junit:1.1.1' } if (project.hasProperty("antennaPodPlayPublisherCredentials")) { diff --git a/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java index 41c8365fb..3c8c5d7f0 100644 --- a/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/EspressoTestUtils.java @@ -5,7 +5,7 @@ import android.content.Intent; import androidx.annotation.IdRes; import androidx.annotation.StringRes; import androidx.preference.PreferenceManager; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.espresso.PerformException; import androidx.test.espresso.UiController; import androidx.test.espresso.ViewAction; @@ -116,38 +116,39 @@ public class EspressoTestUtils { * Clear all app databases */ public static void clearPreferences() { - File root = InstrumentationRegistry.getTargetContext().getFilesDir().getParentFile(); + File root = InstrumentationRegistry.getInstrumentation().getTargetContext().getFilesDir().getParentFile(); String[] sharedPreferencesFileNames = new File(root, "shared_prefs").list(); for (String fileName : sharedPreferencesFileNames) { System.out.println("Cleared database: " + fileName); - InstrumentationRegistry.getTargetContext().getSharedPreferences( + InstrumentationRegistry.getInstrumentation().getTargetContext().getSharedPreferences( fileName.replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit(); } - InstrumentationRegistry.getTargetContext().getSharedPreferences(MainActivity.PREF_NAME, Context.MODE_PRIVATE) + InstrumentationRegistry.getInstrumentation().getTargetContext() + .getSharedPreferences(MainActivity.PREF_NAME, Context.MODE_PRIVATE) .edit() .putBoolean(MainActivity.PREF_IS_FIRST_LAUNCH, false) .commit(); - PreferenceManager.getDefaultSharedPreferences(InstrumentationRegistry.getTargetContext()) + PreferenceManager.getDefaultSharedPreferences(InstrumentationRegistry.getInstrumentation().getTargetContext()) .edit() .putString(UserPreferences.PREF_UPDATE_INTERVAL, "0") .commit(); - RatingDialog.init(InstrumentationRegistry.getTargetContext()); + RatingDialog.init(InstrumentationRegistry.getInstrumentation().getTargetContext()); RatingDialog.saveRated(); } public static void setLastNavFragment(String tag) { - InstrumentationRegistry.getTargetContext().getSharedPreferences( - NavDrawerFragment.PREF_NAME, Context.MODE_PRIVATE) + InstrumentationRegistry.getInstrumentation().getTargetContext() + .getSharedPreferences(NavDrawerFragment.PREF_NAME, Context.MODE_PRIVATE) .edit() .putString(NavDrawerFragment.PREF_LAST_FRAGMENT_TAG, tag) .commit(); } public static void clearDatabase() { - PodDBAdapter.init(InstrumentationRegistry.getTargetContext()); + PodDBAdapter.init(InstrumentationRegistry.getInstrumentation().getTargetContext()); PodDBAdapter.deleteDatabase(); PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); @@ -172,7 +173,7 @@ public class EspressoTestUtils { } public static void tryKillPlaybackService() { - Context context = InstrumentationRegistry.getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); context.stopService(new Intent(context, PlaybackService.class)); try { // Android has no reliable way to stop a service instantly. @@ -183,11 +184,11 @@ public class EspressoTestUtils { } catch (ConditionTimeoutException e) { e.printStackTrace(); } - androidx.test.platform.app.InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } public static void tryKillDownloadService() { - Context context = InstrumentationRegistry.getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); context.stopService(new Intent(context, DownloadService.class)); try { // Android has no reliable way to stop a service instantly. @@ -198,7 +199,7 @@ public class EspressoTestUtils { } catch (ConditionTimeoutException e) { e.printStackTrace(); } - androidx.test.platform.app.InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); } public static Matcher<View> actionBarOverflow() { diff --git a/app/src/androidTest/java/de/test/antennapod/dialogs/ShareDialogTest.java b/app/src/androidTest/java/de/test/antennapod/dialogs/ShareDialogTest.java new file mode 100644 index 000000000..8c628efd5 --- /dev/null +++ b/app/src/androidTest/java/de/test/antennapod/dialogs/ShareDialogTest.java @@ -0,0 +1,92 @@ +package de.test.antennapod.dialogs; + +import android.content.Context; +import android.content.Intent; +import android.view.View; + +import org.hamcrest.Matcher; +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.List; + +import androidx.test.espresso.intent.rule.IntentsTestRule; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.MainActivity; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.fragment.EpisodesFragment; +import de.test.antennapod.EspressoTestUtils; +import de.test.antennapod.ui.UITestUtils; + +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.action.ViewActions.scrollTo; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +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.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; + +/** + * User interface tests for share dialog. + */ +@RunWith(AndroidJUnit4.class) +public class ShareDialogTest { + + @Rule + public IntentsTestRule<MainActivity> activityRule = new IntentsTestRule<>(MainActivity.class, false, false); + + private UITestUtils uiTestUtils; + protected Context context; + + @Before + public void setUp() throws Exception { + context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + EspressoTestUtils.clearPreferences(); + EspressoTestUtils.clearDatabase(); + EspressoTestUtils.setLastNavFragment(EpisodesFragment.TAG); + uiTestUtils = new UITestUtils(context); + uiTestUtils.setup(); + uiTestUtils.addLocalFeedData(true); + + activityRule.launchActivity(new Intent()); + + openNavDrawer(); + onDrawerItem(withText(R.string.episodes_label)).perform(click()); + onView(isRoot()).perform(waitForView(withText(R.string.all_episodes_short_label), 1000)); + onView(withText(R.string.all_episodes_short_label)).perform(click()); + + Matcher<View> allEpisodesMatcher; + final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(0, 10); + allEpisodesMatcher = Matchers.allOf(withId(android.R.id.list), isDisplayed(), hasMinimumChildCount(2)); + onView(isRoot()).perform(waitForView(allEpisodesMatcher, 1000)); + onView(allEpisodesMatcher).perform(actionOnItemAtPosition(0, click())); + onView(first(EspressoTestUtils.actionBarOverflow())).perform(click()); + } + + @Test + public void testShareDialogDisplayed() throws InterruptedException { + onView(withText(R.string.share_label_with_ellipses)).perform(click()); + onView(allOf(isDisplayed(), withText(R.string.share_label))); + } + + @Test + public void testShareDialogCancelButton() { + onView(withText(R.string.share_label_with_ellipses)).perform(scrollTo()).perform(click()); + onView(withText(R.string.cancel_label)).check(matches(isDisplayed())).perform(scrollTo()).perform(click()); + } + +} diff --git a/app/src/androidTest/java/de/test/antennapod/entities/ExternalMediaTest.java b/app/src/androidTest/java/de/test/antennapod/entities/ExternalMediaTest.java index b3c79367f..6da4e60a1 100644 --- a/app/src/androidTest/java/de/test/antennapod/entities/ExternalMediaTest.java +++ b/app/src/androidTest/java/de/test/antennapod/entities/ExternalMediaTest.java @@ -4,7 +4,7 @@ import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.preference.PreferenceManager; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.filters.LargeTest; import androidx.test.filters.SmallTest; import de.danoeh.antennapod.core.feed.MediaType; @@ -36,7 +36,7 @@ public class ExternalMediaTest { } private SharedPreferences getDefaultSharedPrefs() { - return PreferenceManager.getDefaultSharedPreferences(InstrumentationRegistry.getTargetContext()); + return PreferenceManager.getDefaultSharedPreferences(InstrumentationRegistry.getInstrumentation().getTargetContext()); } @Test diff --git a/app/src/androidTest/java/de/test/antennapod/feed/FeedFilterTest.java b/app/src/androidTest/java/de/test/antennapod/feed/FeedFilterTest.java index 4b81a4f2b..fc2943205 100644 --- a/app/src/androidTest/java/de/test/antennapod/feed/FeedFilterTest.java +++ b/app/src/androidTest/java/de/test/antennapod/feed/FeedFilterTest.java @@ -6,6 +6,7 @@ import de.danoeh.antennapod.core.feed.FeedItem; import org.junit.Test; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @SmallTest @@ -17,8 +18,8 @@ public class FeedFilterTest { FeedItem item = new FeedItem(); item.setTitle("Hello world"); - assertTrue(!filter.excludeOnly()); - assertTrue(!filter.includeOnly()); + assertFalse(filter.excludeOnly()); + assertFalse(filter.includeOnly()); assertEquals("", filter.getExcludeFilter()); assertEquals("", filter.getIncludeFilter()); assertTrue(filter.shouldAutoDownload(item)); @@ -34,12 +35,12 @@ public class FeedFilterTest { FeedItem item2 = new FeedItem(); item2.setTitle("Don't include me"); - assertTrue(!filter.excludeOnly()); + assertFalse(filter.excludeOnly()); assertTrue(filter.includeOnly()); assertEquals("", filter.getExcludeFilter()); assertEquals(includeFilter, filter.getIncludeFilter()); assertTrue(filter.shouldAutoDownload(item)); - assertTrue(!filter.shouldAutoDownload(item2)); + assertFalse(filter.shouldAutoDownload(item2)); } @Test @@ -53,10 +54,10 @@ public class FeedFilterTest { item2.setTitle("Item2"); assertTrue(filter.excludeOnly()); - assertTrue(!filter.includeOnly()); + assertFalse(filter.includeOnly()); assertEquals(excludeFilter, filter.getExcludeFilter()); assertEquals("", filter.getIncludeFilter()); - assertTrue(!filter.shouldAutoDownload(item)); + assertFalse(filter.shouldAutoDownload(item)); assertTrue(filter.shouldAutoDownload(item2)); } @@ -73,12 +74,12 @@ public class FeedFilterTest { FeedItem item3 = new FeedItem(); item3.setTitle("One two words"); - assertTrue(!filter.excludeOnly()); + assertFalse(filter.excludeOnly()); assertTrue(filter.includeOnly()); assertEquals("", filter.getExcludeFilter()); assertEquals(includeFilter, filter.getIncludeFilter()); assertTrue(filter.shouldAutoDownload(item)); - assertTrue(!filter.shouldAutoDownload(item2)); + assertFalse(filter.shouldAutoDownload(item2)); assertTrue(filter.shouldAutoDownload(item3)); } @@ -96,12 +97,12 @@ public class FeedFilterTest { item3.setTitle("One two words"); assertTrue(filter.excludeOnly()); - assertTrue(!filter.includeOnly()); + assertFalse(filter.includeOnly()); assertEquals(excludeFilter, filter.getExcludeFilter()); assertEquals("", filter.getIncludeFilter()); - assertTrue(!filter.shouldAutoDownload(item)); + assertFalse(filter.shouldAutoDownload(item)); assertTrue(filter.shouldAutoDownload(item2)); - assertTrue(!filter.shouldAutoDownload(item3)); + assertFalse(filter.shouldAutoDownload(item3)); } @Test @@ -122,8 +123,8 @@ public class FeedFilterTest { assertTrue(filter.hasExcludeFilter()); assertTrue(filter.hasIncludeFilter()); assertTrue(filter.shouldAutoDownload(download)); - assertTrue(!filter.shouldAutoDownload(doNotDownload)); - assertTrue(!filter.shouldAutoDownload(doNotDownload2)); + assertFalse(filter.shouldAutoDownload(doNotDownload)); + assertFalse(filter.shouldAutoDownload(doNotDownload2)); } } diff --git a/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java b/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java index e7e8c5b09..9b3422a5d 100644 --- a/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java +++ b/app/src/androidTest/java/de/test/antennapod/gpodnet/GPodnetServiceTest.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import de.danoeh.antennapod.core.service.download.AntennapodHttpClient; import de.danoeh.antennapod.core.sync.gpoddernet.GpodnetService; import de.danoeh.antennapod.core.sync.gpoddernet.GpodnetServiceException; diff --git a/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java b/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java index b75044d73..fd395f7c1 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/download/DownloadServiceTest.java @@ -5,8 +5,8 @@ import android.content.Intent; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.util.Consumer; -import androidx.test.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; import de.test.antennapod.EspressoTestUtils; import org.awaitility.Awaitility; @@ -81,7 +81,7 @@ public class DownloadServiceTest { @After public void tearDown() throws Exception { DownloadService.setDownloaderFactory(origFactory); - Context context = InstrumentationRegistry.getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); DownloadRequester.getInstance().cancelAllDownloads(context); context.stopService(new Intent(context, DownloadService.class)); EspressoTestUtils.tryKillDownloadService(); @@ -106,9 +106,7 @@ public class DownloadServiceTest { // OPEN: Ideally, I'd like the download time long enough so that multiple in-progress DownloadEvents // are generated (to simulate typical download), but it'll make download time quite long (1-2 seconds) // to do so - DownloadService.setDownloaderFactory(new StubDownloaderFactory(50, downloadStatus -> { - downloadStatus.setSuccessful(); - })); + DownloadService.setDownloaderFactory(new StubDownloaderFactory(50, DownloadStatus::setSuccessful)); UserPreferences.setEnqueueDownloadedEpisodes(enqueueDownloaded); withFeedItemEventListener(feedItemEventListener -> { @@ -117,7 +115,8 @@ public class DownloadServiceTest { assertFalse("The media in test should not yet been downloaded", DBReader.getFeedMedia(testMedia11.getId()).isDownloaded()); - DownloadRequester.getInstance().downloadMedia(false, InstrumentationRegistry.getTargetContext(), true, testMedia11.getItem()); + DownloadRequester.getInstance().downloadMedia(false, InstrumentationRegistry + .getInstrumentation().getTargetContext(), true, testMedia11.getItem()); Awaitility.await() .atMost(5000, TimeUnit.MILLISECONDS) .until(() -> feedItemEventListener.getEvents().size() >= numEventsExpected); @@ -144,11 +143,10 @@ public class DownloadServiceTest { } private void doTestCancelDownload_UndoEnqueue(boolean itemAlreadyInQueue) throws Exception { - Context context = InstrumentationRegistry.getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); // let download take longer to ensure the test can cancel the download in time - DownloadService.setDownloaderFactory(new StubDownloaderFactory(30000, downloadStatus -> { - downloadStatus.setSuccessful(); - })); + DownloadService.setDownloaderFactory( + new StubDownloaderFactory(30000, DownloadStatus::setSuccessful)); UserPreferences.setEnqueueDownloadedEpisodes(true); UserPreferences.setEnableAutodownload(false); diff --git a/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java b/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java index 301ceea6c..4ef6594e3 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/download/HttpDownloaderTest.java @@ -1,6 +1,6 @@ package de.test.antennapod.service.download; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.filters.LargeTest; import android.util.Log; @@ -51,7 +51,7 @@ public class HttpDownloaderTest { @Before public void setUp() throws Exception { UserPreferences.init(InstrumentationRegistry.getInstrumentation().getTargetContext()); - destDir = InstrumentationRegistry.getTargetContext().getExternalFilesDir(DOWNLOAD_DIR); + destDir = InstrumentationRegistry.getInstrumentation().getTargetContext().getExternalFilesDir(DOWNLOAD_DIR); assertNotNull(destDir); assertTrue(destDir.exists()); httpServer = new HTTPBin(); @@ -82,7 +82,7 @@ public class HttpDownloaderTest { downloader.call(); DownloadStatus status = downloader.getResult(); assertNotNull(status); - assertTrue(status.isSuccessful() == expectedResult); + assertEquals(expectedResult, status.isSuccessful()); assertTrue(status.isDone()); // the file should not exist if the download has failed and deleteExisting was true assertTrue(!deleteExisting || new File(feedFile.getFile_url()).exists() == expectedResult); diff --git a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java index cfce069ec..c9cbf1bb2 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceMediaPlayerTest.java @@ -38,6 +38,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -173,7 +174,7 @@ public class PlaybackServiceMediaPlayerTest { throw assertionError; assertTrue(res); - assertTrue(psmp.getPSMPInfo().playerStatus == PlayerStatus.INITIALIZED); + assertSame(PlayerStatus.INITIALIZED, psmp.getPSMPInfo().playerStatus); assertFalse(psmp.isStartWhenPrepared()); callback.cancel(); psmp.shutdown(); @@ -214,7 +215,7 @@ public class PlaybackServiceMediaPlayerTest { throw assertionError; assertTrue(res); - assertTrue(psmp.getPSMPInfo().playerStatus == PlayerStatus.INITIALIZED); + assertSame(PlayerStatus.INITIALIZED, psmp.getPSMPInfo().playerStatus); assertTrue(psmp.isStartWhenPrepared()); callback.cancel(); psmp.shutdown(); @@ -256,7 +257,7 @@ public class PlaybackServiceMediaPlayerTest { if (assertionError != null) throw assertionError; assertTrue(res); - assertTrue(psmp.getPSMPInfo().playerStatus == PlayerStatus.PREPARED); + assertSame(PlayerStatus.PREPARED, psmp.getPSMPInfo().playerStatus); callback.cancel(); psmp.shutdown(); @@ -301,7 +302,7 @@ public class PlaybackServiceMediaPlayerTest { if (assertionError != null) throw assertionError; assertTrue(res); - assertTrue(psmp.getPSMPInfo().playerStatus == PlayerStatus.PLAYING); + assertSame(PlayerStatus.PLAYING, psmp.getPSMPInfo().playerStatus); callback.cancel(); psmp.shutdown(); } @@ -339,7 +340,7 @@ public class PlaybackServiceMediaPlayerTest { if (assertionError != null) throw assertionError; assertTrue(res); - assertTrue(psmp.getPSMPInfo().playerStatus == PlayerStatus.INITIALIZED); + assertSame(PlayerStatus.INITIALIZED, psmp.getPSMPInfo().playerStatus); assertFalse(psmp.isStartWhenPrepared()); callback.cancel(); psmp.shutdown(); @@ -378,7 +379,7 @@ public class PlaybackServiceMediaPlayerTest { if (assertionError != null) throw assertionError; assertTrue(res); - assertTrue(psmp.getPSMPInfo().playerStatus == PlayerStatus.INITIALIZED); + assertSame(PlayerStatus.INITIALIZED, psmp.getPSMPInfo().playerStatus); assertTrue(psmp.isStartWhenPrepared()); callback.cancel(); psmp.shutdown(); @@ -420,7 +421,7 @@ public class PlaybackServiceMediaPlayerTest { if (assertionError != null) throw assertionError; assertTrue(res); - assertTrue(psmp.getPSMPInfo().playerStatus == PlayerStatus.PREPARED); + assertSame(PlayerStatus.PREPARED, psmp.getPSMPInfo().playerStatus); callback.cancel(); psmp.shutdown(); } @@ -465,7 +466,7 @@ public class PlaybackServiceMediaPlayerTest { if (assertionError != null) throw assertionError; assertTrue(res); - assertTrue(psmp.getPSMPInfo().playerStatus == PlayerStatus.PLAYING); + assertSame(PlayerStatus.PLAYING, psmp.getPSMPInfo().playerStatus); callback.cancel(); psmp.shutdown(); } diff --git a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java index fce78ea4f..3e3b7daf4 100644 --- a/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/service/playback/PlaybackServiceTaskManagerTest.java @@ -1,7 +1,7 @@ package de.test.antennapod.service.playback; import android.content.Context; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.annotation.UiThreadTest; import androidx.test.filters.LargeTest; @@ -29,6 +29,7 @@ import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.playback.Playable; import static de.test.antennapod.util.event.FeedItemEventListener.withFeedItemEventListener; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -92,9 +93,9 @@ public class PlaybackServiceTaskManagerTest { PlaybackServiceTaskManager pstm = new PlaybackServiceTaskManager(c, defaultPSTM); List<FeedItem> testQueue = pstm.getQueue(); assertNotNull(testQueue); - assertTrue(queue.size() == testQueue.size()); + assertEquals(testQueue.size(), queue.size()); for (int i = 0; i < queue.size(); i++) { - assertTrue(queue.get(i).getId() == testQueue.get(i).getId()); + assertEquals(testQueue.get(i).getId(), queue.get(i).getId()); } pstm.shutdown(); } @@ -114,9 +115,9 @@ public class PlaybackServiceTaskManagerTest { assertNotNull(queue); testQueue = pstm.getQueue(); assertNotNull(testQueue); - assertTrue(queue.size() == testQueue.size()); + assertEquals(testQueue.size(), queue.size()); for (int i = 0; i < queue.size(); i++) { - assertTrue(queue.get(i).getId() == testQueue.get(i).getId()); + assertEquals(testQueue.get(i).getId(), queue.get(i).getId()); } pstm.shutdown(); } diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java b/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java index 88d78fd14..0e38979b2 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBCleanupTests.java @@ -10,7 +10,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.filters.LargeTest; import androidx.test.filters.SmallTest; import de.danoeh.antennapod.core.feed.Feed; @@ -64,7 +64,7 @@ public class DBCleanupTests { @Before public void setUp() throws Exception { - context = InstrumentationRegistry.getTargetContext(); + context = InstrumentationRegistry.getInstrumentation().getTargetContext(); destFolder = new File(context.getCacheDir(), "DDCleanupTests"); destFolder.mkdir(); cleanupDestFolder(destFolder); diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java index 24cc80061..b76e0d1f3 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBNullCleanupAlgorithmTest.java @@ -10,7 +10,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.filters.LargeTest; import androidx.test.filters.SmallTest; import de.danoeh.antennapod.core.feed.Feed; @@ -55,7 +55,7 @@ public class DBNullCleanupAlgorithmTest { @Before public void setUp() throws Exception { - context = InstrumentationRegistry.getTargetContext(); + context = InstrumentationRegistry.getInstrumentation().getTargetContext(); destFolder = context.getExternalCacheDir(); cleanupDestFolder(destFolder); assertNotNull(destFolder); diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java index b2458bac6..409100e26 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java @@ -5,7 +5,7 @@ import java.util.Date; import java.util.List; import java.util.Random; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.filters.SmallTest; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; @@ -38,7 +38,7 @@ public class DBReaderTest { @Before public void setUp() throws Exception { // create new database - PodDBAdapter.init(InstrumentationRegistry.getTargetContext()); + PodDBAdapter.init(InstrumentationRegistry.getInstrumentation().getTargetContext()); PodDBAdapter.deleteDatabase(); PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); @@ -52,7 +52,7 @@ public class DBReaderTest { assertNotNull(savedFeeds); assertEquals(feeds.size(), savedFeeds.size()); for (int i = 0; i < feeds.size(); i++) { - assertTrue(savedFeeds.get(i).getId() == feeds.get(i).getId()); + assertEquals(feeds.get(i).getId(), savedFeeds.get(i).getId()); } } @@ -91,7 +91,7 @@ public class DBReaderTest { List<Feed> feeds = saveFeedlist(10, 0, false); List<String> urls = DBReader.getFeedListDownloadUrls(); assertNotNull(urls); - assertTrue(urls.size() == feeds.size()); + assertEquals(feeds.size(), urls.size()); for (int i = 0; i < urls.size(); i++) { assertEquals(urls.get(i), feeds.get(i).getDownload_url()); } @@ -115,8 +115,8 @@ public class DBReaderTest { for (int j = 0; j < numItems; j++) { FeedItem item = feeds.get(i).getItems().get(j); assertNotNull(item.getFeed()); - assertTrue(item.getFeed().getId() == feeds.get(i).getId()); - assertTrue(item.getFeedId() == item.getFeed().getId()); + assertEquals(feeds.get(i).getId(), item.getFeed().getId()); + assertEquals(item.getFeed().getId(), item.getFeedId()); } } } @@ -130,9 +130,9 @@ public class DBReaderTest { feed.setItems(null); List<FeedItem> savedItems = DBReader.getFeedItemList(feed); assertNotNull(savedItems); - assertTrue(savedItems.size() == items.size()); + assertEquals(items.size(), savedItems.size()); for (int i = 0; i < savedItems.size(); i++) { - assertTrue(items.get(i).getId() == savedItems.get(i).getId()); + assertEquals(savedItems.get(i).getId(), items.get(i).getId()); } } @@ -167,10 +167,10 @@ public class DBReaderTest { List<FeedItem> queue = saveQueue(numItems); LongList ids = DBReader.getQueueIDList(); assertNotNull(ids); - assertTrue(queue.size() == ids.size()); + assertEquals(ids.size(), queue.size()); for (int i = 0; i < queue.size(); i++) { assertTrue(ids.get(i) != 0); - assertTrue(queue.get(i).getId() == ids.get(i)); + assertEquals(ids.get(i), queue.get(i).getId()); } } @@ -180,10 +180,10 @@ public class DBReaderTest { List<FeedItem> queue = saveQueue(numItems); List<FeedItem> savedQueue = DBReader.getQueue(); assertNotNull(savedQueue); - assertTrue(queue.size() == savedQueue.size()); + assertEquals(savedQueue.size(), queue.size()); for (int i = 0; i < queue.size(); i++) { assertTrue(savedQueue.get(i).getId() != 0); - assertTrue(queue.get(i).getId() == savedQueue.get(i).getId()); + assertEquals(savedQueue.get(i).getId(), queue.get(i).getId()); } } @@ -221,7 +221,7 @@ public class DBReaderTest { List<FeedItem> downloaded = saveDownloadedItems(numItems); List<FeedItem> downloaded_saved = DBReader.getDownloadedItems(); assertNotNull(downloaded_saved); - assertTrue(downloaded_saved.size() == downloaded.size()); + assertEquals(downloaded.size(), downloaded_saved.size()); for (FeedItem item : downloaded_saved) { assertNotNull(item.getMedia()); assertTrue(item.getMedia().isDownloaded()); @@ -264,7 +264,7 @@ public class DBReaderTest { } List<FeedItem> newItemsSaved = DBReader.getNewItemsList(0, Integer.MAX_VALUE); assertNotNull(newItemsSaved); - assertTrue(newItems.size() == newItemsSaved.size()); + assertEquals(newItemsSaved.size(), newItems.size()); for (FeedItem feedItem : newItemsSaved) { long savedId = feedItem.getId(); boolean found = false; diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java index 090cd2213..595a9794f 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java @@ -2,7 +2,7 @@ package de.test.antennapod.storage; import android.content.Context; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.junit.After; @@ -29,6 +29,8 @@ import static java.util.Collections.singletonList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; /** @@ -45,7 +47,7 @@ public class DBTasksTest { @Before public void setUp() throws Exception { - context = InstrumentationRegistry.getTargetContext(); + context = InstrumentationRegistry.getInstrumentation().getTargetContext(); // create new database PodDBAdapter.init(context); @@ -68,7 +70,7 @@ public class DBTasksTest { } Feed newFeed = DBTasks.updateFeed(context, feed)[0]; - assertTrue(newFeed == feed); + assertSame(feed, newFeed); assertTrue(feed.getId() != 0); for (FeedItem item : feed.getItems()) { assertFalse(item.isPlayed()); @@ -123,13 +125,13 @@ public class DBTasksTest { } final Feed newFeed = DBTasks.updateFeed(context, feed)[0]; - assertTrue(feed != newFeed); + assertNotSame(newFeed, feed); updatedFeedTest(newFeed, feedID, itemIDs, NUM_ITEMS_OLD, NUM_ITEMS_NEW); final Feed feedFromDB = DBReader.getFeed(newFeed.getId()); assertNotNull(feedFromDB); - assertTrue(feedFromDB.getId() == newFeed.getId()); + assertEquals(newFeed.getId(), feedFromDB.getId()); updatedFeedTest(feedFromDB, feedID, itemIDs, NUM_ITEMS_OLD, NUM_ITEMS_NEW); } @@ -155,7 +157,7 @@ public class DBTasksTest { feed.setItems(list); final Feed newFeed = DBTasks.updateFeed(context, feed)[0]; - assertTrue(feed != newFeed); + assertNotSame(newFeed, feed); final Feed feedFromDB = DBReader.getFeed(newFeed.getId()); final FeedItem feedItemFromDB = feedFromDB.getItems().get(0); @@ -163,21 +165,21 @@ public class DBTasksTest { } private void updatedFeedTest(final Feed newFeed, long feedID, List<Long> itemIDs, final int NUM_ITEMS_OLD, final int NUM_ITEMS_NEW) { - assertTrue(newFeed.getId() == feedID); - assertTrue(newFeed.getItems().size() == NUM_ITEMS_NEW + NUM_ITEMS_OLD); + assertEquals(feedID, newFeed.getId()); + assertEquals(NUM_ITEMS_NEW + NUM_ITEMS_OLD, newFeed.getItems().size()); Collections.reverse(newFeed.getItems()); Date lastDate = new Date(0); for (int i = 0; i < NUM_ITEMS_OLD; i++) { FeedItem item = newFeed.getItems().get(i); - assertTrue(item.getFeed() == newFeed); - assertTrue(item.getId() == itemIDs.get(i)); + assertSame(newFeed, item.getFeed()); + assertEquals((long) itemIDs.get(i), item.getId()); assertTrue(item.isPlayed()); assertTrue(item.getPubDate().getTime() >= lastDate.getTime()); lastDate = item.getPubDate(); } for (int i = NUM_ITEMS_OLD; i < NUM_ITEMS_NEW + NUM_ITEMS_OLD; i++) { FeedItem item = newFeed.getItems().get(i); - assertTrue(item.getFeed() == newFeed); + assertSame(newFeed, item.getFeed()); assertTrue(item.getId() != 0); assertFalse(item.isPlayed()); assertTrue(item.getPubDate().getTime() >= lastDate.getTime()); diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java b/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java index d82e366da..9fbc5b956 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java @@ -7,7 +7,7 @@ import android.preference.PreferenceManager; import android.util.Log; import androidx.core.util.Consumer; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.filters.MediumTest; import org.awaitility.Awaitility; @@ -35,9 +35,9 @@ import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.FeedItemUtil; -import static androidx.test.InstrumentationRegistry.getInstrumentation; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -56,7 +56,7 @@ public class DBWriterTest { public void tearDown() throws Exception { assertTrue(PodDBAdapter.deleteDatabase()); - final Context context = InstrumentationRegistry.getTargetContext(); + final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); File testDir = context.getExternalFilesDir(TEST_FOLDER); assertNotNull(testDir); for (File f : testDir.listFiles()) { @@ -67,13 +67,13 @@ public class DBWriterTest { @Before public void setUp() throws Exception { // create new database - PodDBAdapter.init(InstrumentationRegistry.getTargetContext()); + PodDBAdapter.init(InstrumentationRegistry.getInstrumentation().getTargetContext()); PodDBAdapter.deleteDatabase(); PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.close(); - Context context = InstrumentationRegistry.getTargetContext(); + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); SharedPreferences.Editor prefEdit = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()).edit(); prefEdit.putBoolean(UserPreferences.PREF_DELETE_REMOVES_FROM_QUEUE, true).commit(); @@ -116,7 +116,8 @@ public class DBWriterTest { @Test public void testDeleteFeedMediaOfItemFileExists() throws IOException, ExecutionException, InterruptedException, TimeoutException { - File dest = new File(getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER), "testFile"); + File dest = new File(InstrumentationRegistry + .getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER), "testFile"); assertTrue(dest.createNewFile()); @@ -137,7 +138,7 @@ public class DBWriterTest { assertTrue(media.getId() != 0); assertTrue(item.getId() != 0); - DBWriter.deleteFeedMediaOfItem(getInstrumentation().getTargetContext(), media.getId()) + DBWriter.deleteFeedMediaOfItem(InstrumentationRegistry.getInstrumentation().getTargetContext(), media.getId()) .get(TIMEOUT, TimeUnit.SECONDS); media = DBReader.getFeedMedia(media.getId()); assertNotNull(media); @@ -151,7 +152,8 @@ public class DBWriterTest { throws IOException, ExecutionException, InterruptedException, TimeoutException { assertTrue(UserPreferences.shouldDeleteRemoveFromQueue()); - File dest = new File(getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER), "testFile"); + File dest = new File(InstrumentationRegistry + .getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER), "testFile"); assertTrue(dest.createNewFile()); @@ -177,7 +179,7 @@ public class DBWriterTest { queue = DBReader.getQueue(); assertTrue(queue.size() != 0); - DBWriter.deleteFeedMediaOfItem(getInstrumentation().getTargetContext(), media.getId()); + DBWriter.deleteFeedMediaOfItem(InstrumentationRegistry.getInstrumentation().getTargetContext(), media.getId()); Awaitility.await().until(() -> !dest.exists()); media = DBReader.getFeedMedia(media.getId()); assertNotNull(media); @@ -185,12 +187,12 @@ public class DBWriterTest { assertFalse(media.isDownloaded()); assertNull(media.getFile_url()); queue = DBReader.getQueue(); - assertTrue(queue.size() == 0); + assertEquals(0, queue.size()); } @Test public void testDeleteFeed() throws ExecutionException, InterruptedException, IOException, TimeoutException { - File destFolder = getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); + File destFolder = InstrumentationRegistry.getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); assertNotNull(destFolder); Feed feed = new Feed("url", null, "title"); @@ -221,7 +223,8 @@ public class DBWriterTest { assertTrue(item.getMedia().getId() != 0); } - DBWriter.deleteFeed(getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); + DBWriter.deleteFeed(InstrumentationRegistry + .getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); // check if files still exist for (File f : itemFiles) { @@ -231,14 +234,14 @@ public class DBWriterTest { adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); for (FeedItem item : feed.getItems()) { c = adapter.getFeedItemCursor(String.valueOf(item.getId())); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); c = adapter.getSingleFeedMediaCursor(item.getMedia().getId()); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); } adapter.close(); @@ -246,7 +249,7 @@ public class DBWriterTest { @Test public void testDeleteFeedNoItems() throws IOException, ExecutionException, InterruptedException, TimeoutException { - File destFolder = getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); + File destFolder = InstrumentationRegistry.getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); assertNotNull(destFolder); Feed feed = new Feed("url", null, "title"); @@ -260,19 +263,20 @@ public class DBWriterTest { assertTrue(feed.getId() != 0); - DBWriter.deleteFeed(getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); + DBWriter.deleteFeed(InstrumentationRegistry + .getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); adapter.close(); } @Test public void testDeleteFeedNoFeedMedia() throws IOException, ExecutionException, InterruptedException, TimeoutException { - File destFolder = getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); + File destFolder = InstrumentationRegistry.getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); assertNotNull(destFolder); Feed feed = new Feed("url", null, "title"); @@ -297,17 +301,18 @@ public class DBWriterTest { assertTrue(item.getId() != 0); } - DBWriter.deleteFeed(getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); + DBWriter.deleteFeed(InstrumentationRegistry + .getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); for (FeedItem item : feed.getItems()) { c = adapter.getFeedItemCursor(String.valueOf(item.getId())); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); } adapter.close(); @@ -315,7 +320,7 @@ public class DBWriterTest { @Test public void testDeleteFeedWithQueueItems() throws ExecutionException, InterruptedException, TimeoutException { - File destFolder = getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); + File destFolder = InstrumentationRegistry.getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); assertNotNull(destFolder); Feed feed = new Feed("url", null, "title"); @@ -344,39 +349,39 @@ public class DBWriterTest { } - List<FeedItem> queue = new ArrayList<>(); - queue.addAll(feed.getItems()); + List<FeedItem> queue = new ArrayList<>(feed.getItems()); adapter.open(); adapter.setQueue(queue); Cursor queueCursor = adapter.getQueueIDCursor(); - assertTrue(queueCursor.getCount() == queue.size()); + assertEquals(queue.size(), queueCursor.getCount()); queueCursor.close(); adapter.close(); - DBWriter.deleteFeed(getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); + DBWriter.deleteFeed(InstrumentationRegistry + .getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); for (FeedItem item : feed.getItems()) { c = adapter.getFeedItemCursor(String.valueOf(item.getId())); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); c = adapter.getSingleFeedMediaCursor(item.getMedia().getId()); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); } c = adapter.getQueueCursor(); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); adapter.close(); } @Test public void testDeleteFeedNoDownloadedFiles() throws ExecutionException, InterruptedException, TimeoutException { - File destFolder = getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); + File destFolder = InstrumentationRegistry.getInstrumentation().getTargetContext().getExternalFilesDir(TEST_FOLDER); assertNotNull(destFolder); Feed feed = new Feed("url", null, "title"); @@ -404,19 +409,20 @@ public class DBWriterTest { assertTrue(item.getMedia().getId() != 0); } - DBWriter.deleteFeed(getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); + DBWriter.deleteFeed(InstrumentationRegistry + .getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); for (FeedItem item : feed.getItems()) { c = adapter.getFeedItemCursor(String.valueOf(item.getId())); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); c = adapter.getSingleFeedMediaCursor(item.getMedia().getId()); - assertTrue(c.getCount() == 0); + assertEquals(0, c.getCount()); c.close(); } adapter.close(); @@ -465,11 +471,11 @@ public class DBWriterTest { assertNotNull(media); assertNotNull(media.getPlaybackCompletionDate()); - assertFalse(OLD_DATE == media.getPlaybackCompletionDate().getTime()); + assertNotEquals(media.getPlaybackCompletionDate().getTime(), OLD_DATE); } private Feed queueTestSetupMultipleItems(final int numItems) throws InterruptedException, ExecutionException, TimeoutException { - final Context context = getInstrumentation().getTargetContext(); + final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); UserPreferences.setEnqueueLocation(UserPreferences.EnqueueLocation.BACK); Feed feed = new Feed("url", null, "title"); feed.setItems(new ArrayList<>()); @@ -498,7 +504,7 @@ public class DBWriterTest { @Test public void testAddQueueItemSingleItem() throws InterruptedException, ExecutionException, TimeoutException { - final Context context = getInstrumentation().getTargetContext(); + final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); Feed feed = new Feed("url", null, "title"); feed.setItems(new ArrayList<>()); FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); @@ -516,14 +522,14 @@ public class DBWriterTest { adapter.open(); Cursor cursor = adapter.getQueueIDCursor(); assertTrue(cursor.moveToFirst()); - assertTrue(cursor.getLong(0) == item.getId()); + assertEquals(item.getId(), cursor.getLong(0)); cursor.close(); adapter.close(); } @Test public void testAddQueueItemSingleItemAlreadyInQueue() throws InterruptedException, ExecutionException, TimeoutException { - final Context context = getInstrumentation().getTargetContext(); + final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); Feed feed = new Feed("url", null, "title"); feed.setItems(new ArrayList<>()); FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); @@ -541,7 +547,7 @@ public class DBWriterTest { adapter.open(); Cursor cursor = adapter.getQueueIDCursor(); assertTrue(cursor.moveToFirst()); - assertTrue(cursor.getLong(0) == item.getId()); + assertEquals(item.getId(), cursor.getLong(0)); cursor.close(); adapter.close(); @@ -550,8 +556,8 @@ public class DBWriterTest { adapter.open(); cursor = adapter.getQueueIDCursor(); assertTrue(cursor.moveToFirst()); - assertTrue(cursor.getLong(0) == item.getId()); - assertTrue(cursor.getCount() == 1); + assertEquals(item.getId(), cursor.getLong(0)); + assertEquals(1, cursor.getCount()); cursor.close(); adapter.close(); } @@ -565,7 +571,7 @@ public class DBWriterTest { adapter.open(); Cursor cursor = adapter.getQueueIDCursor(); assertTrue(cursor.moveToFirst()); - assertTrue(cursor.getCount() == NUM_ITEMS); + assertEquals(NUM_ITEMS, cursor.getCount()); List<Long> expectedIds = FeedItemUtil.getIdList(feed.getItems()); List<Long> actualIds = new ArrayList<>(); for (int i = 0; i < NUM_ITEMS; i++) { @@ -595,7 +601,7 @@ public class DBWriterTest { @Test public void testRemoveQueueItem() throws InterruptedException, ExecutionException, TimeoutException { final int NUM_ITEMS = 10; - final Context context = getInstrumentation().getTargetContext(); + final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); Feed feed = createTestFeed(NUM_ITEMS); for (int removeIndex = 0; removeIndex < NUM_ITEMS; removeIndex++) { @@ -609,7 +615,7 @@ public class DBWriterTest { adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor queue = adapter.getQueueIDCursor(); - assertTrue(queue.getCount() == NUM_ITEMS - 1); + assertEquals(NUM_ITEMS - 1, queue.getCount()); for (int i = 0; i < queue.getCount(); i++) { assertTrue(queue.moveToPosition(i)); final long queueID = queue.getLong(0); @@ -631,7 +637,7 @@ public class DBWriterTest { // final int NUM_ITEMS = 5; final int NUM_IN_QUEUE = NUM_ITEMS - 1; // the last one not in queue for boundary condition - final Context context = getInstrumentation().getTargetContext(); + final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); Feed feed = createTestFeed(NUM_ITEMS); List<FeedItem> itemsToAdd = feed.getItems().subList(0, NUM_IN_QUEUE); @@ -698,11 +704,11 @@ public class DBWriterTest { adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor queue = adapter.getQueueIDCursor(); - assertTrue(queue.getCount() == NUM_ITEMS); + assertEquals(NUM_ITEMS, queue.getCount()); assertTrue(queue.moveToPosition(from)); - assertFalse(queue.getLong(0) == fromID); + assertNotEquals(fromID, queue.getLong(0)); assertTrue(queue.moveToPosition(to)); - assertTrue(queue.getLong(0) == fromID); + assertEquals(fromID, queue.getLong(0)); queue.close(); adapter.close(); diff --git a/app/src/androidTest/java/de/test/antennapod/ui/FeedSettingsTest.java b/app/src/androidTest/java/de/test/antennapod/ui/FeedSettingsTest.java index b49be9a04..8bd4f1be6 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/FeedSettingsTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/FeedSettingsTest.java @@ -3,7 +3,7 @@ package de.test.antennapod.ui; import android.content.Intent; import androidx.test.espresso.intent.rule.IntentsTestRule; import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.feed.Feed; diff --git a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java index 47988d23f..c7520a2e6 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java @@ -2,10 +2,10 @@ package de.test.antennapod.ui; import android.app.Activity; import android.content.Intent; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.espresso.Espresso; import androidx.test.espresso.intent.rule.IntentsTestRule; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import com.robotium.solo.Solo; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; @@ -20,7 +20,6 @@ import org.junit.runner.RunWith; import java.io.IOException; -import static androidx.test.InstrumentationRegistry.getInstrumentation; import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.replaceText; @@ -55,10 +54,10 @@ public class MainActivityTest { mActivityRule.launchActivity(new Intent()); - uiTestUtils = new UITestUtils(InstrumentationRegistry.getTargetContext()); + uiTestUtils = new UITestUtils(InstrumentationRegistry.getInstrumentation().getTargetContext()); uiTestUtils.setup(); - solo = new Solo(getInstrumentation(), mActivityRule.getActivity()); + solo = new Solo(InstrumentationRegistry.getInstrumentation(), mActivityRule.getActivity()); } @After 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 bf4dae882..ade5ea298 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/NavigationDrawerTest.java @@ -1,10 +1,10 @@ package de.test.antennapod.ui; import android.content.Intent; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.espresso.contrib.DrawerActions; import androidx.test.espresso.intent.rule.IntentsTestRule; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.activity.PreferenceActivity; @@ -59,7 +59,7 @@ public class NavigationDrawerTest { @Before public void setUp() throws IOException { - uiTestUtils = new UITestUtils(InstrumentationRegistry.getTargetContext()); + uiTestUtils = new UITestUtils(InstrumentationRegistry.getInstrumentation().getTargetContext()); uiTestUtils.setup(); EspressoTestUtils.clearPreferences(); diff --git a/app/src/androidTest/java/de/test/antennapod/ui/QueueFragmentTest.java b/app/src/androidTest/java/de/test/antennapod/ui/QueueFragmentTest.java index b5c7dd0d1..634904f71 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/QueueFragmentTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/QueueFragmentTest.java @@ -4,7 +4,7 @@ import android.content.Intent; import android.view.View; import androidx.test.espresso.Espresso; import androidx.test.espresso.intent.rule.IntentsTestRule; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.fragment.QueueFragment; diff --git a/app/src/androidTest/java/de/test/antennapod/ui/SpeedChangeTest.java b/app/src/androidTest/java/de/test/antennapod/ui/SpeedChangeTest.java index 6c26078c1..79b8b29a4 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/SpeedChangeTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/SpeedChangeTest.java @@ -5,7 +5,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import androidx.test.rule.ActivityTestRule; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.feed.FeedItem; 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 782bb09d8..488c87052 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/TextOnlyFeedsTest.java @@ -3,7 +3,7 @@ package de.test.antennapod.ui; import android.content.Intent; import androidx.test.espresso.intent.rule.IntentsTestRule; import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.feed.Feed; diff --git a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtilsTest.java b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtilsTest.java index a183b648e..60516454f 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtilsTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtilsTest.java @@ -5,7 +5,7 @@ import java.net.HttpURLConnection; import java.net.URL; import java.util.List; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.filters.LargeTest; import androidx.test.filters.MediumTest; import de.danoeh.antennapod.core.feed.Feed; @@ -29,7 +29,7 @@ public class UITestUtilsTest { @Before public void setUp() throws Exception { - uiTestUtils = new UITestUtils(InstrumentationRegistry.getTargetContext()); + uiTestUtils = new UITestUtils(InstrumentationRegistry.getInstrumentation().getTargetContext()); uiTestUtils.setup(); } diff --git a/app/src/androidTest/java/de/test/antennapod/util/FilenameGeneratorTest.java b/app/src/androidTest/java/de/test/antennapod/util/FilenameGeneratorTest.java index 6f8042d61..93e5bcb74 100644 --- a/app/src/androidTest/java/de/test/antennapod/util/FilenameGeneratorTest.java +++ b/app/src/androidTest/java/de/test/antennapod/util/FilenameGeneratorTest.java @@ -21,32 +21,28 @@ import static org.junit.Assert.assertTrue; @SmallTest public class FilenameGeneratorTest { - private static final String VALID1 = "abc abc"; - private static final String INVALID1 = "ab/c: <abc"; - private static final String INVALID2 = "abc abc "; - public FilenameGeneratorTest() { super(); } @Test public void testGenerateFileName() throws IOException { - String result = FileNameGenerator.generateFileName(VALID1); - assertEquals(result, VALID1); + String result = FileNameGenerator.generateFileName("abc abc"); + assertEquals(result, "abc abc"); createFiles(result); } @Test public void testGenerateFileName1() throws IOException { - String result = FileNameGenerator.generateFileName(INVALID1); - assertEquals(result, VALID1); + String result = FileNameGenerator.generateFileName("ab/c: <abc"); + assertEquals(result, "abc abc"); createFiles(result); } @Test public void testGenerateFileName2() throws IOException { - String result = FileNameGenerator.generateFileName(INVALID2); - assertEquals(result, VALID1); + String result = FileNameGenerator.generateFileName("abc abc "); + assertEquals(result, "abc abc"); createFiles(result); } @@ -63,6 +59,12 @@ public class FilenameGeneratorTest { } @Test + public void testFeedTitleContainsAccents() { + String result = FileNameGenerator.generateFileName("Äà áâãå"); + assertEquals("Aaaaaa", result); + } + + @Test public void testInvalidInput() { String result = FileNameGenerator.generateFileName("???"); assertFalse(TextUtils.isEmpty(result)); @@ -97,14 +99,6 @@ public class FilenameGeneratorTest { assertTrue(testFile.exists()); testFile.delete(); assertTrue(testFile.createNewFile()); - - } - - @After - public void tearDown() { - Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - File f = new File(context.getExternalCacheDir(), VALID1); - f.delete(); } } diff --git a/app/src/androidTest/java/de/test/antennapod/util/playback/TimelineTest.java b/app/src/androidTest/java/de/test/antennapod/util/playback/TimelineTest.java index 59b9ceaca..ed37b7daa 100644 --- a/app/src/androidTest/java/de/test/antennapod/util/playback/TimelineTest.java +++ b/app/src/androidTest/java/de/test/antennapod/util/playback/TimelineTest.java @@ -2,7 +2,7 @@ package de.test.antennapod.util.playback; import android.content.Context; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.filters.SmallTest; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -35,7 +35,7 @@ public class TimelineTest { @Before public void setUp() { - context = InstrumentationRegistry.getTargetContext(); + context = InstrumentationRegistry.getInstrumentation().getTargetContext(); } private Playable newTestPlayable(List<Chapter> chapters, String shownotes, int duration) { diff --git a/app/src/androidTest/java/de/test/antennapod/util/syndication/FeedDiscovererTest.java b/app/src/androidTest/java/de/test/antennapod/util/syndication/FeedDiscovererTest.java index 2dda77524..b213a5efa 100644 --- a/app/src/androidTest/java/de/test/antennapod/util/syndication/FeedDiscovererTest.java +++ b/app/src/androidTest/java/de/test/antennapod/util/syndication/FeedDiscovererTest.java @@ -1,11 +1,12 @@ package de.test.antennapod.util.syndication; -import androidx.test.InstrumentationRegistry; +import androidx.test.platform.app.InstrumentationRegistry; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import java.io.File; import java.io.FileOutputStream; +import java.nio.charset.Charset; import java.util.Map; import de.danoeh.antennapod.core.util.syndication.FeedDiscoverer; @@ -29,7 +30,8 @@ public class FeedDiscovererTest { @Before public void setUp() throws Exception { fd = new FeedDiscoverer(); - testDir = new File(InstrumentationRegistry.getTargetContext().getFilesDir(), "FeedDiscovererTest"); + testDir = new File(InstrumentationRegistry + .getInstrumentation().getTargetContext().getFilesDir(), "FeedDiscovererTest"); testDir.mkdir(); assertTrue(testDir.exists()); } @@ -67,7 +69,7 @@ public class FeedDiscovererTest { } else { File testFile = new File(testDir, "feed"); FileOutputStream out = new FileOutputStream(testFile); - IOUtils.write(html, out); + IOUtils.write(html, out, Charset.forName("UTF-8")); out.close(); res = fd.findLinks(testFile, base); } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java index 48264bb26..b1a0ba2a2 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/BugReportActivity.java @@ -42,9 +42,8 @@ public class BugReportActivity extends AppCompatActivity { } crashDetailsTextView.setText(crashDetailsText); - findViewById(R.id.btn_open_bug_tracker).setOnClickListener(v -> { - IntentUtils.openInBrowser(BugReportActivity.this, "https://github.com/AntennaPod/AntennaPod/issues"); - }); + findViewById(R.id.btn_open_bug_tracker).setOnClickListener(v -> IntentUtils.openInBrowser( + BugReportActivity.this, "https://github.com/AntennaPod/AntennaPod/issues")); findViewById(R.id.btn_copy_log).setOnClickListener(v -> { ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java index 34c7e3aba..61cbcbb01 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -18,16 +18,23 @@ import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.widget.Toast; + +import com.bumptech.glide.Glide; + +import org.apache.commons.lang3.StringUtils; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.text.NumberFormat; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; -import androidx.arch.core.util.Function; +import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityOptionsCompat; import androidx.core.content.ContextCompat; -import androidx.core.util.Consumer; -import androidx.core.util.Supplier; -import com.bumptech.glide.Glide; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.event.PlaybackPositionEvent; import de.danoeh.antennapod.core.feed.FeedItem; @@ -39,7 +46,6 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.FeedItemUtil; -import de.danoeh.antennapod.core.util.Flavors; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.ShareUtils; import de.danoeh.antennapod.core.util.StorageUtils; @@ -51,18 +57,13 @@ import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.PlaybackController; import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; import de.danoeh.antennapod.dialog.PlaybackControlsDialog; +import de.danoeh.antennapod.dialog.ShareDialog; import de.danoeh.antennapod.dialog.SkipPreferenceDialog; import de.danoeh.antennapod.dialog.SleepTimerDialog; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; -import org.apache.commons.lang3.StringUtils; -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.text.NumberFormat; /** @@ -304,7 +305,7 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements return false; } Playable media = controller.getMedia(); - boolean isFeedMedia = media != null && (media instanceof FeedMedia); + boolean isFeedMedia = (media instanceof FeedMedia); menu.findItem(R.id.open_feed_item).setVisible(isFeedMedia); // FeedMedia implies it belongs to a Feed @@ -313,13 +314,8 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements boolean isItemAndHasLink = isFeedMedia && ShareUtils.hasLinkToShare(((FeedMedia) media).getItem()); - menu.findItem(R.id.share_link_item).setVisible(isItemAndHasLink); - menu.findItem(R.id.share_link_with_position_item).setVisible(isItemAndHasLink); boolean isItemHasDownloadLink = isFeedMedia && ((FeedMedia) media).getDownload_url() != null; - menu.findItem(R.id.share_download_url_item).setVisible(isItemHasDownloadLink); - menu.findItem(R.id.share_download_url_with_position_item).setVisible(isItemHasDownloadLink); - menu.findItem(R.id.share_file).setVisible(isFeedMedia && ((FeedMedia) media).fileExists()); menu.findItem(R.id.share_item).setVisible(hasWebsiteLink || isItemAndHasLink || isItemHasDownloadLink); @@ -393,29 +389,10 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements case R.id.visit_website_item: IntentUtils.openInBrowser(MediaplayerActivity.this, getWebsiteLinkWithFallback(media)); break; - case R.id.share_link_item: - if (feedItem != null) { - ShareUtils.shareFeedItemLink(this, feedItem); - } - break; - case R.id.share_download_url_item: - if (feedItem != null) { - ShareUtils.shareFeedItemDownloadLink(this, feedItem); - } - break; - case R.id.share_link_with_position_item: + case R.id.share_item: if (feedItem != null) { - ShareUtils.shareFeedItemLink(this, feedItem, true); - } - break; - case R.id.share_download_url_with_position_item: - if (feedItem != null) { - ShareUtils.shareFeedItemDownloadLink(this, feedItem, true); - } - break; - case R.id.share_file: - if (media instanceof FeedMedia) { - ShareUtils.shareFeedItemFile(this, ((FeedMedia) media)); + ShareDialog shareDialog = ShareDialog.newInstance(feedItem); + shareDialog.show(getSupportFragmentManager(), "ShareEpisodeDialog"); } break; default: diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java index 0f7bab273..a0644a4c4 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java @@ -227,15 +227,14 @@ public class OnlineFeedViewActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - Intent destIntent = new Intent(this, MainActivity.class); - if (NavUtils.shouldUpRecreateTask(this, destIntent)) { - startActivity(destIntent); - } else { - NavUtils.navigateUpFromSameTask(this); - } - return true; + if (item.getItemId() == android.R.id.home) { + Intent destIntent = new Intent(this, MainActivity.class); + if (NavUtils.shouldUpRecreateTask(this, destIntent)) { + startActivity(destIntent); + } else { + NavUtils.navigateUpFromSameTask(this); + } + return true; } return super.onOptionsItemSelected(item); } @@ -609,9 +608,8 @@ public class OnlineFeedViewActivity extends AppCompatActivity { } final List<String> titles = new ArrayList<>(); - final List<String> urls = new ArrayList<>(); - urls.addAll(urlsMap.keySet()); + final List<String> urls = new ArrayList<>(urlsMap.keySet()); for (String url : urls) { titles.add(urlsMap.get(url)); } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java index 337880317..cfd6ec702 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/gpoddernet/GpodnetAuthenticationActivity.java @@ -88,10 +88,9 @@ public class GpodnetAuthenticationActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - finish(); - return true; + if (item.getItemId() == android.R.id.home) { + finish(); + return true; } return super.onOptionsItemSelected(item); } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java index e66032e11..9da83435e 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java @@ -194,7 +194,7 @@ public class NavListAdapter extends BaseAdapter @Override public View getView(int position, View convertView, ViewGroup parent) { int viewType = getItemViewType(position); - View v = null; + View v; if (viewType == VIEW_TYPE_NAV) { v = getNavView((String) getItem(position), position, convertView, parent); } else if (viewType == VIEW_TYPE_SECTION_DIVIDER) { diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java index 428a968c6..2499e4818 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/QueueRecyclerAdapter.java @@ -37,7 +37,7 @@ public class QueueRecyclerAdapter extends EpisodeItemListAdapter { @SuppressLint("ClickableViewAccessibility") protected void afterBindViewHolder(EpisodeItemViewHolder holder, int pos) { View.OnTouchListener startDragTouchListener = (v1, event) -> { - if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) { + if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { Log.d(TAG, "startDrag()"); itemTouchHelper.startDrag(holder); } diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java index ac1e94437..6af35fa55 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java @@ -413,7 +413,7 @@ public class EpisodesApplyActionFragment extends Fragment { boolean checked = checkedIds.contains(episode.getId()); mListView.setItemChecked(i, checked); } - ActivityCompat.invalidateOptionsMenu(EpisodesApplyActionFragment.this.getActivity()); + getActivity().invalidateOptionsMenu(); toolbar.setTitle(getResources().getQuantityString(R.plurals.num_selected_label, checkedIds.size(), checkedIds.size())); } diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/FilterDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/FilterDialog.java index d2912f90f..82010637f 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/FilterDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/FilterDialog.java @@ -1,8 +1,12 @@ package de.danoeh.antennapod.dialog; import android.content.Context; -import androidx.appcompat.app.AlertDialog; import android.text.TextUtils; +import android.view.LayoutInflater; +import android.widget.LinearLayout; +import android.widget.RadioButton; + +import androidx.appcompat.app.AlertDialog; import java.util.Arrays; import java.util.HashSet; @@ -10,6 +14,8 @@ import java.util.Set; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.FeedItemFilter; +import de.danoeh.antennapod.core.feed.FeedItemFilterGroup; +import de.danoeh.antennapod.view.RecursiveRadioGroup; public abstract class FilterDialog { @@ -22,36 +28,46 @@ public abstract class FilterDialog { } public void openDialog() { - final String[] items = context.getResources().getStringArray(R.array.episode_filter_options); - final String[] values = context.getResources().getStringArray(R.array.episode_filter_values); - final boolean[] checkedItems = new boolean[items.length]; final Set<String> filterValues = new HashSet<>(Arrays.asList(filter.getValues())); + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.filter); - // make sure we have no empty strings in the filter list - for (String filterValue : filterValues) { - if (TextUtils.isEmpty(filterValue)) { - filterValues.remove(filterValue); - } + LayoutInflater inflater = LayoutInflater.from(this.context); + LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.filter_dialog, null, false); + builder.setView(layout); + + for (FeedItemFilterGroup item : FeedItemFilterGroup.values()) { + RecursiveRadioGroup row = (RecursiveRadioGroup) inflater.inflate(R.layout.filter_dialog_row, null); + RadioButton filter1 = row.findViewById(R.id.filter_dialog_radioButton1); + RadioButton filter2 = row.findViewById(R.id.filter_dialog_radioButton2); + filter1.setText(item.values[0].displayName); + filter1.setTag(item.values[0].filterId); + filter2.setText(item.values[1].displayName); + filter2.setTag(item.values[1].filterId); + layout.addView(row); } - for (int i = 0; i < values.length; i++) { - String value = values[i]; - if (filterValues.contains(value)) { - checkedItems[i] = true; + for (String filterId : filterValues) { + if (!TextUtils.isEmpty(filterId)) { + ((RadioButton) layout.findViewWithTag(filterId)).setChecked(true); } } - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.filter); - builder.setMultiChoiceItems(items, checkedItems, (dialog, which, isChecked) -> { - if (isChecked) { - filterValues.add(values[which]); - } else { - filterValues.remove(values[which]); - } - }); builder.setPositiveButton(R.string.confirm_label, (dialog, which) -> { + filterValues.clear(); + for (int i = 0; i < layout.getChildCount(); i++) { + if (!(layout.getChildAt(i) instanceof RecursiveRadioGroup)) { + continue; + } + RecursiveRadioGroup group = (RecursiveRadioGroup) layout.getChildAt(i); + if (group.getCheckedButton() != null) { + String tag = (String) group.getCheckedButton().getTag(); + if (tag != null) { // Clear buttons use no tag + filterValues.add((String) group.getCheckedButton().getTag()); + } + } + } updateFilter(filterValues); }); builder.setNegativeButton(R.string.cancel_label, null); diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/ProxyDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/ProxyDialog.java index 0c25e3e9f..d0fb91692 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/ProxyDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/ProxyDialog.java @@ -23,6 +23,7 @@ import java.net.Proxy; import java.net.SocketAddress; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.R; @@ -63,6 +64,8 @@ public class ProxyDialog { public Dialog show() { View content = View.inflate(context, R.layout.proxy_settings, null); + spType = content.findViewById(R.id.spType); + dialog = new AlertDialog.Builder(context) .setTitle(R.string.pref_proxy_title) .setView(content) @@ -76,7 +79,7 @@ public class ProxyDialog { test(); return; } - String type = (String) ((Spinner) content.findViewById(R.id.spType)).getSelectedItem(); + String type = (String) spType.getSelectedItem(); ProxyConfig proxy; if (Proxy.Type.valueOf(type) == Proxy.Type.DIRECT) { proxy = ProxyConfig.direct(); @@ -106,7 +109,6 @@ public class ProxyDialog { dialog.dismiss(); }); - spType = content.findViewById(R.id.spType); List<String> types = new ArrayList<>(); types.add(Proxy.Type.DIRECT.name()); types.add(Proxy.Type.HTTP.name()); @@ -227,12 +229,11 @@ public class ProxyDialog { if(required) { testSuccessful = false; dialog.getButton(AlertDialog.BUTTON_POSITIVE).setText(R.string.proxy_test_label); - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); } else { testSuccessful = true; dialog.getButton(AlertDialog.BUTTON_POSITIVE).setText(android.R.string.ok); - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); } + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); } private void test() { @@ -261,7 +262,7 @@ public class ProxyDialog { portValue = Integer.parseInt(port); } SocketAddress address = InetSocketAddress.createUnresolved(host, portValue); - Proxy.Type proxyType = Proxy.Type.valueOf(type.toUpperCase()); + Proxy.Type proxyType = Proxy.Type.valueOf(type.toUpperCase(Locale.US)); Proxy proxy = new Proxy(proxyType, address); OkHttpClient.Builder builder = AntennapodHttpClient.newBuilder() .connectTimeout(10, TimeUnit.SECONDS) diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/ShareDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/ShareDialog.java new file mode 100644 index 000000000..8104d3539 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/dialog/ShareDialog.java @@ -0,0 +1,112 @@ +package de.danoeh.antennapod.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.view.View; +import android.widget.CheckBox; +import android.widget.RadioButton; +import android.widget.RadioGroup; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.util.ShareUtils; + +public class ShareDialog extends DialogFragment { + + private static final String ARGUMENT_FEED_ITEM = "feedItem"; + + private static final String TAG = "ShareDialog"; + private Context ctx; + private FeedItem item; + + private static final String PREF_SHARE_DIALOG_OPTION = "prefShareDialogOption"; + private static final String PREF_SHARE_EPISODE_START_AT = "prefShareEpisodeStartAt"; + + private RadioGroup radioGroup; + private RadioButton radioEpisodeWebsite; + private RadioButton radioMediaFile; + private CheckBox checkBoxStartAt; + private SharedPreferences prefs; + + public ShareDialog() { + // Empty constructor required for DialogFragment + } + + public static ShareDialog newInstance(FeedItem item) { + Bundle arguments = new Bundle(); + arguments.putSerializable(ARGUMENT_FEED_ITEM, item); + ShareDialog dialog = new ShareDialog(); + dialog.setArguments(arguments); + return dialog; + } + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + if (getArguments() != null) { + ctx = getActivity(); + item = (FeedItem) getArguments().getSerializable(ARGUMENT_FEED_ITEM); + prefs = getActivity().getSharedPreferences("ShareDialog", Context.MODE_PRIVATE); + } + + View content = View.inflate(ctx, R.layout.share_episode_dialog, null); + AlertDialog.Builder builder = new AlertDialog.Builder(ctx); + builder.setTitle(R.string.share_label); + builder.setView(content); + + radioGroup = content.findViewById(R.id.share_dialog_radio_group); + radioEpisodeWebsite = content.findViewById(R.id.share_episode_website_radio); + radioMediaFile = content.findViewById(R.id.share_media_file_radio); + checkBoxStartAt = content.findViewById(R.id.share_start_at_timer_dialog); + + setupOptions(); + + builder.setPositiveButton(R.string.share_label, (dialog, id) -> { + boolean includePlaybackPosition = checkBoxStartAt.isChecked(); + if (radioEpisodeWebsite.isChecked()) { + ShareUtils.shareFeedItemLink(ctx, item, includePlaybackPosition); + prefs.edit().putString(PREF_SHARE_DIALOG_OPTION, "website").apply(); + } else { + ShareUtils.shareFeedItemDownloadLink(ctx, item, includePlaybackPosition); + prefs.edit().putString(PREF_SHARE_DIALOG_OPTION, "media").apply(); + } + prefs.edit().putBoolean(PREF_SHARE_EPISODE_START_AT, includePlaybackPosition).apply(); + }).setNegativeButton(R.string.cancel_label, (dialog, id) -> dialog.dismiss()); + + return builder.create(); + } + + private void setupOptions() { + final boolean hasMedia = item.getMedia() != null; + + if (!ShareUtils.hasLinkToShare(item)) { + radioEpisodeWebsite.setVisibility(View.GONE); + radioMediaFile.setChecked(true); + } + + if (!hasMedia || item.getMedia().getDownload_url() == null) { + radioMediaFile.setVisibility(View.GONE); + radioEpisodeWebsite.setChecked(true); + } + + if (radioEpisodeWebsite.getVisibility() == View.VISIBLE && radioMediaFile.getVisibility() == View.VISIBLE) { + String option = prefs.getString(PREF_SHARE_DIALOG_OPTION, "website"); + if (option.equals("website")) { + radioEpisodeWebsite.setChecked(true); + radioMediaFile.setChecked(false); + } else { + radioEpisodeWebsite.setChecked(false); + radioMediaFile.setChecked(true); + } + } + + boolean switchIsChecked = prefs.getBoolean(PREF_SHARE_EPISODE_START_AT, false); + checkBoxStartAt.setChecked(switchIsChecked); + } +} diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java index 05f38000c..ce2e9575c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java @@ -45,13 +45,11 @@ public class AllEpisodesFragment extends EpisodesListFragment { @Override public boolean onOptionsItemSelected(MenuItem item) { if (!super.onOptionsItemSelected(item)) { - switch (item.getItemId()) { - case R.id.filter_items: - showFilterDialog(); - return true; - default: - return false; + if (item.getItemId() == R.id.filter_items) { + showFilterDialog(); + return true; } + return false; } else { return true; } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java index 5ca8b666a..249d1e9f6 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AudioPlayerFragment.java @@ -491,11 +491,11 @@ public class AudioPlayerFragment extends Fragment implements switch (item.getItemId()) { case R.id.disable_sleeptimer_item: // Fall-through case R.id.set_sleeptimer_item: - new SleepTimerDialog().show(getFragmentManager(), "SleepTimerDialog"); + new SleepTimerDialog().show(getChildFragmentManager(), "SleepTimerDialog"); return true; case R.id.audio_controls: PlaybackControlsDialog dialog = PlaybackControlsDialog.newInstance(false); - dialog.show(getFragmentManager(), "playback_controls"); + dialog.show(getChildFragmentManager(), "playback_controls"); return true; case R.id.open_feed_item: if (feedItem != null) { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java index 6d693f6cb..2650d9d6b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java @@ -45,7 +45,6 @@ public class ChaptersFragment extends Fragment { RecyclerView recyclerView = root.findViewById(R.id.recyclerView); layoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(layoutManager); - recyclerView.setHasFixedSize(true); recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(getActivity()).build()); adapter = new ChaptersListAdapter(getActivity(), pos -> { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java index 312e3cb62..5b2813ec5 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -93,7 +93,7 @@ public class DownloadLogFragment extends ListFragment { private void onFragmentLoaded() { setListShown(true); adapter.notifyDataSetChanged(); - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); } @Override @@ -156,7 +156,7 @@ public class DownloadLogFragment extends ListFragment { } super.onCreateOptionsMenu(menu, inflater); MenuItem clearHistory = menu.add(Menu.NONE, R.id.clear_history_item, Menu.CATEGORY_CONTAINER, R.string.clear_history_label); - MenuItemCompat.setShowAsAction(clearHistory, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); + clearHistory.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); TypedArray drawables = getActivity().obtainStyledAttributes(new int[]{R.attr.ic_delete}); clearHistory.setIcon(drawables.getDrawable(0)); drawables.recycle(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java index b90da7447..9be32dfdd 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedItemlistFragment.java @@ -405,7 +405,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem private void updateSyncProgressBarVisibility() { if (isUpdatingFeed != updateRefreshMenuItemChecker.isRefreshing()) { - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); } if (!DownloadRequester.getInstance().isDownloadingFeeds()) { nextPageLoader.getRoot().setVisibility(View.GONE); @@ -427,7 +427,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem progressBar.setVisibility(View.GONE); adapter.updateItems(feed.getItems()); - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); updateSyncProgressBarVisibility(); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java index 8251e8716..209e5d0e1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java @@ -66,7 +66,7 @@ public class FeedSettingsFragment extends Fragment { Toolbar toolbar = root.findViewById(R.id.toolbar); ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); - getFragmentManager().beginTransaction() + getParentFragmentManager().beginTransaction() .replace(R.id.settings_fragment_container, FeedSettingsPreferenceFragment.newInstance(feedId), "settings_fragment") .commitAllowingStateLoss(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java index aaf0fc7d4..337c789fe 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java @@ -145,9 +145,7 @@ public class ItemFragment extends Fragment { } txtvDuration = layout.findViewById(R.id.txtvDuration); txtvPublished = layout.findViewById(R.id.txtvPublished); - if (Build.VERSION.SDK_INT >= 14) { // ellipsize is causing problems on old versions, see #448 - txtvTitle.setEllipsize(TextUtils.TruncateAt.END); - } + txtvTitle.setEllipsize(TextUtils.TruncateAt.END); webvDescription = layout.findViewById(R.id.webvDescription); webvDescription.setTimecodeSelectedListener(time -> { if (controller != null && item.getMedia() != null && controller.getMedia() != null diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java index c198ce258..3b1171df4 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemPagerFragment.java @@ -140,13 +140,11 @@ public class ItemPagerFragment extends Fragment { @Override public boolean onOptionsItemSelected(MenuItem menuItem) { - switch (menuItem.getItemId()) { - case R.id.open_podcast: - openPodcast(); - return true; - default: - return FeedItemMenuHandler.onMenuItemClicked(this, menuItem.getItemId(), item); + if (menuItem.getItemId() == R.id.open_podcast) { + openPodcast(); + return true; } + return FeedItemMenuHandler.onMenuItemClicked(this, menuItem.getItemId(), item); } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java index 0dff8f24b..590f487f6 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NavDrawerFragment.java @@ -85,9 +85,8 @@ public class NavDrawerFragment extends Fragment implements AdapterView.OnItemCli registerForContextMenu(navList); updateSelection(); - root.findViewById(R.id.nav_settings).setOnClickListener(v -> { - startActivity(new Intent(getActivity(), PreferenceActivity.class)); - }); + root.findViewById(R.id.nav_settings).setOnClickListener(v -> + startActivity(new Intent(getActivity(), PreferenceActivity.class))); getContext().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) .registerOnSharedPreferenceChangeListener(this); return root; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java index d9c31f993..8ecb692a5 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/OnlineSearchFragment.java @@ -126,7 +126,7 @@ public class OnlineSearchFragment extends Fragment { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.online_search, menu); MenuItem searchItem = menu.findItem(R.id.action_search); - final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + final SearchView sv = (SearchView) searchItem.getActionView(); sv.setQueryHint(getString(R.string.search_podcast_hint)); sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java index dabff7269..db4bda1f5 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -153,7 +153,7 @@ public class PlaybackHistoryFragment extends Fragment { } super.onCreateOptionsMenu(menu, inflater); MenuItem clearHistory = menu.add(Menu.NONE, R.id.clear_history_item, Menu.CATEGORY_CONTAINER, R.string.clear_history_label); - MenuItemCompat.setShowAsAction(clearHistory, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM); + clearHistory.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); TypedArray drawables = getActivity().obtainStyledAttributes(new int[]{R.attr.ic_delete}); clearHistory.setIcon(drawables.getDrawable(0)); drawables.recycle(); @@ -171,13 +171,11 @@ public class PlaybackHistoryFragment extends Fragment { @Override public boolean onOptionsItemSelected(MenuItem item) { if (!super.onOptionsItemSelected(item)) { - switch (item.getItemId()) { - case R.id.clear_history_item: - DBWriter.clearPlaybackHistory(); - return true; - default: - return false; + if (item.getItemId() == R.id.clear_history_item) { + DBWriter.clearPlaybackHistory(); + return true; } + return false; } else { return true; } @@ -196,18 +194,18 @@ public class PlaybackHistoryFragment extends Fragment { @Subscribe(threadMode = ThreadMode.MAIN) public void onHistoryUpdated(PlaybackHistoryEvent event) { loadItems(); - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); } @Subscribe(threadMode = ThreadMode.MAIN) public void onPlayerStatusChanged(PlayerStatusEvent event) { loadItems(); - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); } private void onFragmentLoaded() { adapter.notifyDataSetChanged(); - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); } private void loadItems() { 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 49c53627f..4557154bf 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -136,6 +136,7 @@ public class QueueFragment extends Fragment { recyclerAdapter.notifyItemInserted(event.position); break; case SET_QUEUE: + case SORTED: //Deliberate fall-through queue = event.items; recyclerAdapter.notifyDataSetChanged(); break; @@ -149,10 +150,6 @@ public class QueueFragment extends Fragment { queue.clear(); recyclerAdapter.notifyDataSetChanged(); break; - case SORTED: - queue = event.items; - recyclerAdapter.notifyDataSetChanged(); - break; case MOVED: return; } @@ -216,7 +213,7 @@ public class QueueFragment extends Fragment { public void onPlayerStatusChanged(PlayerStatusEvent event) { loadItems(false); if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); } } @@ -225,7 +222,7 @@ public class QueueFragment extends Fragment { // Sent when playback position is reset loadItems(false); if (isUpdatingFeeds != updateRefreshMenuItemChecker.isRefreshing()) { - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); } } @@ -384,7 +381,7 @@ public class QueueFragment extends Fragment { private void setQueueLocked(boolean locked) { UserPreferences.setQueueLocked(locked); - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); if (recyclerAdapter != null) { recyclerAdapter.setLocked(locked); } @@ -572,7 +569,7 @@ public class QueueFragment extends Fragment { // we need to refresh the options menu because it sometimes // needs data that may have just been loaded. - getActivity().supportInvalidateOptionsMenu(); + getActivity().invalidateOptionsMenu(); refreshInfoBar(); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java index 0d33c1282..0c03d407e 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/SearchFragment.java @@ -124,7 +124,6 @@ public class SearchFragment extends Fragment { LinearLayoutManager layoutManagerFeeds = new LinearLayoutManager(getActivity()); layoutManagerFeeds.setOrientation(RecyclerView.HORIZONTAL); recyclerViewFeeds.setLayoutManager(layoutManagerFeeds); - recyclerViewFeeds.setHasFixedSize(true); adapterFeeds = new FeedSearchResultAdapter((MainActivity) getActivity()); recyclerViewFeeds.setAdapter(adapterFeeds); @@ -174,7 +173,7 @@ public class SearchFragment extends Fragment { @Override public boolean onMenuItemActionCollapse(MenuItem item) { - getFragmentManager().popBackStack(); + getParentFragmentManager().popBackStack(); return true; } }); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java index e1c85a2d3..d5cac07f1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/PodcastListFragment.java @@ -56,9 +56,9 @@ public abstract class PodcastListFragment extends Fragment { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.gpodder_podcasts, menu); MenuItem searchItem = menu.findItem(R.id.action_search); - final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + final SearchView sv = (SearchView) searchItem.getActionView(); sv.setQueryHint(getString(R.string.gpodnet_search_hint)); - sv.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() { + sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { sv.clearFocus(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/SearchListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/SearchListFragment.java index 80f1a6ae0..72a752bf1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/SearchListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/SearchListFragment.java @@ -48,7 +48,7 @@ public class SearchListFragment extends PodcastListFragment { super.onCreateOptionsMenu(menu, inflater); // parent already inflated menu MenuItem searchItem = menu.findItem(R.id.action_search); - final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + final SearchView sv = (SearchView) searchItem.getActionView(); sv.setQueryHint(getString(R.string.gpodnet_search_hint)); sv.setQuery(query, false); sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java index a7a0781ce..53a31b68d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/TagListFragment.java @@ -38,7 +38,7 @@ public class TagListFragment extends ListFragment { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.gpodder_podcasts, menu); MenuItem searchItem = menu.findItem(R.id.action_search); - final SearchView sv = (SearchView) MenuItemCompat.getActionView(searchItem); + final SearchView sv = (SearchView) searchItem.getActionView(); sv.setQueryHint(getString(R.string.gpodnet_search_hint)); sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutFragment.java index 0fa7bd4bb..eb57972a1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AboutFragment.java @@ -28,12 +28,12 @@ public class AboutFragment extends PreferenceFragmentCompat { return true; }); findPreference("about_developers").setOnPreferenceClickListener((preference) -> { - getFragmentManager().beginTransaction().replace(R.id.content, new AboutDevelopersFragment()) + getParentFragmentManager().beginTransaction().replace(R.id.content, new AboutDevelopersFragment()) .addToBackStack(getString(R.string.developers)).commit(); return true; }); findPreference("about_translators").setOnPreferenceClickListener((preference) -> { - getFragmentManager().beginTransaction().replace(R.id.content, new AboutTranslatorsFragment()) + getParentFragmentManager().beginTransaction().replace(R.id.content, new AboutTranslatorsFragment()) .addToBackStack(getString(R.string.translators)).commit(); return true; }); @@ -42,7 +42,7 @@ public class AboutFragment extends PreferenceFragmentCompat { return true; }); findPreference("about_licenses").setOnPreferenceClickListener((preference) -> { - getFragmentManager().beginTransaction().replace(R.id.content, new AboutLicensesFragment()) + getParentFragmentManager().beginTransaction().replace(R.id.content, new AboutLicensesFragment()) .addToBackStack(getString(R.string.translators)).commit(); return true; }); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java index 6b15e4301..064c4b3bc 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/AutoDownloadPreferencesFragment.java @@ -1,5 +1,6 @@ package de.danoeh.antennapod.fragment.preferences; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.res.Resources; @@ -85,6 +86,7 @@ public class AutoDownloadPreferencesFragment extends PreferenceFragmentCompat { return val == null ? "" : val; } + @SuppressLint("MissingPermission") // getConfiguredNetworks needs location permission starting with API 29 private void buildAutodownloadSelectedNetworksPreference() { if (Build.VERSION.SDK_INT >= 29) { return; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java index f3b4d3003..5eb4a3aea 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/ImportExportPreferencesFragment.java @@ -38,6 +38,7 @@ import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Locale; public class ImportExportPreferencesFragment extends PreferenceFragmentCompat { private static final String TAG = "ImportExPrefFragment"; @@ -86,9 +87,7 @@ public class ImportExportPreferencesFragment extends PreferenceFragmentCompat { } private String dateStampFilename(String fname) { - return String.format(fname, - new SimpleDateFormat("yyyy-MM-dd") - .format(new Date())); + return String.format(fname, new SimpleDateFormat("yyyy-MM-dd", Locale.US).format(new Date())); } private void setupStorageScreen() { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/MainPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/MainPreferencesFragment.java index 406585808..0409ce11b 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/MainPreferencesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/MainPreferencesFragment.java @@ -62,14 +62,14 @@ public class MainPreferencesFragment extends PreferenceFragmentCompat { findPreference(PREF_ABOUT).setOnPreferenceClickListener( preference -> { - getFragmentManager().beginTransaction().replace(R.id.content, new AboutFragment()) + getParentFragmentManager().beginTransaction().replace(R.id.content, new AboutFragment()) .addToBackStack(getString(R.string.about_pref)).commit(); return true; } ); findPreference(STATISTICS).setOnPreferenceClickListener( preference -> { - getFragmentManager().beginTransaction().replace(R.id.content, new StatisticsFragment()) + getParentFragmentManager().beginTransaction().replace(R.id.content, new StatisticsFragment()) .addToBackStack(getString(R.string.statistics_label)).commit(); return true; } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java index 741080cf1..18137f7f1 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackPreferencesFragment.java @@ -116,7 +116,7 @@ public class PlaybackPreferencesFragment extends PreferenceFragmentCompat { if(x == 0) { entries[x] = res.getString(R.string.pref_smart_mark_as_played_disabled); } else { - Integer v = Integer.parseInt(values[x]); + int v = Integer.parseInt(values[x]); if(v < 60) { entries[x] = res.getQuantityString(R.plurals.time_seconds_quantified, v, v); } else { diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java index 1f15f66ec..bddafb75e 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java @@ -2,13 +2,14 @@ package de.danoeh.antennapod.menuhandler; import android.content.Context; import android.os.Handler; -import androidx.annotation.NonNull; -import com.google.android.material.snackbar.Snackbar; -import androidx.fragment.app.Fragment; import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import com.google.android.material.snackbar.Snackbar; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.feed.FeedItem; @@ -23,6 +24,7 @@ import de.danoeh.antennapod.core.sync.model.EpisodeAction; import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.ShareUtils; +import de.danoeh.antennapod.dialog.ShareDialog; /** * Handles interactions with the FeedItemMenu. @@ -61,20 +63,9 @@ public class FeedItemMenuHandler { } if (!ShareUtils.hasLinkToShare(selectedItem)) { setItemVisibility(menu, R.id.visit_website_item, false); - setItemVisibility(menu, R.id.share_link_item, false); - setItemVisibility(menu, R.id.share_link_with_position_item, false); - } - if (!hasMedia || selectedItem.getMedia().getDownload_url() == null) { - setItemVisibility(menu, R.id.share_download_url_item, false); - setItemVisibility(menu, R.id.share_download_url_with_position_item, false); - } - if(!hasMedia || selectedItem.getMedia().getPosition() <= 0) { - setItemVisibility(menu, R.id.share_download_url_with_position_item, false); - setItemVisibility(menu, R.id.share_link_with_position_item, false); } boolean fileDownloaded = hasMedia && selectedItem.getMedia().fileExists(); - setItemVisibility(menu, R.id.share_file, fileDownloaded); setItemVisibility(menu, R.id.remove_new_flag_item, selectedItem.isNew()); if (selectedItem.isPlayed()) { @@ -243,20 +234,9 @@ public class FeedItemMenuHandler { case R.id.visit_website_item: IntentUtils.openInBrowser(context, FeedItemUtil.getLinkWithFallback(selectedItem)); break; - case R.id.share_link_item: - ShareUtils.shareFeedItemLink(context, selectedItem); - break; - case R.id.share_download_url_item: - ShareUtils.shareFeedItemDownloadLink(context, selectedItem); - break; - case R.id.share_link_with_position_item: - ShareUtils.shareFeedItemLink(context, selectedItem, true); - break; - case R.id.share_download_url_with_position_item: - ShareUtils.shareFeedItemDownloadLink(context, selectedItem, true); - break; - case R.id.share_file: - ShareUtils.shareFeedItemFile(context, selectedItem.getMedia()); + case R.id.share_item: + ShareDialog shareDialog = ShareDialog.newInstance(selectedItem); + shareDialog.show((fragment.getActivity().getSupportFragmentManager()), "ShareEpisodeDialog"); break; default: Log.d(TAG, "Unknown menuItemId: " + menuItemId); diff --git a/app/src/main/java/de/danoeh/antennapod/view/NestedScrollableHost.java b/app/src/main/java/de/danoeh/antennapod/view/NestedScrollableHost.java index a4daa9109..0e1846f1c 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/NestedScrollableHost.java +++ b/app/src/main/java/de/danoeh/antennapod/view/NestedScrollableHost.java @@ -54,7 +54,7 @@ class NestedScrollableHost extends FrameLayout { touchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); } - private int touchSlop = 0; + private int touchSlop; private float initialX = 0f; private float initialY = 0f; diff --git a/app/src/main/java/de/danoeh/antennapod/view/RecursiveRadioGroup.java b/app/src/main/java/de/danoeh/antennapod/view/RecursiveRadioGroup.java new file mode 100644 index 000000000..ee5e7c51d --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/view/RecursiveRadioGroup.java @@ -0,0 +1,67 @@ +package de.danoeh.antennapod.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import java.util.ArrayList; + +/** + * An alternative to {@link android.widget.RadioGroup} that allows to nest children. + * Basend on https://stackoverflow.com/a/14309274. + */ +public class RecursiveRadioGroup extends LinearLayout { + private final ArrayList<RadioButton> radioButtons = new ArrayList<>(); + private RadioButton checkedButton = null; + + public RecursiveRadioGroup(Context context) { + super(context); + } + + public RecursiveRadioGroup(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public RecursiveRadioGroup(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public void addView(View child, int index, ViewGroup.LayoutParams params) { + super.addView(child, index, params); + parseChild(child); + } + + public void parseChild(final View child) { + if (child instanceof RadioButton) { + RadioButton button = (RadioButton) child; + radioButtons.add(button); + button.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (!isChecked) { + return; + } + checkedButton = (RadioButton) buttonView; + + for (RadioButton view : radioButtons) { + if (view != buttonView) { + view.setChecked(false); + } + } + }); + } else if (child instanceof ViewGroup) { + parseChildren((ViewGroup) child); + } + } + + public void parseChildren(final ViewGroup child) { + for (int i = 0; i < child.getChildCount(); i++) { + parseChild(child.getChildAt(i)); + } + } + + public RadioButton getCheckedButton() { + return checkedButton; + } +} diff --git a/app/src/main/res/layout/addfeed.xml b/app/src/main/res/layout/addfeed.xml index 9d14d209a..d44552bab 100644 --- a/app/src/main/res/layout/addfeed.xml +++ b/app/src/main/res/layout/addfeed.xml @@ -71,7 +71,7 @@ android:focusableInTouchMode="true" android:padding="16dp"> - <fragment + <androidx.fragment.app.FragmentContainerView android:id="@+id/quickFeedDiscovery" android:name="de.danoeh.antennapod.fragment.QuickFeedDiscoveryFragment" android:layout_width="match_parent" diff --git a/app/src/main/res/layout/all_episodes_fragment.xml b/app/src/main/res/layout/all_episodes_fragment.xml index 73f061a0f..b67e7e277 100644 --- a/app/src/main/res/layout/all_episodes_fragment.xml +++ b/app/src/main/res/layout/all_episodes_fragment.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" diff --git a/app/src/main/res/layout/choose_data_folder_dialog_entry.xml b/app/src/main/res/layout/choose_data_folder_dialog_entry.xml index ae59c0614..addc63f4d 100644 --- a/app/src/main/res/layout/choose_data_folder_dialog_entry.xml +++ b/app/src/main/res/layout/choose_data_folder_dialog_entry.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root" android:layout_width="match_parent" diff --git a/app/src/main/res/layout/downloadlog_item.xml b/app/src/main/res/layout/downloadlog_item.xml index dd8328c8c..5cde763a0 100644 --- a/app/src/main/res/layout/downloadlog_item.xml +++ b/app/src/main/res/layout/downloadlog_item.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout - xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" diff --git a/app/src/main/res/layout/empty_view_layout.xml b/app/src/main/res/layout/empty_view_layout.xml index 768f74c41..da2040d93 100644 --- a/app/src/main/res/layout/empty_view_layout.xml +++ b/app/src/main/res/layout/empty_view_layout.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
diff --git a/app/src/main/res/layout/filter_dialog.xml b/app/src/main/res/layout/filter_dialog.xml new file mode 100644 index 000000000..39e9258d9 --- /dev/null +++ b/app/src/main/res/layout/filter_dialog.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:paddingLeft="24dp" + android:paddingTop="24dp" + android:paddingRight="24dp" + android:paddingBottom="8dp"> + +</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/filter_dialog_row.xml b/app/src/main/res/layout/filter_dialog_row.xml new file mode 100644 index 000000000..0863997b3 --- /dev/null +++ b/app/src/main/res/layout/filter_dialog_row.xml @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8"?> +<de.danoeh.antennapod.view.RecursiveRadioGroup + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingBottom="8dp" + android:orientation="horizontal"> + + <androidx.cardview.widget.CardView + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:clipChildren="true" + app:cardCornerRadius="32dp" + app:cardElevation="0dp"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="horizontal"> + + <RadioButton + android:id="@+id/filter_dialog_radioButton1" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_marginEnd="2dp" + android:layout_marginRight="2dp" + android:layout_weight="1" + android:background="?attr/filter_dialog_button_background" + android:button="@android:color/transparent" + android:foreground="?android:attr/selectableItemBackground" + android:checked="false" + android:gravity="center" + android:textColor="@color/filter_dialog_button_text" /> + + <RadioButton + android:id="@+id/filter_dialog_radioButton2" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + android:background="?attr/filter_dialog_button_background" + android:button="@android:color/transparent" + android:foreground="?android:attr/selectableItemBackground" + android:checked="false" + android:gravity="center" + android:textColor="@color/filter_dialog_button_text" /> + </LinearLayout> + </androidx.cardview.widget.CardView> + + <RadioButton + android:id="@+id/filter_dialog_clear" + android:layout_width="48dp" + android:layout_height="48dp" + android:background="@drawable/ic_filter_close" + android:button="@android:color/transparent" + android:foreground="?android:attr/selectableItemBackground" + android:layout_gravity="center_vertical" + android:checked="true" /> + +</de.danoeh.antennapod.view.RecursiveRadioGroup> diff --git a/app/src/main/res/layout/listview_activity.xml b/app/src/main/res/layout/listview_activity.xml deleted file mode 100644 index b276f506c..000000000 --- a/app/src/main/res/layout/listview_activity.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="match_parent" - android:layout_height="match_parent"> - <ListView - android:id="@+id/listview" - android:layout_width="match_parent" - android:layout_height="match_parent"/> - -</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/searchlist_item.xml b/app/src/main/res/layout/searchlist_item.xml deleted file mode 100644 index 608bfc3bc..000000000 --- a/app/src/main/res/layout/searchlist_item.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="wrap_content" - tools:background="@android:color/darker_gray" - android:paddingTop="@dimen/listitem_threeline_verticalpadding" - android:paddingBottom="@dimen/listitem_threeline_verticalpadding"> - - <ImageView - android:id="@+id/imgvFeedimage" - android:layout_width="@dimen/thumbnail_length_itemlist" - android:layout_height="@dimen/thumbnail_length_itemlist" - android:layout_alignParentLeft="true" - android:layout_alignParentStart="true" - android:layout_centerVertical="true" - android:layout_marginLeft="@dimen/listitem_threeline_horizontalpadding" - android:layout_marginStart="@dimen/listitem_threeline_horizontalpadding" - android:importantForAccessibility="no" - android:scaleType="centerCrop" - tools:src="@drawable/ic_antenna" - tools:background="@android:color/holo_green_dark"/> - - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_marginLeft="@dimen/listitem_iconwithtext_textleftpadding" - android:layout_marginStart="@dimen/listitem_iconwithtext_textleftpadding" - android:layout_marginRight="@dimen/listitem_threeline_verticalpadding" - android:layout_marginEnd="@dimen/listitem_threeline_verticalpadding" - android:layout_toRightOf="@id/imgvFeedimage" - android:layout_toEndOf="@id/imgvFeedimage" - android:orientation="vertical" - tools:background="@android:color/holo_red_dark"> - - <TextView - android:id="@+id/txtvTitle" - style="@style/AntennaPod.TextView.ListItemPrimaryTitle" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="8dp" - tools:text="Search item title" - tools:background="@android:color/holo_green_dark" /> - - <TextView - android:id="@+id/txtvSubtitle" - style="@style/AntennaPod.TextView.ListItemSecondaryTitle" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:lines="1" - tools:text="Search item subtitle" - tools:background="@android:color/holo_blue_light"/> - </LinearLayout> - -</RelativeLayout> diff --git a/app/src/main/res/layout/share_episode_dialog.xml b/app/src/main/res/layout/share_episode_dialog.xml new file mode 100644 index 000000000..8cf955d4c --- /dev/null +++ b/app/src/main/res/layout/share_episode_dialog.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center" + android:padding="16dp"> + + <RadioGroup + android:id="@+id/share_dialog_radio_group" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="16dp" + android:orientation="vertical"> + + <RadioButton android:id="@+id/share_episode_website_radio" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/share_dialog_episode_website_label" + android:checked="true" + /> + <RadioButton android:id="@+id/share_media_file_radio" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/share_dialog_media_file_label" + /> + </RadioGroup> + + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:text="@string/share_dialog_include_label"/> + + <CheckBox + android:id="@+id/share_start_at_timer_dialog" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/share_playback_position_dialog_label" /> + +</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/statistics_fragment.xml b/app/src/main/res/layout/statistics_fragment.xml deleted file mode 100644 index e44c7ca81..000000000 --- a/app/src/main/res/layout/statistics_fragment.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - - <com.google.android.material.tabs.TabLayout - android:id="@+id/sliding_tabs" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?android:attr/windowBackground" - app:tabBackground="?attr/selectableItemBackground" - app:tabGravity="fill" - app:tabMode="fixed" /> - - <androidx.viewpager2.widget.ViewPager2 - android:id="@+id/viewpager" - android:layout_width="match_parent" - android:layout_height="0px" - android:layout_weight="1" /> -</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/menu/feeditem_options.xml b/app/src/main/res/menu/feeditem_options.xml index e415ff85a..c29229e37 100644 --- a/app/src/main/res/menu/feeditem_options.xml +++ b/app/src/main/res/menu/feeditem_options.xml @@ -71,29 +71,7 @@ <item android:id="@+id/share_item" android:menuCategory="container" - android:title="@string/share_label"> - <menu> - <item - android:id="@+id/share_link_item" - android:menuCategory="container" - android:title="@string/share_link_label" /> - <item - android:id="@+id/share_link_with_position_item" - android:menuCategory="container" - android:title="@string/share_link_with_position_label" /> - <item - android:id="@+id/share_download_url_item" - android:menuCategory="container" - android:title="@string/share_item_url_label" /> - <item - android:id="@+id/share_download_url_with_position_item" - android:menuCategory="container" - android:title="@string/share_item_url_with_position_label" /> - <item - android:id="@+id/share_file" - android:menuCategory="container" - android:title="@string/share_file_label" /> - </menu> + android:title="@string/share_label_with_ellipses"> </item> <item diff --git a/app/src/main/res/menu/feedlist.xml b/app/src/main/res/menu/feedlist.xml index 939a51ab2..3614cfffa 100644 --- a/app/src/main/res/menu/feedlist.xml +++ b/app/src/main/res/menu/feedlist.xml @@ -52,19 +52,25 @@ android:title="@string/visit_website_label" android:visible="true"> </item> + <item - android:id="@+id/share_link_item" - android:menuCategory="container" - custom:showAsAction="collapseActionView" - android:title="@string/share_website_url_label"> - </item> - <item - android:id="@+id/share_download_url_item" + android:id="@+id/share_item" android:menuCategory="container" - custom:showAsAction="collapseActionView" - android:title="@string/share_feed_url_label"> + custom:showAsAction="never" + android:title="@string/share_label_with_ellipses"> + <menu> + <item + android:id="@+id/share_link_item" + android:title="@string/share_website_url_label"> + </item> + <item + android:id="@+id/share_download_url_item" + android:title="@string/share_feed_url_label"> + </item> + </menu> </item> + <item android:id="@+id/rename_item" android:menuCategory="container" diff --git a/app/src/main/res/menu/mediaplayer.xml b/app/src/main/res/menu/mediaplayer.xml index a61616ce9..8afdba369 100644 --- a/app/src/main/res/menu/mediaplayer.xml +++ b/app/src/main/res/menu/mediaplayer.xml @@ -62,28 +62,6 @@ android:id="@+id/share_item" android:menuCategory="container" custom:showAsAction="never" - android:title="@string/share_label"> - <menu> - <item - android:id="@+id/share_link_item" - android:menuCategory="container" - android:title="@string/share_link_label" /> - <item - android:id="@+id/share_link_with_position_item" - android:menuCategory="container" - android:title="@string/share_link_with_position_label" /> - <item - android:id="@+id/share_download_url_item" - android:menuCategory="container" - android:title="@string/share_item_url_label" /> - <item - android:id="@+id/share_download_url_with_position_item" - android:menuCategory="container" - android:title="@string/share_item_url_with_position_label" /> - <item - android:id="@+id/share_file" - android:menuCategory="container" - android:title="@string/share_file_label" /> - </menu> + android:title="@string/share_label_with_ellipses"> </item> </menu>
\ No newline at end of file diff --git a/app/src/main/res/values-w300dp/dimens-fabspeeddial.xml b/app/src/main/res/values-w300dp/dimens-fabspeeddial.xml index 1b90da786..882f8b4be 100644 --- a/app/src/main/res/values-w300dp/dimens-fabspeeddial.xml +++ b/app/src/main/res/values-w300dp/dimens-fabspeeddial.xml @@ -4,5 +4,5 @@ (300dp ~ 1.875 inch, devices with 3.5-inch screens have a width of ~ 1.9in so the setup is applicable for most phones) --> - <dimen name="sd_label_max_width" tools:ignore="MissingDefaultResource">240dp</dimen> + <dimen name="sd_label_max_width" tools:ignore="MissingDefaultResource, UnusedResources">240dp</dimen> </resources> diff --git a/app/src/main/res/xml/automotive_app_desc.xml b/app/src/main/res/xml/automotive_app_desc.xml index 8f0a7c59c..0a6a3c9fb 100644 --- a/app/src/main/res/xml/automotive_app_desc.xml +++ b/app/src/main/res/xml/automotive_app_desc.xml @@ -1,4 +1,4 @@ <?xml version="1.0" encoding="utf-8"?> -<automotiveApp xmlns:android="http://schemas.android.com/apk/res/android"> +<automotiveApp> <uses name="media"/> </automotiveApp>
\ No newline at end of file diff --git a/app/src/main/res/xml/preferences_autodownload.xml b/app/src/main/res/xml/preferences_autodownload.xml index 333224aa0..9a2c859cd 100644 --- a/app/src/main/res/xml/preferences_autodownload.xml +++ b/app/src/main/res/xml/preferences_autodownload.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:search="http://schemas.android.com/apk/com.bytehamster.lib.preferencesearch"> <de.danoeh.antennapod.preferences.MasterSwitchPreference diff --git a/app/src/main/res/xml/preferences_user_interface.xml b/app/src/main/res/xml/preferences_user_interface.xml index a2fc970e0..1a1f125b6 100644 --- a/app/src/main/res/xml/preferences_user_interface.xml +++ b/app/src/main/res/xml/preferences_user_interface.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/appearance"> <ListPreference diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml index c4ed430be..a16b679e3 100644 --- a/app/src/main/res/xml/provider_paths.xml +++ b/app/src/main/res/xml/provider_paths.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<paths xmlns:android="http://schemas.android.com/apk/res/android"> +<paths> <external-path name="external_storage" path="."/> <root-path name="external_files" path="/storage/" /> </paths> diff --git a/app/src/main/res/xml/searchable.xml b/app/src/main/res/xml/searchable.xml deleted file mode 100644 index 0861ecdae..000000000 --- a/app/src/main/res/xml/searchable.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<searchable xmlns:android="http://schemas.android.com/apk/res/android" - android:hint="@string/search_label" - android:label="@string/app_name"/>
\ No newline at end of file |