package com.droidworks.syndication; import java.util.*; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import com.droidworks.syndication.FeedAdapter.Image; public class Feed<T extends FeedItem> implements Parcelable { private String mTitle; private String mLink; private String mDescription; private Date mPubDate = new Date(); private String mLanguage; private String mGenerator; private String mCopyright; private String mManagingEditor; private String mCategory; private int mTTL; private Image mFeedImage; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(mTitle); parcel.writeString(mLink); parcel.writeString(mDescription); parcel.writeLong(mPubDate.getTime()); parcel.writeString(mLanguage); parcel.writeString(mGenerator); parcel.writeString(mCopyright); parcel.writeString(mManagingEditor); parcel.writeString(mCategory); parcel.writeInt(mTTL); parcel.writeParcelable(mFeedImage, flags); } public static final Parcelable.Creator<Feed> CREATOR = new Parcelable.Creator<Feed>() { public Feed createFromParcel(Parcel in) { return new Feed(in); } public Feed[] newArray(int size) { return new Feed[size]; } }; private Feed(Parcel in) { mTitle = in.readString(); mLink = in.readString(); mDescription = in.readString(); mPubDate = new Date(in.readLong()); mLanguage = in.readString(); mGenerator = in.readString(); mCopyright = in.readString(); mManagingEditor = in.readString(); mCategory = in.readString(); mTTL = in.readInt(); mFeedImage = in.readParcelable(Image.class.getClassLoader()); } public Feed() { // default no arg constructor } private ArrayList<T> mItems = new ArrayList<T>(); public String getLanguage() { return mLanguage; } public void setLanguage(String language) { this.mLanguage = language; } public String getGenerator() { return mGenerator; } public void setGenerator(String generator) { this.mGenerator = generator; } public String getLink() { return mLink; } public void setLink(String link) { mLink = link; } public String getTitle() { return mTitle; } public void setTitle(String title) { mTitle = title; } public void setDescription(String description) { mDescription = description; } public String getDescription() { return mDescription; } public void setPubDate(Date pubDate) { mPubDate = pubDate; } public Date getPubDate() { if (mPubDate != null) return (Date) mPubDate.clone(); return null; } public String getCopyright() { return mCopyright; } public void setCopyright(String copyright) { mCopyright = copyright; } public String getManagingEditor() { return mManagingEditor; } public void setManagingEditor(String managingEditor) { mManagingEditor = managingEditor; } public String getCategory() { return mCategory; } public void setCategory(String category) { mCategory = category; } public int getTTL() { return mTTL; } public void setTTL(int ttl) { mTTL = ttl; } public Image getFeedImage() { return mFeedImage; } public void setFeedImage(Image feedImage) { mFeedImage = feedImage; } public List<T> getItems() { return mItems; } public void setItems(ArrayList<T> items) { mItems = items; } public FeedItem getItem(int i) { return mItems.get(i); } public void addItem(T tmpItem) { mItems.add(tmpItem); } public void replaceItem(T item) { for (int i = 0; i < mItems.size(); i++) { if (mItems.get(i).getGuid().equals(item.getGuid())) { mItems.set(i, item); } } } private final Comparator<FeedItem> inverseDateComparator = new Comparator<FeedItem>() { @Override public int compare(FeedItem item1, FeedItem item2) { if (item1.getPubDate().after(item2.getPubDate())) { return 1; } else if (item1.getPubDate().before(item2.getPubDate())) { return -1; } return 0; } }; private final Comparator<FeedItem> dateComparator = new Comparator<FeedItem>() { @Override public int compare(FeedItem item1, FeedItem item2) { if (item1.getPubDate().after(item2.getPubDate())) { return -1; } else if (item1.getPubDate().before(item2.getPubDate())) { return 1; } return 0; } }; /** * Tests to see if the given item already is present within the feed by * comparing guid's. * * @param item * @return */ public boolean containsItem(FeedItem item) { for (FeedItem innerItem : mItems) { if (innerItem.getGuid().equals(item.getGuid())) { return true; } } return false; } /** * Merge another feed into this one, will not overwrite unset/empty * values. * * @param feed */ public void mergeIntoMe(Feed feed) { if (TextUtils.isEmpty(mTitle)) { mTitle = feed.getTitle(); } if (TextUtils.isEmpty(mLink)) { mLink = feed.getLink(); } if (TextUtils.isEmpty(mDescription)) { mDescription = feed.getDescription(); } if (mPubDate == null) { mPubDate = feed.getPubDate(); } if (TextUtils.isEmpty(mLanguage)) { mLanguage = feed.getLanguage(); } if (TextUtils.isEmpty(mGenerator)) { mGenerator = feed.getGenerator(); } if (TextUtils.isEmpty(mCopyright)) { mCopyright = feed.getCopyright(); } if (TextUtils.isEmpty(mManagingEditor)) { mManagingEditor = feed.getManagingEditor(); } if (TextUtils.isEmpty(mCategory)) { mCategory = feed.getCategory(); } if (mTTL == 0) { mTTL = feed.getTTL(); } if (mFeedImage == null) { mFeedImage = feed.getFeedImage(); } List<T> feedItems = feed.getItems(); // merge feed items for (T item : feedItems) { if (!containsItem(item)) addItem(item); } // always sort after merging sort(); } public void sort() { Collections.sort(mItems, dateComparator); } public void reverseSort() { Collections.sort(mItems, inverseDateComparator); } }