]> gitweb.fperrin.net Git - Dictionary.git/commitdiff
Merged. Switched back to name "Preferences" instead of "Settings".
authorThad Hughes <thadh@google.com>
Tue, 3 Dec 2013 18:49:47 +0000 (10:49 -0800)
committerThad Hughes <thadh@google.com>
Tue, 3 Dec 2013 18:49:47 +0000 (10:49 -0800)
Merge branch 'master' of
https://code.google.com/p/quickdic-dictionary.dictionary

Conflicts:
res/xml/preferences.xml
src/com/hughes/android/dictionary/DictionaryActivity.java
src/com/hughes/android/dictionary/PreferenceActivity.java

1  2 
AndroidManifest.xml
res/values/strings.xml
res/xml/preferences.xml
src/com/hughes/android/dictionary/DictionaryActivity.java
src/com/hughes/android/dictionary/DictionaryApplication.java
src/com/hughes/android/dictionary/DictionaryManagerActivity.java
src/com/hughes/android/dictionary/PreferenceActivity.java

diff --combined AndroidManifest.xml
index bb3843c58655a4da9c9304529a209c41949c5824,6f90cc489d73c16bb3d08784333907b66a6d9625..bdcaa593070633e85ae1c0a9403b131f244d7a83
@@@ -6,8 -6,8 +6,8 @@@
      android:versionName="4.0.1" >
  
      <uses-sdk
 -        android:minSdkVersion="4"
 -        android:targetSdkVersion="16" />
 +        android:minSdkVersion="10"
 +        android:targetSdkVersion="19" />
  
      <uses-feature
          android:name="android.hardware.touchscreen"
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      
      <application
 +        android:allowBackup="true"
          android:name=".DictionaryApplication"
          android:icon="@drawable/icon"
          android:label="@string/app_name"
 -        android:theme="@style/Theme.Light" >
 +        android:theme="@style/AppTheme" >
  
          <meta-data
              android:name="com.google.android.backup.api_key"
  
                  <category android:name="android.intent.category.LAUNCHER" />
              </intent-filter>
+               <!--   
+             <intent-filter>
+                <action android:name="android.intent.action.SEND" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <data android:mimeType="text/plain" />
+               </intent-filter>
+               <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/>
+                                               <intent-filter>
+               <action android:name="android.intent.action.SEARCH" />
+               </intent-filter>
+                   -->         
          </activity>
-         <activity android:name=".DictionaryActivity" />
+         
+         
+         <activity android:name=".DictionaryActivity"  android:label="@string/app_name">
+                 <!-- @author Dominik Köppl
+                       Added two different intents to catch simple and advanced queries from other extern applications.
+                       -->
+            <intent-filter>
+              <action android:name="android.intent.action.SEARCH" />      
+                <category android:name="android.intent.category.DEFAULT" />
+               </intent-filter>
+               
+                         
+             <intent-filter>
+                <action android:name="com.hughes.action.ACTION_SEARCH_DICT" />
+                <category android:name="android.intent.category.DEFAULT" />
+               </intent-filter>
+               
+          </activity>
+             
+             
          <activity android:name=".DictionaryEditActivity" />
          <activity android:name=".AboutActivity" />
          <activity android:name=".HtmlDisplayActivity" />
-         <activity android:name=".SettingsActivity" />
+         <activity android:name=".PreferenceActivity" />
          <activity
              android:name=".DownloadActivity"
              android:configChanges="keyboardHidden|orientation" />
      </application>
  
+     
+         
+     
  </manifest>
diff --combined res/values/strings.xml
index 8185bb1d3f8df7554b00473edf379300be8107b7,ef7d8bd50809434895a9c08ef08eea410d1dfbbb..c925821ee1c5f6d4f4a14fd36f8b5cf5cc389617
@@@ -7,23 -7,27 +7,27 @@@
    
    <!-- Global. -->
    <string name="about">About QuickDic…</string> 
 -  <string name="preferences">Preferences…</string>
 +  <string name="settings">Settings…</string>
    <string name="help">Help</string>
    <string name="reportIssue">Report issue…</string>
    <string name="fontWorkaround">Detected font problem (common on Sony Ericsson devices), switching back to default font.</string>
 +  <string name="clearSearchText">Clear search text</string>
    
    
+   <string name="no_dict_file">Please specify a default directory in the settings.</string>
+     
+   
+   
     <!-- DictionaryManagerActivity -->
    <string name="dictionaryManager">Dictionary manager</string>
    <string name="helpText">Long-press a dictionary for more options.</string>
 -  <string name="downloadButton">Download (%.1fMB)</string>
 -  <string name="updateButton">Update (%.1fMB)</string>
 +  <string name="downloadButton">%.1fMB</string>
    <string name="moveToTop">Move to top</string>
    <string name="deleteDictionary">Delete dictionary</string>
    <string name="indexInfo">%1$s: %2$,d words</string>
    <string name="managerFilterText">List filter</string>
 -  <string name="managerFilterCheckbox">Local only</string>
 -  
 +  <string name="managerFilterCheckboxAll">All</string>
 +  <string name="managerFilterCheckboxLocal">Local</string>
  
    <string name="thanksForUpdatingVersion">4.0.1_en_a</string>
  
