package com.ichi2.anki;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.view.View;
import com.afollestad.materialdialogs.MaterialDialog;
import com.ichi2.libanki.Utils;
import timber.log.Timber;
public class Lookup {
/**
* Searches
*/
private static final int DICTIONARY_NONE = 0; // use no dictionary
private static final int DICTIONARY_AEDICT = 1; // Japanese dictionary
private static final int DICTIONARY_EIJIRO_WEB = 2; // japanese web dictionary
private static final int DICTIONARY_LEO_WEB = 3; // German web dictionary for English, French, Spanish, Italian,
// Chinese, Russian
private static final int DICTIONARY_LEO_APP = 4; // German web dictionary for English, French, Spanish, Italian,
// Chinese, Russian
private static final int DICTIONARY_COLORDICT = 5;
private static final int DICTIONARY_FORA = 6;
private static final int DICTIONARY_NCIKU_WEB = 7; // chinese web dictionary
private static Context mContext;
private static boolean mIsDictionaryAvailable;
private static String mDictionaryAction;
private static int mDictionary;
private static String mLookupText;
public static boolean initialize(Context context) {
mContext = context;
SharedPreferences preferences = AnkiDroidApp.getSharedPrefs(AnkiDroidApp.getInstance().getBaseContext());
mDictionary = Integer.parseInt(preferences.getString("dictionary", Integer.toString(DICTIONARY_NONE)));
switch (mDictionary) {
case DICTIONARY_NONE:
mIsDictionaryAvailable = false;
break;
case DICTIONARY_AEDICT:
mDictionaryAction = "sk.baka.aedict.action.ACTION_SEARCH_EDICT";
mIsDictionaryAvailable = Utils.isIntentAvailable(mContext, mDictionaryAction);
break;
case DICTIONARY_LEO_WEB:
case DICTIONARY_NCIKU_WEB:
case DICTIONARY_EIJIRO_WEB:
mDictionaryAction = "android.intent.action.VIEW";
mIsDictionaryAvailable = Utils.isIntentAvailable(mContext, mDictionaryAction);
break;
case DICTIONARY_LEO_APP:
mDictionaryAction = "android.intent.action.SEND";
mIsDictionaryAvailable = Utils.isIntentAvailable(mContext, mDictionaryAction, new ComponentName(
"org.leo.android.dict", "org.leo.android.dict.LeoDict"));
break;
case DICTIONARY_COLORDICT:
mDictionaryAction = "colordict.intent.action.SEARCH";
mIsDictionaryAvailable = Utils.isIntentAvailable(mContext, mDictionaryAction);
break;
case DICTIONARY_FORA:
mDictionaryAction = "com.ngc.fora.action.LOOKUP";
mIsDictionaryAvailable = Utils.isIntentAvailable(mContext, mDictionaryAction);
break;
default:
mIsDictionaryAvailable = false;
break;
}
Timber.v("Is intent available = %b", mIsDictionaryAvailable);
return mIsDictionaryAvailable;
}
public static boolean lookUp(String text) {
if (!mIsDictionaryAvailable) {
return false;
}
// clear text from leading and closing dots, commas, brackets etc.
text = text.trim().replaceAll("[,;:\\s\\(\\[\\)\\]\\.]*$", "").replaceAll("^[,;:\\s\\(\\[\\)\\]\\.]*", "");
switch (mDictionary) {
case DICTIONARY_NONE:
return false;
case DICTIONARY_AEDICT:
Intent aedictSearchIntent = new Intent(mDictionaryAction);
aedictSearchIntent.putExtra("kanjis", text);
mContext.startActivity(aedictSearchIntent);
return true;
case DICTIONARY_LEO_WEB:
case DICTIONARY_LEO_APP:
mLookupText = text;
// localisation is needless here since leo.org translates only into or out of German
final CharSequence[] itemValues = { "en", "fr", "es", "it", "ch", "ru" };
String language = getLanguage(MetaDB.LANGUAGES_QA_UNDEFINED);
if (language.length() > 0) {
for (CharSequence itemValue : itemValues) {
if (language.equals(itemValue)) {
lookupLeo(language, mLookupText);
mLookupText = "";
return true;
}
}
}
final String[] items = { "Englisch", "Französisch", "Spanisch", "Italienisch", "Chinesisch", "Russisch" };
new MaterialDialog.Builder(mContext)
.title("\"" + mLookupText + "\" nachschlagen")
.items(items)
.itemsCallback(new MaterialDialog.ListCallback() {
@Override
public void onSelection(MaterialDialog materialDialog, View view,
int item, CharSequence charSequence) {
String language = itemValues[item].toString();
storeLanguage(language, MetaDB.LANGUAGES_QA_UNDEFINED);
lookupLeo(language, mLookupText);
mLookupText = "";
}
})
.build().show();
return true;
case DICTIONARY_COLORDICT:
Intent colordictSearchIntent = new Intent(mDictionaryAction);
colordictSearchIntent.putExtra("EXTRA_QUERY", text);
mContext.startActivity(colordictSearchIntent);
return true;
case DICTIONARY_FORA:
Intent foraSearchIntent = new Intent(mDictionaryAction);
foraSearchIntent.putExtra("HEADWORD", text.trim());
mContext.startActivity(foraSearchIntent);
return true;
case DICTIONARY_NCIKU_WEB:
Intent ncikuWebIntent = new Intent(mDictionaryAction, Uri.parse("http://m.nciku.com/en/entry/?query="
+ text));
mContext.startActivity(ncikuWebIntent);
return true;
case DICTIONARY_EIJIRO_WEB:
Intent eijiroWebIntent = new Intent(mDictionaryAction, Uri.parse("http://eow.alc.co.jp/" + text));
mContext.startActivity(eijiroWebIntent);
return true;
}
return false;
}
private static void lookupLeo(String language, CharSequence text) {
switch (mDictionary) {
case DICTIONARY_LEO_WEB:
Intent leoSearchIntent = new Intent(mDictionaryAction, Uri.parse("http://pda.leo.org/?lp=" + language
+ "de&search=" + text));
mContext.startActivity(leoSearchIntent);
break;
case DICTIONARY_LEO_APP:
Intent leoAppSearchIntent = new Intent(mDictionaryAction);
leoAppSearchIntent.putExtra("org.leo.android.dict.DICTIONARY", language + "de");
leoAppSearchIntent.putExtra(Intent.EXTRA_TEXT, text);
leoAppSearchIntent.setComponent(new ComponentName("org.leo.android.dict",
"org.leo.android.dict.LeoDict"));
mContext.startActivity(leoAppSearchIntent);
break;
default:
}
}
public static String getSearchStringTitle() {
return String.format(mContext.getString(R.string.menu_search),
mContext.getResources().getStringArray(R.array.dictionary_labels)[mDictionary]);
}
public static boolean isAvailable() {
return mIsDictionaryAvailable;
}
private static String getLanguage(int questionAnswer) {
// if (mCurrentCard == null) {
return "";
// } else {
// return MetaDB.getLanguage(mContext, mDeckFilename, Models.getModel(DeckManager.getMainDeck(),
// mCurrentCard.getCardModelId(), false).getId(), mCurrentCard.getCardModelId(), questionAnswer);
// }
}
private static void storeLanguage(String language, int questionAnswer) {
// if (mCurrentCard != null) {
// MetaDB.storeLanguage(mContext, mDeckFilename, Models.getModel(DeckManager.getMainDeck(),
// mCurrentCard.getCardModelId(), false).getId(), mCurrentCard.getCardModelId(), questionAnswer, language);
// }
}
}