From 73e7eb689ac430af2ee2952cb0ec485f6ec2b1e0 Mon Sep 17 00:00:00 2001 From: thadh Date: Sun, 30 Sep 2012 10:04:01 -0700 Subject: [PATCH] Add TTS. Slovenian. Change HTMLEntry presentation to include source. Synonyms, antonyms. --- res/values-de/strings.xml | 3 +- res/values-it/strings.xml | 4 +- res/values/strings.xml | 3 +- .../dictionary/DictionaryActivity.java | 90 ++++++++++++++----- .../dictionary/HtmlDisplayActivity.java | 2 +- .../dictionary/engine/AbstractEntry.java | 2 +- .../dictionary/engine/EntryTypeName.java | 9 ++ .../android/dictionary/engine/HtmlEntry.java | 4 +- .../android/dictionary/engine/Language.java | 1 + 9 files changed, 90 insertions(+), 28 deletions(-) diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 3f36142..e89e4f4 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -40,7 +40,8 @@ Über Wörterbuch… Random Wort Font failure: %s - vgl.: %s + vgl.: %1$s (%2$s) + Sprechen diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 44224f6..137b4cb 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -35,7 +35,9 @@ Rilevato problema di font (comune su apparecchi Sony Ericsson), ritorno a font d About dictionary… Parola a caso Problema di Font: %s -Vedi anche: %s +Vedi anche: %1$s (%2$s) +Pronuncia + File: %s Dimenzione: %,d bytes diff --git a/res/values/strings.xml b/res/values/strings.xml index 86e5b9c..9cb903f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -41,7 +41,8 @@ About dictionary… Random word Font failure: %s - See also: %s + See also: %1$s (%2$s) + Speak diff --git a/src/com/hughes/android/dictionary/DictionaryActivity.java b/src/com/hughes/android/dictionary/DictionaryActivity.java index 158c1fc..1516ce4 100644 --- a/src/com/hughes/android/dictionary/DictionaryActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryActivity.java @@ -24,6 +24,8 @@ 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; @@ -84,8 +86,10 @@ import java.text.SimpleDateFormat; 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; @@ -117,6 +121,9 @@ public class DictionaryActivity extends ListActivity { // package for test. final Handler uiHandler = new Handler(); + + TextToSpeech textToSpeech; + volatile boolean ttsReady; private final Executor searchExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() { @Override @@ -201,6 +208,15 @@ public class DictionaryActivity extends ListActivity { final Intent intent = getIntent(); dictFile = new File(intent.getStringExtra(C.DICT_FILE)); + + ttsReady = false; + textToSpeech = new TextToSpeech(getApplicationContext(), new OnInitListener() { + @Override + public void onInit(int status) { + ttsReady = true; + updateTTSLanuage(); + } + }); try { final String name = application.getDictionaryName(dictFile.getName()); @@ -465,6 +481,19 @@ public class DictionaryActivity extends ListActivity { // langButton.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); langButton.setText(index.shortName); // } + updateTTSLanuage(); + } + + private void updateTTSLanuage() { + if (!ttsReady) { + 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.SUCCESS) { + Log.e(LOG, "TTS not available in this language."); + } } void onLanguageButton() { @@ -510,14 +539,19 @@ public class DictionaryActivity extends ListActivity { listView.setAdapter(new BaseAdapter() { @Override public View getView(int position, View convertView, ViewGroup parent) { - final LinearLayout result = new LinearLayout(parent.getContext()); - final DictionaryInfo dictionaryInfo = getItem(position); + + final LinearLayout result = new LinearLayout(parent.getContext()); + for (int i = 0; i < dictionaryInfo.indexInfos.size(); ++i) { + if (i > 0) { + final TextView dash = new TextView(parent.getContext()); + dash.setText("-"); + result.addView(dash); + } + 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 IntentLauncher intentLauncher = new IntentLauncher(parent.getContext(), getLaunchIntent(application.getPath(dictionaryInfo.uncompressedFilename), @@ -529,19 +563,21 @@ public class DictionaryActivity extends ListActivity { }; }; 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); + result.addView(nameView); + return result; } @@ -752,11 +788,8 @@ public class DictionaryActivity extends ListActivity { indexToUse = selectedSpannableIndex; } final boolean changeIndex = indexIndex != indexToUse; - setSearchText(selectedText, !changeIndex); // If we're not - // changing - // index, we have - // to - // triggerSearch. + // If we're not changing index, we have to trigger search: + setSearchText(selectedText, !changeIndex); if (changeIndex) { changeIndexGetFocusAndResearch(indexToUse); } @@ -766,6 +799,17 @@ public class DictionaryActivity extends ListActivity { } }); } + + if (row instanceof TokenRow) { + final MenuItem speak = menu.add(R.string.speak); + speak.setOnMenuItemClickListener(new OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + textToSpeech.speak(((TokenRow) row).getToken(), TextToSpeech.QUEUE_FLUSH, new HashMap()); + return false; + } + }); + } } @@ -1167,7 +1211,7 @@ public class DictionaryActivity extends ListActivity { return result; } - private TableLayout getPossibleHtmlEntryView(final boolean isTokenRow, final String text, final boolean hasMainEntry, final List htmlEntries, final String htmlTextToHighlight, ViewGroup parent, final TableLayout result) { + private TableLayout getPossibleLinkToHtmlEntryView(final boolean isTokenRow, final String text, final boolean hasMainEntry, final List htmlEntries, final String htmlTextToHighlight, ViewGroup parent, final TableLayout result) { final Context context = parent.getContext(); final TableRow tableRow = new TableRow(result.getContext()); @@ -1216,18 +1260,20 @@ public class DictionaryActivity extends ListActivity { //result.setColumnStretchable(0, true); //result.setColumnStretchable(1, false); } + result.setLongClickable(true); return result; } private TableLayout getView(TokenRow row, ViewGroup parent, final TableLayout result) { final IndexEntry indexEntry = row.getIndexEntry(); - return getPossibleHtmlEntryView(true, indexEntry.token, row.hasMainEntry, indexEntry.htmlEntries, null, 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 getPossibleHtmlEntryView(false, getString(R.string.seeAlso, htmlEntry.title), false, Collections.singletonList(htmlEntry), tokenRow.getToken(), parent, result); + return getPossibleLinkToHtmlEntryView(false, getString(R.string.seeAlso, htmlEntry.title, htmlEntry.entrySource.getName()), + false, Collections.singletonList(htmlEntry), tokenRow.getToken(), parent, result); } diff --git a/src/com/hughes/android/dictionary/HtmlDisplayActivity.java b/src/com/hughes/android/dictionary/HtmlDisplayActivity.java index a987f5d..0a65290 100644 --- a/src/com/hughes/android/dictionary/HtmlDisplayActivity.java +++ b/src/com/hughes/android/dictionary/HtmlDisplayActivity.java @@ -92,7 +92,7 @@ public final class HtmlDisplayActivity extends Activity { } }); if (!getIntent().getBooleanExtra(SHOW_OK_BUTTON, true)) { - okButton.setVisibility(View.INVISIBLE); + okButton.setVisibility(Button.GONE); } } diff --git a/src/com/hughes/android/dictionary/engine/AbstractEntry.java b/src/com/hughes/android/dictionary/engine/AbstractEntry.java index de221ea..f5d0c8d 100644 --- a/src/com/hughes/android/dictionary/engine/AbstractEntry.java +++ b/src/com/hughes/android/dictionary/engine/AbstractEntry.java @@ -22,7 +22,7 @@ import java.io.RandomAccessFile; public abstract class AbstractEntry extends IndexedObject { - final EntrySource entrySource; + public final EntrySource entrySource; protected AbstractEntry(EntrySource entrySource) { super(-1); diff --git a/src/com/hughes/android/dictionary/engine/EntryTypeName.java b/src/com/hughes/android/dictionary/engine/EntryTypeName.java index 333ee20..7436817 100644 --- a/src/com/hughes/android/dictionary/engine/EntryTypeName.java +++ b/src/com/hughes/android/dictionary/engine/EntryTypeName.java @@ -26,6 +26,9 @@ public enum EntryTypeName { MULTIROW_HEAD_ONE_WORD(true, true, null), MULTIROW_TAIL_ONE_WORD(false, true, null), + SYNONYM_SINGLE(false, true, null), + ANTONYM_SINGLE(false, true, null), + WIKTIONARY_TITLE_MULTI_DETAIL(false, true, WIKTIONARY_TITLE_SINGLE_DETAIL), WIKTIONARY_TITLE_MULTI(false, true, WIKTIONARY_TITLE_SINGLE), WIKTIONARY_TRANSLITERATION(), @@ -34,6 +37,10 @@ public enum EntryTypeName { WIKTIONARY_ENGLISH_DEF_WIKI_LINK(), WIKTIONARY_ENGLISH_DEF_OTHER_LANG(), WIKTIONARY_ENGLISH_DEF(), + + SYNONYM_MULTI(false, true, SYNONYM_SINGLE), + ANTONYM_MULTI(false, true, ANTONYM_SINGLE), + DERIVED_TERM(false, true, null), TWO_WORDS(), THREE_WORDS(), @@ -48,6 +55,7 @@ public enum EntryTypeName { MULTIROW_HEAD_MANY_WORDS(), MULTIROW_TAIL_MANY_WORDS(), WIKTIONARY_EXAMPLE(), + // The next two are how we file entries like: "sono: {form of|essere}" under "essere". WIKTIONARY_BASE_FORM_SINGLE(), // These two should be eligible for removal if the links are otherwise present. WIKTIONARY_BASE_FORM_MULTI(false, false, WIKTIONARY_BASE_FORM_SINGLE), @@ -56,6 +64,7 @@ public enum EntryTypeName { PARENTHESIZED(), WIKTIONARY_TRANSLATION_SENSE(), SEE_ALSO(), + WIKTIONARY_MENTIONED(false, true, null), ; final boolean mainWord; diff --git a/src/com/hughes/android/dictionary/engine/HtmlEntry.java b/src/com/hughes/android/dictionary/engine/HtmlEntry.java index dc5437b..7e24a44 100644 --- a/src/com/hughes/android/dictionary/engine/HtmlEntry.java +++ b/src/com/hughes/android/dictionary/engine/HtmlEntry.java @@ -141,7 +141,9 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable htmlEntries) { final StringBuilder result = new StringBuilder(); for (final HtmlEntry htmlEntry : htmlEntries) { - result.append(String.format("

%s

%s\n", htmlEntry.title, htmlEntry.title, htmlEntry.html)); + result.append(String.format("

%s

\n(%s)\n

%s\n", + htmlEntry.title, htmlEntry.title, htmlEntry.entrySource.name, + htmlEntry.html)); } return result.toString(); } diff --git a/src/com/hughes/android/dictionary/engine/Language.java b/src/com/hughes/android/dictionary/engine/Language.java index deeda18..a731319 100644 --- a/src/com/hughes/android/dictionary/engine/Language.java +++ b/src/com/hughes/android/dictionary/engine/Language.java @@ -96,6 +96,7 @@ public class Language { isoCodeToResources.put("SA", new LanguageResources("Sanskrit", R.string.SA)); isoCodeToResources.put("SR", new LanguageResources("Serbian", R.string.SR)); isoCodeToResources.put("SK", new LanguageResources("Slovak", R.string.SK)); + isoCodeToResources.put("SK", new LanguageResources("Slovenian", R.string.SL)); isoCodeToResources.put("SO", new LanguageResources("Somali", R.string.SO)); isoCodeToResources.put("ES", new LanguageResources("Spanish", R.string.ES)); isoCodeToResources.put("SW", new LanguageResources("Swahili", R.string.SW)); -- 2.43.0