@@@ -43,8 -47,6 +47,8 @@@
    <string name="fontFailure">Font failure: %s</string> 
    <string name="seeAlso">See also: %1$s (%2$s)</string> 
    <string name="speak">Speak</string> 
 +  <string name="nextWord">Next word</string> 
 +  <string name="previousWord">Previous word</string> 
    
  
    <!-- About dictionary. -->
    <string name="unzipping">Unzipping: %1$,d of %2$,d bytes.</string>
    <string name="downloadFinished">Finished: %,d bytes.</string>
    <string name="errorDownloadingFile">Error downloading file: \n%s</string>  
+   
+   
+   <string name="search_hint">An unknown word</string>  
+   
+   
  
        <!-- Preferences -->
  
+   <string name="defaultDicKey">defaultddic</string>
+   <string name="defaultDicTitle">Default Dic</string>
+   <string name="defaultDicSummary">The directory to fired up when nothing else mentioned.</string>
    <string name="quickdicDirectoryKey">quickdicDirectory</string>
    <string name="quickdicDirectoryTitle">QuickDic directory</string>
    <string name="quickdicDirectorySummary">The directory where QuickDic stores dictionaries.</string>
diff --combined res/xml/preferences.xml
index 1644b6116e2a64f9231c046993cc8ea962d74ddc,a57dece5b51e3cf1f2a9fbce891ea8921b969a6f..4b948a079f0f4618fc892d95b6a9ac4ca64b2dc0
@@@ -1,5 -1,13 +1,12 @@@
  <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">\r
  \r
 -    \r
 -       <ListPreference \r
++  <ListPreference \r
+     android:key="@string/defaultDicKey"\r
+     android:title="@string/defaultDicTitle"\r
+     android:summary="@string/defaultDicSummary"\r
+     android:persistent="true"\r
+   />\r
 -    \r
++\r
    <EditTextPreference\r
      android:key="@string/quickdicDirectoryKey"\r
      android:title="@string/quickdicDirectoryTitle" \r
      android:persistent="true"\r
    />\r
  \r
 -  <CheckBoxPreference \r
 -    android:key="@string/showClearSearchTextButtonKey"\r
 -    android:title="@string/showClearSearchTextButtonTitle"\r
 -    android:summary="@string/showClearSearchTextButtonSummary"\r
 -    android:defaultValue="true"\r
 -    android:persistent="true"\r
 -  />\r
 -\r
    <CheckBoxPreference \r
      android:key="@string/showPrevNextButtonsKey"\r
      android:title="@string/showPrevNextButtonsTitle"\r
index 57a49e587b7ca99776473de3e40fe7e6788f3fea,991e87b9a88e9d0f06e89fa3c93bec70014e2f45..6e4bb9106cf6b4ae014a55c109edc83af6cfd1b8
@@@ -1,5 -1,5 +1,5 @@@
  // 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 java.io.File;
 -import java.io.FileWriter;
 -import java.io.IOException;
 -import java.io.PrintWriter;
 -import java.io.RandomAccessFile;
 -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;
 -import java.util.concurrent.Executors;
 -import java.util.concurrent.ThreadFactory;
 -import java.util.concurrent.atomic.AtomicBoolean;
 -import java.util.regex.Matcher;
 -import java.util.regex.Pattern;
 -
 -import android.app.AlertDialog;
 +import android.annotation.SuppressLint;
  import android.app.Dialog;
 -import android.app.ListActivity;
+ import android.app.SearchManager;
  import android.content.Context;
 -import android.content.DialogInterface;
  import android.content.Intent;
  import android.content.SharedPreferences;
  import android.graphics.Color;
@@@ -28,10 -53,10 +29,7 @@@ import android.preference.PreferenceMan
  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;
@@@ -40,22 -65,22 +38,18 @@@ import android.util.TypedValue
  import android.view.ContextMenu;
  import android.view.ContextMenu.ContextMenuInfo;
  import android.view.KeyEvent;
- import android.view.LayoutInflater;
 -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.OnFocusChangeListener;
  import android.view.View.OnLongClickListener;
  import android.view.ViewGroup;
  import android.view.WindowManager;
 +import android.view.inputmethod.EditorInfo;
  import android.view.inputmethod.InputMethodManager;
  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.ImageButton;
  import android.widget.ImageView;
  import android.widget.LinearLayout;
  import android.widget.ListAdapter;
