X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryActivity.java;h=bb749f82fc333ba587d07a9ce7cc2f226c343cbf;hb=cc5c3a2407180de0569c2536a2fa37ce782dd55c;hp=5d0c9c6c34e1ea30204b14491e84ec181cea1567;hpb=3d72bc11d5ef9d58e62b5beb4e33a437da28d4b8;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryActivity.java b/src/com/hughes/android/dictionary/DictionaryActivity.java index 5d0c9c6..bb749f8 100644 --- a/src/com/hughes/android/dictionary/DictionaryActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryActivity.java @@ -28,6 +28,12 @@ import android.os.Handler; import android.preference.PreferenceManager; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; +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.Spannable; import android.text.method.LinkMovementMethod; @@ -37,7 +43,11 @@ 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; @@ -46,11 +56,15 @@ import android.view.ViewGroup; 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.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.FrameLayout; +import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; @@ -60,20 +74,12 @@ 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; @@ -106,7 +112,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class DictionaryActivity extends SherlockListActivity { +public class DictionaryActivity extends ActionBarActivity { static final String LOG = "QuickDic"; @@ -123,6 +129,8 @@ public class DictionaryActivity extends SherlockListActivity { 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() { @@ -138,15 +146,31 @@ public class DictionaryActivity extends SherlockListActivity { volatile boolean ttsReady; Typeface typeface; - C.Theme theme = C.Theme.LIGHT; + DictionaryApplication.Theme theme = DictionaryApplication.Theme.LIGHT; int textColorFg = Color.BLACK; int fontSizeSp; + private ListView listView; + private ListView getListView() { + if (listView == null) { + listView = (ListView)findViewById(android.R.id.list); + } + return listView; + } + + private void setListAdapter(ListAdapter adapter) { + getListView().setAdapter(adapter); + } + + private ListAdapter getListAdapter() { + return getListView().getAdapter(); + } + SearchView searchView; - ImageView searchHintIcon; + ImageButton languageButton; SearchView.OnQueryTextListener onQueryTextListener; - MenuItem nextWordMenuItem, previousWordMenuItem; + MenuItem nextWordMenuItem, previousWordMenuItem, randomWordMenuItem; // Never null. private File wordList = null; @@ -166,11 +190,9 @@ public class DictionaryActivity extends SherlockListActivity { 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); @@ -185,15 +207,13 @@ public class DictionaryActivity extends SherlockListActivity { 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 + // doesn't makes the background of the actionbar white when you're + // in the dark theme. + setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId); + Log.d(LOG, "onCreate:" + this); super.onCreate(savedInstanceState); @@ -202,7 +222,7 @@ public class DictionaryActivity extends SherlockListActivity { // Don't auto-launch if this fails. prefs.edit().remove(C.DICT_FILE).commit(); - setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId); + setContentView(R.layout.dictionary_activity); application = (DictionaryApplication) getApplication(); theme = application.getSelectedTheme(); @@ -296,7 +316,7 @@ public class DictionaryActivity extends SherlockListActivity { 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; } @@ -329,7 +349,7 @@ public class DictionaryActivity extends SherlockListActivity { } Toast.makeText(this, getString(R.string.invalidDictionary, "", e.getMessage()), Toast.LENGTH_LONG).show(); - startActivity(DictionaryManagerActivity.getLaunchIntent()); + startActivity(DictionaryManagerActivity.getLaunchIntent(getApplicationContext())); finish(); return; } @@ -351,6 +371,7 @@ public class DictionaryActivity extends SherlockListActivity { // 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() { @@ -381,10 +402,19 @@ public class DictionaryActivity extends SherlockListActivity { } }).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) { @@ -404,14 +434,11 @@ public class DictionaryActivity extends SherlockListActivity { fontSizeSp = 14; } - setContentView(R.layout.dictionary_activity); - // ContextMenu. registerForContextMenu(getListView()); // Cache some prefs. - wordList = new File(prefs.getString(getString(R.string.wordListFileKey), - new File(application.getDictDir(), "wordList.txt").getAbsolutePath())); + wordList = application.getWordListFile(); saveOnlyFirstSubentry = prefs.getBoolean(getString(R.string.saveOnlyFirstSubentryKey), false); clickOpensContextMenu = prefs.getBoolean(getString(R.string.clickOpensContextMenuKey), @@ -435,11 +462,50 @@ public class DictionaryActivity extends SherlockListActivity { updateLangButton(); searchView.requestFocus(); + + // http://stackoverflow.com/questions/2833057/background-listview-becomes-black-when-scrolling +// getListView().setCacheColorHint(0); } private void onCreateSetupActionBarAndSearchView() { ActionBar actionBar = getSupportActionBar(); 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( + ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + customSearchView.setLayoutParams(layoutParams); + + listView.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int row, long id) { + onListItemClick(getListView(), view, row, id); + } + }); + + languageButton = new ImageButton(customSearchView.getContext()); + languageButton.setScaleType(ScaleType.FIT_CENTER); + languageButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View arg0) { + onLanguageButtonClick(); + } + }); + languageButton.setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + onLanguageButtonLongClick(v.getContext()); + return true; + } + }); + 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); @@ -447,11 +513,6 @@ public class DictionaryActivity extends SherlockListActivity { // 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 | @@ -476,23 +537,16 @@ public class DictionaryActivity extends SherlockListActivity { }; searchView.setOnQueryTextListener(onQueryTextListener); searchView.setFocusable(true); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0, + FrameLayout.LayoutParams.WRAP_CONTENT, 1); + customSearchView.addView(searchView, lp); - searchHintIcon = (ImageView) searchView.findViewById(R.id.abs__search_mag_icon); - searchHintIcon.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View arg0) { - onLanguageButtonClick(); - } - }); - searchHintIcon.setOnLongClickListener(new OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - onLanguageButtonLongClick(v.getContext()); - return true; - } - }); - actionBar.setCustomView(searchView); + actionBar.setCustomView(customSearchView); actionBar.setDisplayShowCustomEnabled(true); + + // Avoid wasting space on large left inset + Toolbar tb = (Toolbar)customSearchView.getParent(); + tb.setContentInsetsRelative(0, 0); } @Override @@ -588,14 +642,14 @@ public class DictionaryActivity extends SherlockListActivity { void updateLangButton() { final LanguageResources languageResources = - Language.isoCodeToResources.get(index.shortName); + DictionaryApplication.isoCodeToResources.get(index.shortName); if (languageResources != null && languageResources.flagId != 0) { - searchHintIcon.setImageResource(languageResources.flagId); + languageButton.setImageResource(languageResources.flagId); } else { if (indexIndex % 2 == 0) { - searchHintIcon.setImageResource(android.R.drawable.ic_media_next); + languageButton.setImageResource(android.R.drawable.ic_media_next); } else { - searchHintIcon.setImageResource(android.R.drawable.ic_media_previous); + languageButton.setImageResource(android.R.drawable.ic_media_previous); } } updateTTSLanguage(); @@ -640,12 +694,12 @@ public class DictionaryActivity extends SherlockListActivity { 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); @@ -662,14 +716,14 @@ public class DictionaryActivity extends SherlockListActivity { 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); result.addView(button); @@ -684,6 +738,7 @@ public class DictionaryActivity extends SherlockListActivity { layoutParams.width = 0; layoutParams.weight = 1.0f; nameView.setLayoutParams(layoutParams); + nameView.setGravity(Gravity.CENTER_VERTICAL); result.addView(nameView); return result; } @@ -731,6 +786,14 @@ public class DictionaryActivity extends SherlockListActivity { 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 // -------------------------------------------------------------------------- @@ -745,7 +808,7 @@ public class DictionaryActivity extends SherlockListActivity { // 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) { @@ -757,7 +820,7 @@ public class DictionaryActivity extends SherlockListActivity { // 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) { @@ -767,14 +830,23 @@ public class DictionaryActivity extends SherlockListActivity { }); } + 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; } @@ -783,7 +855,7 @@ public class DictionaryActivity extends SherlockListActivity { { 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(); @@ -891,6 +963,8 @@ public class DictionaryActivity extends SherlockListActivity { return false; } }); + // Rats, this won't be shown: + //searchForSelection.setIcon(R.drawable.abs__ic_search); } if (row instanceof TokenRow && ttsReady) { @@ -955,7 +1029,6 @@ public class DictionaryActivity extends SherlockListActivity { // searchView.selectAll(); } - @Override protected void onListItemClick(ListView l, View v, int row, long id) { defocusSearchText(); if (clickOpensContextMenu && dictRaf != null) { @@ -979,7 +1052,7 @@ public class DictionaryActivity extends SherlockListActivity { final PrintWriter out = new PrintWriter(new FileWriter(wordList, true)); out.println(rawText.toString()); out.close(); - } catch (IOException e) { + } catch (Exception e) { Log.e(LOG, "Unable to append to " + wordList.getAbsolutePath(), e); Toast.makeText(this, getString(R.string.failedAddingToWordList, wordList.getAbsolutePath()), @@ -1050,6 +1123,11 @@ public class DictionaryActivity extends SherlockListActivity { searchView.setQuery(text, false); moveCursorToRight(); searchView.setOnQueryTextListener(onQueryTextListener); + + // Hide search icon once text is entered + searchView.setIconifiedByDefault(text.length() > 0); + searchView.setIconified(false); + if (triggerSearch) { onQueryTextListener.onQueryTextChange(text); } @@ -1352,7 +1430,10 @@ public class DictionaryActivity extends SherlockListActivity { result.setClickable(true); result.setFocusable(true); result.setLongClickable(true); - result.setBackgroundResource(android.R.drawable.menuitem_background); +// result.setBackgroundResource(android.R.drawable.menuitem_background); + + result.setBackgroundResource(theme.normalRowBg); + result.setOnClickListener(new TextView.OnClickListener() { @Override public void onClick(View v) { @@ -1419,7 +1500,7 @@ public class DictionaryActivity extends SherlockListActivity { 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); @@ -1522,6 +1603,11 @@ public class DictionaryActivity extends SherlockListActivity { Log.d(LOG, "searchText changed during shutdown, doing nothing."); 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;