package com.gettingmobile.goodnews.feedlist; import android.database.sqlite.SQLiteDatabase; import android.view.ContextMenu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import com.gettingmobile.android.widget.Entity2ListItemCursor; import com.gettingmobile.android.widget.ListItemCursorAdapter; import com.gettingmobile.goodnews.AutomaticallyClosingElementListActivity; import com.gettingmobile.goodnews.R; import com.gettingmobile.goodnews.itemlist.ItemListActivity; import com.gettingmobile.goodnews.settings.FeedListSettingsHandler; import com.gettingmobile.goodnews.settings.SettingsHandler; import com.gettingmobile.google.reader.Feed; import com.gettingmobile.google.reader.ItemState; import com.gettingmobile.google.reader.db.EntityCursor; import com.gettingmobile.google.reader.db.FeedDatabaseAdapter; import com.gettingmobile.google.reader.db.ItemDatabaseAdapter; public final class FeedListActivity extends AutomaticallyClosingElementListActivity implements OnItemClickListener { private final FeedDatabaseAdapter feedAdapter = new FeedDatabaseAdapter(); private final ItemDatabaseAdapter itemAdapter = new ItemDatabaseAdapter(); private ListItemCursorAdapter listAdapter = new ListItemCursorAdapter(this, new FeedRowViewType(this)); public FeedListActivity() { final FeedListInflator feedListInflator = new FeedListInflator(); setViewLoader(feedListInflator); setViewUpdater(feedListInflator); } /* * life cycle management */ @Override public void onCreate() { setContentView(R.layout.feed_list); super.onCreate(); final ListView listView = (ListView) findViewById(R.id.feeds); listView.setOnItemClickListener(this); listView.setAdapter(listAdapter); registerForContextMenu(getListView()); } @Override protected void closeCursor() { listAdapter.close(); } /* * helpers */ @Override protected Class<? extends SettingsHandler> getViewSettingsHandlerClass() { return FeedListSettingsHandler.class; } @Override protected boolean isUnreadListRead() { return listAdapter.getCount() == 0; } @Override protected ListView getListView() { return (ListView) findViewById(R.id.feeds); } protected EntityCursor<Feed> getFeedCursor(SQLiteDatabase db) { if (ItemState.READING_LIST.getId().equals(getIntentElementId())) { return getHideRead() ? feedAdapter.cursorAllUnread(db) : feedAdapter.cursorAll(db); } else { final boolean sortByDragAndDropOrder = getApp().getSettings().sortByDragAndDropOrder(); return getHideRead() ? feedAdapter.cursorUnreadByTag(db, getIntentElementKey(), sortByDragAndDropOrder) : feedAdapter.cursorByTag(db, getIntentElementKey(), sortByDragAndDropOrder); } } /* * action handling */ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final int viewId = parent.getId(); if (viewId == R.id.feeds) { onFeedClicked((Feed) view.getTag()); } } protected void onFeedClicked(Feed feed) { startActivity(ItemListActivity.class, feed); } protected Feed getItemRowFeed(ContextMenu.ContextMenuInfo menuInfo) { Feed feed = null; if (menuInfo instanceof ListView.AdapterContextMenuInfo) { final ListView.AdapterContextMenuInfo cmi = (ListView.AdapterContextMenuInfo) menuInfo; return (Feed) cmi.targetView.getTag(); } return feed; } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); if (view.getId() == R.id.feeds) { final Feed feed = getItemRowFeed(menuInfo); if (feed != null) { getMenuInflater().inflate(R.menu.feed_context, menu); menu.setHeaderTitle(R.string.contextmenu_feed); menu.findItem(R.id.menu_feed_preferences).setIntent( settingsIntentFactory.createElementSettingsIntent(feed.getId(), feed.getTitle())); } } } /* * mark read handling */ @Override protected boolean requiresMarkReadConfirmationDialog() { return getApp().getSettings().confirmMarkAllReadInFeedList(); } @Override protected void markAllRead(SQLiteDatabase db) { if (ItemState.READING_LIST.getId().equals(getIntentElementId())) { itemAdapter.markAllRead(db); } else { itemAdapter.markReadByFolder(db, getIntentElementId()); } } /* * hide read handling */ @Override protected boolean getHideRead() { return getApp().getSettings().hideRead(); } @Override protected void setHideReadSetting(boolean hideRead) { getApp().getSettings().setHideRead(hideRead); } @Override protected void onMarkedRead() { if (automaticallyCloseWhenRead()) { finish(); } else { super.onMarkedRead(); } } /* * inner classes */ class FeedListInflator extends ViewOperation<EntityCursor<Feed>> { @Override protected EntityCursor<Feed> fetchData(SQLiteDatabase readOnlyDb) { return getFeedCursor(readOnlyDb); } @Override protected boolean updateView(EntityCursor<Feed> feeds) { listAdapter.changeCursor(new Entity2ListItemCursor<Feed>(feeds)); return feeds.getCount() > 0; } } }