/* * Copyright (C) 2010-2014 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.action; import java.util.*; import java.io.File; import android.app.AlertDialog; import android.app.Activity; import android.net.Uri; import android.content.Intent; import android.content.DialogInterface; import org.geometerplus.zlibrary.core.resources.ZLResource; import net.sourceforge.arabicReader.R; import org.geometerplus.android.fbreader.FBReader; import org.geometerplus.fbreader.network.*; import org.geometerplus.fbreader.network.tree.NetworkBookTree; import org.geometerplus.fbreader.network.tree.BasketCatalogTree; import org.geometerplus.fbreader.network.urlInfo.*; import org.geometerplus.android.fbreader.network.*; public abstract class NetworkBookActions { private static boolean useFullReferences(NetworkBookItem book) { return book.reference(UrlInfo.Type.Book) != null || book.reference(UrlInfo.Type.BookConditional) != null; } private static boolean useDemoReferences(NetworkBookItem book) { return book.reference(UrlInfo.Type.BookDemo) != null && book.localCopyFileName() == null && book.reference(UrlInfo.Type.Book) == null; } public static class NBAction extends BookAction { private final int myId; private final String myArg; public NBAction(Activity activity, int id, String key) { this(activity, id, key, null); } public NBAction(Activity activity, int id, String key, String arg) { super(activity, id, key); myId = id; myArg = arg; } @Override public boolean isEnabled(NetworkTree tree) { return myId >= 0; } @Override public String getContextLabel(NetworkTree tree) { final String base = super.getContextLabel(tree); return myArg == null ? base : base.replace("%s", myArg); } @Override public void run(NetworkTree tree) { runActionStatic(myActivity, (NetworkBookTree)tree, myId); } } public static int getBookStatus(NetworkBookItem book, BookDownloaderServiceConnection connection) { if (useFullReferences(book)) { final BookUrlInfo reference = book.reference(UrlInfo.Type.Book); if (reference != null && connection != null && connection.isBeingDownloaded(reference.Url)) { return R.drawable.ic_list_downloading; } else if (book.localCopyFileName() != null) { return R.drawable.ic_list_flag; } else if (reference != null) { return R.drawable.ic_list_download; } } if (book.getStatus() == NetworkBookItem.Status.CanBePurchased) { return R.drawable.ic_list_buy; } return 0; } public static List<NBAction> getContextMenuActions(Activity activity, NetworkBookTree tree, BookDownloaderServiceConnection connection) { final NetworkBookItem book = tree.Book; List<NBAction> actions = new LinkedList<NBAction>(); if (useFullReferences(book)) { final BookUrlInfo reference = book.reference(UrlInfo.Type.Book); if (reference != null && connection != null && connection.isBeingDownloaded(reference.Url)) { actions.add(new NBAction(activity, ActionCode.TREE_NO_ACTION, "alreadyDownloading")); } else if (book.localCopyFileName() != null) { actions.add(new NBAction(activity, ActionCode.READ_BOOK, "read")); actions.add(new NBAction(activity, ActionCode.DELETE_BOOK, "delete")); } else if (reference != null) { actions.add(new NBAction(activity, ActionCode.DOWNLOAD_BOOK, "download")); } } if (useDemoReferences(book)) { final BookUrlInfo reference = book.reference(UrlInfo.Type.BookDemo); if (connection != null && connection.isBeingDownloaded(reference.Url)) { actions.add(new NBAction(activity, ActionCode.TREE_NO_ACTION, "alreadyDownloadingDemo")); } else if (reference.localCopyFileName(UrlInfo.Type.BookDemo) != null) { actions.add(new NBAction(activity, ActionCode.READ_DEMO, "readDemo")); actions.add(new NBAction(activity, ActionCode.DELETE_DEMO, "deleteDemo")); } else { actions.add(new NBAction(activity, ActionCode.DOWNLOAD_DEMO, "downloadDemo")); } } if (book.getStatus() == NetworkBookItem.Status.CanBePurchased) { final BookBuyUrlInfo reference = book.buyInfo(); final int id = reference.InfoType == UrlInfo.Type.BookBuy ? ActionCode.BUY_DIRECTLY : ActionCode.BUY_IN_BROWSER; final String priceString = reference.Price != null ? reference.Price.toString() : ""; actions.add(new NBAction(activity, id, "buy", priceString)); final BasketItem basketItem = book.Link.getBasketItem(); if (basketItem != null) { if (basketItem.contains(book)) { if (tree.Parent instanceof BasketCatalogTree || activity instanceof NetworkLibraryActivity) { actions.add(new NBAction(activity, ActionCode.REMOVE_BOOK_FROM_BASKET, "removeFromBasket")); } else { actions.add(new NBAction(activity, ActionCode.OPEN_BASKET, "openBasket")); } } else { actions.add(new NBAction(activity, ActionCode.ADD_BOOK_TO_BASKET, "addToBasket")); } } } return actions; } private static boolean runActionStatic(Activity activity, NetworkBookTree tree, int actionCode) { final NetworkBookItem book = tree.Book; switch (actionCode) { case ActionCode.DOWNLOAD_BOOK: Util.doDownloadBook(activity, book, false); return true; case ActionCode.DOWNLOAD_DEMO: Util.doDownloadBook(activity, book, true); return true; case ActionCode.READ_BOOK: doReadBook(activity, book, false); return true; case ActionCode.READ_DEMO: doReadBook(activity, book, true); return true; case ActionCode.DELETE_BOOK: tryToDeleteBook(activity, book, false); return true; case ActionCode.DELETE_DEMO: tryToDeleteBook(activity, book, true); return true; case ActionCode.BUY_DIRECTLY: doBuyDirectly(activity, tree); return true; case ActionCode.BUY_IN_BROWSER: doBuyInBrowser(activity, book); return true; case ActionCode.ADD_BOOK_TO_BASKET: book.Link.getBasketItem().add(book); return true; case ActionCode.REMOVE_BOOK_FROM_BASKET: book.Link.getBasketItem().remove(book); return true; case ActionCode.OPEN_BASKET: new OpenCatalogAction(activity) .run(NetworkLibrary.Instance().getFakeBasketTree(book.Link.getBasketItem())); return true; } return false; } private static void doReadBook(Activity activity, final NetworkBookItem book, boolean demo) { String local = null; if (!demo) { local = book.localCopyFileName(); } else { final BookUrlInfo reference = book.reference(UrlInfo.Type.BookDemo); if (reference != null) { local = reference.localCopyFileName(UrlInfo.Type.BookDemo); } } if (local != null) { activity.startActivity( new Intent(Intent.ACTION_VIEW, Uri.fromFile(new File(local)), activity.getApplicationContext(), FBReader.class ).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK) ); } } private static void tryToDeleteBook(Activity activity, final NetworkBookItem book, final boolean demo) { final ZLResource dialogResource = ZLResource.resource("dialog"); final ZLResource buttonResource = dialogResource.getResource("button"); final ZLResource boxResource = dialogResource.getResource("deleteBookBox"); new AlertDialog.Builder(activity) .setTitle(book.Title) .setMessage(boxResource.getResource("message").getValue()) .setIcon(0) .setPositiveButton(buttonResource.getResource("yes").getValue(), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO: remove information about book from Library??? if (!demo) { book.removeLocalFiles(); } else { final BookUrlInfo reference = book.reference(UrlInfo.Type.BookDemo); if (reference != null) { final String fileName = reference.localCopyFileName(UrlInfo.Type.BookDemo); if (fileName != null) { new File(fileName).delete(); } } } NetworkLibrary.Instance().fireModelChangedEvent(NetworkLibrary.ChangeListener.Code.SomeCode); } }) .setNegativeButton(buttonResource.getResource("no").getValue(), null) .create().show(); } private static void doBuyDirectly(Activity activity, NetworkBookTree tree) { BuyBooksActivity.run(activity, tree); } private static void doBuyInBrowser(Activity activity, final NetworkBookItem book) { BookUrlInfo reference = book.reference(UrlInfo.Type.BookBuyInBrowser); if (reference != null) { Util.openInBrowser(activity, reference.Url); } } }