// Copyright 2011 Google Inc. All Rights Reserved.
-//
+// Some Parts Copyright 2013 Dominik Köppl
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
package com.hughes.android.dictionary;
+import android.annotation.SuppressLint;
import android.app.Dialog;
-import android.app.ListActivity;
+import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.graphics.Color;
import android.graphics.Typeface;
+import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.preference.PreferenceManager;
+import android.speech.tts.TextToSpeech;
+import android.speech.tts.TextToSpeech.OnInitListener;
import android.text.ClipboardManager;
-import android.text.Editable;
-import android.text.Selection;
import android.text.Spannable;
-import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
import android.text.style.StyleSpan;
import android.util.Log;
import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
+import android.view.Gravity;
import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.MenuItem.OnMenuItemClickListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
+import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
-import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.BaseAdapter;
import android.widget.Button;
-import android.widget.EditText;
-import android.widget.ImageButton;
+import android.widget.FrameLayout;
import android.widget.ImageView;
+import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
+import android.widget.TextView.BufferType;
import android.widget.Toast;
+import com.actionbarsherlock.app.ActionBar;
+import com.actionbarsherlock.app.SherlockListActivity;
+import com.actionbarsherlock.view.Menu;
+import com.actionbarsherlock.view.MenuItem;
+import com.actionbarsherlock.view.MenuItem.OnMenuItemClickListener;
+import com.actionbarsherlock.widget.SearchView;
+import com.actionbarsherlock.widget.SearchView.OnQueryTextListener;
import com.hughes.android.dictionary.DictionaryInfo.IndexInfo;
import com.hughes.android.dictionary.engine.Dictionary;
import com.hughes.android.dictionary.engine.EntrySource;
import com.hughes.android.dictionary.engine.HtmlEntry;
import com.hughes.android.dictionary.engine.Index;
import com.hughes.android.dictionary.engine.Index.IndexEntry;
+import com.hughes.android.dictionary.engine.Language;
+import com.hughes.android.dictionary.engine.Language.LanguageResources;
import com.hughes.android.dictionary.engine.PairEntry;
import com.hughes.android.dictionary.engine.PairEntry.Pair;
import com.hughes.android.dictionary.engine.RowBase;
import com.hughes.android.dictionary.engine.TransliteratorManager;
import com.hughes.android.util.IntentLauncher;
import com.hughes.android.util.NonLinkClickableSpan;
+import com.hughes.util.StringUtil;
import java.io.File;
import java.io.FileWriter;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
+import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-public class DictionaryActivity extends ListActivity {
+public class DictionaryActivity extends SherlockListActivity {
static final String LOG = "QuickDic";
- private String initialSearchText;
-
DictionaryApplication application;
File dictFile = null;
-
RandomAccessFile dictRaf = null;
Dictionary dictionary = null;
List<RowBase> rowsToShow = null; // if not null, just show these rows.
- // package for test.
final Handler uiHandler = new Handler();
private final Executor searchExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() {
private SearchOperation currentSearchOperation = null;
- C.Theme theme = C.Theme.LIGHT;
+ TextToSpeech textToSpeech;
+ volatile boolean ttsReady;
Typeface typeface;
-
+ C.Theme theme = C.Theme.LIGHT;
+ int textColorFg = Color.BLACK;
int fontSizeSp;
- EditText searchText;
+ SearchView searchView;
+ ImageView searchHintIcon;
+ SearchView.OnQueryTextListener onQueryTextListener;
- Button langButton;
+ MenuItem nextWordMenuItem, previousWordMenuItem;
// Never null.
private File wordList = null;
-
private boolean saveOnlyFirstSubentry = false;
-
private boolean clickOpensContextMenu = false;
// Visible for testing.
ListAdapter indexAdapter = null;
- final SearchTextWatcher searchTextWatcher = new SearchTextWatcher();
-
/**
* For some languages, loading the transliterators used in this search takes
* a long time, so we fire it up on a different thread, and don't invoke it
public DictionaryActivity() {
}
- public static Intent getLaunchIntent(final File dictFile, final int indexIndex,
+ public static Intent getLaunchIntent(final File dictFile, final String indexShortName,
final String searchToken) {
final Intent intent = new Intent();
intent.setClassName(DictionaryActivity.class.getPackage().getName(),
DictionaryActivity.class.getName());
intent.putExtra(C.DICT_FILE, dictFile.getPath());
- intent.putExtra(C.INDEX_INDEX, indexIndex);
+ intent.putExtra(C.INDEX_SHORT_NAME, indexShortName);
intent.putExtra(C.SEARCH_TOKEN, searchToken);
return intent;
}
@Override
protected void onSaveInstanceState(final Bundle outState) {
super.onSaveInstanceState(outState);
- Log.d(LOG, "onSaveInstanceState: " + searchText.getText().toString());
- outState.putInt(C.INDEX_INDEX, indexIndex);
- outState.putString(C.SEARCH_TOKEN, searchText.getText().toString());
+ Log.d(LOG, "onSaveInstanceState: " + searchView.getQuery().toString());
+ outState.putString(C.INDEX_SHORT_NAME, index.shortName);
+ outState.putString(C.SEARCH_TOKEN, searchView.getQuery().toString());
}
@Override
- protected void onRestoreInstanceState(final Bundle outState) {
- super.onRestoreInstanceState(outState);
- Log.d(LOG, "onRestoreInstanceState: " + outState.getString(C.SEARCH_TOKEN));
- onCreate(outState);
+ protected void onRestoreInstanceState(final Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+ Log.d(LOG, "onRestoreInstanceState: " + savedInstanceState.getString(C.SEARCH_TOKEN));
+ onCreate(savedInstanceState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
+ Log.d(LOG, "onCreate:" + this);
+ super.onCreate(savedInstanceState);
+
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- prefs.edit().remove(C.INDEX_INDEX).commit(); // Don't auto-launch if
- // this fails.
- setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId);
+ // Don't auto-launch if this fails.
+ prefs.edit().remove(C.DICT_FILE).commit();
- Log.d(LOG, "onCreate:" + this);
- super.onCreate(savedInstanceState);
+ setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId);
application = (DictionaryApplication) getApplication();
theme = application.getSelectedTheme();
+ textColorFg = getResources().getColor(theme.tokenRowFgColor);
final Intent intent = getIntent();
- dictFile = new File(intent.getStringExtra(C.DICT_FILE));
+ String intentAction = intent.getAction();
+ /**
+ * @author Dominik Köppl Querying the Intent
+ * com.hughes.action.ACTION_SEARCH_DICT is the advanced query
+ * Arguments: SearchManager.QUERY -> the phrase to search from
+ * -> language in which the phrase is written to -> to which
+ * language shall be translated
+ */
+ if (intentAction != null && intentAction.equals("com.hughes.action.ACTION_SEARCH_DICT"))
+ {
+ String query = intent.getStringExtra(SearchManager.QUERY);
+ String from = intent.getStringExtra("from");
+ if (from != null)
+ from = from.toLowerCase(Locale.US);
+ String to = intent.getStringExtra("to");
+ if (to != null)
+ to = to.toLowerCase(Locale.US);
+ if (query != null)
+ {
+ getIntent().putExtra(C.SEARCH_TOKEN, query);
+ }
+ if (intent.getStringExtra(C.DICT_FILE) == null && (from != null || to != null))
+ {
+ Log.d(LOG, "DictSearch: from: " + from + " to " + to);
+ List<DictionaryInfo> dicts = application.getDictionariesOnDevice(null);
+ for (DictionaryInfo info : dicts)
+ {
+ boolean hasFrom = from == null;
+ boolean hasTo = to == null;
+ for (IndexInfo index : info.indexInfos)
+ {
+ if (!hasFrom && index.shortName.toLowerCase(Locale.US).equals(from))
+ hasFrom = true;
+ if (!hasTo && index.shortName.toLowerCase(Locale.US).equals(to))
+ hasTo = true;
+ }
+ if (hasFrom && hasTo)
+ {
+ if (from != null)
+ {
+ int which_index = 0;
+ for (; which_index < info.indexInfos.size(); ++which_index)
+ {
+ if (info.indexInfos.get(which_index).shortName.toLowerCase(
+ Locale.US).equals(from))
+ break;
+ }
+ intent.putExtra(C.INDEX_SHORT_NAME,
+ info.indexInfos.get(which_index).shortName);
+
+ }
+ intent.putExtra(C.DICT_FILE, application.getPath(info.uncompressedFilename)
+ .toString());
+ break;
+ }
+ }
+
+ }
+ }
+ /**
+ * @author Dominik Köppl Querying the Intent Intent.ACTION_SEARCH is a
+ * simple query Arguments follow from android standard (see
+ * documentation)
+ */
+ if (intentAction != null && intentAction.equals(Intent.ACTION_SEARCH))
+ {
+ String query = intent.getStringExtra(SearchManager.QUERY);
+ if (query != null)
+ getIntent().putExtra(C.SEARCH_TOKEN, query);
+ }
+ /**
+ * @author Dominik Köppl If no dictionary is chosen, use the default
+ * dictionary specified in the preferences If this step does
+ * fail (no default directory specified), show a toast and
+ * abort.
+ */
+ if (intent.getStringExtra(C.DICT_FILE) == null)
+ {
+ String dictfile = prefs.getString(getString(R.string.defaultDicKey), null);
+ if (dictfile != null)
+ intent.putExtra(C.DICT_FILE, application.getPath(dictfile).toString());
+ }
+ String dictFilename = intent.getStringExtra(C.DICT_FILE);
+
+ if (dictFilename == null)
+ {
+ Toast.makeText(this, getString(R.string.no_dict_file), Toast.LENGTH_LONG).show();
+ startActivity(DictionaryManagerActivity.getLaunchIntent());
+ finish();
+ return;
+ }
+ if (dictFilename != null)
+ dictFile = new File(dictFilename);
+
+ ttsReady = false;
+ textToSpeech = new TextToSpeech(getApplicationContext(), new OnInitListener() {
+ @Override
+ public void onInit(int status) {
+ ttsReady = true;
+ updateTTSLanguage();
+ }
+ });
try {
final String name = application.getDictionaryName(dictFile.getName());
finish();
return;
}
- indexIndex = intent.getIntExtra(C.INDEX_INDEX, 0);
- if (savedInstanceState != null) {
- indexIndex = savedInstanceState.getInt(C.INDEX_INDEX, indexIndex);
+ String targetIndex = intent.getStringExtra(C.INDEX_SHORT_NAME);
+ if (savedInstanceState != null && savedInstanceState.getString(C.INDEX_SHORT_NAME) != null) {
+ targetIndex = savedInstanceState.getString(C.INDEX_SHORT_NAME);
+ }
+ indexIndex = 0;
+ for (int i = 0; i < dictionary.indices.size(); ++i) {
+ if (dictionary.indices.get(i).shortName.equals(targetIndex)) {
+ indexIndex = i;
+ break;
+ }
}
- indexIndex %= dictionary.indices.size();
Log.d(LOG, "Loading index " + indexIndex);
index = dictionary.indices.get(indexIndex);
setListAdapter(new IndexAdapter(index));
uiHandler.post(new Runnable() {
@Override
public void run() {
- onSearchTextChange(searchText.getText().toString());
+ onSearchTextChange(searchView.getQuery().toString());
}
});
}
Toast.LENGTH_LONG).show();
}
}
- // if (!"SYSTEM".equals(fontName)) {
- // throw new RuntimeException("Test force using system font: " +
- // fontName);
- // }
if (typeface == null) {
Log.w(LOG, "Unable to create typeface, using default.");
typeface = Typeface.DEFAULT;
}
setContentView(R.layout.dictionary_activity);
- searchText = (EditText) findViewById(R.id.SearchText);
- searchText.requestFocus();
- searchText.addTextChangedListener(searchTextWatcher);
+
+ // ContextMenu.
+ registerForContextMenu(getListView());
+
+ // Cache some prefs.
+ wordList = new File(prefs.getString(getString(R.string.wordListFileKey),
+ new File(application.getDictDir(), "wordList.txt").getAbsolutePath()));
+ saveOnlyFirstSubentry = prefs.getBoolean(getString(R.string.saveOnlyFirstSubentryKey),
+ false);
+ clickOpensContextMenu = prefs.getBoolean(getString(R.string.clickOpensContextMenuKey),
+ false);
+ Log.d(LOG, "wordList=" + wordList + ", saveOnlyFirstSubentry=" + saveOnlyFirstSubentry);
+
+ onCreateSetupActionBarAndSearchView();
// Set the search text from the intent, then the saved state.
String text = getIntent().getStringExtra(C.SEARCH_TOKEN);
setSearchText(text, true);
Log.d(LOG, "Trying to restore searchText=" + text);
- final View clearSearchTextButton = findViewById(R.id.ClearSearchTextButton);
- clearSearchTextButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- onClearSearchTextButton();
- }
- });
- clearSearchTextButton.setVisibility(PreferenceManager.getDefaultSharedPreferences(this)
- .getBoolean(getString(R.string.showClearSearchTextButtonKey), true) ? View.VISIBLE
- : View.GONE);
-
- langButton = (Button) findViewById(R.id.LangButton);
- langButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- onLanguageButton();
- }
- });
- langButton.setOnLongClickListener(new OnLongClickListener() {
+ setDictionaryPrefs(this, dictFile, index.shortName, searchView.getQuery().toString());
+
+ updateLangButton();
+ searchView.requestFocus();
+ }
+
+ private void onCreateSetupActionBarAndSearchView() {
+ ActionBar actionBar = getSupportActionBar();
+ actionBar.setDisplayShowTitleEnabled(false);
+ actionBar.setDisplayShowHomeEnabled(false);
+ actionBar.setDisplayHomeAsUpEnabled(false);
+
+ searchView = new SearchView(getSupportActionBar().getThemedContext());
+ searchView.setIconifiedByDefault(false);
+ // searchView.setIconified(false); // puts the magnifying glass in the
+ // wrong place.
+ searchView.setQueryHint(getString(R.string.searchText));
+ searchView.setSubmitButtonEnabled(false);
+ final int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300,
+ getResources().getDisplayMetrics());
+ FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(width,
+ FrameLayout.LayoutParams.WRAP_CONTENT);
+ searchView.setLayoutParams(lp);
+ searchView.setImeOptions(
+ EditorInfo.IME_ACTION_SEARCH |
+ EditorInfo.IME_FLAG_NO_EXTRACT_UI |
+ EditorInfo.IME_FLAG_NO_ENTER_ACTION |
+ // EditorInfo.IME_FLAG_NO_FULLSCREEN | // Requires API
+ // 11
+ EditorInfo.IME_MASK_ACTION |
+ EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
+ onQueryTextListener = new OnQueryTextListener() {
@Override
- public boolean onLongClick(View v) {
- onLanguageButtonLongClick(v.getContext());
+ public boolean onQueryTextSubmit(String query) {
+ Log.d(LOG, "OnQueryTextListener: onQueryTextSubmit: " + searchView.getQuery());
return true;
}
- });
- updateLangButton();
- final View upButton = findViewById(R.id.UpButton);
- upButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- onUpDownButton(true);
- }
- });
- final View downButton = findViewById(R.id.DownButton);
- downButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- onUpDownButton(false);
+ @Override
+ public boolean onQueryTextChange(String newText) {
+ Log.d(LOG, "OnQueryTextListener: onQueryTextChange: " + searchView.getQuery());
+ onSearchTextChange(searchView.getQuery().toString());
+ return true;
}
- });
-
- getListView().setOnItemSelectedListener(new ListView.OnItemSelectedListener() {
+ };
+ searchView.setOnQueryTextListener(onQueryTextListener);
+ searchView.setFocusable(true);
+
+ searchHintIcon = (ImageView) searchView.findViewById(R.id.abs__search_mag_icon);
+ // http://stackoverflow.com/questions/2521959/how-to-scale-an-image-in-imageview-to-keep-the-aspect-ratio
+ searchHintIcon.setLayoutParams(new LinearLayout.LayoutParams(
+ application.languageButtonPixels * 3 / 4, LayoutParams.WRAP_CONTENT));
+ searchHintIcon.setScaleType(ScaleType.FIT_CENTER);
+ searchHintIcon.setAdjustViewBounds(true);
+ searchHintIcon.setPadding(1, application.languageButtonPixels / 8, 1, 0);
+ searchHintIcon.setOnClickListener(new OnClickListener() {
@Override
- public void onItemSelected(AdapterView<?> adapterView, View arg1, final int position,
- long id) {
- if (!searchText.isFocused()) {
- if (!isFiltered()) {
- final RowBase row = (RowBase) getListAdapter().getItem(position);
- Log.d(LOG, "onItemSelected: " + row.index());
- final TokenRow tokenRow = row.getTokenRow(true);
- searchText.setText(tokenRow.getToken());
- }
- }
+ public void onClick(View arg0) {
+ onLanguageButtonClick();
}
-
+ });
+ searchHintIcon.setOnLongClickListener(new OnLongClickListener() {
@Override
- public void onNothingSelected(AdapterView<?> arg0) {
+ public boolean onLongClick(View v) {
+ onLanguageButtonLongClick(v.getContext());
+ return true;
}
});
-
- // ContextMenu.
- registerForContextMenu(getListView());
-
- // Prefs.
- wordList = new File(prefs.getString(getString(R.string.wordListFileKey),
- getString(R.string.wordListFileDefault)));
- saveOnlyFirstSubentry = prefs.getBoolean(getString(R.string.saveOnlyFirstSubentryKey),
- false);
- clickOpensContextMenu = prefs.getBoolean(getString(R.string.clickOpensContextMenuKey),
- false);
- // if (prefs.getBoolean(getString(R.string.vibrateOnFailedSearchKey),
- // true)) {
- // vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
- // }
- Log.d(LOG, "wordList=" + wordList + ", saveOnlyFirstSubentry=" + saveOnlyFirstSubentry);
-
- setDictionaryPrefs(this, dictFile, indexIndex, searchText.getText().toString());
+ actionBar.setCustomView(searchView);
+ actionBar.setDisplayShowCustomEnabled(true);
}
@Override
protected void onResume() {
+ Log.d(LOG, "onResume");
super.onResume();
if (PreferenceActivity.prefsMightHaveChanged) {
PreferenceActivity.prefsMightHaveChanged = false;
finish();
startActivity(getIntent());
}
- if (initialSearchText != null) {
- setSearchText(initialSearchText, true);
- }
+ showKeyboard();
}
@Override
super.onPause();
}
+ @Override
+ /**
+ * Invoked when MyWebView returns, since the user might have clicked some
+ * hypertext in the MyWebView.
+ */
+ protected void onActivityResult(int requestCode, int resultCode, Intent result) {
+ super.onActivityResult(requestCode, resultCode, result);
+ if (result != null && result.hasExtra(C.SEARCH_TOKEN)) {
+ Log.d(LOG, "onActivityResult: " + result.getStringExtra(C.SEARCH_TOKEN));
+ jumpToTextFromHyperLink(result.getStringExtra(C.SEARCH_TOKEN), indexIndex);
+ }
+ }
+
private static void setDictionaryPrefs(final Context context, final File dictFile,
- final int indexIndex, final String searchToken) {
+ final String indexShortName, final String searchToken) {
final SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(
context).edit();
prefs.putString(C.DICT_FILE, dictFile.getPath());
- prefs.putInt(C.INDEX_INDEX, indexIndex);
+ prefs.putString(C.INDEX_SHORT_NAME, indexShortName);
prefs.putString(C.SEARCH_TOKEN, ""); // Don't need to save search token.
prefs.commit();
}
// Buttons
// --------------------------------------------------------------------------
- private void onClearSearchTextButton() {
- setSearchText("", true);
- Log.d(LOG, "Trying to show soft keyboard.");
- final InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
- manager.showSoftInput(searchText, InputMethodManager.SHOW_IMPLICIT);
+ private void showKeyboard() {
+ // For some reason, this doesn't always work the first time.
+ // One way to replicate the problem:
+ // Press the "task switch" button repeatedly to pause and resume
+ for (int delay = 1; delay <= 101; delay += 100) {
+ searchView.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ Log.d(LOG, "Trying to show soft keyboard.");
+ final boolean searchTextHadFocus = searchView.hasFocus();
+ searchView.requestFocusFromTouch();
+ final InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
+ manager.showSoftInput(searchView, InputMethodManager.SHOW_IMPLICIT);
+ if (!searchTextHadFocus) {
+ defocusSearchText();
+ }
+ }
+ }, delay);
+ }
}
void updateLangButton() {
- // final LanguageResources languageResources =
- // Language.isoCodeToResources.get(index.shortName);
- // if (languageResources != null && languageResources.flagId != 0) {
- // langButton.setCompoundDrawablesWithIntrinsicBounds(0, 0,
- // languageResources.flagId, 0);
- // } else {
- // langButton.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
- langButton.setText(index.shortName);
- // }
+ final LanguageResources languageResources =
+ Language.isoCodeToResources.get(index.shortName);
+ if (languageResources != null && languageResources.flagId != 0) {
+ searchHintIcon.setImageResource(languageResources.flagId);
+ } else {
+ if (indexIndex % 2 == 0) {
+ searchHintIcon.setImageResource(android.R.drawable.ic_media_next);
+ } else {
+ searchHintIcon.setImageResource(android.R.drawable.ic_media_previous);
+ }
+ }
+ updateTTSLanguage();
}
- void onLanguageButton() {
+ private void updateTTSLanguage() {
+ if (!ttsReady || index == null || textToSpeech == null) {
+ Log.d(LOG, "Can't updateTTSLanguage.");
+ return;
+ }
+ final Locale locale = new Locale(index.sortLanguage.getIsoCode());
+ Log.d(LOG, "Setting TTS locale to: " + locale);
+ final int ttsResult = textToSpeech.setLanguage(locale);
+ if (ttsResult != TextToSpeech.LANG_AVAILABLE ||
+ ttsResult != TextToSpeech.LANG_COUNTRY_AVAILABLE) {
+ Log.e(LOG, "TTS not available in this language: ttsResult=" + ttsResult);
+ }
+ }
+
+ void onLanguageButtonClick() {
+ if (dictionary.indices.size() == 1) {
+ // No need to work to switch indices.
+ return;
+ }
if (currentSearchOperation != null) {
currentSearchOperation.interrupted.set(true);
currentSearchOperation = null;
}
- changeIndexGetFocusAndResearch((indexIndex + 1) % dictionary.indices.size());
+ setIndexAndSearchText((indexIndex + 1) % dictionary.indices.size(),
+ searchView.getQuery().toString());
}
void onLanguageButtonLongClick(final Context context) {
dialog.setContentView(R.layout.select_dictionary_dialog);
dialog.setTitle(R.string.selectDictionary);
- final List<DictionaryInfo> installedDicts = ((DictionaryApplication) getApplication())
- .getUsableDicts();
+ final List<DictionaryInfo> installedDicts = application.getDictionariesOnDevice(null);
ListView listView = (ListView) dialog.findViewById(android.R.id.list);
-
- // final LinearLayout.LayoutParams layoutParams = new
- // LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
- // ViewGroup.LayoutParams.WRAP_CONTENT);
- // layoutParams.width = 0;
- // layoutParams.weight = 1.0f;
-
final Button button = new Button(listView.getContext());
final String name = getString(R.string.dictionaryManager);
button.setText(name);
};
};
button.setOnClickListener(intentLauncher);
- // button.setLayoutParams(layoutParams);
listView.addHeaderView(button);
- // listView.setHeaderDividersEnabled(true);
listView.setAdapter(new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
+ final DictionaryInfo dictionaryInfo = getItem(position);
+
final LinearLayout result = new LinearLayout(parent.getContext());
- final DictionaryInfo dictionaryInfo = getItem(position);
for (int i = 0; i < dictionaryInfo.indexInfos.size(); ++i) {
final IndexInfo indexInfo = dictionaryInfo.indexInfos.get(i);
- final Button button = new Button(parent.getContext());
-// final String name = application
-// .getDictionaryName(dictionaryInfo.uncompressedFilename);
- button.setText(indexInfo.shortName);
+ final View button = application.createButton(parent.getContext(),
+ dictionaryInfo, indexInfo);
final IntentLauncher intentLauncher = new IntentLauncher(parent.getContext(),
- getLaunchIntent(application.getPath(dictionaryInfo.uncompressedFilename),
- i, searchText.getText().toString())) {
+ getLaunchIntent(
+ application.getPath(dictionaryInfo.uncompressedFilename),
+ indexInfo.shortName, searchView.getQuery().toString())) {
@Override
protected void onGo() {
dialog.dismiss();
};
};
button.setOnClickListener(intentLauncher);
- final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
- ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
- layoutParams.width = 0;
- layoutParams.weight = 1.0f;
- button.setLayoutParams(layoutParams);
result.addView(button);
-
- if (i > 0) {
- final TextView dash = new TextView(parent.getContext());
- dash.setText("-");
- result.addView(dash);
- }
}
+
+ final TextView nameView = new TextView(parent.getContext());
+ final String name = application
+ .getDictionaryName(dictionaryInfo.uncompressedFilename);
+ nameView.setText(name);
+ final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ layoutParams.width = 0;
+ layoutParams.weight = 1.0f;
+ nameView.setLayoutParams(layoutParams);
+ nameView.setGravity(Gravity.CENTER_VERTICAL);
+ result.addView(nameView);
return result;
}
return installedDicts.size();
}
});
-
dialog.show();
}
- private void changeIndexGetFocusAndResearch(final int newIndex) {
- indexIndex = newIndex;
- index = dictionary.indices.get(indexIndex);
- indexAdapter = new IndexAdapter(index);
- Log.d(LOG, "changingIndex, newLang=" + index.longName);
- setListAdapter(indexAdapter);
- updateLangButton();
- searchText.requestFocus(); // Otherwise, nothing may happen.
- onSearchTextChange(searchText.getText().toString());
- setDictionaryPrefs(this, dictFile, indexIndex, searchText.getText().toString());
- }
-
void onUpDownButton(final boolean up) {
if (isFiltered()) {
return;
}
final Index.IndexEntry dest = index.sortedIndexEntries.get(destIndexEntry);
Log.d(LOG, "onUpDownButton, destIndexEntry=" + dest.token);
- searchText.removeTextChangedListener(searchTextWatcher);
- searchText.setText(dest.token);
- if (searchText.getLayout() != null) {
- // Surprising, but this can otherwise crash sometimes...
- Selection.moveToRightEdge(searchText.getText(), searchText.getLayout());
- }
+ setSearchText(dest.token, false);
jumpToRow(index.sortedIndexEntries.get(destIndexEntry).startRow);
- searchText.addTextChangedListener(searchTextWatcher);
+ defocusSearchText();
}
// --------------------------------------------------------------------------
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
- application.onCreateGlobalOptionsMenu(this, menu);
- {
- final MenuItem randomWord = menu.add(getString(R.string.randomWord));
- randomWord.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- public boolean onMenuItemClick(final MenuItem menuItem) {
- final String word = index.sortedIndexEntries.get(random
- .nextInt(index.sortedIndexEntries.size())).token;
- setSearchText(word, true);
- return false;
+ if (PreferenceManager.getDefaultSharedPreferences(this)
+ .getBoolean(getString(R.string.showPrevNextButtonsKey), true)) {
+ // Next word.
+ nextWordMenuItem = menu.add(getString(R.string.nextWord))
+ .setIcon(R.drawable.arrow_down_float);
+ nextWordMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ nextWordMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ onUpDownButton(false);
+ return true;
+ }
+ });
+
+ // Previous word.
+ previousWordMenuItem = menu.add(getString(R.string.previousWord))
+ .setIcon(R.drawable.arrow_up_float);
+ previousWordMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
+ previousWordMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ onUpDownButton(true);
+ return true;
}
});
}
+ application.onCreateGlobalOptionsMenu(this, menu);
+
{
- final MenuItem dictionaryList = menu.add(getString(R.string.dictionaryManager));
- dictionaryList.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ final MenuItem dictionaryManager = menu.add(getString(R.string.dictionaryManager));
+ dictionaryManager.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+ dictionaryManager.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(final MenuItem menuItem) {
startActivity(DictionaryManagerActivity.getLaunchIntent());
finish();
{
final MenuItem aboutDictionary = menu.add(getString(R.string.aboutDictionary));
+ aboutDictionary.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
aboutDictionary.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(final MenuItem menuItem) {
final Context context = getListView().getContext();
source.getNumEntries())).append("\n");
}
}
- // } else {
- // builder.append(getString(R.string.invalidDictionary));
- // }
textView.setText(builder.toString());
dialog.show();
AdapterContextMenuInfo adapterContextMenuInfo = (AdapterContextMenuInfo) menuInfo;
final RowBase row = (RowBase) getListAdapter().getItem(adapterContextMenuInfo.position);
- final MenuItem addToWordlist = menu.add(getString(R.string.addToWordList,
+ final android.view.MenuItem addToWordlist = menu.add(getString(R.string.addToWordList,
wordList.getName()));
- addToWordlist.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- onAppendToWordList(row);
+ addToWordlist
+ .setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(android.view.MenuItem item) {
+ onAppendToWordList(row);
+ return false;
+ }
+ });
+
+ final android.view.MenuItem share = menu.add("Share");
+ share.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(android.view.MenuItem item) {
+ Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
+ shareIntent.setType("text/plain");
+ shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, row.getTokenRow(true)
+ .getToken());
+ shareIntent.putExtra(android.content.Intent.EXTRA_TEXT,
+ row.getRawText(saveOnlyFirstSubentry));
+ startActivity(shareIntent);
return false;
}
});
- final MenuItem copy = menu.add(android.R.string.copy);
- copy.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
+ final android.view.MenuItem copy = menu.add(android.R.string.copy);
+ copy.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(android.view.MenuItem item) {
onCopy(row);
return false;
}
if (selectedSpannableText != null) {
final String selectedText = selectedSpannableText;
- final MenuItem searchForSelection = menu.add(getString(R.string.searchForSelection,
+ final android.view.MenuItem searchForSelection = menu.add(getString(
+ R.string.searchForSelection,
selectedSpannableText));
- searchForSelection.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- public boolean onMenuItemClick(MenuItem item) {
- int indexToUse = -1;
- for (int i = 0; i < dictionary.indices.size(); ++i) {
- final Index index = dictionary.indices.get(i);
- if (indexPrepFinished) {
- System.out.println("Doing index lookup: on " + selectedText);
- final IndexEntry indexEntry = index.findExact(selectedText);
- if (indexEntry != null) {
- final TokenRow tokenRow = index.rows.get(indexEntry.startRow)
- .getTokenRow(false);
- if (tokenRow != null && tokenRow.hasMainEntry) {
- indexToUse = i;
- break;
- }
- }
- } else {
- Log.w(LOG, "Skipping findExact on index " + index.shortName);
+ searchForSelection
+ .setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
+ public boolean onMenuItemClick(android.view.MenuItem item) {
+ jumpToTextFromHyperLink(selectedText, selectedSpannableIndex);
+ return false;
}
- }
- if (indexToUse == -1) {
- indexToUse = selectedSpannableIndex;
- }
- final boolean changeIndex = indexIndex != indexToUse;
- setSearchText(selectedText, !changeIndex); // If we're not
- // changing
- // index, we have
- // to
- // triggerSearch.
- if (changeIndex) {
- changeIndexGetFocusAndResearch(indexToUse);
- }
- // Give focus back to list view because typing is done.
- getListView().requestFocus();
+ });
+ }
+
+ if (row instanceof TokenRow && ttsReady) {
+ final android.view.MenuItem speak = menu.add(R.string.speak);
+ speak.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(android.view.MenuItem item) {
+ textToSpeech.speak(((TokenRow) row).getToken(), TextToSpeech.QUEUE_FLUSH,
+ new HashMap<String, String>());
return false;
}
});
}
+ }
+ private void jumpToTextFromHyperLink(
+ final String selectedText, final int defaultIndexToUse) {
+ int indexToUse = -1;
+ for (int i = 0; i < dictionary.indices.size(); ++i) {
+ final Index index = dictionary.indices.get(i);
+ if (indexPrepFinished) {
+ System.out.println("Doing index lookup: on " + selectedText);
+ final IndexEntry indexEntry = index.findExact(selectedText);
+ if (indexEntry != null) {
+ final TokenRow tokenRow = index.rows.get(indexEntry.startRow)
+ .getTokenRow(false);
+ if (tokenRow != null && tokenRow.hasMainEntry) {
+ indexToUse = i;
+ break;
+ }
+ }
+ } else {
+ Log.w(LOG, "Skipping findExact on index " + index.shortName);
+ }
+ }
+ if (indexToUse == -1) {
+ indexToUse = defaultIndexToUse;
+ }
+ // Without this extra delay, the call to jumpToRow that this
+ // invokes doesn't always actually have any effect.
+ final int actualIndexToUse = indexToUse;
+ getListView().postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ setIndexAndSearchText(actualIndexToUse, selectedText);
+ }
+ }, 100);
+ }
+
+ /**
+ * Called when user clicks outside of search text, so that they can start
+ * typing again immediately.
+ */
+ void defocusSearchText() {
+ // Log.d(LOG, "defocusSearchText");
+ // Request focus so that if we start typing again, it clears the text
+ // input.
+ getListView().requestFocus();
+
+ // Visual indication that a new keystroke will clear the search text.
+ // Doesn't seem to work unless earchText has focus.
+ // searchView.selectAll();
}
@Override
}
}
+ @SuppressLint("SimpleDateFormat")
void onAppendToWordList(final RowBase row) {
defocusSearchText();
return;
}
- /**
- * Called when user clicks outside of search text, so that they can start
- * typing again immediately.
- */
- void defocusSearchText() {
- // Log.d(LOG, "defocusSearchText");
- // Request focus so that if we start typing again, it clears the text
- // input.
- getListView().requestFocus();
-
- // Visual indication that a new keystroke will clear the search text.
- searchText.selectAll();
- }
-
@SuppressWarnings("deprecation")
void onCopy(final RowBase row) {
defocusSearchText();
@Override
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
if (event.getUnicodeChar() != 0) {
- if (!searchText.hasFocus()) {
+ if (!searchView.hasFocus()) {
setSearchText("" + (char) event.getUnicodeChar(), true);
+ searchView.requestFocus();
}
return true;
}
return super.onKeyDown(keyCode, event);
}
- private void setSearchText(final String text, final boolean triggerSearch) {
- if (!triggerSearch) {
- getListView().requestFocus();
+ private void setIndexAndSearchText(int newIndex, String newSearchText) {
+ Log.d(LOG, "Changing index to: " + newIndex);
+ if (newIndex == -1) {
+ Log.e(LOG, "Invalid index.");
+ newIndex = 0;
+ }
+ if (newIndex != indexIndex) {
+ indexIndex = newIndex;
+ index = dictionary.indices.get(indexIndex);
+ indexAdapter = new IndexAdapter(index);
+ setListAdapter(indexAdapter);
+ Log.d(LOG, "changingIndex, newLang=" + index.longName);
+ setDictionaryPrefs(this, dictFile, index.shortName, searchView.getQuery().toString());
+ updateLangButton();
}
- searchText.setText(text);
- searchText.requestFocus();
+ setSearchText(newSearchText, true);
+ }
+
+ private void setSearchText(final String text, final boolean triggerSearch) {
+ Log.d(LOG, "setSearchText, text=" + text + ", triggerSearch=" + triggerSearch);
+ // Disable the listener, because sometimes it doesn't work.
+ searchView.setOnQueryTextListener(null);
+ searchView.setQuery(text, false);
moveCursorToRight();
+ searchView.setOnQueryTextListener(onQueryTextListener);
if (triggerSearch) {
- onSearchTextChange(text);
+ onQueryTextListener.onQueryTextChange(text);
}
}
- private long cursorDelayMillis = 100;
-
+ // private long cursorDelayMillis = 100;
private void moveCursorToRight() {
- if (searchText.getLayout() != null) {
- cursorDelayMillis = 100;
- // Surprising, but this can crash when you rotate...
- Selection.moveToRightEdge(searchText.getText(), searchText.getLayout());
- } else {
- uiHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- moveCursorToRight();
- }
- }, cursorDelayMillis);
- cursorDelayMillis = Math.min(10 * 1000, 2 * cursorDelayMillis);
- }
+ // if (searchText.getLayout() != null) {
+ // cursorDelayMillis = 100;
+ // // Surprising, but this can crash when you rotate...
+ // Selection.moveToRightEdge(searchView.getQuery(),
+ // searchText.getLayout());
+ // } else {
+ // uiHandler.postDelayed(new Runnable() {
+ // @Override
+ // public void run() {
+ // moveCursorToRight();
+ // }
+ // }, cursorDelayMillis);
+ // cursorDelayMillis = Math.min(10 * 1000, 2 * cursorDelayMillis);
+ // }
}
// --------------------------------------------------------------------------
}
}
}, 20);
-
}
private final void jumpToRow(final int row) {
- setSelection(row);
+ Log.d(LOG, "jumpToRow: " + row + ", refocusSearchText=" + false);
+ // getListView().requestFocusFromTouch();
+ getListView().setSelectionFromTop(row, 0);
getListView().setSelected(true);
}
boolean done = false;
SearchOperation(final String searchText, final Index index) {
- this.searchText = searchText.trim();
+ this.searchText = StringUtil.normalizeWhitespace(searchText);
this.index = index;
}
searchResult = index.findInsertionPoint(searchText, interrupted);
} else {
searchTokens = Arrays.asList(searchTokenArray);
- multiWordSearchResult = index.multiWordSearch(searchTokens, interrupted);
+ multiWordSearchResult = index.multiWordSearch(searchText, searchTokens,
+ interrupted);
}
Log.d(LOG,
"searchText=" + searchText + ", searchDuration="
searchFinished(SearchOperation.this);
}
});
+ } else {
+ Log.d(LOG, "interrupted, skipping searchFinished.");
}
} catch (Exception e) {
Log.e(LOG, "Failure during search (can happen during Activity close.");
return result;
}
- private TableLayout getView(HtmlEntry.Row row, ViewGroup parent, final TableLayout result) {
- final HtmlEntry htmlEntry = row.getEntry();
- return getPossibleHtmlEntryView(htmlEntry.title, false, Collections.singletonList(htmlEntry), parent, result);
- }
-
- private TableLayout getPossibleHtmlEntryView(final String text, final boolean hasMainEntry, final List<HtmlEntry> htmlEntries, ViewGroup parent, final TableLayout result) {
+ private TableLayout getPossibleLinkToHtmlEntryView(final boolean isTokenRow,
+ final String text, final boolean hasMainEntry, final List<HtmlEntry> htmlEntries,
+ final String htmlTextToHighlight, ViewGroup parent, final TableLayout result) {
final Context context = parent.getContext();
-
+
final TableRow tableRow = new TableRow(result.getContext());
tableRow.setBackgroundResource(hasMainEntry ? theme.tokenRowMainBg
: theme.tokenRowOtherBg);
- tableRow.setPadding(mPaddingDefault, mPaddingDefault, mPaddingDefault, 0);
+ if (isTokenRow) {
+ tableRow.setPadding(mPaddingDefault, mPaddingDefault, mPaddingDefault, 0);
+ } else {
+ tableRow.setPadding(mPaddingLarge, mPaddingDefault, mPaddingDefault, 0);
+ }
result.addView(tableRow);
-
+ // Make it so we can long-click on these token rows, too:
final TextView textView = new TextView(context);
- textView.setText(text);
+ textView.setText(text, BufferType.SPANNABLE);
+ createTokenLinkSpans(textView, (Spannable) textView.getText(), text);
+ final TextViewLongClickListener textViewLongClickListenerIndex0 = new TextViewLongClickListener(
+ 0);
+ textView.setOnLongClickListener(textViewLongClickListenerIndex0);
+ result.setLongClickable(true);
+
// Doesn't work:
// textView.setTextColor(android.R.color.secondary_text_light);
- textView.setTextAppearance(context, theme.tokenRowFg);
textView.setTypeface(typeface);
- textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 5 * fontSizeSp / 4);
TableRow.LayoutParams lp = new TableRow.LayoutParams(0);
+ if (isTokenRow) {
+ textView.setTextAppearance(context, theme.tokenRowFg);
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 4 * fontSizeSp / 3);
+ } else {
+ textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp);
+ }
lp.weight = 1.0f;
+
textView.setLayoutParams(lp);
tableRow.addView(textView);
-
if (!htmlEntries.isEmpty()) {
- final ImageButton button = new ImageButton(context);
- button.setImageResource(R.drawable.ic_menu_forward);
- button.setOnClickListener(new OnClickListener() {
+ final ClickableSpan clickableSpan = new ClickableSpan() {
+ @Override
+ public void onClick(View widget) {
+ }
+ };
+ ((Spannable) textView.getText()).setSpan(clickableSpan, 0, text.length(),
+ Spannable.SPAN_INCLUSIVE_INCLUSIVE);
+ result.setClickable(true);
+ textView.setClickable(true);
+ textView.setMovementMethod(LinkMovementMethod.getInstance());
+ textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- final String html = HtmlEntry.htmlBody(htmlEntries);
- startActivity(HtmlDisplayActivity.getHtmlIntent(String.format(
- "<html><head></head><body>%s</body></html>", html), text));
+ String html = HtmlEntry.htmlBody(htmlEntries, index.shortName);
+ // Log.d(LOG, "html=" + html);
+ startActivityForResult(
+ HtmlDisplayActivity.getHtmlIntent(String.format(
+ "<html><head></head><body>%s</body></html>", html),
+ htmlTextToHighlight, false),
+ 0);
}
});
- tableRow.addView(button);
- lp = new TableRow.LayoutParams(1);
- lp.weight = 0.0f;
- button.setLayoutParams(lp);
- //result.setColumnStretchable(0, true);
- //result.setColumnStretchable(1, false);
}
return result;
}
-
+
private TableLayout getView(TokenRow row, ViewGroup parent, final TableLayout result) {
final IndexEntry indexEntry = row.getIndexEntry();
- return getPossibleHtmlEntryView(indexEntry.token, row.hasMainEntry, indexEntry.htmlEntries, parent, result);
+ return getPossibleLinkToHtmlEntryView(true, indexEntry.token, row.hasMainEntry,
+ indexEntry.htmlEntries, null, parent, result);
}
- }
-
+ private TableLayout getView(HtmlEntry.Row row, ViewGroup parent, final TableLayout result) {
+ final HtmlEntry htmlEntry = row.getEntry();
+ final TokenRow tokenRow = row.getTokenRow(true);
+ return getPossibleLinkToHtmlEntryView(false,
+ getString(R.string.seeAlso, htmlEntry.title, htmlEntry.entrySource.getName()),
+ false, Collections.singletonList(htmlEntry), tokenRow.getToken(), parent,
+ result);
+ }
+ }
static final Pattern CHAR_DASH = Pattern.compile("['\\p{L}\\p{M}\\p{N}]+");
textView.setMovementMethod(LinkMovementMethod.getInstance());
final Matcher matcher = CHAR_DASH.matcher(text);
while (matcher.find()) {
- spannable.setSpan(new NonLinkClickableSpan(), matcher.start(), matcher.end(),
+ spannable.setSpan(new NonLinkClickableSpan(textColorFg), matcher.start(),
+ matcher.end(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
Log.d(LOG, "searchText changed during shutdown, doing nothing.");
return;
}
- if (!searchText.isFocused()) {
- Log.d(LOG, "searchText changed without focus, doing nothing.");
- return;
- }
+ // if (!searchView.hasFocus()) {
+ // Log.d(LOG, "searchText changed without focus, doing nothing.");
+ // return;
+ // }
Log.d(LOG, "onSearchTextChange: " + text);
if (currentSearchOperation != null) {
Log.d(LOG, "Interrupting currentSearchOperation.");
searchExecutor.execute(currentSearchOperation);
}
- private class SearchTextWatcher implements TextWatcher {
- public void afterTextChanged(final Editable searchTextEditable) {
- if (searchText.hasFocus()) {
- Log.d(LOG, "Search text changed with focus: " + searchText.getText());
- // If they were typing to cause the change, update the UI.
- onSearchTextChange(searchText.getText().toString());
- }
- }
-
- public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
- }
-
- public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
- }
- }
-
// --------------------------------------------------------------------------
// Filtered results.
// --------------------------------------------------------------------------
}
void setFiltered(final SearchOperation searchOperation) {
- ((ImageButton) findViewById(R.id.UpButton)).setEnabled(false);
- ((ImageButton) findViewById(R.id.DownButton)).setEnabled(false);
+ if (nextWordMenuItem != null) {
+ nextWordMenuItem.setEnabled(false);
+ previousWordMenuItem.setEnabled(false);
+ }
rowsToShow = searchOperation.multiWordSearchResult;
setListAdapter(new IndexAdapter(index, rowsToShow, searchOperation.searchTokens));
}
void clearFiltered() {
- ((ImageButton) findViewById(R.id.UpButton)).setEnabled(true);
- ((ImageButton) findViewById(R.id.DownButton)).setEnabled(true);
+ if (nextWordMenuItem != null) {
+ nextWordMenuItem.setEnabled(true);
+ previousWordMenuItem.setEnabled(true);
+ }
setListAdapter(new IndexAdapter(index));
rowsToShow = null;
}