package com.gettingmobile.goodnews.itemlist; import android.content.Context; import com.gettingmobile.android.widget.Entity2ListItemCursor; import com.gettingmobile.android.widget.ListItem; import com.gettingmobile.android.widget.ListItemCursorAdapter; import com.gettingmobile.google.reader.ElementId; import com.gettingmobile.google.reader.Item; import com.gettingmobile.google.reader.db.EntityCursor; import com.gettingmobile.google.reader.db.ItemCursor; import com.gettingmobile.google.reader.db.ItemTagChangeDatabaseAdapter; import com.gettingmobile.google.reader.db.ItemTagChangeListener; import java.util.ArrayList; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; final class ItemListAdapter extends ListItemCursorAdapter implements ItemTagChangeListener { private final ItemTagChangeDatabaseAdapter itemTagChangeAdapter; private boolean markAllRead; private final SortedMap<Integer, Long> unreadIdsByPosition = new TreeMap<Integer, Long>(); private final SortedMap<Long, Integer> positionsById = new TreeMap<Long, Integer>(); private long[] itemKeys = new long[0]; public ItemListAdapter(Context context, ItemTagChangeDatabaseAdapter itemTagChangeAdapter, ItemRowViewType itemRowViewType) { super(context, itemRowViewType); registerViewType(new FeedSectionHeaderViewType()); this.itemTagChangeAdapter = itemTagChangeAdapter; itemTagChangeAdapter.addListener(this); } @Override public void changeCursor(EntityCursor<? extends ListItem> cursor) { throw new UnsupportedOperationException("Call changeCursor(ItemCursor) instead."); } public void changeCursor(ItemCursor cursor) { /* * reset */ markAllRead = false; unreadIdsByPosition.clear(); positionsById.clear(); if (cursor != null) { final List<Long> keys = new ArrayList<Long>(); int position = 0; for (ItemCursor.IndexEntry e : cursor.getIndex()) { if (!e.isGroupHeader()) { keys.add(e.getId()); positionsById.put(e.getId(), position); if (e.isUnread()) { unreadIdsByPosition.put(position, e.getId()); } } ++position; } itemKeys = new long[keys.size()]; for (int i = 0; i < itemKeys.length; ++i) { itemKeys[i] = keys.get(i); } } else { itemKeys = new long[0]; } /* * set cursor */ super.changeCursor(new Entity2ListItemCursor<Item>(cursor)); } public void markAllRead() { markAllRead = true; unreadIdsByPosition.clear(); } public long[] getItemKeys() { return itemKeys; } public Item adjustItem(Item item) { if (item != null) { itemTagChangeAdapter.adjustItemTags(item); if (markAllRead) item.setRead(true); } return item; } public boolean isRead() { return unreadIdsByPosition.isEmpty(); } public List<Long> getUnreadKeysToPosition(int pos) { return new ArrayList<Long>(unreadIdsByPosition.headMap(pos + 1).values()); } /* * item tag change listener */ @Override public void onItemReadStateChanged(long itemKey, boolean read) { final Integer position = positionsById.get(itemKey); if (position != null) { if (read) { unreadIdsByPosition.remove(position); } else { unreadIdsByPosition.put(position, itemKey); } } } @Override public void onItemTagChanged(long itemKey, ElementId tag, boolean added) { // don't care } }