X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryActivity.java;h=8575fa6eda81b4262d268d5652f412860db79290;hb=25425d0c98914bc805cc12fb82a978223c451eea;hp=f932fbc7c1369abd81acfda3b4824409889493b7;hpb=16e91144f6047f8dd158f50ea9739c9bba8e1c97;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryActivity.java b/src/com/hughes/android/dictionary/DictionaryActivity.java index f932fbc..8575fa6 100644 --- a/src/com/hughes/android/dictionary/DictionaryActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryActivity.java @@ -28,7 +28,15 @@ import android.os.Handler; import android.preference.PreferenceManager; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarActivity; +import android.support.v7.widget.SearchView; +import android.support.v7.widget.SearchView.OnQueryTextListener; +import android.support.v7.widget.Toolbar; import android.text.ClipboardManager; +import android.text.InputType; import android.text.Spannable; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; @@ -39,6 +47,9 @@ 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; @@ -65,20 +76,12 @@ import android.widget.TextView; import android.widget.TextView.BufferType; import android.widget.Toast; -import android.support.v7.app.ActionBar; -import android.support.v7.app.ActionBarActivity; -import android.support.v7.widget.SearchView; -import android.support.v7.widget.SearchView.OnQueryTextListener; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MenuItem.OnMenuItemClickListener; 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; @@ -128,6 +131,8 @@ public class DictionaryActivity extends ActionBarActivity { List rowsToShow = null; // if not null, just show these rows. + final Random rand = new Random(); + final Handler uiHandler = new Handler(); private final Executor searchExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() { @@ -143,7 +148,7 @@ public class DictionaryActivity extends ActionBarActivity { volatile boolean ttsReady; Typeface typeface; - C.Theme theme = C.Theme.LIGHT; + DictionaryApplication.Theme theme = DictionaryApplication.Theme.LIGHT; int textColorFg = Color.BLACK; int fontSizeSp; @@ -167,7 +172,7 @@ public class DictionaryActivity extends ActionBarActivity { ImageButton languageButton; SearchView.OnQueryTextListener onQueryTextListener; - MenuItem nextWordMenuItem, previousWordMenuItem; + MenuItem nextWordMenuItem, previousWordMenuItem, randomWordMenuItem; // Never null. private File wordList = null; @@ -187,11 +192,9 @@ public class DictionaryActivity extends ActionBarActivity { public DictionaryActivity() { } - public static Intent getLaunchIntent(final File dictFile, final String indexShortName, + public static Intent getLaunchIntent(Context c, final File dictFile, final String indexShortName, final String searchToken) { - final Intent intent = new Intent(); - intent.setClassName(DictionaryActivity.class.getPackage().getName(), - DictionaryActivity.class.getName()); + final Intent intent = new Intent(c, DictionaryActivity.class); intent.putExtra(C.DICT_FILE, dictFile.getPath()); intent.putExtra(C.INDEX_SHORT_NAME, indexShortName); intent.putExtra(C.SEARCH_TOKEN, searchToken); @@ -206,13 +209,6 @@ public class DictionaryActivity extends ActionBarActivity { outState.putString(C.SEARCH_TOKEN, searchView.getQuery().toString()); } - @Override - 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) { // This needs to be before super.onCreate, otherwise ActionbarSherlock @@ -228,6 +224,7 @@ public class DictionaryActivity extends ActionBarActivity { // Don't auto-launch if this fails. prefs.edit().remove(C.DICT_FILE).commit(); + setContentView(R.layout.dictionary_activity); application = (DictionaryApplication) getApplication(); theme = application.getSelectedTheme(); @@ -304,6 +301,15 @@ public class DictionaryActivity extends ActionBarActivity { if (query != null) getIntent().putExtra(C.SEARCH_TOKEN, query); } + /* + * This processes text on M+ devices where QuickDic shows up in the context menu. + */ + if (intentAction != null && intentAction.equals(Intent.ACTION_PROCESS_TEXT)) { + String query = intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT); + 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 @@ -321,7 +327,7 @@ public class DictionaryActivity extends ActionBarActivity { if (dictFilename == null) { Toast.makeText(this, getString(R.string.no_dict_file), Toast.LENGTH_LONG).show(); - startActivity(DictionaryManagerActivity.getLaunchIntent()); + startActivity(DictionaryManagerActivity.getLaunchIntent(getApplicationContext())); finish(); return; } @@ -333,7 +339,7 @@ public class DictionaryActivity extends ActionBarActivity { @Override public void onInit(int status) { ttsReady = true; - updateTTSLanguage(); + updateTTSLanguage(indexIndex); } }); @@ -354,7 +360,7 @@ public class DictionaryActivity extends ActionBarActivity { } Toast.makeText(this, getString(R.string.invalidDictionary, "", e.getMessage()), Toast.LENGTH_LONG).show(); - startActivity(DictionaryManagerActivity.getLaunchIntent()); + startActivity(DictionaryManagerActivity.getLaunchIntent(getApplicationContext())); finish(); return; } @@ -371,11 +377,13 @@ public class DictionaryActivity extends ActionBarActivity { } Log.d(LOG, "Loading index " + indexIndex); index = dictionary.indices.get(indexIndex); + getListView().setEmptyView(findViewById(android.R.id.empty)); setListAdapter(new IndexAdapter(index)); // Pre-load the collators. new Thread(new Runnable() { public void run() { + android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); final long startMillis = System.currentTimeMillis(); try { TransliteratorManager.init(new TransliteratorManager.Callback() { @@ -393,8 +401,8 @@ public class DictionaryActivity extends ActionBarActivity { for (final Index index : dictionary.indices) { final String searchToken = index.sortedIndexEntries.get(0).token; final IndexEntry entry = index.findExact(searchToken); - if (!searchToken.equals(entry.token)) { - Log.e(LOG, "Couldn't find token: " + searchToken + ", " + entry.token); + if (entry == null || !searchToken.equals(entry.token)) { + Log.e(LOG, "Couldn't find token: " + searchToken + ", " + (entry == null ? "null" : entry.token)); } } indexPrepFinished = true; @@ -406,10 +414,19 @@ public class DictionaryActivity extends ActionBarActivity { } }).start(); - String fontName = prefs.getString(getString(R.string.fontKey), "FreeSerif.ttf.jpg"); + String fontName = prefs.getString(getString(R.string.fontKey), "FreeSerif.otf.jpg"); if ("SYSTEM".equals(fontName)) { typeface = Typeface.DEFAULT; + } else if ("SERIF".equals(fontName)) { + typeface = Typeface.SERIF; + } else if ("SANS_SERIF".equals(fontName)) { + typeface = Typeface.SANS_SERIF; + } else if ("MONOSPACE".equals(fontName)) { + typeface = Typeface.MONOSPACE; } else { + if ("FreeSerif.ttf.jpg".equals(fontName)) { + fontName = "FreeSerif.otf.jpg"; + } try { typeface = Typeface.createFromAsset(getAssets(), fontName); } catch (Exception e) { @@ -429,8 +446,6 @@ public class DictionaryActivity extends ActionBarActivity { fontSizeSp = 14; } - setContentView(R.layout.dictionary_activity); - // ContextMenu. registerForContextMenu(getListView()); @@ -444,6 +459,36 @@ public class DictionaryActivity extends ActionBarActivity { onCreateSetupActionBarAndSearchView(); + View floatSwapButton = findViewById(R.id.floatSwapButton); + floatSwapButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + onLanguageButtonClick(); + } + }); + floatSwapButton.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + onLanguageButtonLongClick(v.getContext()); + return true; + } + }); + + final FloatingActionButton floatSearchButton = (FloatingActionButton)findViewById(R.id.floatSearchButton); + floatSearchButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + if (!searchView.hasFocus()) { + searchView.requestFocus(); + } + if (searchView.getQuery().toString().length() > 0) { + searchView.setQuery("", false); + } + showKeyboard(); + searchView.setIconified(false); + } + }); + // Set the search text from the intent, then the saved state. String text = getIntent().getStringExtra(C.SEARCH_TOKEN); if (savedInstanceState != null) { @@ -469,13 +514,11 @@ public class DictionaryActivity extends ActionBarActivity { actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowHomeEnabled(false); actionBar.setDisplayHomeAsUpEnabled(false); - + final LinearLayout customSearchView = new LinearLayout(getSupportActionBar().getThemedContext()); - - final int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, - getResources().getDisplayMetrics()); + final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( - width, ViewGroup.LayoutParams.WRAP_CONTENT); + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); customSearchView.setLayoutParams(layoutParams); listView.setOnItemClickListener(new OnItemClickListener() { @@ -486,8 +529,6 @@ public class DictionaryActivity extends ActionBarActivity { }); languageButton = new ImageButton(customSearchView.getContext()); - languageButton.setMinimumWidth(application.languageButtonPixels); - languageButton.setMinimumHeight(application.languageButtonPixels * 2 / 3); languageButton.setScaleType(ScaleType.FIT_CENTER); languageButton.setOnClickListener(new OnClickListener() { @Override @@ -502,30 +543,31 @@ public class DictionaryActivity extends ActionBarActivity { return true; } }); - customSearchView.addView(languageButton); + languageButton.setAdjustViewBounds(true); + LinearLayout.LayoutParams lpb = new LinearLayout.LayoutParams(application.languageButtonPixels, LinearLayout.LayoutParams.MATCH_PARENT); + customSearchView.addView(languageButton, lpb); searchView = new SearchView(getSupportActionBar().getThemedContext()); - searchView.setIconifiedByDefault(false); - // searchView.setIconified(false); // puts the magnifying glass in the - // wrong place. + + // Get rid of search icon, it takes up too much space. + // There is still text saying "search" in the search field. + searchView.setIconifiedByDefault(true); + searchView.setIconified(false); + searchView.setQueryHint(getString(R.string.searchText)); searchView.setSubmitButtonEnabled(false); - LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0, - FrameLayout.LayoutParams.WRAP_CONTENT); - lp.weight = 1; - searchView.setLayoutParams(lp); + searchView.setInputType(InputType.TYPE_CLASS_TEXT); searchView.setImeOptions( - EditorInfo.IME_ACTION_SEARCH | + EditorInfo.IME_ACTION_DONE | 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 onQueryTextSubmit(String query) { Log.d(LOG, "OnQueryTextListener: onQueryTextSubmit: " + searchView.getQuery()); + hideKeyboard(); return true; } @@ -538,10 +580,16 @@ public class DictionaryActivity extends ActionBarActivity { }; searchView.setOnQueryTextListener(onQueryTextListener); searchView.setFocusable(true); - customSearchView.addView(searchView); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0, + FrameLayout.LayoutParams.WRAP_CONTENT, 1); + customSearchView.addView(searchView, lp); actionBar.setCustomView(customSearchView); actionBar.setDisplayShowCustomEnabled(true); + + // Avoid wasting space on large left inset + Toolbar tb = (Toolbar)customSearchView.getParent(); + tb.setContentInsetsRelative(0, 0); } @Override @@ -635,6 +683,13 @@ public class DictionaryActivity extends ActionBarActivity { } } + private void hideKeyboard() { + Log.d(LOG, "Hide soft keyboard."); + searchView.clearFocus(); + InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + manager.hideSoftInputFromWindow(searchView.getWindowToken(), 0); + } + void updateLangButton() { final LanguageResources languageResources = DictionaryApplication.isoCodeToResources.get(index.shortName); @@ -647,21 +702,25 @@ public class DictionaryActivity extends ActionBarActivity { languageButton.setImageResource(android.R.drawable.ic_media_previous); } } - updateTTSLanguage(); + updateTTSLanguage(indexIndex); } - private void updateTTSLanguage() { + private void updateTTSLanguage(int i) { if (!ttsReady || index == null || textToSpeech == null) { Log.d(LOG, "Can't updateTTSLanguage."); return; } - final Locale locale = new Locale(index.sortLanguage.getIsoCode()); + final Locale locale = new Locale(dictionary.indices.get(i).sortLanguage.getIsoCode()); Log.d(LOG, "Setting TTS locale to: " + locale); + try { final int ttsResult = textToSpeech.setLanguage(locale); - if (ttsResult != TextToSpeech.LANG_AVAILABLE || + if (ttsResult != TextToSpeech.LANG_AVAILABLE && ttsResult != TextToSpeech.LANG_COUNTRY_AVAILABLE) { Log.e(LOG, "TTS not available in this language: ttsResult=" + ttsResult); } + } catch (Exception e) { + Toast.makeText(this, getString(R.string.TTSbroken), Toast.LENGTH_LONG).show(); + } } void onLanguageButtonClick() { @@ -674,7 +733,7 @@ public class DictionaryActivity extends ActionBarActivity { currentSearchOperation = null; } setIndexAndSearchText((indexIndex + 1) % dictionary.indices.size(), - searchView.getQuery().toString()); + searchView.getQuery().toString(), false); } void onLanguageButtonLongClick(final Context context) { @@ -689,12 +748,12 @@ public class DictionaryActivity extends ActionBarActivity { final String name = getString(R.string.dictionaryManager); button.setText(name); final IntentLauncher intentLauncher = new IntentLauncher(listView.getContext(), - DictionaryManagerActivity.getLaunchIntent()) { + DictionaryManagerActivity.getLaunchIntent(getApplicationContext())) { @Override protected void onGo() { dialog.dismiss(); DictionaryActivity.this.finish(); - }; + } }; button.setOnClickListener(intentLauncher); listView.addHeaderView(button); @@ -711,16 +770,20 @@ public class DictionaryActivity extends ActionBarActivity { final View button = application.createButton(parent.getContext(), dictionaryInfo, indexInfo); final IntentLauncher intentLauncher = new IntentLauncher(parent.getContext(), - getLaunchIntent( + getLaunchIntent(getApplicationContext(), application.getPath(dictionaryInfo.uncompressedFilename), indexInfo.shortName, searchView.getQuery().toString())) { @Override protected void onGo() { dialog.dismiss(); DictionaryActivity.this.finish(); - }; + } }; button.setOnClickListener(intentLauncher); + if (i == indexIndex && dictFile != null && + dictFile.getName().equals(dictionaryInfo.uncompressedFilename)) { + button.setPressed(true); + } result.addView(button); } @@ -772,7 +835,7 @@ public class DictionaryActivity extends ActionBarActivity { } } else { // Down - destIndexEntry = Math.min(tokenRow.referenceIndex + 1, index.sortedIndexEntries.size()); + destIndexEntry = Math.min(tokenRow.referenceIndex + 1, index.sortedIndexEntries.size() - 1); } final Index.IndexEntry dest = index.sortedIndexEntries.get(destIndexEntry); Log.d(LOG, "onUpDownButton, destIndexEntry=" + dest.token); @@ -781,6 +844,14 @@ public class DictionaryActivity extends ActionBarActivity { defocusSearchText(); } + void onRandomWordButton() { + int destIndexEntry = rand.nextInt(index.sortedIndexEntries.size()); + final Index.IndexEntry dest = index.sortedIndexEntries.get(destIndexEntry); + setSearchText(dest.token, false); + jumpToRow(index.sortedIndexEntries.get(destIndexEntry).startRow); + defocusSearchText(); + } + // -------------------------------------------------------------------------- // Options Menu // -------------------------------------------------------------------------- @@ -795,7 +866,7 @@ public class DictionaryActivity extends ActionBarActivity { // Next word. nextWordMenuItem = menu.add(getString(R.string.nextWord)) .setIcon(R.drawable.arrow_down_float); - nextWordMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + MenuItemCompat.setShowAsAction(nextWordMenuItem, MenuItem.SHOW_AS_ACTION_IF_ROOM); nextWordMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { @@ -807,7 +878,7 @@ public class DictionaryActivity extends ActionBarActivity { // Previous word. previousWordMenuItem = menu.add(getString(R.string.previousWord)) .setIcon(R.drawable.arrow_up_float); - previousWordMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + MenuItemCompat.setShowAsAction(previousWordMenuItem, MenuItem.SHOW_AS_ACTION_IF_ROOM); previousWordMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { @@ -817,14 +888,23 @@ public class DictionaryActivity extends ActionBarActivity { }); } + randomWordMenuItem = menu.add(getString(R.string.randomWord)); + randomWordMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + onRandomWordButton(); + return true; + } + }); + application.onCreateGlobalOptionsMenu(this, menu); { final MenuItem dictionaryManager = menu.add(getString(R.string.dictionaryManager)); - dictionaryManager.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + MenuItemCompat.setShowAsAction(dictionaryManager, MenuItem.SHOW_AS_ACTION_NEVER); dictionaryManager.setOnMenuItemClickListener(new OnMenuItemClickListener() { public boolean onMenuItemClick(final MenuItem menuItem) { - startActivity(DictionaryManagerActivity.getLaunchIntent()); + startActivity(DictionaryManagerActivity.getLaunchIntent(getApplicationContext())); finish(); return false; } @@ -833,7 +913,7 @@ public class DictionaryActivity extends ActionBarActivity { { final MenuItem aboutDictionary = menu.add(getString(R.string.aboutDictionary)); - aboutDictionary.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); + MenuItemCompat.setShowAsAction(aboutDictionary, MenuItem.SHOW_AS_ACTION_NEVER); aboutDictionary.setOnMenuItemClickListener(new OnMenuItemClickListener() { public boolean onMenuItemClick(final MenuItem menuItem) { final Context context = getListView().getContext(); @@ -945,12 +1025,14 @@ public class DictionaryActivity extends ActionBarActivity { //searchForSelection.setIcon(R.drawable.abs__ic_search); } - if (row instanceof TokenRow && ttsReady) { + if ((row instanceof TokenRow || selectedSpannableText != null) && ttsReady) { final android.view.MenuItem speak = menu.add(R.string.speak); + final String textToSpeak = row instanceof TokenRow ? ((TokenRow) row).getToken() : selectedSpannableText; + updateTTSLanguage(row instanceof TokenRow ? indexIndex : selectedSpannableIndex); speak.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(android.view.MenuItem item) { - textToSpeech.speak(((TokenRow) row).getToken(), TextToSpeech.QUEUE_FLUSH, + textToSpeech.speak(textToSpeak, TextToSpeech.QUEUE_FLUSH, new HashMap()); return false; } @@ -961,6 +1043,7 @@ public class DictionaryActivity extends ActionBarActivity { private void jumpToTextFromHyperLink( final String selectedText, final int defaultIndexToUse) { int indexToUse = -1; + int numFound = 0; for (int i = 0; i < dictionary.indices.size(); ++i) { final Index index = dictionary.indices.get(i); if (indexPrepFinished) { @@ -971,14 +1054,14 @@ public class DictionaryActivity extends ActionBarActivity { .getTokenRow(false); if (tokenRow != null && tokenRow.hasMainEntry) { indexToUse = i; - break; + ++numFound; } } } else { Log.w(LOG, "Skipping findExact on index " + index.shortName); } } - if (indexToUse == -1) { + if (numFound != 1 || indexToUse == -1) { indexToUse = defaultIndexToUse; } // Without this extra delay, the call to jumpToRow that this @@ -987,7 +1070,7 @@ public class DictionaryActivity extends ActionBarActivity { getListView().postDelayed(new Runnable() { @Override public void run() { - setIndexAndSearchText(actualIndexToUse, selectedText); + setIndexAndSearchText(actualIndexToUse, selectedText, true); } }, 100); } @@ -1003,7 +1086,7 @@ public class DictionaryActivity extends ActionBarActivity { getListView().requestFocus(); // Visual indication that a new keystroke will clear the search text. - // Doesn't seem to work unless earchText has focus. + // Doesn't seem to work unless searchText has focus. // searchView.selectAll(); } @@ -1069,14 +1152,17 @@ public class DictionaryActivity extends ActionBarActivity { if (keyCode == KeyEvent.KEYCODE_ENTER) { Log.d(LOG, "Trying to hide soft keyboard."); final InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), - InputMethodManager.HIDE_NOT_ALWAYS); + View focus = getCurrentFocus(); + if (focus != null) { + inputManager.hideSoftInputFromWindow(focus.getWindowToken(), + InputMethodManager.HIDE_NOT_ALWAYS); + } return true; } return super.onKeyDown(keyCode, event); } - private void setIndexAndSearchText(int newIndex, String newSearchText) { + private void setIndexAndSearchText(int newIndex, String newSearchText, boolean hideKeyboard) { Log.d(LOG, "Changing index to: " + newIndex); if (newIndex == -1) { Log.e(LOG, "Invalid index."); @@ -1091,21 +1177,31 @@ public class DictionaryActivity extends ActionBarActivity { setDictionaryPrefs(this, dictFile, index.shortName, searchView.getQuery().toString()); updateLangButton(); } - setSearchText(newSearchText, true); + setSearchText(newSearchText, true, hideKeyboard); } - private void setSearchText(final String text, final boolean triggerSearch) { + private void setSearchText(final String text, final boolean triggerSearch, boolean hideKeyboard) { 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) { - onQueryTextListener.onQueryTextChange(text); + onSearchTextChange(text); + } + + // We don't want to show virtual keyboard when we're changing searchView text programatically: + if (hideKeyboard) { + hideKeyboard(); } } + private void setSearchText(final String text, final boolean triggerSearch) { + setSearchText(text, triggerSearch, true); + } + // private long cursorDelayMillis = 100; private void moveCursorToRight() { // if (searchText.getLayout() != null) { @@ -1404,7 +1500,7 @@ public class DictionaryActivity extends ActionBarActivity { result.setFocusable(true); result.setLongClickable(true); // result.setBackgroundResource(android.R.drawable.menuitem_background); - + result.setBackgroundResource(theme.normalRowBg); result.setOnClickListener(new TextView.OnClickListener() { @@ -1436,9 +1532,7 @@ public class DictionaryActivity extends ActionBarActivity { final TextView textView = new TextView(context); textView.setText(text, BufferType.SPANNABLE); createTokenLinkSpans(textView, (Spannable) textView.getText(), text); - final TextViewLongClickListener textViewLongClickListenerIndex0 = new TextViewLongClickListener( - 0); - textView.setOnLongClickListener(textViewLongClickListenerIndex0); + textView.setOnLongClickListener(indexIndex > 0 ? textViewLongClickListenerIndex1 : textViewLongClickListenerIndex0); result.setLongClickable(true); // Doesn't work: @@ -1473,7 +1567,7 @@ public class DictionaryActivity extends ActionBarActivity { String html = HtmlEntry.htmlBody(htmlEntries, index.shortName); // Log.d(LOG, "html=" + html); startActivityForResult( - HtmlDisplayActivity.getHtmlIntent(String.format( + HtmlDisplayActivity.getHtmlIntent(getApplicationContext(), String.format( "%s", html), htmlTextToHighlight, false), 0); @@ -1576,6 +1670,7 @@ public class DictionaryActivity extends ActionBarActivity { Log.d(LOG, "searchText changed during shutdown, doing nothing."); return; } + // if (!searchView.hasFocus()) { // Log.d(LOG, "searchText changed without focus, doing nothing."); // return; @@ -1587,6 +1682,7 @@ public class DictionaryActivity extends ActionBarActivity { } currentSearchOperation = new SearchOperation(text, index); searchExecutor.execute(currentSearchOperation); + ((FloatingActionButton)findViewById(R.id.floatSearchButton)).setImageResource(text.length() > 0 ? R.drawable.ic_clear_black_24dp : R.drawable.ic_search_black_24dp); } // --------------------------------------------------------------------------