/* * Copyright (c) 2015, Nils Braden * * This file is part of ttrss-reader-fork. This program is free software; you * can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; * either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. You should have received a * copy of the GNU General Public License along with this program; If * not, see http://www.gnu.org/licenses/. */ package org.ttrssreader.gui.fragments; import org.ttrssreader.R; import org.ttrssreader.controllers.Controller; import org.ttrssreader.controllers.DBHelper; import org.ttrssreader.controllers.Data; import org.ttrssreader.gui.CategoryActivity; import org.ttrssreader.gui.FeedHeadlineActivity; import org.ttrssreader.gui.dialogs.ReadStateDialog; import org.ttrssreader.gui.interfaces.IItemSelectedListener.TYPE; import org.ttrssreader.model.CategoryAdapter; import org.ttrssreader.model.ListContentProvider; import org.ttrssreader.model.updaters.IUpdatable; import org.ttrssreader.model.updaters.ReadStateUpdater; import android.app.Activity; import android.content.CursorLoader; import android.content.Loader; import android.database.Cursor; import android.net.Uri; import android.net.Uri.Builder; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView.AdapterContextMenuInfo; public class CategoryListFragment extends MainListFragment { @SuppressWarnings("unused") private static final String TAG = CategoryListFragment.class.getSimpleName(); private static final TYPE THIS_TYPE = TYPE.CATEGORY; public static final String FRAGMENT = "CATEGORY_FRAGMENT"; private static final int MARK_GROUP = 100; private static final int MARK_READ = MARK_GROUP + 1; private static final int SELECT_ARTICLES = MARK_GROUP + 2; private static final int SELECT_FEEDS = MARK_GROUP + 3; private Uri categoryUri; public static CategoryListFragment newInstance() { // Create a new fragment instance CategoryListFragment detail = new CategoryListFragment(); detail.setRetainInstance(true); return detail; } @Override public void onCreate(Bundle instance) { if (!Controller.isTablet) Controller.getInstance().lastOpenedFeeds.clear(); Controller.getInstance().lastOpenedArticles.clear(); setHasOptionsMenu(true); super.onCreate(instance); } @Override public void onActivityCreated(Bundle instance) { adapter = new CategoryAdapter(getActivity()); getLoaderManager().restartLoader(TYPE_CAT_ID, null, this); super.onActivityCreated(instance); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add(MARK_GROUP, MARK_READ, Menu.NONE, R.string.Commons_MarkRead); if (Controller.getInstance().invertBrowsing()) menu.add(MARK_GROUP, SELECT_FEEDS, Menu.NONE, R.string.Commons_SelectFeeds); else menu.add(MARK_GROUP, SELECT_ARTICLES, Menu.NONE, R.string.Commons_SelectArticles); } @Override public boolean onContextItemSelected(android.view.MenuItem item) { AdapterContextMenuInfo cmi = (AdapterContextMenuInfo) item.getMenuInfo(); if (cmi == null) return false; int id = adapter.getId(cmi.position); switch (item.getItemId()) { case MARK_READ: IUpdatable updater; if (id < -10) updater = new ReadStateUpdater(id, 42); else updater = new ReadStateUpdater(id); ReadStateDialog.getInstance(updater).show(getFragmentManager()); return true; case SELECT_ARTICLES: if (id < 0) return false; if (getActivity() instanceof CategoryActivity) ((CategoryActivity) getActivity()).displayHeadlines(FeedHeadlineActivity.FEED_NO_ID, id, true); return true; case SELECT_FEEDS: if (id < 0) return false; if (getActivity() instanceof CategoryActivity) ((CategoryActivity) getActivity()).displayFeed(id); return true; } return false; } @Override public void onPrepareOptionsMenu(Menu menu) { if (!Controller.isTablet && selectedId != Integer.MIN_VALUE) menu.removeItem(R.id.Menu_MarkAllRead); if (selectedId == Integer.MIN_VALUE) menu.removeItem(R.id.Menu_MarkFeedsRead); super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (super.onOptionsItemSelected(item)) return true; boolean backAfterUpdate = Controller.getInstance().goBackAfterMarkAllRead(); switch (item.getItemId()) { case R.id.Menu_MarkAllRead: { IUpdatable updateable = new ReadStateUpdater(ReadStateUpdater.TYPE.ALL_CATEGORIES); ReadStateDialog.getInstance(updateable, backAfterUpdate).show(getFragmentManager()); return true; } case R.id.Menu_MarkFeedsRead: if (selectedId > Integer.MIN_VALUE) { IUpdatable updateable = new ReadStateUpdater(selectedId); ReadStateDialog.getInstance(updateable, backAfterUpdate).show(getFragmentManager()); } return true; default: return false; } } @Override public TYPE getType() { return THIS_TYPE; } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { if (id == TYPE_CAT_ID) { categoryUri = ListContentProvider.CONTENT_URI_CAT; return new CursorLoader(getActivity(), categoryUri, null, null, null, null); } return null; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { if (loader.getId() == TYPE_CAT_ID) adapter.changeCursor(data); super.onLoadFinished(loader, data); ((CategoryActivity) getActivity()).setTitleAndUnread(); } @Override public void onLoaderReset(Loader<Cursor> loader) { if (loader.getId() == TYPE_CAT_ID) adapter.changeCursor(null); } @Override protected void fetchOtherData() { title = "TTRSS-Reader"; // Hardcoded since this does not change and we would need to be attached to an activity // here to be able to read from the resources. unreadCount = DBHelper.getInstance().getUnreadCount(Data.VCAT_ALL, true); } @Override public void doRefresh() { Activity activity = getActivity(); if (activity != null && categoryUri != null) activity.getContentResolver().notifyChange(categoryUri, null); super.doRefresh(); } }