Redone new indicator
This commit is contained in:
parent
c829a4e9b2
commit
4561f16f11
|
@ -301,7 +301,7 @@ public class DBReaderTest extends InstrumentationTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetUnreadItemIds() {
|
public void testGetNewItemIds() {
|
||||||
final Context context = getInstrumentation().getTargetContext();
|
final Context context = getInstrumentation().getTargetContext();
|
||||||
final int numItems = 10;
|
final int numItems = 10;
|
||||||
|
|
||||||
|
@ -310,10 +310,11 @@ public class DBReaderTest extends InstrumentationTestCase {
|
||||||
for (int i = 0; i < unread.size(); i++) {
|
for (int i = 0; i < unread.size(); i++) {
|
||||||
unreadIds[i] = unread.get(i).getId();
|
unreadIds[i] = unread.get(i).getId();
|
||||||
}
|
}
|
||||||
long[] unreadSaved = DBReader.getUnreadItemIds(context);
|
LongList unreadSaved = DBReader.getNewItemIds(context);
|
||||||
assertNotNull(unreadSaved);
|
assertNotNull(unreadSaved);
|
||||||
assertTrue(unread.size() == unreadSaved.length);
|
assertTrue(unread.size() == unreadSaved.size());
|
||||||
for (long savedId : unreadSaved) {
|
for(int i=0; i < unreadSaved.size(); i++) {
|
||||||
|
long savedId = unreadSaved.get(i);
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (long id : unreadIds) {
|
for (long id : unreadIds) {
|
||||||
if (id == savedId) {
|
if (id == savedId) {
|
||||||
|
|
|
@ -22,19 +22,22 @@ import de.danoeh.antennapod.core.util.Converter;
|
||||||
/**
|
/**
|
||||||
* List adapter for the list of new episodes
|
* List adapter for the list of new episodes
|
||||||
*/
|
*/
|
||||||
public class NewEpisodesListAdapter extends BaseAdapter {
|
public class AllEpisodesListAdapter extends BaseAdapter {
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private final ItemAccess itemAccess;
|
private final ItemAccess itemAccess;
|
||||||
private final ActionButtonCallback actionButtonCallback;
|
private final ActionButtonCallback actionButtonCallback;
|
||||||
private final ActionButtonUtils actionButtonUtils;
|
private final ActionButtonUtils actionButtonUtils;
|
||||||
|
private final boolean showOnlyNewEpisodes;
|
||||||
|
|
||||||
public NewEpisodesListAdapter(Context context, ItemAccess itemAccess, ActionButtonCallback actionButtonCallback) {
|
public AllEpisodesListAdapter(Context context, ItemAccess itemAccess, ActionButtonCallback actionButtonCallback,
|
||||||
|
boolean showOnlyNewEpisodes) {
|
||||||
super();
|
super();
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.itemAccess = itemAccess;
|
this.itemAccess = itemAccess;
|
||||||
this.actionButtonUtils = new ActionButtonUtils(context);
|
this.actionButtonUtils = new ActionButtonUtils(context);
|
||||||
this.actionButtonCallback = actionButtonCallback;
|
this.actionButtonCallback = actionButtonCallback;
|
||||||
|
this.showOnlyNewEpisodes = showOnlyNewEpisodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -88,7 +91,7 @@ public class NewEpisodesListAdapter extends BaseAdapter {
|
||||||
|
|
||||||
holder.title.setText(item.getTitle());
|
holder.title.setText(item.getTitle());
|
||||||
holder.pubDate.setText(DateUtils.formatDateTime(context, item.getPubDate().getTime(), DateUtils.FORMAT_ABBREV_ALL));
|
holder.pubDate.setText(DateUtils.formatDateTime(context, item.getPubDate().getTime(), DateUtils.FORMAT_ABBREV_ALL));
|
||||||
if (item.isRead()) {
|
if (showOnlyNewEpisodes || item.isRead() || false == itemAccess.isNew(item)) {
|
||||||
holder.statusUnread.setVisibility(View.INVISIBLE);
|
holder.statusUnread.setVisibility(View.INVISIBLE);
|
||||||
} else {
|
} else {
|
||||||
holder.statusUnread.setVisibility(View.VISIBLE);
|
holder.statusUnread.setVisibility(View.VISIBLE);
|
||||||
|
@ -175,5 +178,8 @@ public class NewEpisodesListAdapter extends BaseAdapter {
|
||||||
int getItemDownloadProgressPercent(FeedItem item);
|
int getItemDownloadProgressPercent(FeedItem item);
|
||||||
|
|
||||||
boolean isInQueue(FeedItem item);
|
boolean isInQueue(FeedItem item);
|
||||||
|
|
||||||
|
boolean isNew(FeedItem item);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -110,7 +110,9 @@ public class FeedItemlistAdapter extends BaseAdapter {
|
||||||
}
|
}
|
||||||
holder.title.setText(buffer.toString());
|
holder.title.setText(buffer.toString());
|
||||||
|
|
||||||
if(item.isRead()) {
|
if(false == item.isRead() && itemAccess.isNew(item)) {
|
||||||
|
holder.statusUnread.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
holder.statusUnread.setVisibility(View.INVISIBLE);
|
holder.statusUnread.setVisibility(View.INVISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,6 +216,8 @@ public class FeedItemlistAdapter extends BaseAdapter {
|
||||||
|
|
||||||
FeedItem getItem(int position);
|
FeedItem getItem(int position);
|
||||||
|
|
||||||
|
boolean isNew(FeedItem item);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,6 +142,12 @@ public class StorageCallbacksImpl implements StorageCallbacks {
|
||||||
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
|
db.execSQL("ALTER TABLE " + PodDBAdapter.TABLE_NAME_FEEDS
|
||||||
+ " ADD COLUMN " + PodDBAdapter.KEY_LAST_UPDATE_FAILED + " INTEGER DEFAULT 0");
|
+ " ADD COLUMN " + PodDBAdapter.KEY_LAST_UPDATE_FAILED + " INTEGER DEFAULT 0");
|
||||||
|
|
||||||
|
// create indexes
|
||||||
|
db.execSQL(PodDBAdapter.CREATE_INDEX_FEEDITEMS_FEED);
|
||||||
|
db.execSQL(PodDBAdapter.CREATE_INDEX_FEEDITEMS_IMAGE);
|
||||||
|
db.execSQL(PodDBAdapter.CREATE_INDEX_FEEDMEDIA_FEEDITEM);
|
||||||
|
db.execSQL(PodDBAdapter.CREATE_INDEX_QUEUE_FEEDITEM);
|
||||||
|
db.execSQL(PodDBAdapter.CREATE_INDEX_SIMPLECHAPTERS_FEEDITEM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||||
import de.danoeh.antennapod.R;
|
import de.danoeh.antennapod.R;
|
||||||
import de.danoeh.antennapod.activity.MainActivity;
|
import de.danoeh.antennapod.activity.MainActivity;
|
||||||
import de.danoeh.antennapod.adapter.DefaultActionButtonCallback;
|
import de.danoeh.antennapod.adapter.DefaultActionButtonCallback;
|
||||||
import de.danoeh.antennapod.adapter.NewEpisodesListAdapter;
|
import de.danoeh.antennapod.adapter.AllEpisodesListAdapter;
|
||||||
import de.danoeh.antennapod.core.asynctask.DownloadObserver;
|
import de.danoeh.antennapod.core.asynctask.DownloadObserver;
|
||||||
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
|
import de.danoeh.antennapod.core.dialog.ConfirmationDialog;
|
||||||
import de.danoeh.antennapod.core.feed.EventDistributor;
|
import de.danoeh.antennapod.core.feed.EventDistributor;
|
||||||
|
@ -64,12 +64,13 @@ public class AllEpisodesFragment extends Fragment {
|
||||||
|
|
||||||
private String prefName;
|
private String prefName;
|
||||||
protected DragSortListView listView;
|
protected DragSortListView listView;
|
||||||
private NewEpisodesListAdapter listAdapter;
|
private AllEpisodesListAdapter listAdapter;
|
||||||
private TextView txtvEmpty;
|
private TextView txtvEmpty;
|
||||||
private ProgressBar progLoading;
|
private ProgressBar progLoading;
|
||||||
|
|
||||||
private List<FeedItem> episodes;
|
private List<FeedItem> episodes;
|
||||||
private LongList queueAccess;
|
private LongList queuedItemsIds;
|
||||||
|
private LongList newItemsIds;
|
||||||
private List<Downloader> downloaderList;
|
private List<Downloader> downloaderList;
|
||||||
|
|
||||||
private boolean itemsLoaded = false;
|
private boolean itemsLoaded = false;
|
||||||
|
@ -308,7 +309,8 @@ public class AllEpisodesFragment extends Fragment {
|
||||||
|
|
||||||
private void onFragmentLoaded() {
|
private void onFragmentLoaded() {
|
||||||
if (listAdapter == null) {
|
if (listAdapter == null) {
|
||||||
listAdapter = new NewEpisodesListAdapter(activity.get(), itemAccess, new DefaultActionButtonCallback(activity.get()));
|
listAdapter = new AllEpisodesListAdapter(activity.get(), itemAccess,
|
||||||
|
new DefaultActionButtonCallback(activity.get()), showOnlyNewEpisodes);
|
||||||
listView.setAdapter(listAdapter);
|
listView.setAdapter(listAdapter);
|
||||||
listView.setEmptyView(txtvEmpty);
|
listView.setEmptyView(txtvEmpty);
|
||||||
downloadObserver = new DownloadObserver(activity.get(), new Handler(), downloadObserverCallback);
|
downloadObserver = new DownloadObserver(activity.get(), new Handler(), downloadObserverCallback);
|
||||||
|
@ -337,7 +339,7 @@ public class AllEpisodesFragment extends Fragment {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private NewEpisodesListAdapter.ItemAccess itemAccess = new NewEpisodesListAdapter.ItemAccess() {
|
private AllEpisodesListAdapter.ItemAccess itemAccess = new AllEpisodesListAdapter.ItemAccess() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCount() {
|
public int getCount() {
|
||||||
|
@ -371,7 +373,17 @@ public class AllEpisodesFragment extends Fragment {
|
||||||
@Override
|
@Override
|
||||||
public boolean isInQueue(FeedItem item) {
|
public boolean isInQueue(FeedItem item) {
|
||||||
if (itemsLoaded) {
|
if (itemsLoaded) {
|
||||||
return queueAccess.contains(item.getId());
|
return queuedItemsIds.contains(item.getId());
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNew(FeedItem item) {
|
||||||
|
if (itemsLoaded) {
|
||||||
|
// should actually never be called in NewEpisodesFragment, but better safe than sorry
|
||||||
|
return showOnlyNewEpisodes || newItemsIds.contains(item.getId());
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -436,12 +448,14 @@ public class AllEpisodesFragment extends Fragment {
|
||||||
if(showOnlyNewEpisodes) {
|
if(showOnlyNewEpisodes) {
|
||||||
return new Object[] {
|
return new Object[] {
|
||||||
DBReader.getNewItemsList(context),
|
DBReader.getNewItemsList(context),
|
||||||
DBReader.getQueueIDList(context)
|
DBReader.getQueueIDList(context),
|
||||||
|
null // see ItemAccess.isNew
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return new Object[]{
|
return new Object[]{
|
||||||
DBReader.getRecentlyPublishedEpisodes(context, RECENT_EPISODES_LIMIT),
|
DBReader.getRecentlyPublishedEpisodes(context, RECENT_EPISODES_LIMIT),
|
||||||
DBReader.getQueueIDList(context)
|
DBReader.getQueueIDList(context),
|
||||||
|
DBReader.getNewItemIds(context)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -457,7 +471,8 @@ public class AllEpisodesFragment extends Fragment {
|
||||||
|
|
||||||
if (lists != null) {
|
if (lists != null) {
|
||||||
episodes = (List<FeedItem>) lists[0];
|
episodes = (List<FeedItem>) lists[0];
|
||||||
queueAccess = (LongList) lists[1];
|
queuedItemsIds = (LongList) lists[1];
|
||||||
|
newItemsIds = (LongList) lists[2];
|
||||||
itemsLoaded = true;
|
itemsLoaded = true;
|
||||||
if (viewsCreated && activity.get() != null) {
|
if (viewsCreated && activity.get() != null) {
|
||||||
onFragmentLoaded();
|
onFragmentLoaded();
|
||||||
|
|
|
@ -9,8 +9,8 @@ import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.support.v4.app.ListFragment;
|
import android.support.v4.app.ListFragment;
|
||||||
import android.support.v4.util.Pair;
|
|
||||||
import android.support.v4.view.MenuItemCompat;
|
import android.support.v4.view.MenuItemCompat;
|
||||||
|
|
||||||
import android.support.v7.app.ActionBarActivity;
|
import android.support.v7.app.ActionBarActivity;
|
||||||
import android.support.v7.widget.SearchView;
|
import android.support.v7.widget.SearchView;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
@ -85,7 +85,9 @@ public class ItemlistFragment extends ListFragment {
|
||||||
|
|
||||||
private long feedID;
|
private long feedID;
|
||||||
private Feed feed;
|
private Feed feed;
|
||||||
private LongList queue;
|
private LongList queuedItemsIds;
|
||||||
|
private LongList newItemsIds;
|
||||||
|
|
||||||
|
|
||||||
private boolean itemsLoaded = false;
|
private boolean itemsLoaded = false;
|
||||||
private boolean viewsCreated = false;
|
private boolean viewsCreated = false;
|
||||||
|
@ -299,7 +301,7 @@ public class ItemlistFragment extends ListFragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
contextMenu = menu;
|
contextMenu = menu;
|
||||||
FeedItemMenuHandler.onPrepareMenu(contextMenuInterface, item, false, queue);
|
FeedItemMenuHandler.onPrepareMenu(contextMenuInterface, item, false, queuedItemsIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -547,7 +549,12 @@ public class ItemlistFragment extends ListFragment {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isInQueue(FeedItem item) {
|
public boolean isInQueue(FeedItem item) {
|
||||||
return (queue != null) && queue.contains(item.getId());
|
return (queuedItemsIds != null) && queuedItemsIds.contains(item.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNew(FeedItem item) {
|
||||||
|
return (newItemsIds != null) && newItemsIds.contains(item.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -580,9 +587,9 @@ public class ItemlistFragment extends ListFragment {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ItemLoader extends AsyncTask<Long, Void, Pair<Feed,LongList>> {
|
private class ItemLoader extends AsyncTask<Long, Void, Object[]> {
|
||||||
@Override
|
@Override
|
||||||
protected Pair<Feed,LongList> doInBackground(Long... params) {
|
protected Object[] doInBackground(Long... params) {
|
||||||
long feedID = params[0];
|
long feedID = params[0];
|
||||||
Context context = getActivity();
|
Context context = getActivity();
|
||||||
if (context != null) {
|
if (context != null) {
|
||||||
|
@ -591,19 +598,21 @@ public class ItemlistFragment extends ListFragment {
|
||||||
FeedItemFilter filter = feed.getItemFilter();
|
FeedItemFilter filter = feed.getItemFilter();
|
||||||
feed.setItems(filter.filter(context, feed.getItems()));
|
feed.setItems(filter.filter(context, feed.getItems()));
|
||||||
}
|
}
|
||||||
LongList queue = DBReader.getQueueIDList(context);
|
LongList queuedItemsIds = DBReader.getQueueIDList(context);
|
||||||
return Pair.create(feed, queue);
|
LongList newItemsIds = DBReader.getNewItemIds(context);
|
||||||
|
return new Object[] { feed, queuedItemsIds, newItemsIds };
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostExecute(Pair<Feed,LongList> res) {
|
protected void onPostExecute(Object[] res) {
|
||||||
super.onPostExecute(res);
|
super.onPostExecute(res);
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
feed = res.first;
|
feed = (Feed) res[0];
|
||||||
queue = res.second;
|
queuedItemsIds = (LongList) res[1];
|
||||||
|
newItemsIds = res[2] == null ? null : (LongList) res[2];
|
||||||
itemsLoaded = true;
|
itemsLoaded = true;
|
||||||
if (viewsCreated) {
|
if (viewsCreated) {
|
||||||
onFragmentLoaded();
|
onFragmentLoaded();
|
||||||
|
|
|
@ -225,6 +225,11 @@ public class PlaybackHistoryFragment extends ListFragment {
|
||||||
return (queue != null) ? queue.contains(item.getId()) : false;
|
return (queue != null) ? queue.contains(item.getId()) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNew(FeedItem item) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemDownloadProgressPercent(FeedItem item) {
|
public int getItemDownloadProgressPercent(FeedItem item) {
|
||||||
if (downloaderList != null) {
|
if (downloaderList != null) {
|
||||||
|
|
|
@ -88,7 +88,7 @@ public class FeedItemMenuHandler {
|
||||||
mi.setItemVisibility(R.id.share_link_item, false);
|
mi.setItemVisibility(R.id.share_link_item, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(state == FeedItem.State.NEW || state == FeedItem.State.IN_PROGRESS)) {
|
if (!(state == FeedItem.State.UNREAD || state == FeedItem.State.IN_PROGRESS)) {
|
||||||
mi.setItemVisibility(R.id.mark_read_item, false);
|
mi.setItemVisibility(R.id.mark_read_item, false);
|
||||||
}
|
}
|
||||||
if (!(state == FeedItem.State.IN_PROGRESS || state == FeedItem.State.READ)) {
|
if (!(state == FeedItem.State.IN_PROGRESS || state == FeedItem.State.READ)) {
|
||||||
|
|
|
@ -179,7 +179,7 @@ public class Feed extends FeedFile implements FlattrThing, PicassoImageResource
|
||||||
*/
|
*/
|
||||||
public boolean hasNewItems(boolean enableEpisodeFilter) {
|
public boolean hasNewItems(boolean enableEpisodeFilter) {
|
||||||
for (FeedItem item : items) {
|
for (FeedItem item : items) {
|
||||||
if (item.getState() == FeedItem.State.NEW) {
|
if (item.getState() == FeedItem.State.UNREAD) {
|
||||||
if (item.getMedia() != null) {
|
if (item.getMedia() != null) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,7 +239,7 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isRead() {
|
public boolean isRead() {
|
||||||
return read || isInProgress();
|
return read;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRead(boolean read) {
|
public void setRead(boolean read) {
|
||||||
|
@ -330,7 +330,7 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum State {
|
public enum State {
|
||||||
NEW, IN_PROGRESS, READ, PLAYING
|
UNREAD, IN_PROGRESS, READ, PLAYING
|
||||||
}
|
}
|
||||||
|
|
||||||
public State getState() {
|
public State getState() {
|
||||||
|
@ -342,7 +342,7 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr
|
||||||
return State.IN_PROGRESS;
|
return State.IN_PROGRESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (isRead() ? State.READ : State.NEW);
|
return (isRead() ? State.READ : State.UNREAD);
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getFeedId() {
|
public long getFeedId() {
|
||||||
|
|
|
@ -178,7 +178,6 @@ public final class DBReader {
|
||||||
*/
|
*/
|
||||||
public static List<FeedItem> getFeedItemList(Context context,
|
public static List<FeedItem> getFeedItemList(Context context,
|
||||||
final Feed feed) {
|
final Feed feed) {
|
||||||
if (BuildConfig.DEBUG)
|
|
||||||
Log.d(TAG, "Extracting Feeditems of feed " + feed.getTitle());
|
Log.d(TAG, "Extracting Feeditems of feed " + feed.getTitle());
|
||||||
|
|
||||||
PodDBAdapter adapter = new PodDBAdapter(context);
|
PodDBAdapter adapter = new PodDBAdapter(context);
|
||||||
|
@ -319,7 +318,7 @@ public final class DBReader {
|
||||||
new FlattrStatus(cursor.getLong(PodDBAdapter.IDX_FEED_SEL_STD_FLATTR_STATUS)),
|
new FlattrStatus(cursor.getLong(PodDBAdapter.IDX_FEED_SEL_STD_FLATTR_STATUS)),
|
||||||
cursor.getInt(PodDBAdapter.IDX_FEED_SEL_STD_IS_PAGED) > 0,
|
cursor.getInt(PodDBAdapter.IDX_FEED_SEL_STD_IS_PAGED) > 0,
|
||||||
cursor.getString(PodDBAdapter.IDX_FEED_SEL_STD_NEXT_PAGE_LINK),
|
cursor.getString(PodDBAdapter.IDX_FEED_SEL_STD_NEXT_PAGE_LINK),
|
||||||
cursor.getString(cursor.getColumnIndex(PodDBAdapter.KEY_HIDE))
|
cursor.getString(cursor.getColumnIndex(PodDBAdapter.KEY_HIDE)),
|
||||||
cursor.getInt(PodDBAdapter.IDX_FEED_SEL_STD_LAST_UPDATE_FAILED) > 0
|
cursor.getInt(PodDBAdapter.IDX_FEED_SEL_STD_LAST_UPDATE_FAILED) > 0
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -521,15 +520,16 @@ public final class DBReader {
|
||||||
* @return A list of IDs of the FeedItems whose 'read'-attribute is set to false. This method should be preferred
|
* @return A list of IDs of the FeedItems whose 'read'-attribute is set to false. This method should be preferred
|
||||||
* over {@link #getUnreadItemsList(android.content.Context)} if the FeedItems in the UnreadItems list are not used.
|
* over {@link #getUnreadItemsList(android.content.Context)} if the FeedItems in the UnreadItems list are not used.
|
||||||
*/
|
*/
|
||||||
public static long[] getUnreadItemIds(Context context) {
|
public static LongList getNewItemIds(Context context) {
|
||||||
PodDBAdapter adapter = new PodDBAdapter(context);
|
PodDBAdapter adapter = new PodDBAdapter(context);
|
||||||
adapter.open();
|
adapter.open();
|
||||||
Cursor cursor = adapter.getUnreadItemIdsCursor();
|
Cursor cursor = adapter.getNewItemIdsCursor();
|
||||||
long[] itemIds = new long[cursor.getCount()];
|
LongList itemIds = new LongList(cursor.getCount());
|
||||||
int i = 0;
|
int i = 0;
|
||||||
if (cursor.moveToFirst()) {
|
if (cursor.moveToFirst()) {
|
||||||
do {
|
do {
|
||||||
itemIds[i] = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
|
long id = cursor.getLong(PodDBAdapter.KEY_ID_INDEX);
|
||||||
|
itemIds.add(id);
|
||||||
i++;
|
i++;
|
||||||
} while (cursor.moveToNext());
|
} while (cursor.moveToNext());
|
||||||
}
|
}
|
||||||
|
|
|
@ -455,14 +455,6 @@ public final class DBTasks {
|
||||||
ClientConfig.dbTasksCallbacks.getEpisodeCacheCleanupAlgorithm().getDefaultCleanupParameter(context));
|
ClientConfig.dbTasksCallbacks.getEpisodeCacheCleanupAlgorithm().getDefaultCleanupParameter(context));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds all FeedItem objects whose 'read'-attribute is false to the queue in a separate thread.
|
|
||||||
*/
|
|
||||||
public static void enqueueAllNewItems(final Context context) {
|
|
||||||
long[] unreadItems = DBReader.getUnreadItemIds(context);
|
|
||||||
DBWriter.addQueueItem(context, unreadItems);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the successor of a FeedItem in the queue.
|
* Returns the successor of a FeedItem in the queue.
|
||||||
*
|
*
|
||||||
|
|
|
@ -408,16 +408,11 @@ public class DBWriter {
|
||||||
|
|
||||||
if(addToFront){
|
if(addToFront){
|
||||||
queue.add(0, item);
|
queue.add(0, item);
|
||||||
}else{
|
} else {
|
||||||
queue.add(item);
|
queue.add(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
queueModified = true;
|
queueModified = true;
|
||||||
if (!item.isRead()) {
|
|
||||||
item.setRead(true);
|
|
||||||
itemsToSave.add(item);
|
|
||||||
unreadItemsModified = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -425,11 +420,6 @@ public class DBWriter {
|
||||||
adapter.setQueue(queue);
|
adapter.setQueue(queue);
|
||||||
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.ADDED_ITEMS, queue));
|
EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.ADDED_ITEMS, queue));
|
||||||
}
|
}
|
||||||
if (unreadItemsModified) {
|
|
||||||
adapter.setFeedItemlist(itemsToSave);
|
|
||||||
EventDistributor.getInstance()
|
|
||||||
.sendUnreadItemsUpdateBroadcast();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
adapter.close();
|
adapter.close();
|
||||||
DBTasks.autodownloadUndownloadedItems(context);
|
DBTasks.autodownloadUndownloadedItems(context);
|
||||||
|
|
|
@ -227,6 +227,28 @@ public class PodDBAdapter {
|
||||||
+ " TEXT," + KEY_START + " INTEGER," + KEY_FEEDITEM + " INTEGER,"
|
+ " TEXT," + KEY_START + " INTEGER," + KEY_FEEDITEM + " INTEGER,"
|
||||||
+ KEY_LINK + " TEXT," + KEY_CHAPTER_TYPE + " INTEGER)";
|
+ KEY_LINK + " TEXT," + KEY_CHAPTER_TYPE + " INTEGER)";
|
||||||
|
|
||||||
|
// SQL Statements for creating indexes
|
||||||
|
public static final String CREATE_INDEX_FEEDITEMS_FEED = "CREATE INDEX "
|
||||||
|
+ TABLE_NAME_FEED_ITEMS + "_" + KEY_FEED + " ON " + TABLE_NAME_FEED_ITEMS + " ("
|
||||||
|
+ KEY_FEED + ")";
|
||||||
|
|
||||||
|
public static final String CREATE_INDEX_FEEDITEMS_IMAGE = "CREATE INDEX "
|
||||||
|
+ TABLE_NAME_FEED_ITEMS + "_" + KEY_IMAGE + " ON " + TABLE_NAME_FEED_ITEMS + " ("
|
||||||
|
+ KEY_IMAGE + ")";
|
||||||
|
|
||||||
|
public static final String CREATE_INDEX_QUEUE_FEEDITEM = "CREATE INDEX "
|
||||||
|
+ TABLE_NAME_QUEUE + "_" + KEY_FEEDITEM + " ON " + TABLE_NAME_QUEUE + " ("
|
||||||
|
+ KEY_FEEDITEM + ")";
|
||||||
|
|
||||||
|
public static final String CREATE_INDEX_FEEDMEDIA_FEEDITEM = "CREATE INDEX "
|
||||||
|
+ TABLE_NAME_FEED_MEDIA + "_" + KEY_FEEDITEM + " ON " + TABLE_NAME_FEED_MEDIA + " ("
|
||||||
|
+ KEY_FEEDITEM + ")";
|
||||||
|
|
||||||
|
public static final String CREATE_INDEX_SIMPLECHAPTERS_FEEDITEM = "CREATE INDEX "
|
||||||
|
+ TABLE_NAME_SIMPLECHAPTERS + "_" + KEY_FEEDITEM + " ON " + TABLE_NAME_SIMPLECHAPTERS + " ("
|
||||||
|
+ KEY_FEEDITEM + ")";
|
||||||
|
|
||||||
|
|
||||||
private SQLiteDatabase db;
|
private SQLiteDatabase db;
|
||||||
private final Context context;
|
private final Context context;
|
||||||
private PodDBHelper helper;
|
private PodDBHelper helper;
|
||||||
|
@ -1063,10 +1085,21 @@ public class PodDBAdapter {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final Cursor getUnreadItemIdsCursor() {
|
public final Cursor getNewItemIdsCursor() {
|
||||||
Cursor c = db.query(TABLE_NAME_FEED_ITEMS, new String[]{KEY_ID},
|
final String query = "SELECT " + TABLE_NAME_FEED_ITEMS + "." + KEY_ID
|
||||||
KEY_READ + "=0", null, null, null, KEY_PUBDATE + " DESC");
|
+ " FROM " + TABLE_NAME_FEED_ITEMS
|
||||||
return c;
|
+ " INNER JOIN " + TABLE_NAME_FEED_MEDIA + " ON "
|
||||||
|
+ TABLE_NAME_FEED_ITEMS + "." + KEY_ID + "="
|
||||||
|
+ TABLE_NAME_FEED_MEDIA + "." + KEY_FEEDITEM
|
||||||
|
+ " LEFT OUTER JOIN " + TABLE_NAME_QUEUE + " ON "
|
||||||
|
+ TABLE_NAME_FEED_ITEMS + "." + KEY_ID + "="
|
||||||
|
+ TABLE_NAME_QUEUE + "." + KEY_FEEDITEM
|
||||||
|
+ " WHERE "
|
||||||
|
+ TABLE_NAME_FEED_ITEMS + "." + KEY_READ + " = 0 AND " // unplayed
|
||||||
|
+ TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " = 0 AND " // undownloaded
|
||||||
|
+ TABLE_NAME_FEED_MEDIA + "." + KEY_POSITION + " = 0 AND " // not partially played
|
||||||
|
+ TABLE_NAME_QUEUE + "." + KEY_ID + " IS NULL"; // not in queue
|
||||||
|
return db.rawQuery(query, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1085,7 +1118,8 @@ public class PodDBAdapter {
|
||||||
+ TABLE_NAME_FEED_ITEMS + "." + KEY_READ + " = 0 AND " // unplayed
|
+ TABLE_NAME_FEED_ITEMS + "." + KEY_READ + " = 0 AND " // unplayed
|
||||||
+ TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " = 0 AND " // undownloaded
|
+ TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " = 0 AND " // undownloaded
|
||||||
+ TABLE_NAME_FEED_MEDIA + "." + KEY_POSITION + " = 0 AND " // not partially played
|
+ TABLE_NAME_FEED_MEDIA + "." + KEY_POSITION + " = 0 AND " // not partially played
|
||||||
+ TABLE_NAME_QUEUE + "." + KEY_ID + " IS NULL"; // not in queue
|
+ TABLE_NAME_QUEUE + "." + KEY_ID + " IS NULL" // not in queue
|
||||||
|
+ " ORDER BY " + KEY_PUBDATE + " DESC";
|
||||||
Cursor c = db.rawQuery(query, null);
|
Cursor c = db.rawQuery(query, null);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
@ -1425,6 +1459,12 @@ public class PodDBAdapter {
|
||||||
db.execSQL(CREATE_TABLE_DOWNLOAD_LOG);
|
db.execSQL(CREATE_TABLE_DOWNLOAD_LOG);
|
||||||
db.execSQL(CREATE_TABLE_QUEUE);
|
db.execSQL(CREATE_TABLE_QUEUE);
|
||||||
db.execSQL(CREATE_TABLE_SIMPLECHAPTERS);
|
db.execSQL(CREATE_TABLE_SIMPLECHAPTERS);
|
||||||
|
|
||||||
|
db.execSQL(CREATE_INDEX_FEEDITEMS_FEED);
|
||||||
|
db.execSQL(CREATE_INDEX_FEEDITEMS_IMAGE);
|
||||||
|
db.execSQL(CREATE_INDEX_FEEDMEDIA_FEEDITEM);
|
||||||
|
db.execSQL(CREATE_INDEX_QUEUE_FEEDITEM);
|
||||||
|
db.execSQL(CREATE_INDEX_SIMPLECHAPTERS_FEEDITEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue