/*
* Copyright (C) 2010-2015 FBReader.ORG Limited <contact@fbreader.org>
*
* 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;
import java.io.File;
import java.util.List;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.PopupWindow;
import android.widget.*;
import org.geometerplus.zlibrary.core.network.ZLNetworkException;
import org.geometerplus.zlibrary.core.network.QuietNetworkContext;
import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.text.view.*;
import org.geometerplus.zlibrary.ui.android.R;
import org.geometerplus.zlibrary.ui.android.image.ZLAndroidImageData;
import org.geometerplus.fbreader.book.Book;
import org.geometerplus.fbreader.fbreader.BookElement;
import org.geometerplus.fbreader.fbreader.FBReaderApp;
import org.geometerplus.fbreader.fbreader.options.ColorProfile;
import org.geometerplus.fbreader.network.opds.OPDSBookItem;
import org.geometerplus.fbreader.network.urlInfo.BookUrlInfo;
import org.geometerplus.fbreader.network.urlInfo.UrlInfo;
import org.geometerplus.android.util.UIMessageUtil;
import org.geometerplus.android.util.UIUtil;
class DisplayBookPopupAction extends FBAndroidAction {
DisplayBookPopupAction(FBReader baseActivity, FBReaderApp fbreader) {
super(baseActivity, fbreader);
}
private void openBook(final PopupWindow popup, final Book book) {
if (book == null) {
return;
}
BaseActivity.runOnUiThread(new Runnable() {
public void run() {
popup.dismiss();
Reader.openBook(book, null, null, null);
}
});
}
@Override
protected void run(Object ... params) {
if (params.length != 1 || !(params[0] instanceof ZLTextRegion)) {
return;
}
final ZLTextRegion region = (ZLTextRegion)params[0];
if (!(region.getSoul() instanceof ExtensionRegionSoul)) {
return;
}
final ExtensionElement e = ((ExtensionRegionSoul)region.getSoul()).Element;
if (!(e instanceof BookElement)) {
return;
}
final BookElement element = (BookElement)e;
if (!element.isInitialized()) {
return;
}
final View mainView = (View)BaseActivity.getViewWidget();
final View bookView = BaseActivity.getLayoutInflater().inflate(
ColorProfile.NIGHT.equals(Reader.ViewOptions.ColorProfileName.getValue())
? R.layout.book_popup_night : R.layout.book_popup,
null
);
final int inch = (int)TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_IN, 1, BaseActivity.getResources().getDisplayMetrics()
);
final PopupWindow popup = new PopupWindow(
bookView,
Math.min(4 * inch, mainView.getWidth() * 9 / 10),
Math.min(3 * inch, mainView.getHeight() * 9 / 10)
);
popup.setFocusable(true);
popup.setOutsideTouchable(true);
final ImageView coverView = (ImageView)bookView.findViewById(R.id.book_popup_cover);
if (coverView != null) {
final ZLAndroidImageData imageData = (ZLAndroidImageData)element.getImageData();
if (imageData != null) {
coverView.setImageBitmap(imageData.getFullSizeBitmap());
}
}
final OPDSBookItem item = element.getItem();
final TextView headerView = (TextView)bookView.findViewById(R.id.book_popup_header_text);
final StringBuilder text = new StringBuilder();
for (OPDSBookItem.AuthorData author : item.Authors) {
text.append("<p><i>").append(author.DisplayName).append("</i></p>");
}
text.append("<h3>").append(item.Title).append("</h3>");
headerView.setText(Html.fromHtml(text.toString()));
final TextView descriptionView = (TextView)bookView.findViewById(R.id.book_popup_description_text);
descriptionView.setText(item.getSummary());
descriptionView.setMovementMethod(new LinkMovementMethod());
final ZLResource buttonResource = ZLResource.resource("dialog").getResource("button");
final View buttonsView = bookView.findViewById(R.id.book_popup_buttons);
final Button downloadButton = (Button)buttonsView.findViewById(R.id.ok_button);
downloadButton.setText(buttonResource.getResource("download").getValue());
final List<UrlInfo> infos = item.getAllInfos(UrlInfo.Type.Book);
if (infos.isEmpty() || !(infos.get(0) instanceof BookUrlInfo)) {
downloadButton.setEnabled(false);
} else {
final BookUrlInfo bookInfo = (BookUrlInfo)infos.get(0);
final String fileName = bookInfo.makeBookFileName(UrlInfo.Type.Book);
final Book book = Reader.Collection.getBookByFile(fileName);
if (book != null) {
downloadButton.setText(buttonResource.getResource("openBook").getValue());
downloadButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
openBook(popup, book);
}
});
} else {
final File file = new File(fileName);
if (file.exists()) {
file.delete();
}
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
downloadButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
UIUtil.wait(
"downloadingBook", item.Title.toString(),
new Runnable() {
public void run() {
try {
new QuietNetworkContext().downloadToFile(bookInfo.Url, file);
openBook(popup, Reader.Collection.getBookByFile(fileName));
} catch (ZLNetworkException e) {
UIMessageUtil.showErrorMessage(BaseActivity, "downloadFailed");
e.printStackTrace();
}
}
},
BaseActivity
);
}
});
}
}
final Button cancelButton = (Button)buttonsView.findViewById(R.id.cancel_button);
cancelButton.setText(buttonResource.getResource("cancel").getValue());
cancelButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
popup.dismiss();
}
});
downloadButton.setTextColor(0xFF777777);
cancelButton.setTextColor(0xFF777777);
popup.setOnDismissListener(new PopupWindow.OnDismissListener() {
public void onDismiss() {
}
});
popup.showAtLocation(BaseActivity.getCurrentFocus(), Gravity.CENTER, 0, 0);
}
}