diff options
Diffstat (limited to 'app')
41 files changed, 772 insertions, 425 deletions
diff --git a/app/build.gradle b/app/build.gradle index f28bb4375..e18708878 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,6 +12,7 @@ dependencies { compile 'com.android.support:appcompat-v7:22.2.1' compile 'com.android.support:gridlayout-v7:22.2.1' compile 'com.android.support:cardview-v7:22.2.1' + compile 'com.android.support:design:22.2.1' compile 'org.apache.commons:commons-lang3:3.3.2' compile('org.shredzone.flattr4j:flattr4j-core:2.12') { exclude group: 'org.json', module: 'json' diff --git a/app/src/androidTest/java/de/test/antennapod/AntennaPodTestRunner.java b/app/src/androidTest/java/de/test/antennapod/AntennaPodTestRunner.java index 24cd6e669..c321e6494 100644 --- a/app/src/androidTest/java/de/test/antennapod/AntennaPodTestRunner.java +++ b/app/src/androidTest/java/de/test/antennapod/AntennaPodTestRunner.java @@ -2,6 +2,7 @@ package de.test.antennapod; import android.test.InstrumentationTestRunner; import android.test.suitebuilder.TestSuiteBuilder; + import junit.framework.TestSuite; public class AntennaPodTestRunner extends InstrumentationTestRunner { @@ -13,4 +14,5 @@ public class AntennaPodTestRunner extends InstrumentationTestRunner { .excludePackages("de.test.antennapod.gpodnet") .build(); } + } 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 4ee372d68..133d4152a 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 @@ -1,7 +1,6 @@ package de.test.antennapod.service.playback; import android.content.Context; -import android.media.RemoteControlClient; import android.test.InstrumentationTestCase; import junit.framework.AssertionFailedError; @@ -45,7 +44,7 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { @Override protected void tearDown() throws Exception { super.tearDown(); - PodDBAdapter.deleteDatabase(getInstrumentation().getTargetContext()); + PodDBAdapter.deleteDatabase(); httpServer.stop(); } @@ -54,16 +53,16 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { super.setUp(); assertionError = null; - final Context context = getInstrumentation().getTargetContext(); - context.deleteDatabase(PodDBAdapter.DATABASE_NAME); - // make sure database is created - PodDBAdapter adapter = new PodDBAdapter(context); + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.close(); httpServer = new HTTPBin(); httpServer.start(); + final Context context = getInstrumentation().getTargetContext(); File cacheDir = context.getExternalFilesDir("testFiles"); if (cacheDir == null) cacheDir = context.getExternalFilesDir("testFiles"); @@ -119,12 +118,12 @@ public class PlaybackServiceMediaPlayerTest extends InstrumentationTestCase { Feed f = new Feed(0, new Date(), "f", "l", "d", null, null, null, null, "i", null, null, "l", false); FeedPreferences prefs = new FeedPreferences(f.getId(), false, FeedPreferences.AutoDeleteAction.NO, null, null); f.setPreferences(prefs); - f.setItems(new ArrayList<FeedItem>()); + f.setItems(new ArrayList<>()); FeedItem i = new FeedItem(0, "t", "i", "l", new Date(), FeedItem.UNPLAYED, f); f.getItems().add(i); FeedMedia media = new FeedMedia(0, i, 0, 0, 0, "audio/wav", fileUrl, downloadUrl, fileUrl != null, null, 0); i.setMedia(media); - PodDBAdapter adapter = new PodDBAdapter(c); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(f); assertTrue(media.getId() != 0); 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 385201f25..869a13127 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 @@ -26,16 +26,16 @@ public class PlaybackServiceTaskManagerTest extends InstrumentationTestCase { @Override protected void tearDown() throws Exception { super.tearDown(); - assertTrue(PodDBAdapter.deleteDatabase(getInstrumentation().getTargetContext())); + PodDBAdapter.deleteDatabase(); } @Override protected void setUp() throws Exception { super.setUp(); - final Context context = getInstrumentation().getTargetContext(); - context.deleteDatabase(PodDBAdapter.DATABASE_NAME); - // make sure database is created - PodDBAdapter adapter = new PodDBAdapter(context); + + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.close(); } @@ -49,11 +49,11 @@ public class PlaybackServiceTaskManagerTest extends InstrumentationTestCase { final Context c = getInstrumentation().getTargetContext(); final int NUM_ITEMS = 10; Feed f = new Feed(0, new Date(), "title", "link", "d", null, null, null, null, "id", null, "null", "url", false); - f.setItems(new ArrayList<FeedItem>()); + f.setItems(new ArrayList<>()); for (int i = 0; i < NUM_ITEMS; i++) { f.getItems().add(new FeedItem(0, pref + i, pref + i, "link", new Date(), FeedItem.PLAYED, f)); } - PodDBAdapter adapter = new PodDBAdapter(c); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(f); adapter.setQueue(f.getItems()); 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 11a34813a..6873cb9a6 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBReaderTest.java @@ -15,7 +15,6 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.FeedItemStatistics; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.LongList; -import de.danoeh.antennapod.core.util.flattr.FlattrStatus; import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; @@ -27,25 +26,23 @@ public class DBReaderTest extends InstrumentationTestCase { @Override protected void tearDown() throws Exception { super.tearDown(); - final Context context = getInstrumentation().getTargetContext(); - assertTrue(PodDBAdapter.deleteDatabase(context)); + assertTrue(PodDBAdapter.deleteDatabase()); } @Override protected void setUp() throws Exception { super.setUp(); - final Context context = getInstrumentation().getTargetContext(); - context.deleteDatabase(PodDBAdapter.DATABASE_NAME); - // make sure database is created - PodDBAdapter adapter = new PodDBAdapter(context); + + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.close(); } public void testGetFeedList() { - final Context context = getInstrumentation().getTargetContext(); - List<Feed> feeds = saveFeedlist(context, 10, 0, false); - List<Feed> savedFeeds = DBReader.getFeedList(context); + List<Feed> feeds = saveFeedlist(10, 0, false); + List<Feed> savedFeeds = DBReader.getFeedList(); assertNotNull(savedFeeds); assertEquals(feeds.size(), savedFeeds.size()); for (int i = 0; i < feeds.size(); i++) { @@ -54,8 +51,7 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetFeedListSortOrder() { - final Context context = getInstrumentation().getTargetContext(); - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); Feed feed1 = new Feed(0, new Date(), "A", "link", "d", null, null, null, "rss", "A", null, "", "", true); @@ -73,7 +69,7 @@ public class DBReaderTest extends InstrumentationTestCase { adapter.close(); - List<Feed> saved = DBReader.getFeedList(context); + List<Feed> saved = DBReader.getFeedList(); assertNotNull(saved); assertEquals("Wrong size: ", 4, saved.size()); @@ -84,9 +80,8 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testFeedListDownloadUrls() { - final Context context = getInstrumentation().getTargetContext(); - List<Feed> feeds = saveFeedlist(context, 10, 0, false); - List<String> urls = DBReader.getFeedListDownloadUrls(context); + List<Feed> feeds = saveFeedlist(10, 0, false); + List<String> urls = DBReader.getFeedListDownloadUrls(); assertNotNull(urls); assertTrue(urls.size() == feeds.size()); for (int i = 0; i < urls.size(); i++) { @@ -98,8 +93,8 @@ public class DBReaderTest extends InstrumentationTestCase { final Context context = getInstrumentation().getTargetContext(); final int numFeeds = 10; final int numItems = 1; - List<Feed> feeds = saveFeedlist(context, numFeeds, numItems, false); - List<FeedItem> items = new ArrayList<FeedItem>(); + List<Feed> feeds = saveFeedlist(numFeeds, numItems, false); + List<FeedItem> items = new ArrayList<>(); for (Feed f : feeds) { for (FeedItem item : f.getItems()) { item.setFeed(null); @@ -107,7 +102,7 @@ public class DBReaderTest extends InstrumentationTestCase { items.add(item); } } - DBReader.loadFeedDataOfFeedItemlist(context, items); + DBReader.loadFeedDataOfFeedItemlist(items); for (int i = 0; i < numFeeds; i++) { for (int j = 0; j < numItems; j++) { FeedItem item = feeds.get(i).getItems().get(j); @@ -119,13 +114,12 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetFeedItemList() { - final Context context = getInstrumentation().getTargetContext(); final int numFeeds = 1; final int numItems = 10; - Feed feed = saveFeedlist(context, numFeeds, numItems, false).get(0); + Feed feed = saveFeedlist(numFeeds, numItems, false).get(0); List<FeedItem> items = feed.getItems(); feed.setItems(null); - List<FeedItem> savedItems = DBReader.getFeedItemList(context, feed); + List<FeedItem> savedItems = DBReader.getFeedItemList(feed); assertNotNull(savedItems); assertTrue(savedItems.size() == items.size()); for (int i = 0; i < savedItems.size(); i++) { @@ -137,22 +131,21 @@ public class DBReaderTest extends InstrumentationTestCase { if (numItems <= 0) { throw new IllegalArgumentException("numItems<=0"); } - final Context context = getInstrumentation().getTargetContext(); - List<Feed> feeds = saveFeedlist(context, numItems, numItems, false); - List<FeedItem> allItems = new ArrayList<FeedItem>(); + List<Feed> feeds = saveFeedlist(numItems, numItems, false); + List<FeedItem> allItems = new ArrayList<>(); for (Feed f : feeds) { allItems.addAll(f.getItems()); } // take random items from every feed Random random = new Random(); - List<FeedItem> queue = new ArrayList<FeedItem>(); + List<FeedItem> queue = new ArrayList<>(); while (queue.size() < numItems) { int index = random.nextInt(numItems); if (!queue.contains(allItems.get(index))) { queue.add(allItems.get(index)); } } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setQueue(queue); adapter.close(); @@ -160,10 +153,9 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetQueueIDList() { - final Context context = getInstrumentation().getTargetContext(); final int numItems = 10; List<FeedItem> queue = saveQueue(numItems); - LongList ids = DBReader.getQueueIDList(context); + LongList ids = DBReader.getQueueIDList(); assertNotNull(ids); assertTrue(queue.size() == ids.size()); for (int i = 0; i < queue.size(); i++) { @@ -173,10 +165,9 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetQueue() { - final Context context = getInstrumentation().getTargetContext(); final int numItems = 10; List<FeedItem> queue = saveQueue(numItems); - List<FeedItem> savedQueue = DBReader.getQueue(context); + List<FeedItem> savedQueue = DBReader.getQueue(); assertNotNull(savedQueue); assertTrue(queue.size() == savedQueue.size()); for (int i = 0; i < queue.size(); i++) { @@ -189,13 +180,12 @@ public class DBReaderTest extends InstrumentationTestCase { if (numItems <= 0) { throw new IllegalArgumentException("numItems<=0"); } - final Context context = getInstrumentation().getTargetContext(); - List<Feed> feeds = saveFeedlist(context, numItems, numItems, true); - List<FeedItem> items = new ArrayList<FeedItem>(); + List<Feed> feeds = saveFeedlist(numItems, numItems, true); + List<FeedItem> items = new ArrayList<>(); for (Feed f : feeds) { items.addAll(f.getItems()); } - List<FeedItem> downloaded = new ArrayList<FeedItem>(); + List<FeedItem> downloaded = new ArrayList<>(); Random random = new Random(); while (downloaded.size() < numItems) { @@ -207,7 +197,7 @@ public class DBReaderTest extends InstrumentationTestCase { downloaded.add(item); } } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setFeedItemlist(downloaded); adapter.close(); @@ -215,10 +205,9 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetDownloadedItems() { - final Context context = getInstrumentation().getTargetContext(); final int numItems = 10; List<FeedItem> downloaded = saveDownloadedItems(numItems); - List<FeedItem> downloaded_saved = DBReader.getDownloadedItems(context); + List<FeedItem> downloaded_saved = DBReader.getDownloadedItems(); assertNotNull(downloaded_saved); assertTrue(downloaded_saved.size() == downloaded.size()); for (FeedItem item : downloaded_saved) { @@ -232,13 +221,12 @@ public class DBReaderTest extends InstrumentationTestCase { if (numItems <= 0) { throw new IllegalArgumentException("numItems<=0"); } - final Context context = getInstrumentation().getTargetContext(); - List<Feed> feeds = saveFeedlist(context, numItems, numItems, true); - List<FeedItem> items = new ArrayList<FeedItem>(); + List<Feed> feeds = saveFeedlist(numItems, numItems, true); + List<FeedItem> items = new ArrayList<>(); for (Feed f : feeds) { items.addAll(f.getItems()); } - List<FeedItem> unread = new ArrayList<FeedItem>(); + List<FeedItem> unread = new ArrayList<>(); Random random = new Random(); while (unread.size() < numItems) { @@ -249,7 +237,7 @@ public class DBReaderTest extends InstrumentationTestCase { unread.add(item); } } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setFeedItemlist(unread); adapter.close(); @@ -257,11 +245,10 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetUnreadItemsList() { - final Context context = getInstrumentation().getTargetContext(); final int numItems = 10; List<FeedItem> unread = saveUnreadItems(numItems); - List<FeedItem> unreadSaved = DBReader.getUnreadItemsList(context); + List<FeedItem> unreadSaved = DBReader.getUnreadItemsList(); assertNotNull(unreadSaved); assertTrue(unread.size() == unreadSaved.size()); for (FeedItem item : unreadSaved) { @@ -270,7 +257,6 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetNewItemIds() { - final Context context = getInstrumentation().getTargetContext(); final int numItems = 10; List<FeedItem> unread = saveUnreadItems(numItems); @@ -278,7 +264,7 @@ public class DBReaderTest extends InstrumentationTestCase { for (int i = 0; i < unread.size(); i++) { unreadIds[i] = unread.get(i).getId(); } - List<FeedItem> unreadSaved = DBReader.getUnreadItemsList(context); + List<FeedItem> unreadSaved = DBReader.getUnreadItemsList(); assertNotNull(unreadSaved); assertTrue(unread.size() == unreadSaved.size()); for(int i=0; i < unreadSaved.size(); i++) { @@ -295,16 +281,15 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetPlaybackHistory() { - final Context context = getInstrumentation().getTargetContext(); final int numItems = (DBReader.PLAYBACK_HISTORY_SIZE + 1) * 2; final int playedItems = DBReader.PLAYBACK_HISTORY_SIZE + 1; final int numReturnedItems = Math.min(playedItems, DBReader.PLAYBACK_HISTORY_SIZE); final int numFeeds = 1; - Feed feed = DBTestUtils.saveFeedlist(context, numFeeds, numItems, true).get(0); + Feed feed = DBTestUtils.saveFeedlist(numFeeds, numItems, true).get(0); long[] ids = new long[playedItems]; - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); for (int i = 0; i < playedItems; i++) { FeedMedia m = feed.getItems().get(i).getMedia(); @@ -314,7 +299,7 @@ public class DBReaderTest extends InstrumentationTestCase { } adapter.close(); - List<FeedItem> saved = DBReader.getPlaybackHistory(context); + List<FeedItem> saved = DBReader.getPlaybackHistory(); assertNotNull(saved); assertEquals("Wrong size: ", numReturnedItems, saved.size()); for (int i = 0; i < numReturnedItems; i++) { @@ -325,11 +310,10 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetFeedStatisticsCheckOrder() { - final Context context = getInstrumentation().getTargetContext(); final int NUM_FEEDS = 10; final int NUM_ITEMS = 10; - List<Feed> feeds = DBTestUtils.saveFeedlist(context, NUM_FEEDS, NUM_ITEMS, false); - List<FeedItemStatistics> statistics = DBReader.getFeedStatisticsList(context); + List<Feed> feeds = DBTestUtils.saveFeedlist(NUM_FEEDS, NUM_ITEMS, false); + List<FeedItemStatistics> statistics = DBReader.getFeedStatisticsList(); assertNotNull(statistics); assertEquals(feeds.size(), statistics.size()); for (int i = 0; i < NUM_FEEDS; i++) { @@ -338,31 +322,29 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetNavDrawerDataQueueEmptyNoUnreadItems() { - final Context context = getInstrumentation().getTargetContext(); final int NUM_FEEDS = 10; final int NUM_ITEMS = 10; - List<Feed> feeds = DBTestUtils.saveFeedlist(context, NUM_FEEDS, NUM_ITEMS, true); - DBReader.NavDrawerData navDrawerData = DBReader.getNavDrawerData(context); + List<Feed> feeds = DBTestUtils.saveFeedlist(NUM_FEEDS, NUM_ITEMS, true); + DBReader.NavDrawerData navDrawerData = DBReader.getNavDrawerData(); assertEquals(NUM_FEEDS, navDrawerData.feeds.size()); assertEquals(0, navDrawerData.numNewItems); assertEquals(0, navDrawerData.queueSize); } public void testGetNavDrawerDataQueueNotEmptyWithUnreadItems() { - final Context context = getInstrumentation().getTargetContext(); final int NUM_FEEDS = 10; final int NUM_ITEMS = 10; final int NUM_QUEUE = 1; final int NUM_NEW = 2; - List<Feed> feeds = DBTestUtils.saveFeedlist(context, NUM_FEEDS, NUM_ITEMS, true); - PodDBAdapter adapter = new PodDBAdapter(context); + List<Feed> feeds = DBTestUtils.saveFeedlist(NUM_FEEDS, NUM_ITEMS, true); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); for (int i = 0; i < NUM_NEW; i++) { FeedItem item = feeds.get(0).getItems().get(i); item.setNew(); adapter.setSingleFeedItem(item); } - List<FeedItem> queue = new ArrayList<FeedItem>(); + List<FeedItem> queue = new ArrayList<>(); for (int i = 0; i < NUM_QUEUE; i++) { FeedItem item = feeds.get(1).getItems().get(i); queue.add(item); @@ -371,7 +353,7 @@ public class DBReaderTest extends InstrumentationTestCase { adapter.close(); - DBReader.NavDrawerData navDrawerData = DBReader.getNavDrawerData(context); + DBReader.NavDrawerData navDrawerData = DBReader.getNavDrawerData(); assertEquals(NUM_FEEDS, navDrawerData.feeds.size()); assertEquals(NUM_NEW, navDrawerData.numNewItems); assertEquals(NUM_QUEUE, navDrawerData.queueSize); @@ -379,7 +361,7 @@ public class DBReaderTest extends InstrumentationTestCase { public void testGetFeedItemlistCheckChaptersFalse() throws Exception { Context context = getInstrumentation().getTargetContext(); - List<Feed> feeds = DBTestUtils.saveFeedlist(context, 10, 10, false, false, 0); + List<Feed> feeds = DBTestUtils.saveFeedlist(10, 10, false, false, 0); for (Feed feed : feeds) { for (FeedItem item : feed.getItems()) { assertFalse(item.hasChapters()); @@ -388,8 +370,7 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetFeedItemlistCheckChaptersTrue() throws Exception { - Context context = getInstrumentation().getTargetContext(); - List<Feed> feeds = saveFeedlist(context, 10, 10, false, true, 10); + List<Feed> feeds = saveFeedlist(10, 10, false, true, 10); for (Feed feed : feeds) { for (FeedItem item : feed.getItems()) { assertTrue(item.hasChapters()); @@ -398,13 +379,12 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testLoadChaptersOfFeedItemNoChapters() throws Exception { - Context context = getInstrumentation().getTargetContext(); - List<Feed> feeds = saveFeedlist(context, 1, 3, false, false, 0); - saveFeedlist(context, 1, 3, false, true, 3); + List<Feed> feeds = saveFeedlist(1, 3, false, false, 0); + saveFeedlist(1, 3, false, true, 3); for (Feed feed : feeds) { for (FeedItem item : feed.getItems()) { assertFalse(item.hasChapters()); - DBReader.loadChaptersOfFeedItem(context, item); + DBReader.loadChaptersOfFeedItem(item); assertFalse(item.hasChapters()); assertNull(item.getChapters()); } @@ -412,14 +392,13 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testLoadChaptersOfFeedItemWithChapters() throws Exception { - Context context = getInstrumentation().getTargetContext(); final int NUM_CHAPTERS = 3; - DBTestUtils.saveFeedlist(context, 1, 3, false, false, 0); - List<Feed> feeds = saveFeedlist(context, 1, 3, false, true, NUM_CHAPTERS); + DBTestUtils.saveFeedlist(1, 3, false, false, 0); + List<Feed> feeds = saveFeedlist(1, 3, false, true, NUM_CHAPTERS); for (Feed feed : feeds) { for (FeedItem item : feed.getItems()) { assertTrue(item.hasChapters()); - DBReader.loadChaptersOfFeedItem(context, item); + DBReader.loadChaptersOfFeedItem(item); assertTrue(item.hasChapters()); assertNotNull(item.getChapters()); assertEquals(NUM_CHAPTERS, item.getChapters().size()); @@ -428,11 +407,10 @@ public class DBReaderTest extends InstrumentationTestCase { } public void testGetItemWithChapters() throws Exception { - Context context = getInstrumentation().getTargetContext(); final int NUM_CHAPTERS = 3; - List<Feed> feeds = saveFeedlist(context, 1, 1, false, true, NUM_CHAPTERS); + List<Feed> feeds = saveFeedlist(1, 1, false, true, NUM_CHAPTERS); FeedItem item1 = feeds.get(0).getItems().get(0); - FeedItem item2 = DBReader.getFeedItem(context, item1.getId()); + FeedItem item2 = DBReader.getFeedItem(item1.getId()); assertTrue(item2.hasChapters()); assertEquals(item1.getChapters(), item2.getChapters()); } 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 944fc7792..024b506d9 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBTasksTest.java @@ -12,7 +12,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; -import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; @@ -21,7 +20,6 @@ import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBTasks; import de.danoeh.antennapod.core.storage.PodDBAdapter; -import de.danoeh.antennapod.core.util.flattr.FlattrStatus; import static de.test.antennapod.storage.DBTestUtils.saveFeedlist; @@ -40,7 +38,8 @@ public class DBTasksTest extends InstrumentationTestCase { @Override protected void tearDown() throws Exception { super.tearDown(); - assertTrue(PodDBAdapter.deleteDatabase(context)); + + assertTrue(PodDBAdapter.deleteDatabase()); for (File f : destFolder.listFiles()) { assertTrue(f.delete()); @@ -58,9 +57,9 @@ public class DBTasksTest extends InstrumentationTestCase { assertTrue(destFolder.exists()); assertTrue(destFolder.canWrite()); - context.deleteDatabase(PodDBAdapter.DATABASE_NAME); - // make sure database is created - PodDBAdapter adapter = new PodDBAdapter(context); + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.close(); @@ -76,9 +75,9 @@ public class DBTasksTest extends InstrumentationTestCase { final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; Feed feed = new Feed("url", new Date(), "title"); - List<FeedItem> items = new ArrayList<FeedItem>(); + List<FeedItem> items = new ArrayList<>(); feed.setItems(items); - List<File> files = new ArrayList<File>(); + List<File> files = new ArrayList<>(); for (int i = 0; i < NUM_ITEMS; i++) { FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); @@ -89,7 +88,7 @@ public class DBTasksTest extends InstrumentationTestCase { items.add(item); } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -128,7 +127,7 @@ public class DBTasksTest extends InstrumentationTestCase { items.add(item); } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -149,9 +148,9 @@ public class DBTasksTest extends InstrumentationTestCase { final int NUM_ITEMS = EPISODE_CACHE_SIZE * 2; Feed feed = new Feed("url", new Date(), "title"); - List<FeedItem> items = new ArrayList<FeedItem>(); + List<FeedItem> items = new ArrayList<>(); feed.setItems(items); - List<File> files = new ArrayList<File>(); + List<File> files = new ArrayList<>(); for (int i = 0; i < NUM_ITEMS; i++) { FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); @@ -163,7 +162,7 @@ public class DBTasksTest extends InstrumentationTestCase { items.add(item); } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.setQueue(items); @@ -188,14 +187,14 @@ public class DBTasksTest extends InstrumentationTestCase { @FlakyTest(tolerance = 3) public void testPerformAutoCleanupShouldNotDeleteBecauseInQueue_withFeedsWithNoMedia() throws IOException { // add feed with no enclosures so that item ID != media ID - saveFeedlist(context, 1, 10, false); + saveFeedlist(1, 10, false); // add candidate for performAutoCleanup - List<Feed> feeds = saveFeedlist(context, 1, 1, true); + List<Feed> feeds = saveFeedlist(1, 1, true); FeedMedia m = feeds.get(0).getItems().get(0).getMedia(); m.setDownloaded(true); m.setFile_url("file"); - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setMedia(m); adapter.close(); @@ -208,7 +207,7 @@ public class DBTasksTest extends InstrumentationTestCase { final int NUM_ITEMS = 10; Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); for (int i = 0; i < NUM_ITEMS; i++) { feed.getItems().add(new FeedItem(0, "item " + i, "id " + i, "link " + i, new Date(), FeedItem.UNPLAYED, feed)); } @@ -228,8 +227,8 @@ public class DBTasksTest extends InstrumentationTestCase { Feed feed1 = new Feed("url1", new Date(), "title"); Feed feed2 = new Feed("url2", new Date(), "title"); - feed1.setItems(new ArrayList<FeedItem>()); - feed2.setItems(new ArrayList<FeedItem>()); + feed1.setItems(new ArrayList<>()); + feed2.setItems(new ArrayList<>()); Feed savedFeed1 = DBTasks.updateFeed(context, feed1)[0]; Feed savedFeed2 = DBTasks.updateFeed(context, feed2)[0]; @@ -242,11 +241,11 @@ public class DBTasksTest extends InstrumentationTestCase { final int NUM_ITEMS_NEW = 10; final Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); for (int i = 0; i < NUM_ITEMS_OLD; i++) { feed.getItems().add(new FeedItem(0, "item " + i, "id " + i, "link " + i, new Date(i), FeedItem.PLAYED, feed)); } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -271,7 +270,7 @@ public class DBTasksTest extends InstrumentationTestCase { updatedFeedTest(newFeed, feedID, itemIDs, NUM_ITEMS_OLD, NUM_ITEMS_NEW); - final Feed feedFromDB = DBReader.getFeed(context, newFeed.getId()); + final Feed feedFromDB = DBReader.getFeed(newFeed.getId()); assertNotNull(feedFromDB); assertTrue(feedFromDB.getId() == newFeed.getId()); updatedFeedTest(feedFromDB, feedID, itemIDs, NUM_ITEMS_OLD, NUM_ITEMS_NEW); diff --git a/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java b/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java index c6f702f3d..0af8afa83 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBTestUtils.java @@ -1,7 +1,5 @@ package de.test.antennapod.storage; -import android.content.Context; - import junit.framework.Assert; import java.util.ArrayList; @@ -26,14 +24,14 @@ public class DBTestUtils { /** * Use this method when tests don't involve chapters. */ - public static List<Feed> saveFeedlist(Context context, int numFeeds, int numItems, boolean withMedia) { - return saveFeedlist(context, numFeeds, numItems, withMedia, false, 0); + public static List<Feed> saveFeedlist(int numFeeds, int numItems, boolean withMedia) { + return saveFeedlist(numFeeds, numItems, withMedia, false, 0); } /** * Use this method when tests involve chapters. */ - public static List<Feed> saveFeedlist(Context context, int numFeeds, int numItems, boolean withMedia, + public static List<Feed> saveFeedlist(int numFeeds, int numItems, boolean withMedia, boolean withChapters, int numChapters) { if (numFeeds <= 0) { throw new IllegalArgumentException("numFeeds<=0"); @@ -42,13 +40,13 @@ public class DBTestUtils { throw new IllegalArgumentException("numItems<0"); } - List<Feed> feeds = new ArrayList<Feed>(); - PodDBAdapter adapter = new PodDBAdapter(context); + List<Feed> feeds = new ArrayList<>(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); for (int i = 0; i < numFeeds; i++) { Feed f = new Feed(0, new Date(), "feed " + i, "link" + i, "descr", null, null, null, null, "id" + i, null, null, "url" + i, false, new FlattrStatus(), false, null, null, false); - f.setItems(new ArrayList<FeedItem>()); + f.setItems(new ArrayList<>()); for (int j = 0; j < numItems; j++) { FeedItem item = new FeedItem(0, "item " + j, "id" + j, "link" + j, new Date(), FeedItem.PLAYED, f, withChapters); 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 c5fa2f131..2a63ef4b3 100644 --- a/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java +++ b/app/src/androidTest/java/de/test/antennapod/storage/DBWriterTest.java @@ -29,6 +29,7 @@ import de.danoeh.antennapod.core.storage.PodDBAdapter; * Test class for DBWriter */ public class DBWriterTest extends InstrumentationTestCase { + private static final String TAG = "DBWriterTest"; private static final String TEST_FOLDER = "testDBWriter"; private static final long TIMEOUT = 5L; @@ -36,9 +37,10 @@ public class DBWriterTest extends InstrumentationTestCase { @Override protected void tearDown() throws Exception { super.tearDown(); - final Context context = getInstrumentation().getTargetContext(); - assertTrue(PodDBAdapter.deleteDatabase(getInstrumentation().getTargetContext())); + assertTrue(PodDBAdapter.deleteDatabase()); + + final Context context = getInstrumentation().getTargetContext(); File testDir = context.getExternalFilesDir(TEST_FOLDER); assertNotNull(testDir); for (File f : testDir.listFiles()) { @@ -49,10 +51,10 @@ public class DBWriterTest extends InstrumentationTestCase { @Override protected void setUp() throws Exception { super.setUp(); - final Context context = getInstrumentation().getTargetContext(); - context.deleteDatabase(PodDBAdapter.DATABASE_NAME); - // make sure database is created - PodDBAdapter adapter = new PodDBAdapter(context); + + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.close(); } @@ -63,7 +65,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertTrue(dest.createNewFile()); Feed feed = new Feed("url", new Date(), "title"); - List<FeedItem> items = new ArrayList<FeedItem>(); + List<FeedItem> items = new ArrayList<>(); feed.setItems(items); FeedItem item = new FeedItem(0, "Item", "Item", "url", new Date(), FeedItem.PLAYED, feed); @@ -72,7 +74,7 @@ public class DBWriterTest extends InstrumentationTestCase { items.add(item); - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -80,7 +82,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); DBWriter.deleteFeedMediaOfItem(getInstrumentation().getTargetContext(), media.getId()).get(); - media = DBReader.getFeedMedia(getInstrumentation().getTargetContext(), media.getId()); + media = DBReader.getFeedMedia(media.getId()); assertNotNull(media); assertFalse(dest.exists()); assertFalse(media.isDownloaded()); @@ -92,7 +94,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertNotNull(destFolder); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); // create Feed image File imgFile = new File(destFolder, "image"); @@ -118,7 +120,7 @@ public class DBWriterTest extends InstrumentationTestCase { item.getChapters().add(new SimpleChapter(0, "item " + i, item, "example.com")); } - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getContext()); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -139,7 +141,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertFalse(f.exists()); } - adapter = new PodDBAdapter(getInstrumentation().getContext()); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); assertEquals(0, c.getCount()); @@ -164,7 +166,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertNotNull(destFolder); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); feed.setImage(null); @@ -182,7 +184,7 @@ public class DBWriterTest extends InstrumentationTestCase { item.setMedia(media); } - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getContext()); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -200,7 +202,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertFalse(f.exists()); } - adapter = new PodDBAdapter(getInstrumentation().getContext()); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); assertTrue(c.getCount() == 0); @@ -229,7 +231,7 @@ public class DBWriterTest extends InstrumentationTestCase { image.setOwner(feed); feed.setImage(image); - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getContext()); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -242,7 +244,7 @@ public class DBWriterTest extends InstrumentationTestCase { // check if files still exist assertFalse(imgFile.exists()); - adapter = new PodDBAdapter(getInstrumentation().getContext()); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); assertTrue(c.getCount() == 0); @@ -257,7 +259,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertNotNull(destFolder); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); // create Feed image File imgFile = new File(destFolder, "image"); @@ -273,7 +275,7 @@ public class DBWriterTest extends InstrumentationTestCase { } - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getContext()); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -289,7 +291,7 @@ public class DBWriterTest extends InstrumentationTestCase { // check if files still exist assertFalse(imgFile.exists()); - adapter = new PodDBAdapter(getInstrumentation().getContext()); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); assertTrue(c.getCount() == 0); @@ -309,7 +311,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertNotNull(destFolder); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); // create Feed image File imgFile = new File(destFolder, "image"); @@ -327,7 +329,7 @@ public class DBWriterTest extends InstrumentationTestCase { item.setImage(itemImage); } - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getContext()); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -344,7 +346,7 @@ public class DBWriterTest extends InstrumentationTestCase { // check if files still exist assertFalse(imgFile.exists()); - adapter = new PodDBAdapter(getInstrumentation().getContext()); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); assertTrue(c.getCount() == 0); @@ -367,7 +369,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertNotNull(destFolder); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); // create Feed image File imgFile = new File(destFolder, "image"); @@ -388,7 +390,7 @@ public class DBWriterTest extends InstrumentationTestCase { item.setMedia(media); } - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getContext()); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -460,7 +462,7 @@ public class DBWriterTest extends InstrumentationTestCase { item.setMedia(media); } - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getContext()); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -474,7 +476,7 @@ public class DBWriterTest extends InstrumentationTestCase { DBWriter.deleteFeed(getInstrumentation().getTargetContext(), feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); - adapter = new PodDBAdapter(getInstrumentation().getContext()); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor c = adapter.getFeedCursor(feed.getId()); assertTrue(c.getCount() == 0); @@ -500,7 +502,7 @@ public class DBWriterTest extends InstrumentationTestCase { FeedMedia media = new FeedMedia(0, item, 10, 0, 1, "mime", null, "url", false, playbackCompletionDate, 0); feed.getItems().add(item); item.setMedia(media); - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -509,13 +511,11 @@ public class DBWriterTest extends InstrumentationTestCase { } public void testAddItemToPlaybackHistoryNotPlayedYet() throws ExecutionException, InterruptedException { - final Context context = getInstrumentation().getTargetContext(); - FeedMedia media = playbackHistorySetup(null); - DBWriter.addItemToPlaybackHistory(context, media).get(); - PodDBAdapter adapter = new PodDBAdapter(context); + DBWriter.addItemToPlaybackHistory(media).get(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - media = DBReader.getFeedMedia(context, media.getId()); + media = DBReader.getFeedMedia(media.getId()); adapter.close(); assertNotNull(media); @@ -524,13 +524,12 @@ public class DBWriterTest extends InstrumentationTestCase { public void testAddItemToPlaybackHistoryAlreadyPlayed() throws ExecutionException, InterruptedException { final long OLD_DATE = 0; - final Context context = getInstrumentation().getTargetContext(); FeedMedia media = playbackHistorySetup(new Date(OLD_DATE)); - DBWriter.addItemToPlaybackHistory(getInstrumentation().getTargetContext(), media).get(); - PodDBAdapter adapter = new PodDBAdapter(context); + DBWriter.addItemToPlaybackHistory(media).get(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); - media = DBReader.getFeedMedia(context, media.getId()); + media = DBReader.getFeedMedia(media.getId()); adapter.close(); assertNotNull(media); @@ -541,13 +540,13 @@ public class DBWriterTest extends InstrumentationTestCase { private Feed queueTestSetupMultipleItems(final int NUM_ITEMS) throws InterruptedException, ExecutionException, TimeoutException { final Context context = getInstrumentation().getTargetContext(); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); for (int i = 0; i < NUM_ITEMS; i++) { FeedItem item = new FeedItem(0, "title " + i, "id " + i, "link " + i, new Date(), FeedItem.PLAYED, feed); feed.getItems().add(item); } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -568,11 +567,11 @@ public class DBWriterTest extends InstrumentationTestCase { public void testAddQueueItemSingleItem() throws InterruptedException, ExecutionException, TimeoutException { final Context context = getInstrumentation().getTargetContext(); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); feed.getItems().add(item); - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -580,7 +579,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); DBWriter.addQueueItem(context, item.getId()).get(TIMEOUT, TimeUnit.SECONDS); - adapter = new PodDBAdapter(context); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor cursor = adapter.getQueueIDCursor(); assertTrue(cursor.moveToFirst()); @@ -592,11 +591,11 @@ public class DBWriterTest extends InstrumentationTestCase { public void testAddQueueItemSingleItemAlreadyInQueue() throws InterruptedException, ExecutionException, TimeoutException { final Context context = getInstrumentation().getTargetContext(); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); feed.getItems().add(item); - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -604,7 +603,7 @@ public class DBWriterTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); DBWriter.addQueueItem(context, item.getId()).get(TIMEOUT, TimeUnit.SECONDS); - adapter = new PodDBAdapter(context); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor cursor = adapter.getQueueIDCursor(); assertTrue(cursor.moveToFirst()); @@ -613,7 +612,7 @@ public class DBWriterTest extends InstrumentationTestCase { adapter.close(); DBWriter.addQueueItem(context, item.getId()).get(TIMEOUT, TimeUnit.SECONDS); - adapter = new PodDBAdapter(context); + adapter = PodDBAdapter.getInstance(); adapter.open(); cursor = adapter.getQueueIDCursor(); assertTrue(cursor.moveToFirst()); @@ -628,7 +627,7 @@ public class DBWriterTest extends InstrumentationTestCase { final int NUM_ITEMS = 10; Feed feed = queueTestSetupMultipleItems(NUM_ITEMS); - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor cursor = adapter.getQueueIDCursor(); assertTrue(cursor.moveToFirst()); @@ -642,12 +641,11 @@ public class DBWriterTest extends InstrumentationTestCase { } public void testClearQueue() throws InterruptedException, ExecutionException, TimeoutException { - final Context context = getInstrumentation().getTargetContext(); final int NUM_ITEMS = 10; Feed feed = queueTestSetupMultipleItems(NUM_ITEMS); - DBWriter.clearQueue(context).get(TIMEOUT, TimeUnit.SECONDS); - PodDBAdapter adapter = new PodDBAdapter(context); + DBWriter.clearQueue().get(TIMEOUT, TimeUnit.SECONDS); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor cursor = adapter.getQueueIDCursor(); assertFalse(cursor.moveToFirst()); @@ -659,13 +657,13 @@ public class DBWriterTest extends InstrumentationTestCase { final int NUM_ITEMS = 10; final Context context = getInstrumentation().getTargetContext(); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); for (int i = 0; i < NUM_ITEMS; i++) { FeedItem item = new FeedItem(0, "title " + i, "id " + i, "link " + i, new Date(), FeedItem.PLAYED, feed); feed.getItems().add(item); } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -675,13 +673,13 @@ public class DBWriterTest extends InstrumentationTestCase { } for (int removeIndex = 0; removeIndex < NUM_ITEMS; removeIndex++) { final FeedItem item = feed.getItems().get(removeIndex); - adapter = new PodDBAdapter(context); + adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setQueue(feed.getItems()); adapter.close(); DBWriter.removeQueueItem(context, item, false).get(TIMEOUT, TimeUnit.SECONDS); - adapter = new PodDBAdapter(context); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor queue = adapter.getQueueIDCursor(); assertTrue(queue.getCount() == NUM_ITEMS - 1); @@ -703,15 +701,14 @@ public class DBWriterTest extends InstrumentationTestCase { public void testMoveQueueItem() throws InterruptedException, ExecutionException, TimeoutException { final int NUM_ITEMS = 10; - final Context context = getInstrumentation().getTargetContext(); Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); for (int i = 0; i < NUM_ITEMS; i++) { FeedItem item = new FeedItem(0, "title " + i, "id " + i, "link " + i, new Date(), FeedItem.PLAYED, feed); feed.getItems().add(item); } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -727,13 +724,13 @@ public class DBWriterTest extends InstrumentationTestCase { Log.d(TAG, String.format("testMoveQueueItem: From=%d, To=%d", from, to)); final long fromID = feed.getItems().get(from).getId(); - adapter = new PodDBAdapter(context); + adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setQueue(feed.getItems()); adapter.close(); - DBWriter.moveQueueItem(context, from, to, false).get(TIMEOUT, TimeUnit.SECONDS); - adapter = new PodDBAdapter(context); + DBWriter.moveQueueItem(from, to, false).get(TIMEOUT, TimeUnit.SECONDS); + adapter = PodDBAdapter.getInstance(); adapter.open(); Cursor queue = adapter.getQueueIDCursor(); assertTrue(queue.getCount() == NUM_ITEMS); @@ -749,7 +746,6 @@ public class DBWriterTest extends InstrumentationTestCase { } public void testMarkFeedRead() throws InterruptedException, ExecutionException, TimeoutException { - final Context context = getInstrumentation().getTargetContext(); final int NUM_ITEMS = 10; Feed feed = new Feed("url", new Date(), "title"); feed.setItems(new ArrayList<FeedItem>()); @@ -758,7 +754,7 @@ public class DBWriterTest extends InstrumentationTestCase { feed.getItems().add(item); } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -768,24 +764,23 @@ public class DBWriterTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); } - DBWriter.markFeedRead(context, feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); - List<FeedItem> loadedItems = DBReader.getFeedItemList(context, feed); + DBWriter.markFeedRead(feed.getId()).get(TIMEOUT, TimeUnit.SECONDS); + List<FeedItem> loadedItems = DBReader.getFeedItemList(feed); for (FeedItem item : loadedItems) { assertTrue(item.isPlayed()); } } public void testMarkAllItemsReadSameFeed() throws InterruptedException, ExecutionException, TimeoutException { - final Context context = getInstrumentation().getTargetContext(); final int NUM_ITEMS = 10; Feed feed = new Feed("url", new Date(), "title"); - feed.setItems(new ArrayList<FeedItem>()); + feed.setItems(new ArrayList<>()); for (int i = 0; i < NUM_ITEMS; i++) { FeedItem item = new FeedItem(0, "title " + i, "id " + i, "link " + i, new Date(), FeedItem.UNPLAYED, feed); feed.getItems().add(item); } - PodDBAdapter adapter = new PodDBAdapter(context); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.setCompleteFeed(feed); adapter.close(); @@ -795,8 +790,8 @@ public class DBWriterTest extends InstrumentationTestCase { assertTrue(item.getId() != 0); } - DBWriter.markAllItemsRead(context).get(TIMEOUT, TimeUnit.SECONDS); - List<FeedItem> loadedItems = DBReader.getFeedItemList(context, feed); + DBWriter.markAllItemsRead().get(TIMEOUT, TimeUnit.SECONDS); + List<FeedItem> loadedItems = DBReader.getFeedItemList(feed); for (FeedItem item : loadedItems) { assertTrue(item.isPlayed()); } 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 286095210..f6c3d0e7d 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/MainActivityTest.java @@ -18,9 +18,8 @@ import de.danoeh.antennapod.activity.OnlineFeedViewActivity; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.PodDBAdapter; -import de.danoeh.antennapod.fragment.AllEpisodesFragment; import de.danoeh.antennapod.fragment.DownloadsFragment; -import de.danoeh.antennapod.fragment.NewEpisodesFragment; +import de.danoeh.antennapod.fragment.EpisodesFragment; import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.preferences.PreferenceController; @@ -45,8 +44,10 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv solo = new Solo(getInstrumentation(), getActivity()); uiTestUtils = new UITestUtils(getInstrumentation().getTargetContext()); uiTestUtils.setup(); - // create database - PodDBAdapter adapter = new PodDBAdapter(getInstrumentation().getTargetContext()); + + // create new database + PodDBAdapter.deleteDatabase(); + PodDBAdapter adapter = PodDBAdapter.getInstance(); adapter.open(); adapter.close(); @@ -60,7 +61,7 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv uiTestUtils.tearDown(); solo.finishOpenedActivities(); - PodDBAdapter.deleteDatabase(getInstrumentation().getTargetContext()); + PodDBAdapter.deleteDatabase(); // reset preferences prefs.edit().clear().commit(); @@ -98,17 +99,11 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv solo.waitForView(android.R.id.list); assertEquals(solo.getString(R.string.queue_label), getActionbarTitle()); - // new episodes + // episodes openNavDrawer(); - solo.clickOnText(solo.getString(R.string.new_episodes_label)); + solo.clickOnText(solo.getString(R.string.episodes_label)); solo.waitForView(android.R.id.list); - assertEquals(solo.getString(R.string.new_episodes_label), getActionbarTitle()); - - // all episodes - openNavDrawer(); - solo.clickOnText(solo.getString(R.string.all_episodes_label)); - solo.waitForView(android.R.id.list); - assertEquals(solo.getString(R.string.all_episodes_label), getActionbarTitle()); + assertEquals(solo.getString(R.string.episodes_label), getActionbarTitle()); // downloads openNavDrawer(); @@ -156,18 +151,18 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv openNavDrawer(); solo.clickLongOnText(solo.getString(R.string.queue_label)); solo.waitForDialogToOpen(); - solo.clickOnText(solo.getString(R.string.all_episodes_label)); + solo.clickOnText(solo.getString(R.string.episodes_label)); solo.clickOnText(solo.getString(R.string.playback_history_label)); solo.clickOnText(solo.getString(R.string.confirm_label)); solo.waitForDialogToClose(); List<String> hidden = UserPreferences.getHiddenDrawerItems(); assertEquals(2, hidden.size()); - assertTrue(hidden.contains(AllEpisodesFragment.TAG)); + assertTrue(hidden.contains(EpisodesFragment.TAG)); assertTrue(hidden.contains(PlaybackHistoryFragment.TAG)); } public void testDrawerPreferencesUnhideSomeElements() { - List<String> hidden = Arrays.asList(NewEpisodesFragment.TAG, DownloadsFragment.TAG); + List<String> hidden = Arrays.asList(PlaybackHistoryFragment.TAG, DownloadsFragment.TAG); UserPreferences.setHiddenDrawerItems(getInstrumentation().getTargetContext(), hidden); openNavDrawer(); solo.clickLongOnText(solo.getString(R.string.queue_label)); @@ -179,7 +174,7 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv hidden = UserPreferences.getHiddenDrawerItems(); assertEquals(2, hidden.size()); assertTrue(hidden.contains(QueueFragment.TAG)); - assertTrue(hidden.contains(NewEpisodesFragment.TAG)); + assertTrue(hidden.contains(PlaybackHistoryFragment.TAG)); } public void testDrawerPreferencesHideAllElements() { @@ -195,7 +190,7 @@ public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActiv solo.clickOnText(solo.getString(R.string.confirm_label)); solo.waitForDialogToClose(); List<String> hidden = UserPreferences.getHiddenDrawerItems(); - assertEquals(6, hidden.size()); + assertEquals(titles.length, hidden.size()); for(String tag : MainActivity.NAV_DRAWER_TAGS) { assertTrue(hidden.contains(tag)); } diff --git a/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java b/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java index 775bc0ecd..a27089726 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/PlaybackTest.java @@ -1,12 +1,16 @@ package de.test.antennapod.ui; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.test.ActivityInstrumentationTestCase2; +import android.test.FlakyTest; +import android.view.View; +import android.widget.ImageButton; +import android.widget.ListView; -import com.robotium.solo.Condition; import com.robotium.solo.Solo; import com.robotium.solo.Timeout; @@ -15,22 +19,122 @@ import java.util.List; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.MainActivity; import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; +import de.danoeh.antennapod.core.service.playback.PlayerStatus; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.PodDBAdapter; +import de.danoeh.antennapod.core.util.playback.Playable; +import de.danoeh.antennapod.core.util.playback.PlaybackController; /** - * Test cases for starting and ending playback from the MainActivity and AudioPlayerActivity + * test cases for starting and ending playback from the MainActivity and AudioPlayerActivity */ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> { + private static final String TAG = PlaybackTest.class.getSimpleName(); + public static final int EPISODES_DRAWER_LIST_INDEX = 1; + public static final int QUEUE_DRAWER_LIST_INDEX = 0; + private Solo solo; private UITestUtils uiTestUtils; private Context context; + private PlaybackController controller; + protected FeedMedia currentMedia; + + private PlaybackController createController(Activity activity) { + return new PlaybackController(activity, false) { + + @Override + public void setupGUI() { + } + + @Override + public void onPositionObserverUpdate() { + } + + @Override + public void onBufferStart() { + } + + @Override + public void onBufferEnd() { + } + + @Override + public void onBufferUpdate(float progress) { + } + + @Override + public void handleError(int code) { + } + + @Override + public void onReloadNotification(int code) { + } + + @Override + public void onSleepTimerUpdate() { + } + + @Override + public ImageButton getPlayButton() { + return null; + } + + @Override + public void postStatusMsg(int msg) { + } + + @Override + public void clearStatusMsg() { + } + + @Override + public boolean loadMediaInfo() { + Playable playable = controller.getMedia(); + if(playable == null) { + currentMedia = null; + return true; + } else if(playable instanceof FeedMedia) { + currentMedia = (FeedMedia) playable; + return true; + } else { + return false; + } + } + + @Override + public void onAwaitingVideoSurface() { + } + + @Override + public void onServiceQueried() { + } + + @Override + public void onShutdownNotification() { + } + + @Override + public void onPlaybackEnd() { + currentMedia = null; + } + + @Override + public void onPlaybackSpeedChange() { + } + + @Override + protected void setScreenOn(boolean enable) { + } + }; + } + public PlaybackTest() { super(MainActivity.class); } @@ -38,30 +142,37 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> @Override public void setUp() throws Exception { super.setUp(); - solo = new Solo(getInstrumentation(), getActivity()); - context = getInstrumentation().getContext(); - uiTestUtils = new UITestUtils(context); - uiTestUtils.setup(); + PodDBAdapter.deleteDatabase(); - // create database - PodDBAdapter adapter = new PodDBAdapter(context); - adapter.open(); - adapter.close(); + context = getInstrumentation().getTargetContext(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.edit() + .clear() .putBoolean(UserPreferences.PREF_UNPAUSE_ON_HEADSET_RECONNECT, false) .putBoolean(UserPreferences.PREF_PAUSE_ON_HEADSET_DISCONNECT, false) - .putString(UserPreferences.PREF_HIDDEN_DRAWER_ITEMS, "") .commit(); + + controller = createController(getActivity()); + controller.init(); + + solo = new Solo(getInstrumentation(), getActivity()); + + uiTestUtils = new UITestUtils(context); + uiTestUtils.setup(); + + // create database + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); + adapter.close(); } @Override public void tearDown() throws Exception { - uiTestUtils.tearDown(); + controller.release(); solo.finishOpenedActivities(); - PodDBAdapter.deleteDatabase(context); + uiTestUtils.tearDown(); // shut down playback service skipEpisode(); @@ -86,86 +197,118 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> private void startLocalPlayback() { openNavDrawer(); - - solo.clickOnText(solo.getString(R.string.all_episodes_label)); - final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(context, 10); + // if we try to just click on plain old text then + // we might wind up clicking on the fragment title and not + // the drawer element like we want. + ListView drawerView = (ListView)solo.getView(R.id.nav_list); + // this should be 'Episodes' + View targetView = drawerView.getChildAt(EPISODES_DRAWER_LIST_INDEX); + solo.waitForView(targetView); + solo.clickOnView(targetView); + solo.waitForText(solo.getString(R.string.all_episodes_short_label)); + solo.clickOnText(solo.getString(R.string.all_episodes_short_label)); + + final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(10); assertTrue(solo.waitForView(solo.getView(R.id.butSecondaryAction))); solo.clickOnView(solo.getView(R.id.butSecondaryAction)); - assertTrue(solo.waitForView(solo.getView(R.id.butPlay))); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return episodes.get(0).getMedia().isCurrentlyPlaying(); + long mediaId = episodes.get(0).getMedia().getId(); + boolean playing = solo.waitForCondition(() -> { + if (currentMedia != null) { + return currentMedia.getId() == mediaId; + } else { + return false; } - }, Timeout.getLargeTimeout()); + }, Timeout.getSmallTimeout()); + assertTrue(playing); } private void startLocalPlaybackFromQueue() { + openNavDrawer(); + + // if we try to just click on plain old text then + // we might wind up clicking on the fragment title and not + // the drawer element like we want. + ListView drawerView = (ListView)solo.getView(R.id.nav_list); + // this should be 'Queue' + View targetView = drawerView.getChildAt(QUEUE_DRAWER_LIST_INDEX); + solo.waitForView(targetView); + solo.clickOnView(targetView); + assertTrue(solo.waitForView(solo.getView(R.id.butSecondaryAction))); - final List<FeedItem> queue = DBReader.getQueue(context); + final List<FeedItem> queue = DBReader.getQueue(); solo.clickOnImageButton(1); assertTrue(solo.waitForView(solo.getView(R.id.butPlay))); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return queue.get(0).getMedia().isCurrentlyPlaying(); + long mediaId = queue.get(0).getMedia().getId(); + boolean playing = solo.waitForCondition(() -> { + if(currentMedia != null) { + return currentMedia.getId() == mediaId; + } else { + return false; } - }, Timeout.getLargeTimeout()); + }, Timeout.getSmallTimeout()); + assertTrue(playing); } public void testStartLocal() throws Exception { uiTestUtils.addLocalFeedData(true); - DBWriter.clearQueue(context).get(); + DBWriter.clearQueue().get(); startLocalPlayback(); } public void testContinousPlaybackOffSingleEpisode() throws Exception { setContinuousPlaybackPreference(false); uiTestUtils.addLocalFeedData(true); - DBWriter.clearQueue(context).get(); + DBWriter.clearQueue().get(); startLocalPlayback(); } - + @FlakyTest(tolerance = 3) public void testContinousPlaybackOffMultipleEpisodes() throws Exception { setContinuousPlaybackPreference(false); uiTestUtils.addLocalFeedData(true); - List<FeedItem> queue = DBReader.getQueue(context); + List<FeedItem> queue = DBReader.getQueue(); final FeedItem first = queue.get(0); - final FeedItem second = queue.get(1); startLocalPlaybackFromQueue(); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return first.getMedia().isCurrentlyPlaying() == false; + boolean stopped = solo.waitForCondition(() -> { + if (currentMedia != null) { + return currentMedia.getId() != first.getMedia().getId(); + } else { + return false; } - }, 10000); + }, Timeout.getSmallTimeout()); + assertTrue(stopped); Thread.sleep(1000); - assertTrue(second.getMedia().isCurrentlyPlaying() == false); + PlayerStatus status = controller.getStatus(); + assertFalse(status.equals(PlayerStatus.PLAYING)); } + @FlakyTest(tolerance = 3) public void testContinuousPlaybackOnMultipleEpisodes() throws Exception { setContinuousPlaybackPreference(true); uiTestUtils.addLocalFeedData(true); - List<FeedItem> queue = DBReader.getQueue(context); + List<FeedItem> queue = DBReader.getQueue(); final FeedItem first = queue.get(0); final FeedItem second = queue.get(1); startLocalPlaybackFromQueue(); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return first.getMedia().isCurrentlyPlaying() == false; + boolean firstPlaying = solo.waitForCondition(() -> { + if (currentMedia != null) { + return currentMedia.getId() == first.getMedia().getId(); + } else { + return false; } - }, 10000); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return second.getMedia().isCurrentlyPlaying() == true; + }, Timeout.getSmallTimeout()); + assertTrue(firstPlaying); + boolean secondPlaying = solo.waitForCondition(() -> { + if (currentMedia != null) { + return currentMedia.getId() == second.getMedia().getId(); + } else { + return false; } - }, 10000); + }, Timeout.getLargeTimeout()); + assertTrue(secondPlaying); } /** @@ -174,24 +317,34 @@ public class PlaybackTest extends ActivityInstrumentationTestCase2<MainActivity> private void replayEpisodeCheck(boolean followQueue) throws Exception { setContinuousPlaybackPreference(followQueue); uiTestUtils.addLocalFeedData(true); - DBWriter.clearQueue(context).get(); - final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(context, 10); + DBWriter.clearQueue().get(); + final List<FeedItem> episodes = DBReader.getRecentlyPublishedEpisodes(10); startLocalPlayback(); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return false == episodes.get(0).getMedia().isCurrentlyPlaying(); + long mediaId = episodes.get(0).getMedia().getId(); + boolean startedPlaying = solo.waitForCondition(() -> { + if (currentMedia != null) { + return currentMedia.getId() == mediaId; + } else { + return false; } + }, Timeout.getSmallTimeout()); + assertTrue(startedPlaying); + + boolean stoppedPlaying = solo.waitForCondition(() -> { + return currentMedia == null || currentMedia.getId() != mediaId; }, Timeout.getLargeTimeout()); + assertTrue(stoppedPlaying); startLocalPlayback(); - solo.waitForCondition(new Condition() { - @Override - public boolean isSatisfied() { - return false == episodes.get(0).getMedia().isCurrentlyPlaying(); + boolean startedReplay = solo.waitForCondition(() -> { + if(currentMedia != null) { + return currentMedia.getId() == mediaId; + } else { + return false; } }, Timeout.getLargeTimeout()); + assertTrue(startedReplay); } public void testReplayEpisodeContinuousPlaybackOn() throws Exception { diff --git a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java index 7bbc6e462..9859e7534 100644 --- a/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java +++ b/app/src/androidTest/java/de/test/antennapod/ui/UITestUtils.java @@ -4,6 +4,7 @@ import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.os.Build; +import android.util.Log; import junit.framework.Assert; @@ -38,6 +39,8 @@ import de.test.antennapod.util.syndication.feedgenerator.RSS2Generator; @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class UITestUtils { + private static final String TAG = UITestUtils.class.getSimpleName(); + private static final String DATA_FOLDER = "test/UITestUtils"; public static final int NUM_FEEDS = 5; @@ -79,7 +82,7 @@ public class UITestUtils { server.stop(); if (localFeedDataAdded) { - PodDBAdapter.deleteDatabase(context); + PodDBAdapter.deleteDatabase(); } } @@ -174,16 +177,15 @@ public class UITestUtils { */ public void addLocalFeedData(boolean downloadEpisodes) throws Exception { if (localFeedDataAdded) { - throw new IllegalStateException("addLocalFeedData was called twice on the same instance"); + Log.w(TAG, "addLocalFeedData was called twice on the same instance"); + // might be a flaky test, this is actually not that severe + return; } if (!feedDataHosted) { addHostedFeedData(); } - List<FeedItem> queue = new ArrayList<FeedItem>(); - - PodDBAdapter adapter = new PodDBAdapter(context); - adapter.open(); + List<FeedItem> queue = new ArrayList<>(); for (Feed feed : hostedFeeds) { feed.setDownloaded(true); if (feed.getImage() != null) { @@ -206,6 +208,10 @@ public class UITestUtils { queue.add(feed.getItems().get(0)); feed.getItems().get(1).getMedia().setPlaybackCompletionDate(new Date()); } + localFeedDataAdded = true; + + PodDBAdapter adapter = PodDBAdapter.getInstance(); + adapter.open(); adapter.setCompleteFeed(hostedFeeds.toArray(new Feed[hostedFeeds.size()])); adapter.setQueue(queue); adapter.close(); diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 72e7752b1..117a008a8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.danoeh.antennapod" - android:versionCode="1030204" - android:versionName="1.3.2"> + android:versionCode="1040000" + android:versionName="1.4.0.0"> <!-- Version code schema: "1.2.3-SNAPSHOT" -> 1020300 diff --git a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java index 5442c6988..66d7a25f0 100644 --- a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java +++ b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java @@ -9,6 +9,7 @@ import com.joanzapata.iconify.fonts.FontAwesomeModule; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.spa.SPAUtil; @@ -40,6 +41,7 @@ public class PodcastApp extends Application { singleton = this; LOGICAL_DENSITY = getResources().getDisplayMetrics().density; + PodDBAdapter.init(this); UpdateManager.init(this); UserPreferences.init(this); PlaybackPreferences.init(this); diff --git a/app/src/main/java/de/danoeh/antennapod/UpdateManager.java b/app/src/main/java/de/danoeh/antennapod/UpdateManager.java index 2f6bb1b50..b1d7fffc8 100644 --- a/app/src/main/java/de/danoeh/antennapod/UpdateManager.java +++ b/app/src/main/java/de/danoeh/antennapod/UpdateManager.java @@ -65,9 +65,9 @@ public class UpdateManager { // from now on, Glide will handle caching images new Thread() { public void run() { - List<Feed> feeds = DBReader.getFeedList(context); + List<Feed> feeds = DBReader.getFeedList(); for (Feed podcast : feeds) { - List<FeedItem> episodes = DBReader.getFeedItemList(context, podcast); + List<FeedItem> episodes = DBReader.getFeedItemList(podcast); for (FeedItem episode : episodes) { FeedImage image = episode.getImage(); if (image != null && image.isDownloaded() && image.getFile_url() != null) { @@ -76,7 +76,7 @@ public class UpdateManager { imageFile.delete(); } image.setFile_url(null); // calls setDownloaded(false) - DBWriter.setFeedImage(context, image); + DBWriter.setFeedImage(image); } } } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java index c3d82c41d..417d49e83 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/AudioplayerActivity.java @@ -6,7 +6,6 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.drawable.BitmapDrawable; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; @@ -60,6 +59,10 @@ import de.danoeh.antennapod.fragment.CoverFragment; import de.danoeh.antennapod.fragment.ItemDescriptionFragment; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; import de.danoeh.antennapod.preferences.PreferenceController; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Activity for playing audio files. @@ -104,6 +107,8 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc private ImageButton butNavChaptersShownotes; private ImageButton butShowCover; + private Subscription subscription; + private PopupWindow popupWindow; private void resetFragmentView() { @@ -145,7 +150,9 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc protected void onStop() { super.onStop(); Log.d(TAG, "onStop()"); - cancelLoadTask(); + if(subscription != null) { + subscription.unsubscribe(); + } EventDistributor.getInstance().unregister(contentUpdate); } @@ -716,10 +723,10 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc Feed feed = navDrawerData.feeds.get(position - navAdapter.getSubscriptionOffset()); switch(item.getItemId()) { case R.id.mark_all_seen_item: - DBWriter.markFeedSeen(this, feed.getId()); + DBWriter.markFeedSeen(feed.getId()); return true; case R.id.mark_all_read_item: - DBWriter.markFeedRead(this, feed.getId()); + DBWriter.markFeedRead(feed.getId()); return true; case R.id.remove_item: final FeedRemover remover = new FeedRemover(this, feed) { @@ -747,32 +754,22 @@ public class AudioplayerActivity extends MediaplayerActivity implements ItemDesc private DBReader.NavDrawerData navDrawerData; - private AsyncTask<Void, Void, DBReader.NavDrawerData> loadTask; private void loadData() { - loadTask = new AsyncTask<Void, Void, DBReader.NavDrawerData>() { - @Override - protected DBReader.NavDrawerData doInBackground(Void... params) { - return DBReader.getNavDrawerData(AudioplayerActivity.this); - } - - @Override - protected void onPostExecute(DBReader.NavDrawerData result) { - super.onPostExecute(result); - navDrawerData = result; - if (navAdapter != null) { - navAdapter.notifyDataSetChanged(); - } - } - }; - loadTask.execute(); + subscription = Observable.defer(() -> Observable.just(DBReader.getNavDrawerData())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + navDrawerData = result; + if (navAdapter != null) { + navAdapter.notifyDataSetChanged(); + } + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } - private void cancelLoadTask() { - if (loadTask != null) { - loadTask.cancel(true); - } - } + private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() { diff --git a/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java index cc4d459c8..80883e4ae 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java @@ -26,7 +26,6 @@ import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.joanzapata.iconify.Iconify; import de.danoeh.antennapod.R; @@ -111,7 +110,7 @@ public class FeedInfoActivity extends ActionBarActivity { @Override protected Feed doInBackground(Long... params) { - return DBReader.getFeed(FeedInfoActivity.this, params[0]); + return DBReader.getFeed(params[0]); } @Override @@ -239,7 +238,7 @@ public class FeedInfoActivity extends ActionBarActivity { prefs.setPassword(etxtPassword.getText().toString()); } if (authInfoChanged || autoDeleteChanged) { - DBWriter.setFeedPreferences(this, prefs); + DBWriter.setFeedPreferences(prefs); } authInfoChanged = false; autoDeleteChanged = false; @@ -299,7 +298,7 @@ public class FeedInfoActivity extends ActionBarActivity { @Override public void onConfirmButtonPressed(DialogInterface dialog) { - DBWriter.setFeedsItemsAutoDownload(context, feed, autoDownload); + DBWriter.setFeedsItemsAutoDownload(feed, autoDownload); } } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index e10e8041e..76d657585 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -1,5 +1,6 @@ package de.danoeh.antennapod.activity; +import android.annotation.TargetApi; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; @@ -9,6 +10,7 @@ import android.content.res.Configuration; import android.database.DataSetObserver; import android.media.AudioManager; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; @@ -27,6 +29,8 @@ import android.view.View; import android.widget.AdapterView; import android.widget.ListView; +import com.bumptech.glide.Glide; + import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.Validate; @@ -45,16 +49,19 @@ import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.util.StorageUtils; import de.danoeh.antennapod.fragment.AddFeedFragment; -import de.danoeh.antennapod.fragment.AllEpisodesFragment; import de.danoeh.antennapod.fragment.DownloadsFragment; +import de.danoeh.antennapod.fragment.EpisodesFragment; import de.danoeh.antennapod.fragment.ExternalPlayerFragment; import de.danoeh.antennapod.fragment.ItemlistFragment; -import de.danoeh.antennapod.fragment.NewEpisodesFragment; import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; import de.danoeh.antennapod.preferences.PreferenceController; import de.greenrobot.event.EventBus; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * The activity that is shown when the user launches the app. @@ -82,8 +89,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity public static final String[] NAV_DRAWER_TAGS = { QueueFragment.TAG, - NewEpisodesFragment.TAG, - AllEpisodesFragment.TAG, + EpisodesFragment.TAG, DownloadsFragment.TAG, PlaybackHistoryFragment.TAG, AddFeedFragment.TAG @@ -104,6 +110,8 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity private ProgressDialog pd; + private Subscription subscription; + @Override public void onCreate(Bundle savedInstanceState) { setTheme(UserPreferences.getNoTitleTheme()); @@ -169,10 +177,17 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity transaction.replace(R.id.main_view, mainFragment); } else { String lastFragment = getLastNavFragment(); - if(ArrayUtils.contains(NAV_DRAWER_TAGS, lastFragment)) { + if (ArrayUtils.contains(NAV_DRAWER_TAGS, lastFragment)) { loadFragment(lastFragment, null); } else { - loadFeedFragmentById(Integer.valueOf(lastFragment), null); + try { + loadFeedFragmentById(Integer.valueOf(lastFragment), null); + } catch (NumberFormatException e) { + // it's not a number, this happens if we removed + // a label from the NAV_DRAWER_TAGS + // give them a nice default... + loadFragment(QueueFragment.TAG, null); + } } } externalPlayerFragment = new ExternalPlayerFragment(); @@ -281,11 +296,8 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity case QueueFragment.TAG: fragment = new QueueFragment(); break; - case NewEpisodesFragment.TAG: - fragment = new NewEpisodesFragment(); - break; - case AllEpisodesFragment.TAG: - fragment = new AllEpisodesFragment(); + case EpisodesFragment.TAG: + fragment = new EpisodesFragment(); break; case DownloadsFragment.TAG: fragment = new DownloadsFragment(); @@ -296,6 +308,10 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity case AddFeedFragment.TAG: fragment = new AddFeedFragment(); break; + default: + // default to the queue + fragment = new QueueFragment(); + break; } currentTitle = navAdapter.getLabel(tag); getSupportActionBar().setTitle(currentTitle); @@ -468,14 +484,30 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity @Override protected void onStop() { super.onStop(); - cancelLoadTask(); EventDistributor.getInstance().unregister(contentUpdate); EventBus.getDefault().unregister(this); + if(subscription != null) { + subscription.unsubscribe(); + } if(pd != null) { pd.dismiss(); } } + + @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) + @Override + public void onTrimMemory(int level) { + super.onTrimMemory(level); + Glide.get(this).trimMemory(level); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + Glide.get(this).clearMemory(); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { if (drawerToggle.onOptionsItemSelected(item)) { @@ -527,10 +559,10 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity Feed feed = navDrawerData.feeds.get(position - navAdapter.getSubscriptionOffset()); switch(item.getItemId()) { case R.id.mark_all_seen_item: - DBWriter.markFeedSeen(this, feed.getId()); + DBWriter.markFeedSeen(feed.getId()); return true; case R.id.mark_all_read_item: - DBWriter.markFeedRead(this, feed.getId()); + DBWriter.markFeedRead(feed.getId()); return true; case R.id.remove_item: final FeedRemover remover = new FeedRemover(this, feed) { @@ -538,7 +570,7 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity protected void onPostExecute(Void result) { super.onPostExecute(result); if(getSelectedNavListIndex() == position) { - loadFragment(NewEpisodesFragment.TAG, null); + loadFragment(EpisodesFragment.TAG, null); } } }; @@ -605,33 +637,21 @@ public class MainActivity extends ActionBarActivity implements NavDrawerActivity }; private void loadData() { - cancelLoadTask(); - loadTask = new AsyncTask<Void, Void, DBReader.NavDrawerData>() { - @Override - protected DBReader.NavDrawerData doInBackground(Void... params) { - return DBReader.getNavDrawerData(MainActivity.this); - } - - @Override - protected void onPostExecute(DBReader.NavDrawerData result) { - super.onPostExecute(navDrawerData); - boolean handleIntent = (navDrawerData == null); + subscription = Observable.defer(() -> Observable.just(DBReader.getNavDrawerData())) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + boolean handleIntent = (navDrawerData == null); - navDrawerData = result; - navAdapter.notifyDataSetChanged(); + navDrawerData = result; + navAdapter.notifyDataSetChanged(); - if (handleIntent) { - handleNavIntent(); - } - } - }; - loadTask.execute(); - } - - private void cancelLoadTask() { - if (loadTask != null) { - loadTask.cancel(true); - } + if (handleIntent) { + handleNavIntent(); + } + }, error -> { + Log.e(TAG, Log.getStackTraceString(error)); + }); } public void onEvent(QueueEvent event) { 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 13d5e7acf..a629b8758 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/OnlineFeedViewActivity.java @@ -109,7 +109,7 @@ public class OnlineFeedViewActivity extends ActionBarActivity { @Override public void update(EventDistributor eventDistributor, Integer arg) { if ((arg & EventDistributor.FEED_LIST_UPDATE) != 0) { - updater = Observable.defer(() -> Observable.just(DBReader.getFeedList(OnlineFeedViewActivity.this))) + updater = Observable.defer(() -> Observable.just(DBReader.getFeedList())) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(feeds -> { @@ -263,7 +263,7 @@ public class OnlineFeedViewActivity extends ActionBarActivity { download = Observable.create(new Observable.OnSubscribe<DownloadStatus>() { @Override public void call(Subscriber<? super DownloadStatus> subscriber) { - feeds = DBReader.getFeedList(OnlineFeedViewActivity.this); + feeds = DBReader.getFeedList(); downloader = new HttpDownloader(request); downloader.call(); Log.d(TAG, "Download was completed"); diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java b/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java index aca2b359a..d60888a43 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/ActionButtonUtils.java @@ -64,7 +64,7 @@ public class ActionButtonUtils { butSecondary.setContentDescription(context.getString(labels[1])); } else { // item is not downloaded and not being downloaded - LongList queueIds = DBReader.getQueueIDList(context); + LongList queueIds = DBReader.getQueueIDList(); if(DefaultActionButtonCallback.userAllowedMobileDownloads() || !DefaultActionButtonCallback.userChoseAddToQueue() || queueIds.contains(item.getId())) { butSecondary.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java index b9247e76b..f17f0ba0f 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DefaultActionButtonCallback.java @@ -57,7 +57,7 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { final FeedMedia media = item.getMedia(); boolean isDownloading = DownloadRequester.getInstance().isDownloadingFile(media); if (!isDownloading && !media.isDownloaded()) { - LongList queueIds = DBReader.getQueueIDList(context); + LongList queueIds = DBReader.getQueueIDList(); if (NetworkUtils.isDownloadAllowed() || userAllowedMobileDownloads()) { try { DBTasks.downloadFeedItems(context, item); @@ -75,7 +75,7 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { } else if (isDownloading) { DownloadRequester.getInstance().cancelDownload(context, media); if(UserPreferences.isEnableAutodownload()) { - DBWriter.setFeedItemAutoDownload(context, media.getItem(), false); + DBWriter.setFeedItemAutoDownload(media.getItem(), false); Toast.makeText(context, R.string.download_canceled_autodownload_enabled_msg, Toast.LENGTH_LONG).show(); } else { Toast.makeText(context, R.string.download_canceled_msg, Toast.LENGTH_LONG).show(); @@ -93,7 +93,7 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { } } else { if (!item.isPlayed()) { - DBWriter.markItemPlayed(context, item, FeedItem.PLAYED, true); + DBWriter.markItemPlayed(item, FeedItem.PLAYED, true); } } } @@ -117,7 +117,7 @@ public class DefaultActionButtonCallback implements ActionButtonCallback { } } }); - LongList queueIds = DBReader.getQueueIDList(context); + LongList queueIds = DBReader.getQueueIDList(); if(!queueIds.contains(item.getId())) { builder.setNeutralButton(context.getText(R.string.confirm_mobile_download_dialog_only_add_to_queue), new DialogInterface.OnClickListener() { diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java index 6961cf5c1..4ccff39af 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java @@ -123,7 +123,7 @@ public class DownloadLogAdapter extends BaseAdapter { public void onClick(View v) { ButtonHolder holder = (ButtonHolder) v.getTag(); if(holder.typeId == Feed.FEEDFILETYPE_FEED) { - Feed feed = DBReader.getFeed(context, holder.id); + Feed feed = DBReader.getFeed(holder.id); if (feed != null) { feed.setLastUpdate(new Date(0)); // force refresh try { @@ -135,7 +135,7 @@ public class DownloadLogAdapter extends BaseAdapter { Log.wtf(TAG, "Could not find feed for feed id: " + holder.id); } } else if(holder.typeId == FeedMedia.FEEDFILETYPE_FEEDMEDIA) { - FeedMedia media = DBReader.getFeedMedia(context, holder.id); + FeedMedia media = DBReader.getFeedMedia(holder.id); try { DBTasks.downloadFeedItems(context, media.getItem()); Toast.makeText(context, R.string.status_downloading_label, Toast.LENGTH_SHORT).show(); 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 c3bf8faa5..183c1a44e 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/NavListAdapter.java @@ -33,6 +33,7 @@ import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.fragment.AddFeedFragment; import de.danoeh.antennapod.fragment.AllEpisodesFragment; import de.danoeh.antennapod.fragment.DownloadsFragment; +import de.danoeh.antennapod.fragment.EpisodesFragment; import de.danoeh.antennapod.fragment.NewEpisodesFragment; import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; import de.danoeh.antennapod.fragment.QueueFragment; @@ -94,6 +95,9 @@ public class NavListAdapter extends BaseAdapter case NewEpisodesFragment.TAG: icon = R.attr.ic_new; break; + case EpisodesFragment.TAG: + icon = R.attr.feed; + break; case AllEpisodesFragment.TAG: icon = R.attr.feed; break; @@ -212,7 +216,7 @@ public class NavListAdapter extends BaseAdapter } else { holder.count.setVisibility(View.GONE); } - } else if (tags.get(position).equals(NewEpisodesFragment.TAG)) { + } else if (tags.get(position).equals(EpisodesFragment.TAG)) { int unreadItems = itemAccess.getNumberOfNewItems(); if (unreadItems > 0) { holder.count.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlExportWorker.java b/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlExportWorker.java index 6bba956a6..3656c3638 100644 --- a/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlExportWorker.java +++ b/app/src/main/java/de/danoeh/antennapod/asynctask/OpmlExportWorker.java @@ -5,6 +5,8 @@ import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; import android.os.AsyncTask; import android.util.Log; @@ -57,7 +59,7 @@ public class OpmlExportWorker extends AsyncTask<Void, Void, Void> { OutputStreamWriter writer = null; try { writer = new OutputStreamWriter(new FileOutputStream(output), LangUtils.UTF_8); - opmlWriter.writeDocument(DBReader.getFeedList(context), writer); + opmlWriter.writeDocument(DBReader.getFeedList(), writer); } catch (IOException e) { e.printStackTrace(); exception = e; @@ -93,7 +95,17 @@ public class OpmlExportWorker extends AsyncTask<Void, Void, Void> { alert.setTitle(R.string.opml_export_success_title); alert.setMessage(context .getString(R.string.opml_export_success_sum) - + output.toString()); + + output.toString()) + .setPositiveButton(R.string.send_label, (dialog, which) -> { + Uri outputUri = Uri.fromFile(output); + Intent sendIntent = new Intent(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_SUBJECT, + context.getResources().getText(R.string.opml_export_label)); + sendIntent.putExtra(Intent.EXTRA_STREAM, outputUri); + sendIntent.setType("text/plain"); + context.startActivity(Intent.createChooser(sendIntent, + context.getResources().getText(R.string.send_label))); + }); } alert.create().show(); } 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 dbc99b21a..37ca0ad26 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java @@ -372,12 +372,12 @@ public class EpisodesApplyActionFragment extends Fragment { } private void markedCheckedPlayed() { - DBWriter.markItemPlayed(getActivity(), FeedItem.PLAYED, checkedIds.toArray()); + DBWriter.markItemPlayed(FeedItem.PLAYED, checkedIds.toArray()); close(); } private void markedCheckedUnplayed() { - DBWriter.markItemPlayed(getActivity(), FeedItem.UNPLAYED, checkedIds.toArray()); + DBWriter.markItemPlayed(FeedItem.UNPLAYED, checkedIds.toArray()); close(); } 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 b4c4f1822..5d0edb638 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/AllEpisodesFragment.java @@ -38,6 +38,7 @@ import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; +import de.danoeh.antennapod.core.feed.QueueEvent; import de.danoeh.antennapod.core.service.download.DownloadService; import de.danoeh.antennapod.core.service.download.Downloader; import de.danoeh.antennapod.core.storage.DBReader; @@ -57,6 +58,7 @@ public class AllEpisodesFragment extends Fragment { public static final String TAG = "AllEpisodesFragment"; private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED | + EventDistributor.FEED_LIST_UPDATE | EventDistributor.DOWNLOAD_QUEUED | EventDistributor.UNREAD_ITEMS_UPDATE | EventDistributor.PLAYER_STATUS_UPDATE; @@ -105,7 +107,6 @@ public class AllEpisodesFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setRetainInstance(true); setHasOptionsMenu(true); } @@ -252,7 +253,7 @@ public class AllEpisodesFragment extends Fragment { public void onConfirmButtonPressed( DialogInterface dialog) { dialog.dismiss(); - DBWriter.markAllItemsRead(getActivity()); + DBWriter.markAllItemsRead(); Toast.makeText(getActivity(), R.string.mark_all_read_msg, Toast.LENGTH_SHORT).show(); } }; @@ -270,16 +271,14 @@ public class AllEpisodesFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return onCreateViewHelper(inflater, container, savedInstanceState, - R.layout.all_episodes_fragment, R.string.all_episodes_label); + R.layout.all_episodes_fragment); } protected View onCreateViewHelper(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState, - int fragmentResource, - int titleString) { + int fragmentResource) { super.onCreateView(inflater, container, savedInstanceState); - ((MainActivity) getActivity()).getSupportActionBar().setTitle(titleString); View root = inflater.inflate(fragmentResource, container, false); @@ -488,14 +487,14 @@ public class AllEpisodesFragment extends Fragment { if (context != null) { if(showOnlyNewEpisodes) { return new Object[] { - DBReader.getNewItemsList(context), - DBReader.getQueueIDList(context), + DBReader.getNewItemsList(), + DBReader.getQueueIDList(), null // see ItemAccess.isNew }; } else { return new Object[]{ - DBReader.getRecentlyPublishedEpisodes(context, RECENT_EPISODES_LIMIT), - DBReader.getQueueIDList(context) + DBReader.getRecentlyPublishedEpisodes(RECENT_EPISODES_LIMIT), + DBReader.getQueueIDList() }; } } else { diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java index 3ca5b3c89..278928f3d 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -179,7 +179,7 @@ public class CompletedDownloadsFragment extends ListFragment { protected List<FeedItem> doInBackground(Void... params) { Context context = getActivity(); if (context != null) { - return DBReader.getDownloadedItems(context); + return DBReader.getDownloadedItems(); } return Collections.emptyList(); } 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 074a87ea0..da2c05a69 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadLogFragment.java @@ -142,7 +142,7 @@ public class DownloadLogFragment extends ListFragment { if (!super.onOptionsItemSelected(item)) { switch (item.getItemId()) { case R.id.clear_history_item: - DBWriter.clearDownloadLog(getActivity()); + DBWriter.clearDownloadLog(); return true; default: return false; @@ -170,7 +170,7 @@ public class DownloadLogFragment extends ListFragment { protected List<DownloadStatus> doInBackground(Void... params) { Context context = getActivity(); if (context != null) { - return DBReader.getDownloadLog(context); + return DBReader.getDownloadLog(); } return null; } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java index 1ce379cf8..52a38ccb9 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java @@ -1,7 +1,10 @@ package de.danoeh.antennapod.fragment; +import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Bundle; +import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; @@ -25,15 +28,24 @@ public class DownloadsFragment extends Fragment { public static final int POS_COMPLETED = 1; public static final int POS_LOG = 2; - private ViewPager pager; + private static final String PREF_LAST_TAB_POSITION = "tab_position"; + + private ViewPager viewPager; + private TabLayout tabLayout; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View root = inflater.inflate(R.layout.pager_fragment, container, false); - pager = (ViewPager) root.findViewById(R.id.pager); + + viewPager = (ViewPager)root.findViewById(R.id.viewpager); DownloadsPagerAdapter pagerAdapter = new DownloadsPagerAdapter(getChildFragmentManager(), getResources()); - pager.setAdapter(pagerAdapter); + viewPager.setAdapter(pagerAdapter); + + // Give the TabLayout the ViewPager + tabLayout = (TabLayout) root.findViewById(R.id.sliding_tabs); + tabLayout.setupWithViewPager(viewPager); + return root; } @@ -42,10 +54,30 @@ public class DownloadsFragment extends Fragment { super.onViewCreated(view, savedInstanceState); if (getArguments() != null) { int tab = getArguments().getInt(ARG_SELECTED_TAB); - pager.setCurrentItem(tab, false); + viewPager.setCurrentItem(tab, false); } } + @Override + public void onPause() { + super.onPause(); + // save our tab selection + SharedPreferences prefs = getActivity().getSharedPreferences(TAG, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + editor.putInt(PREF_LAST_TAB_POSITION, tabLayout.getSelectedTabPosition()); + editor.apply(); + } + + @Override + public void onStart() { + super.onStart(); + + // restore our last position + SharedPreferences prefs = getActivity().getSharedPreferences(TAG, Context.MODE_PRIVATE); + int lastPosition = prefs.getInt(PREF_LAST_TAB_POSITION, 0); + viewPager.setCurrentItem(lastPosition); + } + public class DownloadsPagerAdapter extends FragmentPagerAdapter { Resources resources; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java new file mode 100644 index 000000000..e234d95ad --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java @@ -0,0 +1,115 @@ +package de.danoeh.antennapod.fragment; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.os.Bundle; +import android.support.design.widget.TabLayout; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.activity.MainActivity; + +public class EpisodesFragment extends Fragment { + + public static final String TAG = "EpisodesFragment"; + private static final String PREF_LAST_TAB_POSITION = "tab_position"; + + public static final int POS_NEW_EPISODES = 0; + public static final int POS_ALL_EPISODES = 1; + public static final int TOTAL_COUNT = 2; + + + private TabLayout tabLayout; + private ViewPager viewPager; + + //Mandatory Constructor + public EpisodesFragment() { + } + + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRetainInstance(true); + } + + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + super.onCreateView(inflater, container, savedInstanceState); + setHasOptionsMenu(true); + ((MainActivity) getActivity()).getSupportActionBar().setTitle(R.string.episodes_label); + + View rootView = inflater.inflate(R.layout.pager_fragment, container, false); + viewPager = (ViewPager)rootView.findViewById(R.id.viewpager); + viewPager.setAdapter(new EpisodesPagerAdapter(getChildFragmentManager(), getResources())); + + // Give the TabLayout the ViewPager + tabLayout = (TabLayout) rootView.findViewById(R.id.sliding_tabs); + tabLayout.setupWithViewPager(viewPager); + + return rootView; + } + + @Override + public void onPause() { + super.onPause(); + // save our tab selection + SharedPreferences prefs = getActivity().getSharedPreferences(TAG, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + editor.putInt(PREF_LAST_TAB_POSITION, tabLayout.getSelectedTabPosition()); + editor.apply(); + } + + @Override + public void onStart() { + super.onStart(); + + // restore our last position + SharedPreferences prefs = getActivity().getSharedPreferences(TAG, Context.MODE_PRIVATE); + int lastPosition = prefs.getInt(PREF_LAST_TAB_POSITION, 0); + viewPager.setCurrentItem(lastPosition); + } + + public static class EpisodesPagerAdapter extends FragmentPagerAdapter { + + private final Resources resources; + + public EpisodesPagerAdapter(FragmentManager fm, Resources resources) { + super(fm); + this.resources = resources; + } + + @Override + public Fragment getItem(int position) { + switch (position) { + case POS_ALL_EPISODES: + return new AllEpisodesFragment(); + case POS_NEW_EPISODES: + return new NewEpisodesFragment(); + } + return null; + } + + @Override + public int getCount() { + return TOTAL_COUNT; + } + + @Override + public CharSequence getPageTitle(int position) { + switch (position) { + case POS_ALL_EPISODES: + return resources.getString(R.string.all_episodes_short_label); + case POS_NEW_EPISODES: + return resources.getString(R.string.new_label); + default: + return super.getPageTitle(position); + } + } + } +} diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java index 9693e6886..faa4413bb 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemDescriptionFragment.java @@ -210,7 +210,7 @@ public class ItemDescriptionFragment extends Fragment { @Override protected FeedItem doInBackground(Void... voids) { - return DBReader.getFeedItem(getActivity(), getArguments().getLong(ARG_FEEDITEM_ID)); + return DBReader.getFeedItem(getArguments().getLong(ARG_FEEDITEM_ID)); } @Override 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 4edb7f36f..353d8149c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemFragment.java @@ -36,7 +36,6 @@ import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; import java.util.List; @@ -497,12 +496,12 @@ public class ItemFragment extends Fragment implements LoaderManager.LoaderCallba return new DBTaskLoader<Pair<FeedItem,LongList>>(getActivity()) { @Override public Pair<FeedItem,LongList> loadInBackground() { - FeedItem data1 = DBReader.getFeedItem(getContext(), itemID); + FeedItem data1 = DBReader.getFeedItem(itemID); if (data1 != null) { Timeline t = new Timeline(getActivity(), data1); webviewData = t.processShownotes(false); } - LongList data2 = DBReader.getQueueIDList(getContext()); + LongList data2 = DBReader.getQueueIDList(); return Pair.create(data1, data2); } }; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java index 18a9d09d6..38c9b645a 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -630,12 +630,12 @@ public class ItemlistFragment extends ListFragment { long feedID = params[0]; Context context = getActivity(); if (context != null) { - Feed feed = DBReader.getFeed(context, feedID); + Feed feed = DBReader.getFeed(feedID); if(feed != null && feed.getItemFilter() != null) { FeedItemFilter filter = feed.getItemFilter(); feed.setItems(filter.filter(context, feed.getItems())); } - LongList queuedItemsIds = DBReader.getQueueIDList(context); + LongList queuedItemsIds = DBReader.getQueueIDList(); return new Object[] { feed, queuedItemsIds }; } else { return null; diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java index b0ccbfbea..6177f2a50 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/NewEpisodesFragment.java @@ -63,7 +63,7 @@ public class NewEpisodesFragment extends AllEpisodesFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = super.onCreateViewHelper(inflater, container, savedInstanceState, - R.layout.new_episodes_fragment, R.string.new_episodes_label); + R.layout.new_episodes_fragment); listView.setRemoveListener(new DragSortListView.RemoveListener() { @Override @@ -73,7 +73,7 @@ public class NewEpisodesFragment extends AllEpisodesFragment { FeedItem item = (FeedItem) listView.getAdapter().getItem(which); // we're marking it as unplayed since the user didn't actually play it // but they don't want it considered 'NEW' anymore - DBWriter.markItemPlayed(getActivity(), FeedItem.UNPLAYED, item.getId()); + DBWriter.markItemPlayed(FeedItem.UNPLAYED, item.getId()); undoBarController.showUndoBar(false, getString(R.string.marked_as_read_label), new FeedItemUndoToken(item, which) @@ -89,14 +89,14 @@ public class NewEpisodesFragment extends AllEpisodesFragment { public void onUndo(FeedItemUndoToken token) { if (token != null) { long itemId = token.getFeedItemId(); - DBWriter.markItemPlayed(context, FeedItem.NEW, itemId); + DBWriter.markItemPlayed(FeedItem.NEW, itemId); } } @Override public void onHide(FeedItemUndoToken token) { if (token != null && context != null) { long itemId = token.getFeedItemId(); - FeedItem item = DBReader.getFeedItem(context, itemId); + FeedItem item = DBReader.getFeedItem(itemId); FeedMedia media = item.getMedia(); if(media != null && media.hasAlmostEnded() && item.getFeed().getPreferences().getCurrentAutoDelete()) { DBWriter.deleteFeedMediaOfItem(context, media.getId()); 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 b094133d3..530883667 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/PlaybackHistoryFragment.java @@ -164,7 +164,7 @@ public class PlaybackHistoryFragment extends ListFragment { if (!super.onOptionsItemSelected(item)) { switch (item.getItemId()) { case R.id.clear_history_item: - DBWriter.clearPlaybackHistory(getActivity()); + DBWriter.clearPlaybackHistory(); return true; default: return false; @@ -267,9 +267,9 @@ public class PlaybackHistoryFragment extends ListFragment { protected Pair<List<FeedItem>,LongList> doInBackground(Void... params) { Context context = activity.get(); if (context != null) { - List<FeedItem> history = DBReader.getPlaybackHistory(context); - LongList queue = DBReader.getQueueIDList(context); - DBReader.loadFeedDataOfFeedItemlist(context, history); + List<FeedItem> history = DBReader.getPlaybackHistory(); + LongList queue = DBReader.getQueueIDList(); + DBReader.loadFeedDataOfFeedItemlist(history); return Pair.create(history, queue); } else { return null; 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 24c9fc425..63c319e03 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/QueueFragment.java @@ -269,7 +269,7 @@ public class QueueFragment extends Fragment { public void onConfirmButtonPressed( DialogInterface dialog) { dialog.dismiss(); - DBWriter.clearQueue(getActivity()); + DBWriter.clearQueue(); } }; conDialog.createNewDialog().show(); @@ -402,7 +402,7 @@ public class QueueFragment extends Fragment { final FeedItem item = queue.remove(from); queue.add(to, item); listAdapter.notifyDataSetChanged(); - DBWriter.moveQueueItem(getActivity(), from, to, true); + DBWriter.moveQueueItem(from, to, true); } @Override @@ -432,10 +432,12 @@ public class QueueFragment extends Fragment { public void onHide(FeedItemUndoToken token) { if (token != null && context != null) { long itemId = token.getFeedItemId(); - FeedItem item = DBReader.getFeedItem(context, itemId); - FeedMedia media = item.getMedia(); - if(media != null && media.hasAlmostEnded() && item.getFeed().getPreferences().getCurrentAutoDelete()) { - DBWriter.deleteFeedMediaOfItem(context, media.getId()); + FeedItem item = DBReader.getFeedItem(itemId); + if(item != null) { + FeedMedia media = item.getMedia(); + if (media != null && media.hasAlmostEnded() && item.getFeed().getPreferences().getCurrentAutoDelete()) { + DBWriter.deleteFeedMediaOfItem(context, media.getId()); + } } } } @@ -608,7 +610,7 @@ public class QueueFragment extends Fragment { protected List<FeedItem> doInBackground(Void... params) { Context context = activity.get(); if (context != null) { - return DBReader.getQueue(context); + return DBReader.getQueue(); } return null; } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java index eb4d18328..544bdfc43 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/RunningDownloadsFragment.java @@ -81,8 +81,8 @@ public class RunningDownloadsFragment extends ListFragment { if(downloadRequest.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA && UserPreferences.isEnableAutodownload()) { - FeedMedia media = DBReader.getFeedMedia(getActivity(), downloadRequest.getFeedfileId()); - DBWriter.setFeedItemAutoDownload(getActivity(), media.getItem(), false); + FeedMedia media = DBReader.getFeedMedia(downloadRequest.getFeedfileId()); + DBWriter.setFeedItemAutoDownload(media.getItem(), false); Toast.makeText(getActivity(), R.string.download_canceled_autodownload_enabled_msg, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getActivity(), R.string.download_canceled_msg, Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java index 55d4b940f..aff5069c6 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/gpodnet/GpodnetMainFragment.java @@ -1,7 +1,10 @@ package de.danoeh.antennapod.fragment.gpodnet; +import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Resources; import android.os.Bundle; +import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; @@ -17,16 +20,49 @@ import de.danoeh.antennapod.R; */ public class GpodnetMainFragment extends Fragment { + public static final String TAG = "GpodnetMainFragment"; + + private static final String PREF_LAST_TAB_POSITION = "tab_position"; + private TabLayout tabLayout; + private ViewPager viewPager; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View root = inflater.inflate(R.layout.pager_fragment, container, false); - ViewPager pager = (ViewPager) root.findViewById(R.id.pager); + + viewPager = (ViewPager)root.findViewById(R.id.viewpager); GpodnetPagerAdapter pagerAdapter = new GpodnetPagerAdapter(getChildFragmentManager(), getResources()); - pager.setAdapter(pagerAdapter); + viewPager.setAdapter(pagerAdapter); + + // Give the TabLayout the ViewPager + tabLayout = (TabLayout) root.findViewById(R.id.sliding_tabs); + tabLayout.setupWithViewPager(viewPager); + return root; } + + @Override + public void onPause() { + super.onPause(); + // save our tab selection + SharedPreferences prefs = getActivity().getSharedPreferences(TAG, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + editor.putInt(PREF_LAST_TAB_POSITION, tabLayout.getSelectedTabPosition()); + editor.apply(); + } + + @Override + public void onStart() { + super.onStart(); + + // restore our last position + SharedPreferences prefs = getActivity().getSharedPreferences(TAG, Context.MODE_PRIVATE); + int lastPosition = prefs.getInt(PREF_LAST_TAB_POSITION, 0); + viewPager.setCurrentItem(lastPosition); + } + public class GpodnetPagerAdapter extends FragmentPagerAdapter { 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 014b44078..510ea2760 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java @@ -155,7 +155,7 @@ public class FeedItemMenuHandler { break; case R.id.mark_read_item: selectedItem.setPlayed(true); - DBWriter.markItemPlayed(context, selectedItem, FeedItem.PLAYED, false); + DBWriter.markItemPlayed(selectedItem, FeedItem.PLAYED, false); if(GpodnetPreferences.loggedIn()) { FeedMedia media = selectedItem.getMedia(); // not all items have media, Gpodder only cares about those that do @@ -173,7 +173,7 @@ public class FeedItemMenuHandler { break; case R.id.mark_unread_item: selectedItem.setPlayed(false); - DBWriter.markItemPlayed(context, selectedItem, FeedItem.UNPLAYED, false); + DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, false); if(GpodnetPreferences.loggedIn()) { GpodnetEpisodeAction actionNew = new GpodnetEpisodeAction.Builder(selectedItem, Action.NEW) .currentDeviceId() @@ -183,10 +183,10 @@ public class FeedItemMenuHandler { } break; case R.id.move_to_top_item: - DBWriter.moveQueueItemToTop(context, selectedItem.getId(), true); + DBWriter.moveQueueItemToTop(selectedItem.getId(), true); return true; case R.id.move_to_bottom_item: - DBWriter.moveQueueItemToBottom(context, selectedItem.getId(), true); + DBWriter.moveQueueItemToBottom(selectedItem.getId(), true); case R.id.add_to_queue_item: DBWriter.addQueueItem(context, selectedItem.getId()); break; @@ -195,15 +195,15 @@ public class FeedItemMenuHandler { break; case R.id.reset_position: selectedItem.getMedia().setPosition(0); - DBWriter.markItemPlayed(context, selectedItem, FeedItem.UNPLAYED, true); + DBWriter.markItemPlayed(selectedItem, FeedItem.UNPLAYED, true); break; case R.id.activate_auto_download: selectedItem.setAutoDownload(true); - DBWriter.setFeedItemAutoDownload(context, selectedItem, true); + DBWriter.setFeedItemAutoDownload(selectedItem, true); break; case R.id.deactivate_auto_download: selectedItem.setAutoDownload(false); - DBWriter.setFeedItemAutoDownload(context, selectedItem, false); + DBWriter.setFeedItemAutoDownload(selectedItem, false); break; case R.id.visit_website_item: Uri uri = Uri.parse(selectedItem.getLink()); diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java index 3df59724d..f32a1c2ee 100644 --- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java +++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedMenuHandler.java @@ -78,7 +78,7 @@ public class FeedMenuHandler { public void onConfirmButtonPressed( DialogInterface dialog) { dialog.dismiss(); - DBWriter.markFeedRead(context, selectedFeed.getId()); + DBWriter.markFeedRead(selectedFeed.getId()); } }; conDialog.createNewDialog().show(); @@ -138,7 +138,7 @@ public class FeedMenuHandler { @Override public void onClick(DialogInterface dialog, int which) { feed.setHiddenItemProperties(hidden.toArray(new String[hidden.size()])); - DBWriter.setFeedItemsFilter(context, feed.getId(), hidden); + DBWriter.setFeedItemsFilter(feed.getId(), hidden); } }); builder.setNegativeButton(R.string.cancel_label, null); diff --git a/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java b/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java index 0f726f214..d7a049a32 100644 --- a/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java +++ b/app/src/main/java/de/danoeh/antennapod/service/PlayerWidgetService.java @@ -58,9 +58,9 @@ public class PlayerWidgetService extends Service { if (media.hasAlmostEnded()) { Log.d(TAG, "smart mark as read"); FeedItem item = media.getItem(); - DBWriter.markItemPlayed(this, item, FeedItem.PLAYED, false); + DBWriter.markItemPlayed(item, FeedItem.PLAYED, false); DBWriter.removeQueueItem(this, item, false); - DBWriter.addItemToPlaybackHistory(this, media); + DBWriter.addItemToPlaybackHistory(media); if (item.getFeed().getPreferences().getCurrentAutoDelete()) { Log.d(TAG, "Delete " + media.toString()); DBWriter.deleteFeedMediaOfItem(this, media.getId()); diff --git a/app/src/main/res/layout/pager_fragment.xml b/app/src/main/res/layout/pager_fragment.xml index ed639a2db..54b711b1c 100644 --- a/app/src/main/res/layout/pager_fragment.xml +++ b/app/src/main/res/layout/pager_fragment.xml @@ -1,18 +1,22 @@ <?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"> - <android.support.v4.view.ViewPager - android:id="@+id/pager" + + <android.support.design.widget.TabLayout + android:id="@+id/sliding_tabs" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="wrap_content" + app:tabGravity="fill" + app:tabMode="fixed" /> - <android.support.v4.view.PagerTabStrip - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="top" /> - </android.support.v4.view.ViewPager> + <android.support.v4.view.ViewPager + android:id="@+id/viewpager" + android:layout_width="match_parent" + android:layout_height="0px" + android:layout_weight="1" /> </LinearLayout>
\ No newline at end of file |