You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.7 KiB
110 lines
3.7 KiB
/* |
|
* Copyright 2010-2018 Eric Kok et al. |
|
* |
|
* Transdroid is free software: you can redistribute it and/or modify |
|
* it under the terms of the GNU General Public License as published by |
|
* the Free Software Foundation, either version 3 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* Transdroid is distributed in the hope that it will be useful, |
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
* GNU General Public License for more details. |
|
* |
|
* You should have received a copy of the GNU General Public License |
|
* along with Transdroid. If not, see <http://www.gnu.org/licenses/>. |
|
*/ |
|
package org.transdroid.core.gui.rss; |
|
|
|
import org.transdroid.core.app.settings.RssfeedSetting; |
|
import org.transdroid.core.rssparser.Channel; |
|
import org.transdroid.core.rssparser.Item; |
|
|
|
import java.util.Collections; |
|
import java.util.Comparator; |
|
import java.util.Date; |
|
import java.util.List; |
|
|
|
/** |
|
* A container class that holds RSS feed settings and, after they have been retrieved, the contents as {@link Channel}, the number of new items and an |
|
* indication of a connection error. |
|
* |
|
* @author Eric Kok |
|
*/ |
|
public class RssfeedLoader { |
|
|
|
private final RssfeedSetting setting; |
|
private Channel channel = null; |
|
private int newCount = -1; |
|
private boolean hasError = false; |
|
|
|
public RssfeedLoader(RssfeedSetting setting) { |
|
this.setting = setting; |
|
} |
|
|
|
public void update(Channel channel, boolean hasError) { |
|
this.channel = channel; |
|
this.hasError = hasError; |
|
if (channel == null || channel.getItems() == null || hasError) { |
|
this.hasError = true; |
|
newCount = -1; |
|
return; |
|
} |
|
// Peek if this feed properly supports publish dates |
|
boolean usePublishDate = false; |
|
if (channel.getItems().size() > 0) { |
|
Date pubDate = channel.getItems().get(0).getPubdate(); |
|
usePublishDate = pubDate != null && pubDate.getTime() > 0; |
|
} |
|
if (usePublishDate) { |
|
// Count the number of new items, based on the date that this RSS feed was last viewed by the user |
|
newCount = 0; |
|
List<Item> items = channel.getItems(); |
|
// Reverse-order sort the items on their published date |
|
Collections.sort(items, new Comparator<Item>() { |
|
@Override |
|
public int compare(Item lhs, Item rhs) { |
|
return 0 - lhs.getPubdate().compareTo(rhs.getPubdate()); |
|
} |
|
}); |
|
for (Item item : items) { |
|
if (item.getPubdate() == null || setting.getLastViewed() == null || item.getPubdate().after(setting.getLastViewed())) { |
|
newCount++; |
|
item.setIsNew(true); |
|
} else { |
|
item.setIsNew(false); |
|
} |
|
} |
|
} else { |
|
// Use the url of the last RSS item the last time the feed was viewed by the user to count new items |
|
newCount = 0; |
|
boolean isNew = true; |
|
for (Item item : channel.getItems()) { |
|
if (item.getTheLink() != null && setting.getLastViewedItemUrl() != null && item.getTheLink().equals(setting.getLastViewedItemUrl())) { |
|
isNew = false; |
|
} |
|
if (isNew) { |
|
newCount++; |
|
} |
|
item.setIsNew(isNew); |
|
} |
|
} |
|
} |
|
|
|
public Channel getChannel() { |
|
return channel; |
|
} |
|
|
|
public RssfeedSetting getSetting() { |
|
return setting; |
|
} |
|
|
|
public int getNewCount() { |
|
return newCount; |
|
} |
|
|
|
public boolean hasError() { |
|
return hasError; |
|
} |
|
|
|
}
|
|
|