/* * 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.dict; import com.github.johnpersano.supertoasts.SuperActivityToast; import com.github.johnpersano.supertoasts.SuperToast; import com.github.johnpersano.supertoasts.util.OnClickWrapper; import android.content.ActivityNotFoundException; import android.content.Intent; import android.os.Parcelable; import android.view.View; import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.android.fbreader.FBReaderMainActivity; final class Dictan extends DictionaryUtil.PackageInfo { private static final int MAX_LENGTH_FOR_TOAST = 180; Dictan(String id, String title) { super(id, title); } @Override void open(String text, Runnable outliner, FBReaderMainActivity fbreader, DictionaryUtil.PopupFrameMetric frameMetrics) { final Intent intent = getActionIntent(text); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); intent.putExtra("article.mode", 20); intent.putExtra("article.text.size.max", MAX_LENGTH_FOR_TOAST); try { fbreader.startActivityForResult(intent, FBReaderMainActivity.REQUEST_DICTIONARY); fbreader.overridePendingTransition(0, 0); if (outliner != null) { outliner.run(); } } catch (ActivityNotFoundException e) { InternalUtil.installDictionaryIfNotInstalled(fbreader, this); } } void onActivityResult(final FBReaderMainActivity fbreader, int resultCode, final Intent data) { if (data == null) { fbreader.hideDictionarySelection(); return; } final int errorCode = data.getIntExtra("error.code", -1); if (resultCode != FBReaderMainActivity.RESULT_OK || errorCode != -1) { showError(fbreader, errorCode, data); return; } String text = data.getStringExtra("article.text"); if (text == null) { showError(fbreader, -1, data); return; } // a hack for obsolete (before 5.0 beta) dictan versions final int index = text.indexOf("\000"); if (index >= 0) { text = text.substring(0, index); } final boolean hasExtraData; if (text.length() == MAX_LENGTH_FOR_TOAST) { text = trimArticle(text); hasExtraData = true; } else { hasExtraData = data.getBooleanExtra("article.resources.contains", false); } final SuperActivityToast toast; if (hasExtraData) { toast = new SuperActivityToast(fbreader, SuperToast.Type.BUTTON); toast.setButtonIcon( android.R.drawable.ic_menu_more, ZLResource.resource("toast").getResource("more").getValue() ); toast.setOnClickWrapper(new OnClickWrapper("dict", new SuperToast.OnClickListener() { @Override public void onClick(View view, Parcelable token) { final String word = data.getStringExtra("article.word"); final Intent intent = getActionIntent(word); try { intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); fbreader.startActivity(intent); fbreader.overridePendingTransition(0, 0); } catch (ActivityNotFoundException e) { // ignore } } })); } else { toast = new SuperActivityToast(fbreader, SuperToast.Type.STANDARD); } toast.setText(text); toast.setDuration(DictionaryUtil.TranslationToastDurationOption.getValue().Value); InternalUtil.showToast(toast, fbreader); } private static String trimArticle(String text) { final int len = text.length(); final int eolIndex = text.lastIndexOf("\n"); final int spaceIndex = text.lastIndexOf(" "); if (spaceIndex < eolIndex || eolIndex >= len * 2 / 3) { return text.substring(0, eolIndex); } else { return text.substring(0, spaceIndex); } } private static void showError(final FBReaderMainActivity fbreader, int code, Intent data) { final ZLResource resource = ZLResource.resource("dictanErrors"); String message; switch (code) { default: message = data.getStringExtra("error.message"); if (message == null) { message = resource.getResource("unknown").getValue(); } break; case 100: { final String word = data.getStringExtra("article.word"); message = resource.getResource("noArticle").getValue().replaceAll("%s", word); break; } case 130: message = resource.getResource("cannotOpenDictionary").getValue(); break; case 131: message = resource.getResource("noDictionarySelected").getValue(); break; } final SuperActivityToast toast = new SuperActivityToast(fbreader, SuperToast.Type.STANDARD); toast.setText("Dictan: " + message); toast.setDuration(DictionaryUtil.ErrorToastDurationOption.getValue().Value); InternalUtil.showToast(toast, fbreader); } }