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:
parent
edd84c6a4c
commit
6d1a8535f5
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
@ -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();
|
||||
|
||||
}
|
Loading…
Reference in New Issue