/* * Copyright (C) 2010-2011 Geometer Plus <contact@geometerplus.com> * * 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 2 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ package org.geometerplus.android.fbreader.network; import java.util.ArrayList; import android.os.Bundle; import android.view.*; import android.widget.BaseAdapter; import android.content.Intent; import org.geometerplus.zlibrary.core.network.ZLNetworkException; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.tree.*; import org.geometerplus.fbreader.tree.FBTree; public class NetworkCatalogActivity extends NetworkBaseActivity implements UserRegistrationConstants { private NetworkTree myTree; private volatile boolean myInProgress; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); final NetworkView networkView = NetworkView.Instance(); if (!networkView.isInitialized()) { finish(); return; } myTree = Util.getTreeFromIntent(getIntent()); if (myTree == null) { finish(); return; } networkView.setOpenedActivity(myTree.getUniqueKey(), this); setListAdapter(new CatalogAdapter()); getListView().invalidateViews(); setupTitle(); } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { if (menuInfo == null && myTree instanceof NetworkCatalogTree) { final INetworkLink link = ((NetworkCatalogTree)myTree).Item.Link; if (Util.isAccountRefillingSupported(this, link)) { final RefillAccountActions actions = NetworkView.Instance().getTopUpActions(); if (actions != null) { actions.buildContextMenu(this, menu, link); return; } } } super.onCreateContextMenu(menu, view, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { if ((item == null || item.getMenuInfo() == null) && myTree instanceof NetworkCatalogTree) { final INetworkLink link = ((NetworkCatalogTree)myTree).Item.Link; if (Util.isAccountRefillingSupported(this, link)) { final RefillAccountActions actions = NetworkView.Instance().getTopUpActions(); if (actions != null && actions.runAction(this, link, item.getItemId())) { return true; } } } return super.onContextItemSelected(item); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case USER_REGISTRATION_REQUEST_CODE: if (myTree instanceof NetworkCatalogTree && resultCode == RESULT_OK && data != null) { try { Util.runAfterRegistration( ((NetworkCatalogTree)myTree).Item.Link.authenticationManager(), data ); } catch (ZLNetworkException e) { // TODO: show an error message } } break; } } private final void setupTitle() { String title = null; final NetworkView networkView = NetworkView.Instance(); if (networkView.isInitialized()) { final NetworkTreeActions actions = networkView.getActions(myTree); if (actions != null) { title = actions.getTreeTitle(myTree); } } if (title == null) { title = myTree.getName(); } setTitle(title); setProgressBarIndeterminateVisibility(myInProgress); } @Override public void onDestroy() { if (myTree != null && NetworkView.Instance().isInitialized()) { NetworkView.Instance().setOpenedActivity(myTree.getUniqueKey(), null); } super.onDestroy(); } @Override public void onResume() { super.onResume(); } private final class CatalogAdapter extends BaseAdapter { public final int getCount() { return myTree.subTrees().size(); } public final NetworkTree getItem(int position) { if (position < 0 || position >= myTree.subTrees().size()) { return null; } return (NetworkTree)myTree.subTrees().get(position); } public final long getItemId(int position) { return position; } public View getView(int position, View convertView, final ViewGroup parent) { final NetworkTree tree = getItem(position); return setupNetworkTreeItemView(convertView, parent, tree); } void onModelChanged() { notifyDataSetChanged(); for (FBTree child : myTree.subTrees()) { if (child instanceof TopUpTree) { child.invalidateChildren(); } } } } private static NetworkTree.Key getLoadableNetworkTreeKey(NetworkTree tree) { if ((tree instanceof NetworkAuthorTree || tree instanceof NetworkSeriesTree) && tree.Parent instanceof NetworkTree) { return getLoadableNetworkTreeKey((NetworkTree)tree.Parent); } return tree.getUniqueKey(); } @Override public void onModelChanged() { final NetworkView networkView = NetworkView.Instance(); final NetworkTree.Key key = getLoadableNetworkTreeKey(myTree); myInProgress = key != null && networkView.isInitialized() && networkView.containsItemsLoadingRunnable(key); getListView().invalidateViews(); /* * getListAdapter() always returns CatalogAdapter because onModelChanged() * can be called only after Activity's onStart() method (where NetworkView's * addEventListener() is called). Therefore CatalogAdapter will be set as * adapter in onCreate() method before any calls to onModelChanged(). */ ((CatalogAdapter) getListAdapter()).onModelChanged(); setupTitle(); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { doStopLoading(); } return super.onKeyDown(keyCode, event); } private void doStopLoading() { if (NetworkView.Instance().isInitialized()) { final ItemsLoadingRunnable runnable = NetworkView.Instance().getItemsLoadingRunnable(myTree.getUniqueKey()); if (runnable != null) { runnable.interruptLoading(); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); return NetworkView.Instance().createOptionsMenu(menu, myTree); } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); return NetworkView.Instance().prepareOptionsMenu(this, menu, myTree); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (NetworkView.Instance().runOptionsMenu(this, item, myTree)) { return true; } return super.onOptionsItemSelected(item); } }