package com.gettingmobile.goodnews; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.database.sqlite.SQLiteDatabase; import android.widget.ListView; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import com.gettingmobile.android.app.DialogFactory; public abstract class ElementListActivity extends Activity { protected abstract ListView getListView(); protected ElementListActivity() { super(); } protected ElementListActivity(int tipGroupId) { super(tipGroupId); } /* * live cycle handler */ @Override protected void onDestroy() { super.onDestroy(); closeCursor(); } @Override public void loadView() { super.loadView(); invalidateOptionsMenu(); } @Override public void updateView() { super.updateView(); invalidateOptionsMenu(); } protected abstract void closeCursor(); /* * control handling */ protected abstract boolean getHideRead(); protected abstract void setHideReadSetting(boolean hideRead); /** * Called when the hide read status changed, but before the view is reloaded. * @param hideRead specifies whether the status has been set or reset. * @return true if the view should be reloaded, false if reloading should be skipped. */ protected boolean onSetHideRead(boolean hideRead) { return true; } protected final void setHideRead(boolean hideRead) { setHideReadSetting(hideRead); invalidateOptionsMenu(); if (onSetHideRead(hideRead)) { loadView(); } } /* * command handling */ protected abstract boolean requiresMarkReadConfirmationDialog(); @Override protected int getOptionsMenuResourceId() { return R.menu.list_options; } @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.menu_show_new).setVisible(!getHideRead()); menu.findItem(R.id.menu_show_all).setVisible(getHideRead()); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.menu_mark_read) { onMarkRead(); } else if (item.getItemId() == R.id.menu_show_new) { setHideRead(true); } else if (item.getItemId() == R.id.menu_show_all) { setHideRead(false); } else { return super.onOptionsItemSelected(item); } return true; } protected abstract void markAllRead(SQLiteDatabase db); protected void markAllRead() { final SQLiteDatabase db = getDb(); db.beginTransaction(); try { markAllRead(db); db.setTransactionSuccessful(); } finally { db.endTransaction(); } getApp().onItemTagsChanged(); onMarkedRead(); } protected void onMarkRead() { if (requiresMarkReadConfirmationDialog()) { confirmMarkRead(); } else { markAllRead(); } } protected void confirmMarkRead() { DialogFactory.buildYesNoDialog(this, R.string.confirm_mark_read, R.string.confirm_mark_read_msg, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { markAllRead(); } }).show(); } protected void onMarkedRead() { loadView(); } }