package org.ebookdroid.ui.opds; 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 org.ebookdroid.ui.opds.adapters.FeedListener; import org.ebookdroid.ui.opds.adapters.OPDSAdapter; import android.annotation.TargetApi; import android.view.LayoutInflater; import android.view.View; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.EditText; import android.widget.ExpandableListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import org.emdev.ui.AbstractActivityController; import org.emdev.ui.actions.ActionDialogBuilder; import org.emdev.ui.actions.ActionEx; import org.emdev.ui.actions.ActionMethod; import org.emdev.ui.actions.IActionController; import org.emdev.ui.actions.params.CheckableValue; import org.emdev.ui.actions.params.Constant; import org.emdev.ui.actions.params.EditableValue; import org.emdev.ui.actions.params.EditableValue.PasswordEditable; import org.emdev.utils.LengthUtils; @TargetApi(8) public class OPDSActivityController extends AbstractActivityController<OPDSActivity> implements ExpandableListView.OnGroupClickListener, ExpandableListView.OnChildClickListener, FeedListener { OPDSAdapter adapter; Feed current; public OPDSActivityController(final OPDSActivity activity) { super(activity, BEFORE_CREATE, AFTER_CREATE, ON_DESTROY); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActivityController#beforeCreate(android.app.Activity) */ @Override public void beforeCreate(final OPDSActivity activity) { adapter = new OPDSAdapter(activity, this); adapter.addListener(this); } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActivityController#afterCreate(android.app.Activity, boolean) */ @Override public void afterCreate(final OPDSActivity activity, final boolean recreated) { if (recreated) { activity.onCurrrentFeedChanged(adapter.getCurrentFeed()); } } /** * {@inheritDoc} * * @see org.emdev.ui.AbstractActivityController#onDestroy(boolean) */ @Override public void onDestroy(final boolean finishing) { if (finishing) { adapter.close(); } } /** * {@inheritDoc} * * @see org.ebookdroid.ui.opds.adapters.FeedListener#feedLoaded(org.ebookdroid.opds.model.Feed) */ @Override public void feedLoaded(final Feed feed) { getManagedComponent().onFeedLoaded(feed); } /** * {@inheritDoc} * * @see android.widget.ExpandableListView.OnGroupClickListener#onGroupClick(android.widget.ExpandableListView, * android.view.View, int, long) */ @Override public boolean onGroupClick(final ExpandableListView parent, final View v, final int groupPosition, final long id) { if (adapter.getChildrenCount(groupPosition) > 0) { return false; } final Entry group = adapter.getGroup(groupPosition); if (group instanceof Feed) { setCurrentFeed((Feed) group); return true; } else if (group instanceof Book) { showDownloadDlg((Book) group, null); return true; } return false; } /** * {@inheritDoc} * * @see android.widget.ExpandableListView.OnChildClickListener#onChildClick(android.widget.ExpandableListView, * android.view.View, int, int, long) */ @Override public boolean onChildClick(final ExpandableListView parent, final View v, final int groupPosition, final int childPosition, final long id) { final Entry group = adapter.getGroup(groupPosition); final Object child = adapter.getChild(groupPosition, childPosition); if (child instanceof Feed) { setCurrentFeed((Feed) child); } else if (child instanceof Link) { showDownloadDlg((Book) group, (Link) child); } return true; } public void setCurrentFeed(final Feed feed) { adapter.setCurrentFeed(feed); getManagedComponent().onCurrrentFeedChanged(feed); } @ActionMethod(ids = R.id.opdsclose) public void close(final ActionEx action) { getManagedComponent().finish(); } @ActionMethod(ids = R.id.opdshome) public void goHome(final ActionEx action) { setCurrentFeed(null); } @ActionMethod(ids = R.id.opdsgoto) public void goTo(final ActionEx action) { final Feed feed = action.getParameter("feed"); setCurrentFeed(feed); } @ActionMethod(ids = R.id.opdsupfolder) public void goUp(final ActionEx action) { final Feed dir = adapter.getCurrentFeed(); final Feed parent = dir != null ? dir.parent : null; setCurrentFeed(parent); } @ActionMethod(ids = R.id.opdsnextfolder) public void goNext(final ActionEx action) { final Feed dir = adapter.getCurrentFeed(); final Feed next = dir != null ? dir.next : null; if (next != null) { setCurrentFeed(next); } } @ActionMethod(ids = R.id.opdsprevfolder) public void goPrev(final ActionEx action) { final Feed dir = adapter.getCurrentFeed(); final Feed prev = dir != null ? dir.prev : null; if (prev != null) { setCurrentFeed(prev); } } @ActionMethod(ids = R.id.opdsrefreshfolder) public void refresh(final ActionEx action) { final Feed dir = adapter.getCurrentFeed(); if (dir != null) { setCurrentFeed(dir); } } @ActionMethod(ids = { R.id.opdsaddfeed, R.id.opds_feed_add }) public void showAddFeedDlg(final ActionEx action) { final View childView = LayoutInflater.from(getManagedComponent()).inflate(R.layout.alias_url, null); final ActionDialogBuilder builder = new ActionDialogBuilder(getManagedComponent(), this); builder.setTitle(R.string.opds_addfeed_title); builder.setMessage(R.string.opds_addfeed_msg); builder.setView(childView); final EditText aliasEdit = (EditText) childView.findViewById(R.id.editAlias); final EditText urlEdit = (EditText) childView.findViewById(R.id.editURL); final CheckBox authCheck = (CheckBox) childView.findViewById(R.id.checkAuth); final TextView loginText = (TextView) childView.findViewById(R.id.textUsername); final EditText loginEdit = (EditText) childView.findViewById(R.id.editUsername); final TextView passwordText = (TextView) childView.findViewById(R.id.textPassword); final EditText passwordEdit = (EditText) childView.findViewById(R.id.editPassword); authCheck.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) { loginText.setVisibility(isChecked ? View.VISIBLE : View.GONE); loginEdit.setVisibility(isChecked ? View.VISIBLE : View.GONE); passwordText.setVisibility(isChecked ? View.VISIBLE : View.GONE); passwordEdit.setVisibility(isChecked ? View.VISIBLE : View.GONE); } }); authCheck.setChecked(false); builder.setPositiveButton(R.string.opds_addfeed_ok, R.id.actions_addFeed, new EditableValue("alias", aliasEdit), new EditableValue("url", urlEdit), new CheckableValue("auth", authCheck), new EditableValue("login", loginEdit), new EditableValue("password", passwordEdit)); builder.setNegativeButton(); builder.show(); } @ActionMethod(ids = R.id.actions_addFeed) public void addFeed(final ActionEx action) { final String alias = LengthUtils.toString(action.getParameter("alias")); final String url = LengthUtils.toString(action.getParameter("url")); if (LengthUtils.isAnyEmpty(alias, url)) { return; } final Boolean auth = action.getParameter("auth"); if (auth) { final String login = action.getParameter("login").toString(); final String password = ((PasswordEditable) action.getParameter("password")).getPassword(); adapter.addFeed(alias, url, login, password); } else { adapter.addFeed(alias, url); } } @ActionMethod(ids = { R.id.opds_feed_edit }) public void showEditFeedDlg(final ActionEx action) { final Feed feed = action.getParameter("feed"); final View childView = LayoutInflater.from(getManagedComponent()).inflate(R.layout.alias_url, null); final ActionDialogBuilder builder = new ActionDialogBuilder(getManagedComponent(), this); builder.setTitle(R.string.opds_editfeed_title); builder.setMessage(R.string.opds_editfeed_msg); builder.setView(childView); final EditText aliasEdit = (EditText) childView.findViewById(R.id.editAlias); final EditText urlEdit = (EditText) childView.findViewById(R.id.editURL); final CheckBox authCheck = (CheckBox) childView.findViewById(R.id.checkAuth); final TextView loginText = (TextView) childView.findViewById(R.id.textUsername); final EditText loginEdit = (EditText) childView.findViewById(R.id.editUsername); final TextView passwordText = (TextView) childView.findViewById(R.id.textPassword); final EditText passwordEdit = (EditText) childView.findViewById(R.id.editPassword); authCheck.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) { loginText.setVisibility(isChecked ? View.VISIBLE : View.GONE); loginEdit.setVisibility(isChecked ? View.VISIBLE : View.GONE); passwordText.setVisibility(isChecked ? View.VISIBLE : View.GONE); passwordEdit.setVisibility(isChecked ? View.VISIBLE : View.GONE); } }); authCheck.setChecked(feed.login == null); authCheck.setChecked(feed.login != null); aliasEdit.setText(feed.title); urlEdit.setText(feed.id); loginEdit.setText(feed.login); passwordEdit.setText(feed.password); builder.setPositiveButton(R.string.opds_editfeed_ok, R.id.actions_editFeed, new EditableValue("alias", aliasEdit), new EditableValue("url", urlEdit), new CheckableValue("auth", authCheck), new EditableValue("login", loginEdit), new EditableValue("password", passwordEdit), new Constant( "feed", feed)); builder.setNegativeButton(); builder.show(); } @ActionMethod(ids = R.id.actions_editFeed) public void editFeed(final ActionEx action) { final Feed feed = action.getParameter("feed"); final String alias = LengthUtils.toString(action.getParameter("alias")); final String url = LengthUtils.toString(action.getParameter("url")); final Boolean auth = action.getParameter("auth"); final String login = auth ? action.getParameter("login").toString() : null; final String password = auth ? ((PasswordEditable) action.getParameter("password")).getPassword() : null; if (LengthUtils.isAllNotEmpty(alias, url)) { adapter.editFeed(feed, alias, url, login, password); } } @ActionMethod(ids = { R.id.opds_feed_delete }) public void showDeleteFeedDlg(final ActionEx action) { final Feed feed = action.getParameter("feed"); final ActionDialogBuilder builder = new ActionDialogBuilder(getManagedComponent(), this); builder.setTitle(R.string.opds_deletefeed_title); builder.setMessage(R.string.opds_deletefeed_msg); builder.setPositiveButton(R.string.opds_deletefeed_ok, R.id.actions_deleteFeed, new Constant("feed", feed)); builder.setNegativeButton(); builder.show(); } @ActionMethod(ids = R.id.actions_deleteFeed) public void deleteFeed(final ActionEx action) { final Feed feed = action.getParameter("feed"); adapter.removeFeed(feed); } @ActionMethod(ids = R.id.opds_book_download) public void showDownloadDlg(final ActionEx action) { final Book book = action.getParameter("book"); final Link link = action.getParameter("link"); showDownloadDlg(book, link); } protected void showDownloadDlg(final Book book, final Link link) { if (LengthUtils.isEmpty(book.downloads)) { return; } final String rawType = getManagedComponent().getResources().getString(R.string.opds_downloading_dlg_raw_type); if (link != null || book.downloads.size() == 1) { final Link target = link != null ? link : book.downloads.get(0); final ActionDialogBuilder builder = new ActionDialogBuilder(getManagedComponent(), this); builder.setTitle(R.string.opds_downloading_dlg_title); builder.setMessage(LengthUtils.safeString(target.type, rawType)); builder.setPositiveButton(R.id.actions_downloadBook, new Constant("book", book), new Constant( IActionController.DIALOG_ITEM_PROPERTY, 0)); builder.setNegativeButton(); builder.show(); return; } final List<String> itemList = new ArrayList<String>(); for (final Link l : book.downloads) { itemList.add(LengthUtils.safeString(l.type, rawType)); } final String[] items = itemList.toArray(new String[itemList.size()]); final ActionDialogBuilder builder = new ActionDialogBuilder(getManagedComponent(), this); builder.setTitle(R.string.opds_downloading_type_dlg_title); builder.setItems(items, getOrCreateAction(R.id.actions_downloadBook).putValue("book", book)); builder.show(); } @ActionMethod(ids = R.id.actions_downloadBook) public void doDownload(final ActionEx action) { final Book book = action.getParameter("book"); final Integer index = action.getParameter(IActionController.DIALOG_ITEM_PROPERTY); if (book != null && index != null) { adapter.downloadBook(book, index.intValue()); } } }