@@@ -66,21 -91,12 +60,21 @@@ 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;
@@@ -90,35 -106,14 +84,35 @@@ import com.hughes.android.util.IntentLa
  import com.hughes.android.util.NonLinkClickableSpan;
  import com.hughes.util.StringUtil;
  
 -public class DictionaryActivity extends ListActivity {
 +import java.io.File;
 +import java.io.FileWriter;
 +import java.io.IOException;
 +import java.io.PrintWriter;
 +import java.io.RandomAccessFile;
 +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;
 +import java.util.concurrent.Executors;
 +import java.util.concurrent.ThreadFactory;
 +import java.util.concurrent.atomic.AtomicBoolean;
 +import java.util.regex.Matcher;
 +import java.util.regex.Pattern;
 +
 +public class DictionaryActivity extends SherlockListActivity {
  
      static final String LOG = "QuickDic";
  
      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();
 -
 -    TextToSpeech textToSpeech;
 -    volatile boolean ttsReady;
 -    
 -    int textColorFg = Color.BLACK;
      
 -
      private final Executor searchExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() {
          @Override
          public Thread newThread(Runnable r) {
  
      private SearchOperation currentSearchOperation = null;
  
 -    C.Theme theme = C.Theme.LIGHT;
  
 -    Typeface typeface;
 +    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
  
      @Override
      protected void onSaveInstanceState(final Bundle outState) {
 -        super.onSaveInstanceState(outState);
 -        Log.d(LOG, "onSaveInstanceState: " + searchText.getText().toString());
 +        super.onSaveInstanceState(outState);        
 +        Log.d(LOG, "onSaveInstanceState: " + searchView.getQuery().toString());
          outState.putInt(C.INDEX_INDEX, indexIndex);
 -        outState.putString(C.SEARCH_TOKEN, searchText.getText().toString());
 +        outState.putString(C.SEARCH_TOKEN, searchView.getQuery().toString());
      }
  
      @Override
  
      @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.
 +        
 +        // Don't auto-launch if this fails.
 +        prefs.edit().remove(C.INDEX_INDEX).commit(); 
  
          setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId);
  
 -        Log.d(LOG, "onCreate:" + this);
 -        super.onCreate(savedInstanceState);
 -
          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.getUsableDicts();
+                       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_INDEX, which_index);
+                                       
+                                       }
+                                       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;
-                 updateTTSLanuage();
+                 updateTTSLanguage();
              }
          });
          
                              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);
 -        searchText.setOnFocusChangeListener(new OnFocusChangeListener() {
 -            @Override
 -            public void onFocusChange(View v, boolean hasFocus) {
 -                Log.d(LOG, "searchText onFocusChange hasFocus=" + hasFocus);
 -            }
 -        });
  
 +        // ContextMenu.
 +        registerForContextMenu(getListView());
 +
 +        // Cache some 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);
 +        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);
          if (savedInstanceState != null) {
          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();
 +        setDictionaryPrefs(this, dictFile, indexIndex, searchView.getQuery().toString());
 +
 +        updateLangButton();
 +    }
 +
 +    private void onCreateSetupActionBarAndSearchView() {
 +        ActionBar actionBar = getSupportActionBar();
 +        actionBar.setDisplayShowTitleEnabled(false);
 +        
 +        searchView = new SearchView(getSupportActionBar().getThemedContext());
 +        searchView.setIconifiedByDefault(false);
 +        // searchView.setIconified(false); // puts the magifying 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 onQueryTextSubmit(String query) {
 +                Log.d(LOG, "OnQueryTextListener: onQueryTextSubmit: " + searchView.getQuery());
 +                return true;
              }
 -        });
 -        langButton.setOnLongClickListener(new OnLongClickListener() {
 +
              @Override
 -            public boolean onLongClick(View v) {
 -                onLanguageButtonLongClick(v.getContext());
 +            public boolean onQueryTextChange(String newText) {
 +                Log.d(LOG, "OnQueryTextListener: onQueryTextChange: " + searchView.getQuery());
 +                onSearchTextChange(searchView.getQuery().toString());
                  return true;
              }
 -        });
 -        updateLangButton();
 +        };
 +        searchView.setOnQueryTextListener(onQueryTextListener);
  
 -        final View upButton = findViewById(R.id.UpButton);
 -        upButton.setOnClickListener(new OnClickListener() {
 -            public void onClick(View v) {
 -                onUpDownButton(true);
 +        searchHintIcon = (ImageView) searchView.findViewById(R.id.abs__search_mag_icon);
 +        searchHintIcon.setOnClickListener(new OnClickListener() {
 +            @Override
 +            public void onClick(View arg0) {
 +                onLanguageButtonClick();
              }
          });
 -        final View downButton = findViewById(R.id.DownButton);
 -        downButton.setOnClickListener(new OnClickListener() {
 -            public void onClick(View v) {
 -                onUpDownButton(false);
 +        searchHintIcon.setOnLongClickListener(new OnLongClickListener() {
 +            @Override
 +            public boolean onLongClick(View v) {
 +                onLanguageButtonLongClick(v.getContext());
 +                return true;
              }
          });
 -        upButton.setVisibility(PreferenceManager.getDefaultSharedPreferences(this)
 -                .getBoolean(getString(R.string.showPrevNextButtonsKey), true) ? View.VISIBLE
 -                : View.GONE);
 -        downButton.setVisibility(PreferenceManager.getDefaultSharedPreferences(this)
 -                .getBoolean(getString(R.string.showPrevNextButtonsKey), true) ? View.VISIBLE
 -                : View.GONE);
 -
 -//        getListView().setOnItemSelectedListener(new ListView.OnItemSelectedListener() {
 -//            @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());
 -//                    }
 -//                }
 -//            }
 -//
 -//            @Override
 -//            public void onNothingSelected(AdapterView<?> arg0) {
 -//            }
 -//        });
 -//
 -        // 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 (SettingsActivity.settingsMightHaveChanged) {
-             SettingsActivity.settingsMightHaveChanged = false;
+         if (PreferenceActivity.prefsMightHaveChanged) {
+             PreferenceActivity.prefsMightHaveChanged = false;
              finish();
              startActivity(getIntent());
          }
      }
  
      @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)) {
      // Buttons
      // --------------------------------------------------------------------------
  
 -    private void onClearSearchTextButton() {
 -        setSearchText("", true);
 -        showKeyboard();
 -    }
 -
      private void showKeyboard() {
 -        searchText.postDelayed(new Runnable() {
 -            @Override
 -            public void run() {
 -                Log.d(LOG, "Trying to show soft keyboard.");
 -                final boolean searchTextHadFocus = searchText.hasFocus();
 -                searchText.requestFocus();
 -                final InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
 -                manager.showSoftInput(searchText, InputMethodManager.SHOW_IMPLICIT);
 -                if (!searchTextHadFocus) {
 -                    defocusSearchText();
 -                }
 -            }}, 100);
 +//        searchText.postDelayed(new Runnable() {
 +//            @Override
 +//            public void run() {
 +//                Log.d(LOG, "Trying to show soft keyboard.");
 +//                final boolean searchTextHadFocus = searchText.hasFocus();
 +//                searchText.requestFocus();
 +//                final InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
 +//                manager.showSoftInput(searchText, InputMethodManager.SHOW_IMPLICIT);
 +//                if (!searchTextHadFocus) {
 +//                    defocusSearchText();
 +//                }
 +//            }}, 100);
      }
  
      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);
 +            }
 +        }
-         updateTTSLanuage();
+         updateTTSLanguage();
 -    }
 +     }
  
