Added FeedItemStatistics.

Makes it possible to get number of (new, in progress) episodes of a feed without loading the whole list of items
This commit is contained in:
daniel oeh 2013-08-05 01:27:38 +02:00
parent edd84c6a4c
commit 6d1a8535f5
6 changed files with 1622 additions and 1497 deletions

View File

@ -12,6 +12,7 @@ import de.danoeh.antennapod.R;
import de.danoeh.antennapod.asynctask.ImageLoader;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.storage.DownloadRequester;
import de.danoeh.antennapod.storage.FeedItemStatistics;
import de.danoeh.antennapod.util.ThemeUtils;
public class FeedlistAdapter extends BaseAdapter {
@ -43,6 +44,7 @@ public class FeedlistAdapter extends BaseAdapter {
public View getView(int position, View convertView, ViewGroup parent) {
final Holder holder;
final Feed feed = getItem(position);
final FeedItemStatistics feedItemStatistics = itemAccess.getFeedItemStatistics(position);
// Inflate Layout
if (convertView == null) {
@ -82,42 +84,40 @@ public class FeedlistAdapter extends BaseAdapter {
}
holder.title.setText(feed.getTitle());
int numOfItems = feed.getNumOfItems(true);
if (DownloadRequester.getInstance().isDownloadingFile(feed)) {
holder.lastUpdate.setText(R.string.refreshing_label);
} else {
if (numOfItems > 0) {
holder.lastUpdate.setText(convertView.getResources().getString(
R.string.most_recent_prefix)
+ DateUtils.getRelativeTimeSpanString(
feed.getItemAtIndex(true, 0).getPubDate().getTime(),
System.currentTimeMillis(), 0, 0));
} else {
holder.lastUpdate.setText("");
}
}
holder.numberOfEpisodes.setText(numOfItems
+ convertView.getResources()
.getString(R.string.episodes_suffix));
int newItems = feed.getNumOfNewItems();
int inProgressItems = feed.getNumOfStartedItems();
if (feedItemStatistics != null) {
if (DownloadRequester.getInstance().isDownloadingFile(feed)) {
holder.lastUpdate.setText(R.string.refreshing_label);
} else {
if (feedItemStatistics.getNumberOfItems() > 0) {
holder.lastUpdate.setText(convertView.getResources().getString(
R.string.most_recent_prefix)
+ DateUtils.getRelativeTimeSpanString(
feedItemStatistics.getLastUpdate().getTime(),
System.currentTimeMillis(), 0, 0));
} else {
holder.lastUpdate.setText("");
}
}
holder.numberOfEpisodes.setText(feedItemStatistics.getNumberOfItems()
+ convertView.getResources()
.getString(R.string.episodes_suffix));
if (newItems > 0) {
holder.newEpisodes.setText(Integer.toString(newItems));
holder.newEpisodesLabel.setVisibility(View.VISIBLE);
} else {
holder.newEpisodesLabel.setVisibility(View.INVISIBLE);
}
if (inProgressItems > 0) {
holder.inProgressEpisodes
.setText(Integer.toString(inProgressItems));
holder.inProgressEpisodesLabel.setVisibility(View.VISIBLE);
} else {
holder.inProgressEpisodesLabel.setVisibility(View.INVISIBLE);
}
if (feedItemStatistics.getNumberOfNewItems() > 0) {
holder.newEpisodes.setText(Integer.toString(feedItemStatistics.getNumberOfNewItems()));
holder.newEpisodesLabel.setVisibility(View.VISIBLE);
} else {
holder.newEpisodesLabel.setVisibility(View.INVISIBLE);
}
if (feedItemStatistics.getNumberOfInProgressItems() > 0) {
holder.inProgressEpisodes
.setText(Integer.toString(feedItemStatistics.getNumberOfInProgressItems()));
holder.inProgressEpisodesLabel.setVisibility(View.VISIBLE);
} else {
holder.inProgressEpisodesLabel.setVisibility(View.INVISIBLE);
}
}
final String imageUrl = (feed.getImage() != null) ? feed.getImage()
.getFile_url() : null;
holder.image.setTag(imageUrl);
@ -169,5 +169,7 @@ public class FeedlistAdapter extends BaseAdapter {
int getCount();
Feed getItem(int position);
FeedItemStatistics getFeedItemStatistics(int position);
}
}

View File

@ -32,231 +32,244 @@ import de.danoeh.antennapod.feed.EventDistributor;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.storage.DBReader;
import de.danoeh.antennapod.storage.DownloadRequestException;
import de.danoeh.antennapod.storage.FeedItemStatistics;
import de.danoeh.antennapod.util.menuhandler.FeedMenuHandler;
public class FeedlistFragment extends SherlockFragment implements
ActionMode.Callback, AdapterView.OnItemClickListener,
AdapterView.OnItemLongClickListener {
private static final String TAG = "FeedlistFragment";
ActionMode.Callback, AdapterView.OnItemClickListener,
AdapterView.OnItemLongClickListener {
private static final String TAG = "FeedlistFragment";
private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED
| EventDistributor.DOWNLOAD_QUEUED
| EventDistributor.FEED_LIST_UPDATE
| EventDistributor.UNREAD_ITEMS_UPDATE;
private static final int EVENTS = EventDistributor.DOWNLOAD_HANDLED
| EventDistributor.DOWNLOAD_QUEUED
| EventDistributor.FEED_LIST_UPDATE
| EventDistributor.UNREAD_ITEMS_UPDATE;
public static final String EXTRA_SELECTED_FEED = "extra.de.danoeh.antennapod.activity.selected_feed";
public static final String EXTRA_SELECTED_FEED = "extra.de.danoeh.antennapod.activity.selected_feed";
private FeedlistAdapter fla;
private List<Feed> feeds;
private FeedlistAdapter fla;
private List<Feed> feeds;
private List<FeedItemStatistics> feedItemStatistics;
private Feed selectedFeed;
private ActionMode mActionMode;
private Feed selectedFeed;
private ActionMode mActionMode;
private GridView gridView;
private ListView listView;
private TextView txtvEmpty;
private GridView gridView;
private ListView listView;
private TextView txtvEmpty;
private FeedlistAdapter.ItemAccess itemAccess = new FeedlistAdapter.ItemAccess() {
private FeedlistAdapter.ItemAccess itemAccess = new FeedlistAdapter.ItemAccess() {
@Override
public Feed getItem(int position) {
if (feeds != null) {
return feeds.get(position);
} else {
return null;
}
}
@Override
public Feed getItem(int position) {
if (feeds != null) {
return feeds.get(position);
} else {
return null;
}
}
@Override
public int getCount() {
if (feeds != null) {
return feeds.size();
} else {
return 0;
}
}
};
@Override
public FeedItemStatistics getFeedItemStatistics(int position) {
if (feedItemStatistics != null && position < feedItemStatistics.size()) {
return feedItemStatistics.get(position);
} else {
return null;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (AppConfig.DEBUG)
Log.d(TAG, "Creating");
fla = new FeedlistAdapter(getActivity(), itemAccess);
loadFeeds();
}
@Override
public int getCount() {
if (feeds != null) {
return feeds.size();
} else {
return 0;
}
}
};
private void loadFeeds() {
AsyncTask<Void, Void, List<Feed>> loadTask = new AsyncTask<Void, Void, List<Feed>>() {
@Override
protected List<Feed> doInBackground(Void... params) {
return DBReader.getFeedList(getActivity());
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (AppConfig.DEBUG)
Log.d(TAG, "Creating");
fla = new FeedlistAdapter(getActivity(), itemAccess);
loadFeeds();
}
@Override
protected void onPostExecute(List<Feed> result) {
super.onPostExecute(result);
if (result != null) {
feeds = result;
if (fla != null) {
fla.notifyDataSetChanged();
}
} else {
Log.e(TAG, "Failed to load feeds");
}
}
};
loadTask.execute();
}
private void loadFeeds() {
AsyncTask<Void, Void, List[]> loadTask = new AsyncTask<Void, Void, List[]>() {
@Override
protected List[] doInBackground(Void... params) {
return new List[]{DBReader.getFeedList(getActivity()),
DBReader.getFeedStatisticsList(getActivity())};
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View result = inflater.inflate(R.layout.feedlist, container, false);
listView = (ListView) result.findViewById(android.R.id.list);
gridView = (GridView) result.findViewById(R.id.grid);
txtvEmpty = (TextView) result.findViewById(android.R.id.empty);
@Override
protected void onPostExecute(List[] result) {
super.onPostExecute(result);
if (result != null) {
feeds = result[0];
feedItemStatistics = result[1];
if (fla != null) {
fla.notifyDataSetChanged();
}
} else {
Log.e(TAG, "Failed to load feeds");
}
}
};
loadTask.execute();
}
return result;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View result = inflater.inflate(R.layout.feedlist, container, false);
listView = (ListView) result.findViewById(android.R.id.list);
gridView = (GridView) result.findViewById(R.id.grid);
txtvEmpty = (TextView) result.findViewById(android.R.id.empty);
}
return result;
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (listView != null) {
listView.setOnItemClickListener(this);
listView.setOnItemLongClickListener(this);
listView.setAdapter(fla);
listView.setEmptyView(txtvEmpty);
if (AppConfig.DEBUG)
Log.d(TAG, "Using ListView");
} else {
gridView.setOnItemClickListener(this);
gridView.setOnItemLongClickListener(this);
gridView.setAdapter(fla);
gridView.setEmptyView(txtvEmpty);
if (AppConfig.DEBUG)
Log.d(TAG, "Using GridView");
}
}
}
@Override
public void onResume() {
super.onResume();
if (AppConfig.DEBUG)
Log.d(TAG, "Resuming");
EventDistributor.getInstance().register(contentUpdate);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (listView != null) {
listView.setOnItemClickListener(this);
listView.setOnItemLongClickListener(this);
listView.setAdapter(fla);
listView.setEmptyView(txtvEmpty);
if (AppConfig.DEBUG)
Log.d(TAG, "Using ListView");
} else {
gridView.setOnItemClickListener(this);
gridView.setOnItemLongClickListener(this);
gridView.setAdapter(fla);
gridView.setEmptyView(txtvEmpty);
if (AppConfig.DEBUG)
Log.d(TAG, "Using GridView");
}
}
@Override
public void onPause() {
super.onPause();
EventDistributor.getInstance().unregister(contentUpdate);
if (mActionMode != null) {
mActionMode.finish();
}
}
@Override
public void onResume() {
super.onResume();
if (AppConfig.DEBUG)
Log.d(TAG, "Resuming");
EventDistributor.getInstance().register(contentUpdate);
}
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
public void onPause() {
super.onPause();
EventDistributor.getInstance().unregister(contentUpdate);
if (mActionMode != null) {
mActionMode.finish();
}
}
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
if ((EVENTS & arg) != 0) {
if (AppConfig.DEBUG)
Log.d(TAG, "Received contentUpdate Intent.");
loadFeeds();
}
}
};
private EventDistributor.EventListener contentUpdate = new EventDistributor.EventListener() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
FeedMenuHandler.onCreateOptionsMenu(mode.getMenuInflater(), menu);
mode.setTitle(selectedFeed.getTitle());
return true;
}
@Override
public void update(EventDistributor eventDistributor, Integer arg) {
if ((EVENTS & arg) != 0) {
if (AppConfig.DEBUG)
Log.d(TAG, "Received contentUpdate Intent.");
loadFeeds();
}
}
};
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return FeedMenuHandler.onPrepareOptionsMenu(menu, selectedFeed);
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
FeedMenuHandler.onCreateOptionsMenu(mode.getMenuInflater(), menu);
mode.setTitle(selectedFeed.getTitle());
return true;
}
@SuppressLint("NewApi")
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
try {
if (FeedMenuHandler.onOptionsItemClicked(getSherlockActivity(),
item, selectedFeed)) {
loadFeeds();
} else {
switch (item.getItemId()) {
case R.id.remove_item:
final FeedRemover remover = new FeedRemover(
getSherlockActivity(), selectedFeed) {
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
loadFeeds();
}
};
ConfirmationDialog conDialog = new ConfirmationDialog(
getActivity(), R.string.remove_feed_label,
R.string.feed_delete_confirmation_msg) {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return FeedMenuHandler.onPrepareOptionsMenu(menu, selectedFeed);
}
@Override
public void onConfirmButtonPressed(
DialogInterface dialog) {
dialog.dismiss();
remover.executeAsync();
}
};
conDialog.createNewDialog().show();
break;
}
}
} catch (DownloadRequestException e) {
e.printStackTrace();
DownloadRequestErrorDialogCreator.newRequestErrorDialog(
getActivity(), e.getMessage());
}
mode.finish();
return true;
}
@SuppressLint("NewApi")
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
try {
if (FeedMenuHandler.onOptionsItemClicked(getSherlockActivity(),
item, selectedFeed)) {
loadFeeds();
} else {
switch (item.getItemId()) {
case R.id.remove_item:
final FeedRemover remover = new FeedRemover(
getSherlockActivity(), selectedFeed) {
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
loadFeeds();
}
};
ConfirmationDialog conDialog = new ConfirmationDialog(
getActivity(), R.string.remove_feed_label,
R.string.feed_delete_confirmation_msg) {
@Override
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
selectedFeed = null;
fla.setSelectedItemIndex(FeedlistAdapter.SELECTION_NONE);
}
@Override
public void onConfirmButtonPressed(
DialogInterface dialog) {
dialog.dismiss();
remover.executeAsync();
}
};
conDialog.createNewDialog().show();
break;
}
}
} catch (DownloadRequestException e) {
e.printStackTrace();
DownloadRequestErrorDialogCreator.newRequestErrorDialog(
getActivity(), e.getMessage());
}
mode.finish();
return true;
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) {
Feed selection = fla.getItem(position);
Intent showFeed = new Intent(getActivity(), FeedItemlistActivity.class);
showFeed.putExtra(EXTRA_SELECTED_FEED, selection.getId());
@Override
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
selectedFeed = null;
fla.setSelectedItemIndex(FeedlistAdapter.SELECTION_NONE);
}
getActivity().startActivity(showFeed);
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long id) {
Feed selection = fla.getItem(position);
Intent showFeed = new Intent(getActivity(), FeedItemlistActivity.class);
showFeed.putExtra(EXTRA_SELECTED_FEED, selection.getId());
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Feed selection = fla.getItem(position);
if (AppConfig.DEBUG)
Log.d(TAG, "Selected Feed with title " + selection.getTitle());
if (selection != null) {
if (mActionMode != null) {
mActionMode.finish();
}
fla.setSelectedItemIndex(position);
selectedFeed = selection;
mActionMode = getSherlockActivity().startActionMode(
FeedlistFragment.this);
getActivity().startActivity(showFeed);
}
}
return true;
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Feed selection = fla.getItem(position);
if (AppConfig.DEBUG)
Log.d(TAG, "Selected Feed with title " + selection.getTitle());
if (selection != null) {
if (mActionMode != null) {
mActionMode.finish();
}
fla.setSelectedItemIndex(position);
selectedFeed = selection;
mActionMode = getSherlockActivity().startActionMode(
FeedlistFragment.this);
}
return true;
}
}

