X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryActivity.java;h=8575fa6eda81b4262d268d5652f412860db79290;hb=25425d0c98914bc805cc12fb82a978223c451eea;hp=2683663fabb8c3204a2405aeab164c5c667a06be;hpb=f2001d22a55f8af36e019c670f0d7c58c942a4e4;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryActivity.java b/src/com/hughes/android/dictionary/DictionaryActivity.java index 2683663..8575fa6 100644 --- a/src/com/hughes/android/dictionary/DictionaryActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryActivity.java @@ -28,6 +28,7 @@ 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; @@ -300,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 @@ -329,7 +339,7 @@ public class DictionaryActivity extends ActionBarActivity { @Override public void onInit(int status) { ttsReady = true; - updateTTSLanguage(); + updateTTSLanguage(indexIndex); } }); @@ -367,6 +377,7 @@ 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. @@ -448,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) { @@ -473,9 +514,9 @@ public class DictionaryActivity extends ActionBarActivity { actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowHomeEnabled(false); actionBar.setDisplayHomeAsUpEnabled(false); - + final LinearLayout customSearchView = new LinearLayout(getSupportActionBar().getThemedContext()); - + final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); customSearchView.setLayoutParams(layoutParams); @@ -507,9 +548,12 @@ public class DictionaryActivity extends ActionBarActivity { 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); searchView.setInputType(InputType.TYPE_CLASS_TEXT); @@ -658,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 && 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() { @@ -685,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) { @@ -732,6 +780,10 @@ public class DictionaryActivity extends ActionBarActivity { } }; button.setOnClickListener(intentLauncher); + if (i == indexIndex && dictFile != null && + dictFile.getName().equals(dictionaryInfo.uncompressedFilename)) { + button.setPressed(true); + } result.addView(button); } @@ -973,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; } @@ -989,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) { @@ -999,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 @@ -1015,7 +1070,7 @@ public class DictionaryActivity extends ActionBarActivity { getListView().postDelayed(new Runnable() { @Override public void run() { - setIndexAndSearchText(actualIndexToUse, selectedText); + setIndexAndSearchText(actualIndexToUse, selectedText, true); } }, 100); } @@ -1107,7 +1162,7 @@ public class DictionaryActivity extends ActionBarActivity { 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."); @@ -1122,10 +1177,10 @@ 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); @@ -1133,18 +1188,20 @@ public class DictionaryActivity extends ActionBarActivity { moveCursorToRight(); searchView.setOnQueryTextListener(onQueryTextListener); - // Hide search icon once text is entered - searchView.setIconifiedByDefault(text.length() > 0); - searchView.setIconified(false); + if (triggerSearch) { + onSearchTextChange(text); + } // We don't want to show virtual keyboard when we're changing searchView text programatically: - hideKeyboard(); - - if (triggerSearch) { - onQueryTextListener.onQueryTextChange(text); + 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) { @@ -1443,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() { @@ -1475,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: @@ -1616,10 +1671,6 @@ public class DictionaryActivity extends ActionBarActivity { return; } - // Hide search icon once text is entered - searchView.setIconifiedByDefault(text.length() > 0); - searchView.setIconified(false); - // if (!searchView.hasFocus()) { // Log.d(LOG, "searchText changed without focus, doing nothing."); // return; @@ -1631,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); } // --------------------------------------------------------------------------