package org.ebookdroid.ui.opds; import org.emdev.ui.uimanager.UIManagerAppCompat; import org.sufficientlysecure.viewer.R; import org.ebookdroid.opds.model.Book; import org.ebookdroid.opds.model.Entry; import org.ebookdroid.opds.model.Feed; import org.ebookdroid.opds.model.Link; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.View; import android.widget.ExpandableListView; import android.widget.ExpandableListView.ExpandableListContextMenuInfo; import org.emdev.common.android.AndroidVersion; import org.emdev.ui.AbstractActionActivity; import org.emdev.ui.actions.ActionMenuHelper; import org.emdev.ui.actions.params.Constant; import org.emdev.ui.uimanager.IUIManager; public class OPDSActivity extends AbstractActionActivity<OPDSActivity, OPDSActivityController> { ExpandableListView list; public OPDSActivity() { super(false, ON_CREATE); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#createController() */ @Override protected OPDSActivityController createController() { return new OPDSActivityController(this); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#onCreateImpl(android.os.Bundle) */ @Override protected void onCreateImpl(final Bundle savedInstanceState) { setContentView(R.layout.opds); setActionForView(R.id.opdsaddfeed); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); final OPDSActivityController c = getController(); list = (ExpandableListView) findViewById(R.id.opdslist); list.setGroupIndicator(null); list.setChildIndicator(null); list.setOnGroupClickListener(c); list.setOnChildClickListener(c); list.setAdapter(c.adapter); this.registerForContextMenu(list); } /** * {@inheritDoc} * * @see android.app.Activity#onKeyUp(int, android.view.KeyEvent) */ @Override public boolean onKeyUp(final int keyCode, final KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && !event.isCanceled()) { final Feed current = getController().adapter.getCurrentFeed(); if (current == null) { finish(); } else { getController().setCurrentFeed(current.parent); } return true; } return super.onKeyUp(keyCode, event); } /** * {@inheritDoc} * * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu) */ @Override public boolean onCreateOptionsMenu(final Menu menu) { final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.opdsmenu, menu); return true; } /** * {@inheritDoc} * * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo) */ @Override public void onCreateContextMenu(final ContextMenu menu, final View v, final ContextMenuInfo menuInfo) { if (menuInfo instanceof ExpandableListContextMenuInfo) { final ExpandableListContextMenuInfo cmi = (ExpandableListContextMenuInfo) menuInfo; final int type = ExpandableListView.getPackedPositionType(cmi.packedPosition); final int groupPosition = ExpandableListView.getPackedPositionGroup(cmi.packedPosition); final int childPosition = ExpandableListView.getPackedPositionChild(cmi.packedPosition); // System.out.println("OPDSActivity.onCreateContextMenu(): " + type + ", " + groupPosition + ", " // + childPosition); switch (type) { case ExpandableListView.PACKED_POSITION_TYPE_NULL: onCreateContextMenu(menu); return; case ExpandableListView.PACKED_POSITION_TYPE_GROUP: final Entry entry = getController().adapter.getGroup(groupPosition); if (entry instanceof Feed) { onCreateFeedContextMenu(menu, (Feed) entry); } else if (entry instanceof Book) { onCreateBookContextMenu(menu, (Book) entry); } return; case ExpandableListView.PACKED_POSITION_TYPE_CHILD: final Entry group = getController().adapter.getGroup(groupPosition); final Object child = getController().adapter.getChild(groupPosition, childPosition); if (child instanceof Link) { onCreateLinkContextMenu(menu, (Book) group, (Link) child); } else if (child instanceof Feed) { onCreateFacetContextMenu(menu, (Feed) group, (Feed) child); } return; } } onCreateContextMenu(menu); } protected void onCreateContextMenu(final ContextMenu menu) { final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.opds_defmenu, menu); final Feed feed = getController().adapter.getCurrentFeed(); menu.setHeaderTitle(getFeedTitle(feed)); updateMenuItems(menu, feed); } protected void onCreateFeedContextMenu(final ContextMenu menu, final Feed feed) { final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.opds_feedmenu, menu); menu.setHeaderTitle(getFeedTitle(feed)); updateMenuItems(menu, feed.parent); ActionMenuHelper.setMenuParameters(getController(), menu, new Constant("feed", feed)); } protected void onCreateFacetContextMenu(final ContextMenu menu, final Feed feed, final Feed facet) { final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.opds_facetmenu, menu); menu.setHeaderTitle(getFeedTitle(facet)); updateMenuItems(menu, feed.parent); ActionMenuHelper.setMenuParameters(getController(), menu, new Constant("feed", facet)); } protected void onCreateBookContextMenu(final ContextMenu menu, final Book book) { final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.opds_bookmenu, menu); menu.setHeaderTitle(book.title); ActionMenuHelper.setMenuParameters(getController(), menu, new Constant("book", book)); } protected void onCreateLinkContextMenu(final ContextMenu menu, final Book book, final Link link) { final MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.opds_bookmenu, menu); menu.setHeaderTitle(book.title); ActionMenuHelper.setMenuParameters(getController(), menu, new Constant("book", book), new Constant("link", link)); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActionActivity#updateMenuItems(android.view.Menu) */ @Override protected void updateMenuItems(final Menu menu) { updateMenuItems(menu, getController().adapter.getCurrentFeed()); } protected void updateMenuItems(final Menu menu, final Feed feed) { final boolean canUp = feed != null; final boolean canNext = feed != null && feed.next != null; final boolean canPrev = feed != null && feed.prev != null; if (menu != null) { ActionMenuHelper.setMenuItemEnabled(menu, canUp, R.id.opdsupfolder, R.drawable.opds_actionbar_nav_up_enabled, R.drawable.opds_actionbar_nav_up_disabled); ActionMenuHelper.setMenuItemEnabled(menu, canNext, R.id.opdsnextfolder, R.drawable.opds_actionbar_nav_next_enabled, R.drawable.opds_actionbar_nav_next_disabled); ActionMenuHelper.setMenuItemEnabled(menu, canPrev, R.id.opdsprevfolder, R.drawable.opds_actionbar_nav_prev_enabled, R.drawable.opds_actionbar_nav_prev_disabled); } } protected String getFeedTitle(final Feed feed) { return feed != null ? feed.title : getResources().getString(R.string.opds); } protected void onCurrrentFeedChanged(final Feed feed) { UIManagerAppCompat.invalidateOptionsMenu(this); setTitle(getFeedTitle(feed)); findViewById(R.id.opdsaddfeed).setVisibility(feed != null ? View.GONE : View.VISIBLE); } protected void onFeedLoaded(final Feed feed) { UIManagerAppCompat.invalidateOptionsMenu(this); } }