View File

@ -23,90 +23,90 @@ import de.danoeh.antennapod.util.comparator.DownloadStatusComparator;
import de.danoeh.antennapod.util.comparator.FeedItemPubdateComparator;
public final class DBReader {
private static final String TAG = "DBReader";
private static final String TAG = "DBReader";
private DBReader() {
}
private DBReader() {
}
public static List<Feed> getFeedList(final Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting Feedlist");
public static List<Feed> getFeedList(final Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting Feedlist");
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor feedlistCursor = adapter.getAllFeedsCursor();
List<Feed> feeds = new ArrayList<Feed>(feedlistCursor.getCount());
Cursor feedlistCursor = adapter.getAllFeedsCursor();
List<Feed> feeds = new ArrayList<Feed>(feedlistCursor.getCount());
if (feedlistCursor.moveToFirst()) {
do {
Feed feed = extractFeedFromCursorRow(adapter, feedlistCursor);
feeds.add(feed);
} while (feedlistCursor.moveToNext());
}
feedlistCursor.close();
return feeds;
}
static List<Feed> getExpiredFeedsList(final Context context, final long expirationTime) {
if (AppConfig.DEBUG)
Log.d(TAG, String.format("getExpiredFeedsList(%d)", expirationTime));
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
if (feedlistCursor.moveToFirst()) {
do {
Feed feed = extractFeedFromCursorRow(adapter, feedlistCursor);
feeds.add(feed);
} while (feedlistCursor.moveToNext());
}
feedlistCursor.close();
return feeds;
}
Cursor feedlistCursor = adapter.getExpiredFeedsCursor(expirationTime);
List<Feed> feeds = new ArrayList<Feed>(feedlistCursor.getCount());
static List<Feed> getExpiredFeedsList(final Context context, final long expirationTime) {
if (AppConfig.DEBUG)
Log.d(TAG, String.format("getExpiredFeedsList(%d)", expirationTime));
if (feedlistCursor.moveToFirst()) {
do {
Feed feed = extractFeedFromCursorRow(adapter, feedlistCursor);
feeds.add(feed);
} while (feedlistCursor.moveToNext());
}
feedlistCursor.close();
return feeds;
}
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
public static void loadFeedDataOfFeedItemlist(Context context,
List<FeedItem> items) {
List<Feed> feeds = getFeedList(context);
for (FeedItem item : items) {
for (Feed feed : feeds) {
if (feed.getId() == item.getFeedId()) {
item.setFeed(feed);
break;
}
}
Cursor feedlistCursor = adapter.getExpiredFeedsCursor(expirationTime);
List<Feed> feeds = new ArrayList<Feed>(feedlistCursor.getCount());
if (feedlistCursor.moveToFirst()) {
do {
Feed feed = extractFeedFromCursorRow(adapter, feedlistCursor);
feeds.add(feed);
} while (feedlistCursor.moveToNext());
}
feedlistCursor.close();
return feeds;
}
public static void loadFeedDataOfFeedItemlist(Context context,
List<FeedItem> items) {
List<Feed> feeds = getFeedList(context);
for (FeedItem item : items) {
for (Feed feed : feeds) {
if (feed.getId() == item.getFeedId()) {
item.setFeed(feed);
break;
}
}
if (item.getFeed() == null) {
Log.w(TAG, "No match found for item with ID " + item.getId() + ". Feed ID was " + item.getFeedId());
}
}
}
}
}
public static List<FeedItem> getFeedItemList(Context context,
final Feed feed) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting Feeditems of feed " + feed.getTitle());
public static List<FeedItem> getFeedItemList(Context context,
final Feed feed) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting Feeditems of feed " + feed.getTitle());
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor itemlistCursor = adapter.getAllItemsOfFeedCursor(feed);
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
Cursor itemlistCursor = adapter.getAllItemsOfFeedCursor(feed);
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
Collections.sort(items, new FeedItemPubdateComparator());
Collections.sort(items, new FeedItemPubdateComparator());
adapter.close();
adapter.close();
for (FeedItem item : items) {
item.setFeed(feed);
}
for (FeedItem item : items) {
item.setFeed(feed);
}
return items;
}
return items;
}
static List<FeedItem> extractItemlistFromCursor(Context context, Cursor itemlistCursor) {
PodDBAdapter adapter = new PodDBAdapter(context);
@ -116,178 +116,178 @@ public final class DBReader {
return result;
}
private static List<FeedItem> extractItemlistFromCursor(
PodDBAdapter adapter, Cursor itemlistCursor) {
ArrayList<String> itemIds = new ArrayList<String>();
List<FeedItem> items = new ArrayList<FeedItem>(
itemlistCursor.getCount());
private static List<FeedItem> extractItemlistFromCursor(
PodDBAdapter adapter, Cursor itemlistCursor) {
ArrayList<String> itemIds = new ArrayList<String>();
List<FeedItem> items = new ArrayList<FeedItem>(
itemlistCursor.getCount());
if (itemlistCursor.moveToFirst()) {
do {
FeedItem item = new FeedItem();
if (itemlistCursor.moveToFirst()) {
do {
FeedItem item = new FeedItem();
item.setId(itemlistCursor.getLong(PodDBAdapter.IDX_FI_SMALL_ID));
item.setTitle(itemlistCursor
.getString(PodDBAdapter.IDX_FI_SMALL_TITLE));
item.setLink(itemlistCursor
.getString(PodDBAdapter.IDX_FI_SMALL_LINK));
item.setPubDate(new Date(itemlistCursor
.getLong(PodDBAdapter.IDX_FI_SMALL_PUBDATE)));
item.setPaymentLink(itemlistCursor
.getString(PodDBAdapter.IDX_FI_SMALL_PAYMENT_LINK));
item.setFeedId(itemlistCursor
.getLong(PodDBAdapter.IDX_FI_SMALL_FEED));
itemIds.add(String.valueOf(item.getId()));
item.setId(itemlistCursor.getLong(PodDBAdapter.IDX_FI_SMALL_ID));
item.setTitle(itemlistCursor
.getString(PodDBAdapter.IDX_FI_SMALL_TITLE));
item.setLink(itemlistCursor
.getString(PodDBAdapter.IDX_FI_SMALL_LINK));
item.setPubDate(new Date(itemlistCursor
.getLong(PodDBAdapter.IDX_FI_SMALL_PUBDATE)));
item.setPaymentLink(itemlistCursor
.getString(PodDBAdapter.IDX_FI_SMALL_PAYMENT_LINK));
item.setFeedId(itemlistCursor
.getLong(PodDBAdapter.IDX_FI_SMALL_FEED));
itemIds.add(String.valueOf(item.getId()));
item.setRead((itemlistCursor
item.setRead((itemlistCursor
.getInt(PodDBAdapter.IDX_FI_SMALL_READ) > 0));
item.setItemIdentifier(itemlistCursor
.getString(PodDBAdapter.IDX_FI_SMALL_ITEM_IDENTIFIER));
item.setItemIdentifier(itemlistCursor
.getString(PodDBAdapter.IDX_FI_SMALL_ITEM_IDENTIFIER));
// extract chapters
boolean hasSimpleChapters = itemlistCursor
.getInt(PodDBAdapter.IDX_FI_SMALL_HAS_CHAPTERS) > 0;
if (hasSimpleChapters) {
Cursor chapterCursor = adapter
.getSimpleChaptersOfFeedItemCursor(item);
if (chapterCursor.moveToFirst()) {
item.setChapters(new ArrayList<Chapter>());
do {
int chapterType = chapterCursor
.getInt(PodDBAdapter.KEY_CHAPTER_TYPE_INDEX);
Chapter chapter = null;
long start = chapterCursor
.getLong(PodDBAdapter.KEY_CHAPTER_START_INDEX);
String title = chapterCursor
.getString(PodDBAdapter.KEY_TITLE_INDEX);
String link = chapterCursor
.getString(PodDBAdapter.KEY_CHAPTER_LINK_INDEX);
// extract chapters
boolean hasSimpleChapters = itemlistCursor
.getInt(PodDBAdapter.IDX_FI_SMALL_HAS_CHAPTERS) > 0;
if (hasSimpleChapters) {
Cursor chapterCursor = adapter
.getSimpleChaptersOfFeedItemCursor(item);
if (chapterCursor.moveToFirst()) {
item.setChapters(new ArrayList<Chapter>());
do {
int chapterType = chapterCursor
.getInt(PodDBAdapter.KEY_CHAPTER_TYPE_INDEX);
Chapter chapter = null;
long start = chapterCursor
.getLong(PodDBAdapter.KEY_CHAPTER_START_INDEX);
String title = chapterCursor
.getString(PodDBAdapter.KEY_TITLE_INDEX);
String link = chapterCursor
.getString(PodDBAdapter.KEY_CHAPTER_LINK_INDEX);
switch (chapterType) {
case SimpleChapter.CHAPTERTYPE_SIMPLECHAPTER:
chapter = new SimpleChapter(start, title, item,
link);
break;
case ID3Chapter.CHAPTERTYPE_ID3CHAPTER:
chapter = new ID3Chapter(start, title, item,
link);
break;
case VorbisCommentChapter.CHAPTERTYPE_VORBISCOMMENT_CHAPTER:
chapter = new VorbisCommentChapter(start,
title, item, link);
break;
}
chapter.setId(chapterCursor
.getLong(PodDBAdapter.KEY_ID_INDEX));
item.getChapters().add(chapter);
} while (chapterCursor.moveToNext());
}
chapterCursor.close();
}
items.add(item);
} while (itemlistCursor.moveToNext());
}
switch (chapterType) {
case SimpleChapter.CHAPTERTYPE_SIMPLECHAPTER:
chapter = new SimpleChapter(start, title, item,
link);
break;
case ID3Chapter.CHAPTERTYPE_ID3CHAPTER:
chapter = new ID3Chapter(start, title, item,
link);
break;
case VorbisCommentChapter.CHAPTERTYPE_VORBISCOMMENT_CHAPTER:
chapter = new VorbisCommentChapter(start,
title, item, link);
break;
}
chapter.setId(chapterCursor
.getLong(PodDBAdapter.KEY_ID_INDEX));
item.getChapters().add(chapter);
} while (chapterCursor.moveToNext());
}
chapterCursor.close();
}
items.add(item);
} while (itemlistCursor.moveToNext());
}
extractMediafromItemlist(adapter, items, itemIds);
return items;
}
private static void extractMediafromItemlist(PodDBAdapter adapter,
List<FeedItem> items, ArrayList<String> itemIds) {
List<FeedItem> itemsCopy = new ArrayList<FeedItem>(items);
Cursor cursor = adapter.getFeedMediaCursorByItemID(itemIds
.toArray(new String[itemIds.size()]));
if (cursor.moveToFirst()) {
do {
long itemId = cursor.getLong(PodDBAdapter.KEY_MEDIA_FEEDITEM_INDEX);
// find matching feed item
FeedItem item = getMatchingItemForMedia(itemId, itemsCopy);
if (item != null) {
item.setMedia(extractFeedMediaFromCursorRow(cursor));
item.getMedia().setItem(item);
}
} while (cursor.moveToNext());
cursor.close();
}
}
private static FeedMedia extractFeedMediaFromCursorRow(final Cursor cursor) {
long mediaId = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
Date playbackCompletionDate = null;
long playbackCompletionTime = cursor
.getLong(PodDBAdapter.KEY_PLAYBACK_COMPLETION_DATE_INDEX);
if (playbackCompletionTime > 0) {
playbackCompletionDate = new Date(
playbackCompletionTime);
}
return new FeedMedia(
mediaId,
null,
cursor.getInt(PodDBAdapter.KEY_DURATION_INDEX),
cursor.getInt(PodDBAdapter.KEY_POSITION_INDEX),
cursor.getLong(PodDBAdapter.KEY_SIZE_INDEX),
cursor.getString(PodDBAdapter.KEY_MIME_TYPE_INDEX),
cursor.getString(PodDBAdapter.KEY_FILE_URL_INDEX),
cursor.getString(PodDBAdapter.KEY_DOWNLOAD_URL_INDEX),
cursor.getInt(PodDBAdapter.KEY_DOWNLOADED_INDEX) > 0,
playbackCompletionDate);
extractMediafromItemlist(adapter, items, itemIds);
return items;
}
private static Feed extractFeedFromCursorRow(PodDBAdapter adapter,
Cursor cursor) {
Date lastUpdate = new Date(
cursor.getLong(PodDBAdapter.KEY_LAST_UPDATE_INDEX));
Feed feed = new Feed(lastUpdate);
private static void extractMediafromItemlist(PodDBAdapter adapter,
List<FeedItem> items, ArrayList<String> itemIds) {
feed.setId(cursor.getLong(PodDBAdapter.KEY_ID_INDEX));
feed.setTitle(cursor.getString(PodDBAdapter.KEY_TITLE_INDEX));
feed.setLink(cursor.getString(PodDBAdapter.KEY_LINK_INDEX));
feed.setDescription(cursor
.getString(PodDBAdapter.KEY_DESCRIPTION_INDEX));
feed.setPaymentLink(cursor
.getString(PodDBAdapter.KEY_PAYMENT_LINK_INDEX));
feed.setAuthor(cursor.getString(PodDBAdapter.KEY_AUTHOR_INDEX));
feed.setLanguage(cursor.getString(PodDBAdapter.KEY_LANGUAGE_INDEX));
feed.setType(cursor.getString(PodDBAdapter.KEY_TYPE_INDEX));
feed.setFeedIdentifier(cursor
.getString(PodDBAdapter.KEY_FEED_IDENTIFIER_INDEX));
long imageIndex = cursor.getLong(PodDBAdapter.KEY_IMAGE_INDEX);
if (imageIndex != 0) {
feed.setImage(getFeedImage(adapter, imageIndex));
feed.getImage().setFeed(feed);
}
feed.setFile_url(cursor.getString(PodDBAdapter.KEY_FILE_URL_INDEX));
feed.setDownload_url(cursor
.getString(PodDBAdapter.KEY_DOWNLOAD_URL_INDEX));
feed.setDownloaded(cursor.getInt(PodDBAdapter.KEY_DOWNLOADED_INDEX) > 0);
List<FeedItem> itemsCopy = new ArrayList<FeedItem>(items);
Cursor cursor = adapter.getFeedMediaCursorByItemID(itemIds
.toArray(new String[itemIds.size()]));
if (cursor.moveToFirst()) {
do {
long itemId = cursor.getLong(PodDBAdapter.KEY_MEDIA_FEEDITEM_INDEX);
// find matching feed item
FeedItem item = getMatchingItemForMedia(itemId, itemsCopy);
if (item != null) {
item.setMedia(extractFeedMediaFromCursorRow(cursor));
item.getMedia().setItem(item);
}
} while (cursor.moveToNext());
cursor.close();
}
}
return feed;
}
private static FeedMedia extractFeedMediaFromCursorRow(final Cursor cursor) {
long mediaId = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
Date playbackCompletionDate = null;
long playbackCompletionTime = cursor
.getLong(PodDBAdapter.KEY_PLAYBACK_COMPLETION_DATE_INDEX);
if (playbackCompletionTime > 0) {
playbackCompletionDate = new Date(
playbackCompletionTime);
}
private static FeedItem getMatchingItemForMedia(long itemId,
List<FeedItem> items) {
for (FeedItem item : items) {
if (item.getId() == itemId) {
return item;
}
}
return null;
}
static List<FeedItem> getQueue(Context context, PodDBAdapter adapter) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting queue");
return new FeedMedia(
mediaId,
null,
cursor.getInt(PodDBAdapter.KEY_DURATION_INDEX),
cursor.getInt(PodDBAdapter.KEY_POSITION_INDEX),
cursor.getLong(PodDBAdapter.KEY_SIZE_INDEX),
cursor.getString(PodDBAdapter.KEY_MIME_TYPE_INDEX),
cursor.getString(PodDBAdapter.KEY_FILE_URL_INDEX),
cursor.getString(PodDBAdapter.KEY_DOWNLOAD_URL_INDEX),
cursor.getInt(PodDBAdapter.KEY_DOWNLOADED_INDEX) > 0,
playbackCompletionDate);
}
Cursor itemlistCursor = adapter.getQueueCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
loadFeedDataOfFeedItemlist(context, items);
private static Feed extractFeedFromCursorRow(PodDBAdapter adapter,
Cursor cursor) {
Date lastUpdate = new Date(
cursor.getLong(PodDBAdapter.KEY_LAST_UPDATE_INDEX));
Feed feed = new Feed(lastUpdate);
return items;
}
feed.setId(cursor.getLong(PodDBAdapter.KEY_ID_INDEX));
feed.setTitle(cursor.getString(PodDBAdapter.KEY_TITLE_INDEX));
feed.setLink(cursor.getString(PodDBAdapter.KEY_LINK_INDEX));
feed.setDescription(cursor
.getString(PodDBAdapter.KEY_DESCRIPTION_INDEX));
feed.setPaymentLink(cursor
.getString(PodDBAdapter.KEY_PAYMENT_LINK_INDEX));
feed.setAuthor(cursor.getString(PodDBAdapter.KEY_AUTHOR_INDEX));
feed.setLanguage(cursor.getString(PodDBAdapter.KEY_LANGUAGE_INDEX));
feed.setType(cursor.getString(PodDBAdapter.KEY_TYPE_INDEX));
feed.setFeedIdentifier(cursor
.getString(PodDBAdapter.KEY_FEED_IDENTIFIER_INDEX));
long imageIndex = cursor.getLong(PodDBAdapter.KEY_IMAGE_INDEX);
if (imageIndex != 0) {
feed.setImage(getFeedImage(adapter, imageIndex));
feed.getImage().setFeed(feed);
}
feed.setFile_url(cursor.getString(PodDBAdapter.KEY_FILE_URL_INDEX));
feed.setDownload_url(cursor
.getString(PodDBAdapter.KEY_DOWNLOAD_URL_INDEX));
feed.setDownloaded(cursor.getInt(PodDBAdapter.KEY_DOWNLOADED_INDEX) > 0);
return feed;
}
private static FeedItem getMatchingItemForMedia(long itemId,
List<FeedItem> items) {
for (FeedItem item : items) {
if (item.getId() == itemId) {
return item;
}
}
return null;
}
static List<FeedItem> getQueue(Context context, PodDBAdapter adapter) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting queue");
Cursor itemlistCursor = adapter.getQueueCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
loadFeedDataOfFeedItemlist(context, items);
return items;
}
public static List<Long> getQueueIDList(Context context) {
PodDBAdapter adapter = new PodDBAdapter(context);
@ -312,178 +312,198 @@ public final class DBReader {
return queueIds;
}
public static List<FeedItem> getQueue(Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting queue");
public static List<FeedItem> getQueue(Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting queue");
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
List<FeedItem> items = getQueue(context, adapter);
adapter.close();
return items;
}
public static List<FeedItem> getDownloadedItems(Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting downloaded items");
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
List<FeedItem> items = getQueue(context, adapter);
adapter.close();
return items;
}
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor itemlistCursor = adapter.getDownloadedItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
loadFeedDataOfFeedItemlist(context, items);
Collections.sort(items, new FeedItemPubdateComparator());
public static List<FeedItem> getDownloadedItems(Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting downloaded items");
adapter.close();
return items;
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
}
public static List<FeedItem> getUnreadItemsList(Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting unread items list");
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor itemlistCursor = adapter.getUnreadItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
loadFeedDataOfFeedItemlist(context, items);
adapter.close();
return items;
}
public static long[] getUnreadItemIds(Context context) {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor cursor = adapter.getUnreadItemIdsCursor();
long[] itemIds = new long[cursor.getCount()];
int i = 0;
if (cursor.moveToFirst()) {
do {
itemIds[i] = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
i++;
} while (cursor.moveToNext());
}
return itemIds;
}
public static List<FeedItem> getPlaybackHistory(final Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Loading playback history");
final int PLAYBACK_HISTORY_SIZE = 50;
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor mediaCursor = adapter.getCompletedMediaCursor(PLAYBACK_HISTORY_SIZE);
String[] itemIds = new String[mediaCursor.getCount()];
for (int i = 0; i < itemIds.length && mediaCursor.moveToPosition(i); i++) {
itemIds[i] = Long.toString(mediaCursor.getLong(PodDBAdapter.KEY_MEDIA_FEEDITEM_INDEX));
}
mediaCursor.close();
Cursor itemCursor = adapter.getFeedItemCursor(itemIds);
List<FeedItem> items = extractItemlistFromCursor(adapter, itemCursor);
Cursor itemlistCursor = adapter.getDownloadedItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
loadFeedDataOfFeedItemlist(context, items);
itemCursor.close();
adapter.close();
return items;
}
Collections.sort(items, new FeedItemPubdateComparator());
public static List<DownloadStatus> getDownloadLog(Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting DownloadLog");
adapter.close();
return items;
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor logCursor = adapter.getDownloadLogCursor();
List<DownloadStatus> downloadLog = new ArrayList<DownloadStatus>(
logCursor.getCount());
}
if (logCursor.moveToFirst()) {
do {
long id = logCursor.getLong(PodDBAdapter.KEY_ID_INDEX);
public static List<FeedItem> getUnreadItemsList(Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting unread items list");
long feedfileId = logCursor
.getLong(PodDBAdapter.KEY_FEEDFILE_INDEX);
int feedfileType = logCursor
.getInt(PodDBAdapter.KEY_FEEDFILETYPE_INDEX);
boolean successful = logCursor
.getInt(PodDBAdapter.KEY_SUCCESSFUL_INDEX) > 0;
int reason = logCursor.getInt(PodDBAdapter.KEY_REASON_INDEX);
String reasonDetailed = logCursor
.getString(PodDBAdapter.KEY_REASON_DETAILED_INDEX);
String title = logCursor
.getString(PodDBAdapter.KEY_DOWNLOADSTATUS_TITLE_INDEX);
Date completionDate = new Date(
logCursor
.getLong(PodDBAdapter.KEY_COMPLETION_DATE_INDEX));
downloadLog.add(new DownloadStatus(id, title, feedfileId,
feedfileType, successful, reason, completionDate,
reasonDetailed));
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
} while (logCursor.moveToNext());
}
logCursor.close();
Collections.sort(downloadLog, new DownloadStatusComparator());
return downloadLog;
}
Cursor itemlistCursor = adapter.getUnreadItemsCursor();
List<FeedItem> items = extractItemlistFromCursor(adapter,
itemlistCursor);
itemlistCursor.close();
public static Feed getFeed(final Context context, final long feedId) {
if (AppConfig.DEBUG)
Log.d(TAG, "Loading feed with id " + feedId);
Feed feed = null;
loadFeedDataOfFeedItemlist(context, items);
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor feedCursor = adapter.getFeedCursor(feedId);
if (feedCursor.moveToFirst()) {
feed = extractFeedFromCursorRow(adapter, feedCursor);
feed.setItems(getFeedItemList(context, feed));
} else {
adapter.close();
return items;
}
public static long[] getUnreadItemIds(Context context) {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor cursor = adapter.getUnreadItemIdsCursor();
long[] itemIds = new long[cursor.getCount()];
int i = 0;
if (cursor.moveToFirst()) {
do {
itemIds[i] = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
i++;
} while (cursor.moveToNext());
}
return itemIds;
}
public static List<FeedItem> getPlaybackHistory(final Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Loading playback history");
final int PLAYBACK_HISTORY_SIZE = 50;
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor mediaCursor = adapter.getCompletedMediaCursor(PLAYBACK_HISTORY_SIZE);
String[] itemIds = new String[mediaCursor.getCount()];
for (int i = 0; i < itemIds.length && mediaCursor.moveToPosition(i); i++) {
itemIds[i] = Long.toString(mediaCursor.getLong(PodDBAdapter.KEY_MEDIA_FEEDITEM_INDEX));
}
mediaCursor.close();
Cursor itemCursor = adapter.getFeedItemCursor(itemIds);
List<FeedItem> items = extractItemlistFromCursor(adapter, itemCursor);
loadFeedDataOfFeedItemlist(context, items);
itemCursor.close();
adapter.close();
return items;
}
public static List<DownloadStatus> getDownloadLog(Context context) {
if (AppConfig.DEBUG)
Log.d(TAG, "Extracting DownloadLog");
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor logCursor = adapter.getDownloadLogCursor();
List<DownloadStatus> downloadLog = new ArrayList<DownloadStatus>(
logCursor.getCount());
if (logCursor.moveToFirst()) {
do {
long id = logCursor.getLong(PodDBAdapter.KEY_ID_INDEX);
long feedfileId = logCursor
.getLong(PodDBAdapter.KEY_FEEDFILE_INDEX);
int feedfileType = logCursor
.getInt(PodDBAdapter.KEY_FEEDFILETYPE_INDEX);
boolean successful = logCursor
.getInt(PodDBAdapter.KEY_SUCCESSFUL_INDEX) > 0;
int reason = logCursor.getInt(PodDBAdapter.KEY_REASON_INDEX);
String reasonDetailed = logCursor
.getString(PodDBAdapter.KEY_REASON_DETAILED_INDEX);
String title = logCursor
.getString(PodDBAdapter.KEY_DOWNLOADSTATUS_TITLE_INDEX);
Date completionDate = new Date(
logCursor
.getLong(PodDBAdapter.KEY_COMPLETION_DATE_INDEX));
downloadLog.add(new DownloadStatus(id, title, feedfileId,
feedfileType, successful, reason, completionDate,
reasonDetailed));
} while (logCursor.moveToNext());
}
logCursor.close();
Collections.sort(downloadLog, new DownloadStatusComparator());
return downloadLog;
}
public static List<FeedItemStatistics> getFeedStatisticsList(final Context context) {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
List<FeedItemStatistics> result = new ArrayList<FeedItemStatistics>();
Cursor cursor = adapter.getFeedStatisticsCursor();
if (cursor.moveToFirst()) {
do {
result.add(new FeedItemStatistics(cursor.getLong(PodDBAdapter.IDX_FEEDSTATISTICS_FEED),
cursor.getInt(PodDBAdapter.IDX_FEEDSTATISTICS_NUM_ITEMS),
cursor.getInt(PodDBAdapter.IDX_FEEDSTATISTICS_NEW_ITEMS),
cursor.getInt(PodDBAdapter.IDX_FEEDSTATISTICS_IN_PROGRESS_EPISODES),
new Date(cursor.getLong(PodDBAdapter.IDX_FEEDSTATISTICS_LATEST_EPISODE))));
} while (cursor.moveToNext());
}
cursor.close();
adapter.close();
return result;
}
public static Feed getFeed(final Context context, final long feedId) {
if (AppConfig.DEBUG)
Log.d(TAG, "Loading feed with id " + feedId);
Feed feed = null;
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
Cursor feedCursor = adapter.getFeedCursor(feedId);
if (feedCursor.moveToFirst()) {
feed = extractFeedFromCursorRow(adapter, feedCursor);
feed.setItems(getFeedItemList(context, feed));
} else {
Log.e(TAG, "getFeed could not find feed with id " + feedId);
}
adapter.close();
return feed;
}
static FeedItem getFeedItem(final Context context, final long itemId, PodDBAdapter adapter) {
if (AppConfig.DEBUG)
Log.d(TAG, "Loading feeditem with id " + itemId);
FeedItem item = null;
adapter.close();
return feed;
}
Cursor itemCursor = adapter.getFeedItemCursor(Long.toString(itemId));
if (itemCursor.moveToFirst()) {
List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor);
if (list.size() > 0) {
item = list.get(0);
static FeedItem getFeedItem(final Context context, final long itemId, PodDBAdapter adapter) {
if (AppConfig.DEBUG)
Log.d(TAG, "Loading feeditem with id " + itemId);
FeedItem item = null;
Cursor itemCursor = adapter.getFeedItemCursor(Long.toString(itemId));
if (itemCursor.moveToFirst()) {
List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor);
if (list.size() > 0) {
item = list.get(0);
loadFeedDataOfFeedItemlist(context, list);
}
}
return item;
}
}
return item;
}
}
public static FeedItem getFeedItem(final Context context, final long itemId) {
if (AppConfig.DEBUG)
Log.d(TAG, "Loading feeditem with id " + itemId);
public static FeedItem getFeedItem(final Context context, final long itemId) {
if (AppConfig.DEBUG)
Log.d(TAG, "Loading feeditem with id " + itemId);
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
FeedItem item = getFeedItem(context, itemId, adapter);
adapter.close();
return item;
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
FeedItem item = getFeedItem(context, itemId, adapter);
adapter.close();
return item;
}
}
public static void loadExtraInformationOfFeedItem(final Context context, final FeedItem item) {
PodDBAdapter adapter = new PodDBAdapter(context);
@ -499,14 +519,14 @@ public final class DBReader {
}
adapter.close();
}
public static int getNumberOfDownloadedEpisodes(final Context context) {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
final int result = adapter.getNumberOfDownloadedEpisodes();
adapter.close();
return result;
}
public static int getNumberOfDownloadedEpisodes(final Context context) {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
final int result = adapter.getNumberOfDownloadedEpisodes();
adapter.close();
return result;
}
public static int getNumberOfUnreadItems(final Context context) {
PodDBAdapter adapter = new PodDBAdapter(context);
@ -519,10 +539,9 @@ public final class DBReader {
/**
* Searches the DB for a FeedImage of the given id.
*
* @param imageId
* The id of the object
* @param imageId The id of the object
* @return The found object
* */
*/
public static FeedImage getFeedImage(final Context context, final long imageId) {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
@ -531,37 +550,35 @@ public final class DBReader {
return result;
}
/**
* Searches the DB for a FeedImage of the given id.
*
* @param id
* The id of the object
* @return The found object
* */
static FeedImage getFeedImage(PodDBAdapter adapter, final long id) {
Cursor cursor = adapter.getImageOfFeedCursor(id);
if ((cursor.getCount() == 0) || !cursor.moveToFirst()) {
throw new SQLException("No FeedImage found at index: " + id);
}
FeedImage image = new FeedImage(id, cursor.getString(cursor
.getColumnIndex(PodDBAdapter.KEY_TITLE)),
cursor.getString(cursor
.getColumnIndex(PodDBAdapter.KEY_FILE_URL)),
cursor.getString(cursor
.getColumnIndex(PodDBAdapter.KEY_DOWNLOAD_URL)),
cursor.getInt(cursor
.getColumnIndex(PodDBAdapter.KEY_DOWNLOADED)) > 0);
cursor.close();
return image;
}
/**
* Searches the DB for a FeedImage of the given id.
*
* @param id The id of the object
* @return The found object
*/
static FeedImage getFeedImage(PodDBAdapter adapter, final long id) {
Cursor cursor = adapter.getImageOfFeedCursor(id);
if ((cursor.getCount() == 0) || !cursor.moveToFirst()) {
throw new SQLException("No FeedImage found at index: " + id);
}
FeedImage image = new FeedImage(id, cursor.getString(cursor
.getColumnIndex(PodDBAdapter.KEY_TITLE)),
cursor.getString(cursor
.getColumnIndex(PodDBAdapter.KEY_FILE_URL)),
cursor.getString(cursor
.getColumnIndex(PodDBAdapter.KEY_DOWNLOAD_URL)),
cursor.getInt(cursor
.getColumnIndex(PodDBAdapter.KEY_DOWNLOADED)) > 0);
cursor.close();
return image;
}
/**
* Searches the DB for a FeedMedia of the given id.
*
* @param mediaId
* The id of the object
* @param mediaId The id of the object
* @return The found object
* */
*/
public static FeedMedia getFeedMedia(final Context context, final long mediaId) {
PodDBAdapter adapter = new PodDBAdapter(context);

View File

@ -0,0 +1,42 @@
package de.danoeh.antennapod.storage;
import java.util.Date;
/**
* Contains information about a feed's items.
*/
public class FeedItemStatistics {
private long feedID;
private int numberOfItems;
private int numberOfNewItems;
private int numberOfInProgressItems;
private Date lastUpdate;
public FeedItemStatistics(long feedID, int numberOfItems, int numberOfNewItems, int numberOfInProgressItems, Date lastUpdate) {
this.feedID = feedID;
this.numberOfItems = numberOfItems;
this.numberOfNewItems = numberOfNewItems;
this.numberOfInProgressItems = numberOfInProgressItems;
this.lastUpdate = lastUpdate;
}
public long getFeedID() {
return feedID;
}
public int getNumberOfItems() {
return numberOfItems;
}
public int getNumberOfNewItems() {
return numberOfNewItems;
}
public int getNumberOfInProgressItems() {
return numberOfInProgressItems;
}
public Date getLastUpdate() {
return lastUpdate;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,17 @@
package de.danoeh.antennapod.util;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* Created by daniel on 04.08.13.
*/
public interface ShownotesProvider {
/**
* Loads shownotes. If the shownotes have to be loaded from a file or from a
* database, it should be done in a separate thread. After the shownotes
* have been loaded, callback.onShownotesLoaded should be called.
*/
public Callable<String> loadShownotes();
}