Search in sources :

Example 51 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class DBReader method getFeed.

static Feed getFeed(final long feedId, PodDBAdapter adapter) {
    Feed feed = null;
    Cursor feedCursor = adapter.getFeedCursor(feedId);
    if (feedCursor.moveToFirst()) {
        feed = extractFeedFromCursorRow(adapter, feedCursor);
        feed.setItems(getFeedItemList(feed));
    } else {
        Log.e(TAG, "getFeed could not find feed with id " + feedId);
    }
    feedCursor.close();
    return feed;
}
Also used : Cursor(android.database.Cursor) Feed(de.danoeh.antennapod.core.feed.Feed)

Example 52 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class DBReader method getStatistics.

/**
     * Searches the DB for statistics
     *
     * @return The StatisticsInfo object
     */
public static StatisticsData getStatistics() {
    PodDBAdapter adapter = PodDBAdapter.getInstance();
    adapter.open();
    long totalTime = 0;
    List<StatisticsItem> feedTime = new ArrayList<>();
    List<Feed> feeds = getFeedList();
    for (Feed feed : feeds) {
        long feedPlayedTime = 0;
        long feedTotalTime = 0;
        long episodes = 0;
        long episodesStarted = 0;
        List<FeedItem> items = getFeed(feed.getId()).getItems();
        for (FeedItem item : items) {
            FeedMedia media = item.getMedia();
            if (media == null) {
                continue;
            }
            // played duration used to be reset when the item is added to the playback history
            if (media.getPlaybackCompletionDate() != null) {
                feedPlayedTime += media.getDuration() / 1000;
            }
            feedPlayedTime += media.getPlayedDuration() / 1000;
            if (media.getPlaybackCompletionDate() != null || media.getPlayedDuration() > 0) {
                episodesStarted++;
            }
            feedTotalTime += media.getDuration() / 1000;
            episodes++;
        }
        feedTime.add(new StatisticsItem(feed, feedTotalTime, feedPlayedTime, episodes, episodesStarted));
        totalTime += feedPlayedTime;
    }
    Collections.sort(feedTime, (item1, item2) -> {
        if (item1.timePlayed > item2.timePlayed) {
            return -1;
        } else if (item1.timePlayed < item2.timePlayed) {
            return 1;
        } else {
            return 0;
        }
    });
    adapter.close();
    return new StatisticsData(totalTime, feedTime);
}
Also used : FeedItem(de.danoeh.antennapod.core.feed.FeedItem) FeedMedia(de.danoeh.antennapod.core.feed.FeedMedia) ArrayList(java.util.ArrayList) Feed(de.danoeh.antennapod.core.feed.Feed)

Example 53 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class DBReader method getFeedList.

private static List<Feed> getFeedList(PodDBAdapter adapter) {
    Cursor feedlistCursor = adapter.getAllFeedsCursor();
    List<Feed> feeds = new ArrayList<>(feedlistCursor.getCount());
    if (feedlistCursor.moveToFirst()) {
        do {
            Feed feed = extractFeedFromCursorRow(adapter, feedlistCursor);
            feeds.add(feed);
        } while (feedlistCursor.moveToNext());
    }
    feedlistCursor.close();
    return feeds;
}
Also used : ArrayList(java.util.ArrayList) Cursor(android.database.Cursor) Feed(de.danoeh.antennapod.core.feed.Feed)

Example 54 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class DBTasks method refreshFeed.

private static void refreshFeed(Context context, Feed feed, boolean loadAllPages, boolean force) throws DownloadRequestException {
    Feed f;
    String lastUpdate = feed.hasLastUpdateFailed() ? null : feed.getLastUpdate();
    if (feed.getPreferences() == null) {
        f = new Feed(feed.getDownload_url(), lastUpdate, feed.getTitle());
    } else {
        f = new Feed(feed.getDownload_url(), lastUpdate, feed.getTitle(), feed.getPreferences().getUsername(), feed.getPreferences().getPassword());
    }
    f.setId(feed.getId());
    DownloadRequester.getInstance().downloadFeed(context, f, loadAllPages, force);
}
Also used : Feed(de.danoeh.antennapod.core.feed.Feed)

Example 55 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class DBTasks method updateFeed.

/**
     * Adds new Feeds to the database or updates the old versions if they already exists. If another Feed with the same
     * identifying value already exists, this method will add new FeedItems from the new Feed to the existing Feed.
     * These FeedItems will be marked as unread with the exception of the most recent FeedItem.
     * <p/>
     * This method can update multiple feeds at once. Submitting a feed twice in the same method call can result in undefined behavior.
     * <p/>
     * This method should NOT be executed on the GUI thread.
     *
     * @param context  Used for accessing the DB.
     * @param newFeeds The new Feed objects.
     * @return The updated Feeds from the database if it already existed, or the new Feed from the parameters otherwise.
     */
