/* * Copyright (C) 2009-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.math.BigInteger; import java.util.Random; import android.app.AlertDialog; import android.content.*; import org.geometerplus.zlibrary.core.options.Config; import org.geometerplus.zlibrary.core.options.ZLStringOption; import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.fbreader.book.Book; import org.geometerplus.fbreader.book.Bookmark; import org.geometerplus.fbreader.fbreader.FBReaderApp; import org.geometerplus.fbreader.formats.ExternalFormatPlugin; import org.geometerplus.android.fbreader.api.FBReaderIntents; import org.geometerplus.android.fbreader.formatPlugin.PluginUtil; import org.geometerplus.android.util.PackageUtil; class ExternalFileOpener implements FBReaderApp.ExternalFileOpener { private final String myPluginCode = new BigInteger(80, new Random()).toString(); private final FBReader myReader; private volatile AlertDialog myDialog; ExternalFileOpener(FBReader reader) { myReader = reader; } public void openFile(final ExternalFormatPlugin plugin, final Book book, Bookmark bookmark) { if (myDialog != null) { myDialog.dismiss(); myDialog = null; } final Intent intent = PluginUtil.createIntent(plugin, FBReaderIntents.Action.PLUGIN_VIEW); FBReaderIntents.putBookExtra(intent, book); FBReaderIntents.putBookmarkExtra(intent, bookmark); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); new ZLStringOption("PluginCode", plugin.packageName(), "").setValue(myPluginCode); intent.putExtra("PLUGIN_CODE", myPluginCode); Config.Instance().runOnConnect(new Runnable() { public void run() { try { myReader.startActivity(intent); myReader.overridePendingTransition(0, 0); } catch (ActivityNotFoundException e) { showErrorDialog(plugin, book); } } }); } private void showErrorDialog(final ExternalFormatPlugin plugin, final Book book) { final ZLResource rootResource = ZLResource.resource("dialog"); final ZLResource buttonResource = rootResource.getResource("button"); final ZLResource dialogResource = rootResource.getResource("missingPlugin"); final AlertDialog.Builder builder = new AlertDialog.Builder(myReader) .setTitle(dialogResource.getValue()) .setMessage(dialogResource.getResource("message").getValue().replace("%s", plugin.supportedFileType())) .setPositiveButton(buttonResource.getResource("yes").getValue(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { PackageUtil.installFromMarket(myReader, plugin.packageName()); myDialog = null; } }) .setNegativeButton(buttonResource.getResource("no").getValue(), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { myReader.onPluginNotFound(book); myDialog = null; } }) .setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { myReader.onPluginNotFound(book); myDialog = null; } }); final Runnable showDialog = new Runnable() { public void run() { myDialog = builder.create(); myDialog.show(); } }; if (!myReader.IsPaused) { myReader.runOnUiThread(showDialog); } else { myReader.OnResumeAction = showDialog; } } }