-     private void updateTTSLanuage() {
+     private void updateTTSLanguage() {
          if (!ttsReady || index == null || textToSpeech == null) {
              Log.d(LOG, "Can't updateTTSLanguage.");
              return;
          }
      }
  
 -    void onLanguageButton() {
 +    void onLanguageButtonClick() {
          if (currentSearchOperation != null) {
              currentSearchOperation.interrupted.set(true);
              currentSearchOperation = null;
          }
 -        changeIndexAndResearch((indexIndex + 1) % dictionary.indices.size());
 +        setIndexAndSearchText((indexIndex + 1) % dictionary.indices.size(), searchView.getQuery().toString());
      }
  
      void onLanguageButtonLongClick(final Context context) {
  
          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
                      final IntentLauncher intentLauncher = new IntentLauncher(parent.getContext(),
                              getLaunchIntent(
                                      application.getPath(dictionaryInfo.uncompressedFilename),
 -                                    i, searchText.getText().toString())) {
 +                                    i, searchView.getQuery().toString())) {
                          @Override
                          protected void onGo() {
                              dialog.dismiss();
          dialog.show();
      }
  
 -    private void changeIndexAndResearch(int newIndex) {
 -        Log.d(LOG, "Changing index to: " + newIndex);
 -        if (newIndex == -1) {
 -            Log.e(LOG, "Invalid index.");
 -            newIndex = 0;
 -        }
 -        indexIndex = newIndex;
 -        index = dictionary.indices.get(indexIndex);
 -        indexAdapter = new IndexAdapter(index);
 -        Log.d(LOG, "changingIndex, newLang=" + index.longName);
 -        setDictionaryPrefs(this, dictFile, indexIndex, searchText.getText().toString());
 -        setListAdapter(indexAdapter);
 -        updateLangButton();
 -        setSearchText(searchText.getText().toString(), true);
 -    }
 -
      void onUpDownButton(final boolean up) {
          if (isFiltered()) {
              return;
      // --------------------------------------------------------------------------
  
      final Random random = new Random();
 -
 +    
      @Override
      public boolean onCreateOptionsMenu(final Menu menu) {
 -        application.onCreateGlobalOptionsMenu(this, menu);
 +        
 +        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;
 +                    }
 +                });
 +        }
  
 -//        {
 -//            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;
 -//                }
 -//            });
 -//        }
 +        application.onCreateGlobalOptionsMenu(this, menu);
  
          {
              final MenuItem dictionaryList = menu.add(getString(R.string.dictionaryManager));
 +            dictionaryList.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
              dictionaryList.setOnMenuItemClickListener(new OnMenuItemClickListener() {
                  public boolean onMenuItemClick(final MenuItem menuItem) {
                      startActivity(DictionaryManagerActivity.getLaunchIntent());
  
          {
              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) {
 +        addToWordlist.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
 +            public boolean onMenuItemClick(android.view.MenuItem item) {
                  onAppendToWordList(row);
                  return false;
              }
          });
  
 -        final MenuItem share = menu.add("Share");
 -        share.setOnMenuItemClickListener(new OnMenuItemClickListener() {
 -            public boolean onMenuItemClick(MenuItem item) {
 +        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());
              }
          });
  
 -        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) {
 +            searchForSelection.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
 +                public boolean onMenuItemClick(android.view.MenuItem item) {
                      jumpToTextFromHyperLink(selectedText, selectedSpannableIndex);
                      return false;
                  }
          }
  
          if (row instanceof TokenRow && ttsReady) {
 -            final MenuItem speak = menu.add(R.string.speak);
 -            speak.setOnMenuItemClickListener(new OnMenuItemClickListener() {
 +            final android.view.MenuItem speak = menu.add(R.string.speak);
 +            speak.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
                  @Override
 -                public boolean onMenuItemClick(MenuItem item) {
 +                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) {
 +    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 (indexToUse == -1) {
              indexToUse = defaultIndexToUse;
          }
 -        final boolean changeIndex = indexIndex != indexToUse;
 -        if (changeIndex) {
 -            setSearchText(selectedText, false);
 -            changeIndexAndResearch(indexToUse);
 -        } else {
 -            setSearchText(selectedText, true);
 -        }
 +        setIndexAndSearchText(indexToUse, selectedText);
 +    }
 +    
 +    /**
 +     * 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.
 -        // Doesn't seem to work unless earchText has focus.
 -        // 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;
          }
          if (keyCode == KeyEvent.KEYCODE_BACK) {
          }
          return super.onKeyDown(keyCode, event);
      }
 +    
 +    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, indexIndex, searchView.getQuery().toString());
 +            updateLangButton();
 +        }
 +        setSearchText(newSearchText, true);
 +    }
  
      private void setSearchText(final String text, final boolean triggerSearch) {
          if (!triggerSearch) {
 -            getListView().requestFocus();
 +            searchView.setOnQueryTextListener(null);
          }
 -        searchText.setText(text);
 -        searchText.requestFocus();
 +        searchView.setQuery(text, false);
          moveCursorToRight();
 -        if (triggerSearch) {
 -            onSearchTextChange(text);
 +        if (!triggerSearch) {
 +            searchView.setOnQueryTextListener(onQueryTextListener);            
 +        } else {
 +            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);
 +//        }
      }
  
      // --------------------------------------------------------------------------
      }
  
      private final void jumpToRow(final int row) {
 -        final boolean refocusSearchText = searchText.hasFocus();
 -        Log.d(LOG, "jumpToRow: " + row + ", refocusSearchText=" + refocusSearchText);
 -        getListView().requestFocusFromTouch();
 +        Log.d(LOG, "jumpToRow: " + row + ", refocusSearchText=" + false);
 +//        getListView().requestFocusFromTouch();
          getListView().setSelectionFromTop(row, 0);
          getListView().setSelected(true);
 -        if (refocusSearchText) {            
 -            searchText.requestFocus();
 -        }
 -        //Log.d(LOG, "getSelectedItemPosition():" + getSelectedItemPosition());
      }
  
      static final Pattern WHITESPACE = Pattern.compile("\\s+");
              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, "SearchTextWatcher: 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;
      }
index 09e7ba44e995d2ef7f425d799863aea400435e98,72892daace9ba00add4777ae532b665451a90951..ca8d4ac0fb432a963eedaef5e19b3ad897cd4a7a
@@@ -22,10 -22,10 +22,10 @@@ import android.content.SharedPreference
  import android.net.Uri;
  import android.preference.PreferenceManager;
  import android.util.Log;
 -import android.view.Menu;
 -import android.view.MenuItem;
 -import android.view.MenuItem.OnMenuItemClickListener;
  
 +import com.actionbarsherlock.view.Menu;
 +import com.actionbarsherlock.view.MenuItem;
 +import com.actionbarsherlock.view.MenuItem.OnMenuItemClickListener;
  import com.hughes.android.dictionary.engine.Dictionary;
  import com.hughes.android.dictionary.engine.Language;
  import com.hughes.android.dictionary.engine.TransliteratorManager;
@@@ -124,7 -124,6 +124,7 @@@ public class DictionaryApplication exte
    public void onCreateGlobalOptionsMenu(
        final Context context, final Menu menu) {
      final MenuItem about = menu.add(getString(R.string.about));
 +    about.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
      about.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(final MenuItem menuItem) {
          final Intent intent = new Intent().setClassName(AboutActivity.class
      });
  
      final MenuItem help = menu.add(getString(R.string.help));
 +    help.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
      help.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(final MenuItem menuItem) {
          context.startActivity(HtmlDisplayActivity.getHelpLaunchIntent());
        }
      });
  
 -    final MenuItem preferences = menu.add(getString(R.string.preferences));
 +    final MenuItem preferences = menu.add(getString(R.string.settings));
 +    preferences.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
      preferences.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(final MenuItem menuItem) {
-         SettingsActivity.settingsMightHaveChanged = true;
-         final Intent intent = new Intent().setClassName(SettingsActivity.class
-             .getPackage().getName(), SettingsActivity.class.getCanonicalName());
+         PreferenceActivity.prefsMightHaveChanged = true;
+         final Intent intent = new Intent().setClassName(PreferenceActivity.class
+             .getPackage().getName(), PreferenceActivity.class.getCanonicalName());
          context.startActivity(intent);
          return false;
        }
      
      
      final MenuItem reportIssue = menu.add(getString(R.string.reportIssue));
 +    reportIssue.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
      reportIssue.setOnMenuItemClickListener(new OnMenuItemClickListener() {
        public boolean onMenuItemClick(final MenuItem menuItem) {
          final Intent intent = new Intent(Intent.ACTION_VIEW);
index 74ac89500ce905f4a9eb14f652f15fe934d82c60,8ca3c92aea6f02632db1e08bf1e9ffb268633b92..af50112dbc98f36ff15b0693e5ffd7b24cdf4bc3
@@@ -14,6 -14,7 +14,6 @@@
  
  package com.hughes.android.dictionary;
  
 -import android.app.ListActivity;
  import android.content.Intent;
  import android.content.SharedPreferences;
  import android.content.SharedPreferences.Editor;
@@@ -23,25 -24,28 +23,25 @@@ import android.preference.PreferenceMan
  import android.text.Editable;
  import android.text.TextWatcher;
  import android.util.Log;
 -import android.util.TypedValue;
  import android.view.ContextMenu;
  import android.view.ContextMenu.ContextMenuInfo;
 -import android.view.Menu;
 -import android.view.MenuItem;
 -import android.view.MenuItem.OnMenuItemClickListener;
 +import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
 -import android.view.WindowManager;
  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.CheckBox;
  import android.widget.CompoundButton;
  import android.widget.CompoundButton.OnCheckedChangeListener;
  import android.widget.EditText;
 -import android.widget.ImageView;
 -import android.widget.LinearLayout;
 +import android.widget.ImageButton;
  import android.widget.TextView;
 +import android.widget.ToggleButton;
  
 +import com.actionbarsherlock.app.SherlockListActivity;
 +import com.actionbarsherlock.view.Menu;
  import com.hughes.android.dictionary.DictionaryInfo.IndexInfo;
  import com.hughes.android.util.IntentLauncher;
  
@@@ -49,7 -53,7 +49,7 @@@ import java.io.File
  import java.util.ArrayList;
  import java.util.List;
  
 -public class DictionaryManagerActivity extends ListActivity {
 +public class DictionaryManagerActivity extends SherlockListActivity {
  
    static final String LOG = "QuickDic";
    static boolean blockAutoLaunch = false;
@@@ -58,7 -62,7 +58,7 @@@
    Adapter adapter;
    
    EditText filterText;
 -  CheckBox showLocal;
 +  ToggleButton showLocal;
    
    Handler uiHandler;
    
@@@ -82,7 -86,7 +82,7 @@@
      setContentView(R.layout.dictionary_manager_activity);
      
      filterText = (EditText) findViewById(R.id.filterText);
 -    showLocal = (CheckBox) findViewById(R.id.showLocal);
 +    showLocal = (ToggleButton) findViewById(R.id.showLocal);
      
      filterText.addTextChangedListener(new TextWatcher() {
        @Override
        }
      });
      
 +    final ImageButton clearSearchText = (ImageButton) findViewById(R.id.ClearSearchTextButton);
 +    clearSearchText.setOnClickListener(new View.OnClickListener() {
 +        @Override
 +        public void onClick(View arg0) {
 +            filterText.setText("");
 +            filterText.requestFocus();
 +        }
 +    });
 +    
      showLocal.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    protected void onResume() {
      super.onResume();
      
-     if (SettingsActivity.settingsMightHaveChanged) {
-       SettingsActivity.settingsMightHaveChanged = false;
+     if (PreferenceActivity.prefsMightHaveChanged) {
 -      PreferenceActivity.prefsMightHaveChanged = false;
++        PreferenceActivity.prefsMightHaveChanged = false;
        finish();
        startActivity(getIntent());
      }
      final DictionaryInfo dictionaryInfo = adapter.getItem(position);
      
      if (position > 0 && application.isDictionaryOnDevice(dictionaryInfo.uncompressedFilename)) {
 -      final MenuItem moveToTopMenuItem = menu.add(R.string.moveToTop);
 -      moveToTopMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
 +      final android.view.MenuItem moveToTopMenuItem = menu.add(R.string.moveToTop);
 +      moveToTopMenuItem.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
          @Override
 -        public boolean onMenuItemClick(MenuItem item) {
 +        public boolean onMenuItemClick(android.view.MenuItem item) {
            application.moveDictionaryToTop(dictionaryInfo);
            setListAdapter(adapter = new Adapter());
            return true;
        });
      }
  
 -    final MenuItem deleteMenuItem = menu.add(R.string.deleteDictionary);
 -    deleteMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
 +    final android.view.MenuItem deleteMenuItem = menu.add(R.string.deleteDictionary);
 +    deleteMenuItem.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
        @Override
 -      public boolean onMenuItemClick(MenuItem item) {
 +      public boolean onMenuItemClick(android.view.MenuItem item) {
          application.deleteDictionary(dictionaryInfo);
          setListAdapter(adapter = new Adapter());
          return true;
  
      final DictionaryInfo downloadable = application.getDownloadable(dictionaryInfo.uncompressedFilename);
      if (downloadable != null) {
 -      final MenuItem downloadMenuItem = menu.add(getString(R.string.downloadButton, downloadable.zipBytes/1024.0/1024.0));
 -      downloadMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
 +      final android.view.MenuItem downloadMenuItem = menu.add(getString(R.string.downloadButton, downloadable.zipBytes/1024.0/1024.0));
 +      downloadMenuItem.setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() {
          @Override
 -        public boolean onMenuItemClick(MenuItem item) {
 +        public boolean onMenuItemClick(android.view.MenuItem item) {
            final Intent intent = getDownloadIntent(downloadable);
            startActivity(intent);
            setListAdapter(adapter = new Adapter());
    }
  
    private Intent getDownloadIntent(final DictionaryInfo downloadable) {
 -    final Intent intent = DownloadActivity.getLaunchIntent(downloadable.downloadUrl,
 -        application.getPath(downloadable.uncompressedFilename).getPath() + ".zip",
 -        downloadable.dictInfo);
 -    return intent;
 +//      DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
 +//      DownloadManager.Request request = new DownloadManager.Request(Uri.parse(""));
 +//      long id = downloadManager.enqueue(request);
 +//      DownloadManager.Query query;
 +      return null;
    }
    
    private void onFilterTextChanged() {
          }
          if (canShow) {
            dictionaryInfos.add(dictionaryInfo);
 -          
          }
        }
      }
      }
      
      @Override
 -    public View getView(final int position, final View convertView, final ViewGroup parent) {
 -      final LinearLayout result;
 -      // Android 4.0.3 leaks memory like crazy if we don't do this.
 -      if (convertView instanceof LinearLayout) {
 -        result = (LinearLayout) convertView;
 -        result.removeAllViews();
 -      } else {
 -        result = new LinearLayout(parent.getContext());
 -      }
 -      
 +    public View getView(final int position, View convertView, final ViewGroup parent) {
 +       if (convertView == null) {
 +           convertView = LayoutInflater.from(parent.getContext()).inflate(
 +                   R.layout.dictionary_manager_row, parent, false);
 +       }
 +        
        final DictionaryInfo dictionaryInfo = getItem(position);
 -      result.setOrientation(LinearLayout.VERTICAL);
 -
 -      final LinearLayout row = new LinearLayout(parent.getContext());
 -      row.setOrientation(LinearLayout.HORIZONTAL);
 -      result.addView(row);
  
 -      {
 -      final TextView textView = new TextView(parent.getContext());
 +      final TextView textView = (TextView) convertView.findViewById(R.id.dictionaryName);
        final String name = application.getDictionaryName(dictionaryInfo.uncompressedFilename);
        textView.setText(name);
 -      textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);
 -      row.addView(textView);
 -      LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
 -      layoutParams.weight = 1.0f;
 -      textView.setLayoutParams(layoutParams);
 -      }
        
 +      final Button downloadButton = (Button) convertView.findViewById(R.id.dictionaryDownloadButton);
        final boolean updateAvailable = application.updateAvailable(dictionaryInfo);
 -      final DictionaryInfo downloadable = application.getDownloadable(dictionaryInfo.uncompressedFilename); 
 -      if ((!application.isDictionaryOnDevice(dictionaryInfo.uncompressedFilename) || updateAvailable) && downloadable != null) {
 -        final Button downloadButton = new Button(parent.getContext());
 -        downloadButton.setText(getString(updateAvailable ? R.string.updateButton : R.string.downloadButton, downloadable.zipBytes / 1024.0 / 1024.0));
 -        final Intent intent = getDownloadIntent(downloadable);
 -        downloadButton.setOnClickListener(new IntentLauncher(parent.getContext(), intent));
 -        WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
 -        layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
 -        layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
 -        downloadButton.setLayoutParams(layoutParams);
 -        row.addView(downloadButton);
 +      final DictionaryInfo downloadable = application.getDownloadable(dictionaryInfo.uncompressedFilename);
 +      if (updateAvailable) {
 +          downloadButton.setCompoundDrawablesWithIntrinsicBounds(
 +                              android.R.drawable.ic_menu_add, 
 +                          0, 0, 0);
 +          downloadButton.setText(getString(R.string.downloadButton, downloadable.zipBytes / 1024.0 / 1024.0));
 +      } else if (!application.isDictionaryOnDevice(dictionaryInfo.uncompressedFilename)) {
 +          downloadButton.setCompoundDrawablesWithIntrinsicBounds(
 +                  android.R.drawable.ic_menu_add, 
 +              0, 0, 0);
 +          downloadButton.setText(getString(R.string.downloadButton, downloadable.zipBytes / 1024.0 / 1024.0));
        } else {
 -        final ImageView checkMark = new ImageView(parent.getContext());
 -        checkMark.setImageResource(R.drawable.btn_check_buttonless_on);
 -        row.addView(checkMark);
 +          downloadButton.setCompoundDrawablesWithIntrinsicBounds(
 +                  android.R.drawable.checkbox_on_background, 
 +              0, 0, 0);
 +          downloadButton.setText("");
        }
 +      final Intent intent = getDownloadIntent(downloadable);
 +      downloadButton.setOnClickListener(new IntentLauncher(parent.getContext(), intent));
  
        // Add the information about each index.
 -      final LinearLayout row2 = new LinearLayout(parent.getContext());
 -      row2.setOrientation(LinearLayout.HORIZONTAL);
 -      final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
 -      row2.setLayoutParams(layoutParams);
 -      result.addView(row2);
 +      final TextView dictionaryDetails = (TextView) convertView.findViewById(R.id.dictionaryDetails);
        final StringBuilder builder = new StringBuilder();
        for (final IndexInfo indexInfo : dictionaryInfo.indexInfos) {
          if (builder.length() > 0) {
          }
          builder.append(getString(R.string.indexInfo, indexInfo.shortName, indexInfo.mainTokenCount));
        }
 -      final TextView indexView = new TextView(parent.getContext());
 -      indexView.setText(builder.toString());
 -      row2.addView(indexView);
 -      
 +      dictionaryDetails.setText(builder.toString());
        
 -      // Because we have a Button inside a ListView row:
 -      // http://groups.google.com/group/android-developers/browse_thread/thread/3d96af1530a7d62a?pli=1
 -      result.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
 -      result.setClickable(true);
 -      result.setFocusable(true);
 -      result.setLongClickable(true);
 -      result.setBackgroundResource(android.R.drawable.menuitem_background);
 -      result.setOnClickListener(new TextView.OnClickListener() {
 +//      // Because we have a Button inside a ListView row:
 +//      // http://groups.google.com/group/android-developers/browse_thread/thread/3d96af1530a7d62a?pli=1
 +      //convertView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
 +      convertView.setClickable(true);
 +      convertView.setFocusable(true);
 +      convertView.setLongClickable(true);
 +//      result.setBackgroundResource(android.R.drawable.menuitem_background);
 +      convertView.setOnClickListener(new TextView.OnClickListener() {
          @Override
          public void onClick(View v) {
            DictionaryManagerActivity.this.onClick(position);
          }
        });
        
 -      return result;
 +      return convertView;
      }
    }
  
index 0000000000000000000000000000000000000000,343deda4d5089e9c4eb8ff6a9eaaf4a83a946e19..5e74a3cd0554d1d903873465753c0c155bb19faf
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,62 +1,59 @@@
 -    
 -    
+ // Copyright 2011 Google Inc. All Rights Reserved.
+ //
+ // 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
+ //
+ //     http://www.apache.org/licenses/LICENSE-2.0
+ //
+ // Unless required by applicable law or agreed to in writing, software
+ // distributed under the License is distributed on an "AS IS" BASIS,
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ // See the License for the specific language governing permissions and
+ // limitations under the License.
+ package com.hughes.android.dictionary;
+ import java.util.List;
+ import android.os.Bundle;
+ import android.preference.ListPreference;
+ public class PreferenceActivity extends android.preference.PreferenceActivity {
+   
+   static boolean prefsMightHaveChanged = false;
+   
+   @SuppressWarnings("deprecation")
+   @Override
+   public void onCreate(Bundle savedInstanceState) {
+     setTheme(((DictionaryApplication)getApplication()).getSelectedTheme().themeId);
+     /**
+      * @author Dominik Köppl
+      * Preference: select default dictionary
+      * As this list is dynamically generated, we have to do it in this fashion
+      */
+     super.onCreate(savedInstanceState);
+     addPreferencesFromResource(R.xml.preferences);
+     ListPreference defaultDic = (ListPreference) findPreference(getResources().getString(R.string.defaultDicKey));
+     DictionaryApplication application = (DictionaryApplication) getApplication();
+     List<DictionaryInfo> dicts = application.getUsableDicts();
+     
+       final CharSequence[] entries = new CharSequence[dicts.size()];
+       final CharSequence[] entryvalues = new CharSequence[dicts.size()];
+       for(int i = 0; i < entries.length; ++i)
+       {
+               entries[i] = dicts.get(i).dictInfo;
+               entryvalues[i] = dicts.get(i).uncompressedFilename;
+       }
+       
+       defaultDic.setEntries(entries);
+       defaultDic.setEntryValues(entryvalues);
 -
+   }
+   @Override
+   public void onContentChanged() {
+     super.onContentChanged();
+   }
+ }