public static synchronized Feed[] updateFeed(final Context context, final Feed... newFeeds) {
    List<Feed> newFeedsList = new ArrayList<>();
    List<Feed> updatedFeedsList = new ArrayList<>();
    Feed[] resultFeeds = new Feed[newFeeds.length];
    PodDBAdapter adapter = PodDBAdapter.getInstance();
    adapter.open();
    for (int feedIdx = 0; feedIdx < newFeeds.length; feedIdx++) {
        final Feed newFeed = newFeeds[feedIdx];
        // Look up feed in the feedslist
        final Feed savedFeed = searchFeedByIdentifyingValueOrID(adapter, newFeed);
        if (savedFeed == null) {
            Log.d(TAG, "Found no existing Feed with title " + newFeed.getTitle() + ". Adding as new one.");
            // Add a new Feed
            // all new feeds will have the most recent item marked as unplayed
            FeedItem mostRecent = newFeed.getMostRecentItem();
            if (mostRecent != null) {
                mostRecent.setNew();
            }
            newFeedsList.add(newFeed);
            resultFeeds[feedIdx] = newFeed;
        } else {
            Log.d(TAG, "Feed with title " + newFeed.getTitle() + " already exists. Syncing new with existing one.");
            Collections.sort(newFeed.getItems(), new FeedItemPubdateComparator());
            if (newFeed.getPageNr() == savedFeed.getPageNr()) {
                if (savedFeed.compareWithOther(newFeed)) {
                    Log.d(TAG, "Feed has updated attribute values. Updating old feed's attributes");
                    savedFeed.updateFromOther(newFeed);
                }
            } else {
                Log.d(TAG, "New feed has a higher page number.");
                savedFeed.setNextPageLink(newFeed.getNextPageLink());
            }
            if (savedFeed.getPreferences().compareWithOther(newFeed.getPreferences())) {
                Log.d(TAG, "Feed has updated preferences. Updating old feed's preferences");
                savedFeed.getPreferences().updateFromOther(newFeed.getPreferences());
            }
            // get the most recent date now, before we start changing the list
            FeedItem priorMostRecent = savedFeed.getMostRecentItem();
            Date priorMostRecentDate = null;
            if (priorMostRecent != null) {
                priorMostRecentDate = priorMostRecent.getPubDate();
            }
            // Look for new or updated Items
            for (int idx = 0; idx < newFeed.getItems().size(); idx++) {
                final FeedItem item = newFeed.getItems().get(idx);
                FeedItem oldItem = searchFeedItemByIdentifyingValue(savedFeed, item.getIdentifyingValue());
                if (oldItem == null) {
                    // item is new
                    item.setFeed(savedFeed);
                    item.setAutoDownload(savedFeed.getPreferences().getAutoDownload());
                    savedFeed.getItems().add(idx, item);
                    // and this is the first, hence 'new')
                    if (priorMostRecentDate == null || priorMostRecentDate.before(item.getPubDate()) || priorMostRecentDate.equals(item.getPubDate())) {
                        Log.d(TAG, "Marking item published on " + item.getPubDate() + " new, prior most recent date = " + priorMostRecentDate);
                        item.setNew();
                    }
                } else {
                    oldItem.updateFromOther(item);
                }
            }
            // update attributes
            savedFeed.setLastUpdate(newFeed.getLastUpdate());
            savedFeed.setType(newFeed.getType());
            savedFeed.setLastUpdateFailed(false);
            updatedFeedsList.add(savedFeed);
            resultFeeds[feedIdx] = savedFeed;
        }
    }
    adapter.close();
    try {
        DBWriter.addNewFeed(context, newFeedsList.toArray(new Feed[newFeedsList.size()])).get();
        DBWriter.setCompleteFeed(updatedFeedsList.toArray(new Feed[updatedFeedsList.size()])).get();
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
    EventDistributor.getInstance().sendFeedUpdateBroadcast();
    return resultFeeds;
}
Also used : FeedItemPubdateComparator(de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator) FeedItem(de.danoeh.antennapod.core.feed.FeedItem) ArrayList(java.util.ArrayList) ExecutionException(java.util.concurrent.ExecutionException) Date(java.util.Date) Feed(de.danoeh.antennapod.core.feed.Feed)

Aggregations

Feed (de.danoeh.antennapod.core.feed.Feed)95 FeedItem (de.danoeh.antennapod.core.feed.FeedItem)55 PodDBAdapter (de.danoeh.antennapod.core.storage.PodDBAdapter)32 ArrayList (java.util.ArrayList)30 Date (java.util.Date)30 FeedMedia (de.danoeh.antennapod.core.feed.FeedMedia)21 File (java.io.File)20 Cursor (android.database.Cursor)16 FeedImage (de.danoeh.antennapod.core.feed.FeedImage)14 Context (android.content.Context)13 FlakyTest (android.test.FlakyTest)9 DialogInterface (android.content.DialogInterface)8 Intent (android.content.Intent)8 LayoutInflater (android.view.LayoutInflater)7 AdapterView (android.widget.AdapterView)7 ConfirmationDialog (de.danoeh.antennapod.core.dialog.ConfirmationDialog)6 FeedPreferences (de.danoeh.antennapod.core.feed.FeedPreferences)6 DownloadRequestException (de.danoeh.antennapod.core.storage.DownloadRequestException)6 Log (android.util.Log)4 View (android.view.View)4