]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - src/com/hughes/android/dictionary/DictionaryActivity.java
Using external storage dir properly, better notifications when missing.
[Dictionary.git] / src / com / hughes / android / dictionary / DictionaryActivity.java
index 57a49e587b7ca99776473de3e40fe7e6788f3fea..f8dca37d5dbf03192cb842782c687e735204c652 100644 (file)
@@ -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
@@ -16,6 +16,7 @@ package com.hughes.android.dictionary;
 
 import android.annotation.SuppressLint;
 import android.app.Dialog;
+import android.app.SearchManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -28,10 +29,7 @@ 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;
 import android.text.Spannable;
-import android.text.TextWatcher;
 import android.text.method.LinkMovementMethod;
 import android.text.style.ClickableSpan;
 import android.text.style.StyleSpan;
@@ -40,11 +38,9 @@ import android.util.TypedValue;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.view.KeyEvent;
-import android.view.LayoutInflater;
 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;
@@ -53,9 +49,7 @@ 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.FrameLayout;
-import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.ListAdapter;
@@ -140,7 +134,6 @@ public class DictionaryActivity extends SherlockListActivity {
 
     private SearchOperation currentSearchOperation = null;
 
-
     TextToSpeech textToSpeech;
     volatile boolean ttsReady;
 
@@ -173,13 +166,13 @@ public class DictionaryActivity extends SherlockListActivity {
     public DictionaryActivity() {
     }
 
-    public static Intent getLaunchIntent(final File dictFile, final int indexIndex,
+    public static Intent getLaunchIntent(final File dictFile, final String indexShortName,
             final String searchToken) {
         final Intent intent = new Intent();
         intent.setClassName(DictionaryActivity.class.getPackage().getName(),
                 DictionaryActivity.class.getName());
         intent.putExtra(C.DICT_FILE, dictFile.getPath());
-        intent.putExtra(C.INDEX_INDEX, indexIndex);
+        intent.putExtra(C.INDEX_SHORT_NAME, indexShortName);
         intent.putExtra(C.SEARCH_TOKEN, searchToken);
         return intent;
     }
@@ -188,26 +181,26 @@ public class DictionaryActivity extends SherlockListActivity {
     protected void onSaveInstanceState(final Bundle outState) {
         super.onSaveInstanceState(outState);        
         Log.d(LOG, "onSaveInstanceState: " + searchView.getQuery().toString());
-        outState.putInt(C.INDEX_INDEX, indexIndex);
+        outState.putString(C.INDEX_SHORT_NAME, index.shortName);
         outState.putString(C.SEARCH_TOKEN, searchView.getQuery().toString());
     }
 
     @Override
-    protected void onRestoreInstanceState(final Bundle outState) {
-        super.onRestoreInstanceState(outState);
-        Log.d(LOG, "onRestoreInstanceState: " + outState.getString(C.SEARCH_TOKEN));
-        onCreate(outState);
+    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) {
         Log.d(LOG, "onCreate:" + this);
         super.onCreate(savedInstanceState);
-
+        
         final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
         
         // Don't auto-launch if this fails.
-        prefs.edit().remove(C.INDEX_INDEX).commit(); 
+        prefs.edit().remove(C.DICT_FILE).commit(); 
 
         setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId);
 
@@ -216,14 +209,98 @@ public class DictionaryActivity extends SherlockListActivity {
         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.getDictionariesOnDevice(null);
+                       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_SHORT_NAME, info.indexInfos.get(which_index).shortName);
+                                       
+                                       }
+                                       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();
             }
         });
         
@@ -248,11 +325,17 @@ public class DictionaryActivity extends SherlockListActivity {
             finish();
             return;
         }
-        indexIndex = intent.getIntExtra(C.INDEX_INDEX, 0);
-        if (savedInstanceState != null) {
-            indexIndex = savedInstanceState.getInt(C.INDEX_INDEX, indexIndex);
+        String targetIndex = intent.getStringExtra(C.INDEX_SHORT_NAME);
+        if (savedInstanceState != null && savedInstanceState.getString(C.INDEX_SHORT_NAME) != null) {
+            targetIndex = savedInstanceState.getString(C.INDEX_SHORT_NAME);
+        }
+        indexIndex = 0;
+        for (int i = 0; i < dictionary.indices.size(); ++i) {
+            if (dictionary.indices.get(i).shortName.equals(targetIndex)) {
+                indexIndex = i;
+                break;
+            }
         }
-        indexIndex %= dictionary.indices.size();
         Log.d(LOG, "Loading index " + indexIndex);
         index = dictionary.indices.get(indexIndex);
         setListAdapter(new IndexAdapter(index));
@@ -340,7 +423,7 @@ public class DictionaryActivity extends SherlockListActivity {
         setSearchText(text, true);
         Log.d(LOG, "Trying to restore searchText=" + text);
 
-        setDictionaryPrefs(this, dictFile, indexIndex, searchView.getQuery().toString());
+        setDictionaryPrefs(this, dictFile, index.shortName, searchView.getQuery().toString());
 
         updateLangButton();
     }
@@ -351,7 +434,7 @@ public class DictionaryActivity extends SherlockListActivity {
         
         searchView = new SearchView(getSupportActionBar().getThemedContext());
         searchView.setIconifiedByDefault(false);
-        // searchView.setIconified(false); // puts the magifying glass in the
+        // searchView.setIconified(false); // puts the magnifying glass in the
         // wrong place.
         searchView.setQueryHint(getString(R.string.searchText));
         searchView.setSubmitButtonEnabled(false);
@@ -406,8 +489,8 @@ public class DictionaryActivity extends SherlockListActivity {
     protected void onResume() {
         Log.d(LOG, "onResume");
         super.onResume();
-        if (SettingsActivity.settingsMightHaveChanged) {
-            SettingsActivity.settingsMightHaveChanged = false;
+        if (PreferenceActivity.prefsMightHaveChanged) {
+            PreferenceActivity.prefsMightHaveChanged = false;
             finish();
             startActivity(getIntent());
         }
@@ -433,11 +516,11 @@ public class DictionaryActivity extends SherlockListActivity {
     }
 
     private static void setDictionaryPrefs(final Context context, final File dictFile,
-            final int indexIndex, final String searchToken) {
+            final String indexShortName, final String searchToken) {
         final SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(
                 context).edit();
         prefs.putString(C.DICT_FILE, dictFile.getPath());
-        prefs.putInt(C.INDEX_INDEX, indexIndex);
+        prefs.putString(C.INDEX_SHORT_NAME, indexShortName);
         prefs.putString(C.SEARCH_TOKEN, ""); // Don't need to save search token.
         prefs.commit();
     }
@@ -499,10 +582,10 @@ public class DictionaryActivity extends SherlockListActivity {
                 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;
@@ -529,11 +612,9 @@ public class DictionaryActivity extends SherlockListActivity {
         dialog.setContentView(R.layout.select_dictionary_dialog);
         dialog.setTitle(R.string.selectDictionary);
 
-        final List<DictionaryInfo> installedDicts = ((DictionaryApplication) getApplication())
-                .getUsableDicts();
+        final List<DictionaryInfo> installedDicts = application.getDictionariesOnDevice(null);
 
         ListView listView = (ListView) dialog.findViewById(android.R.id.list);
-
         final Button button = new Button(listView.getContext());
         final String name = getString(R.string.dictionaryManager);
         button.setText(name);
@@ -556,19 +637,12 @@ public class DictionaryActivity extends SherlockListActivity {
                 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());
-                    button.setText(indexInfo.shortName);
+                    final View button = application.createButton(parent.getContext(), dictionaryInfo, indexInfo);
                     final IntentLauncher intentLauncher = new IntentLauncher(parent.getContext(),
                             getLaunchIntent(
                                     application.getPath(dictionaryInfo.uncompressedFilename),
-                                    i, searchView.getQuery().toString())) {
+                                    indexInfo.shortName, searchView.getQuery().toString())) {
                         @Override
                         protected void onGo() {
                             dialog.dismiss();
@@ -577,7 +651,6 @@ public class DictionaryActivity extends SherlockListActivity {
                     };
                     button.setOnClickListener(intentLauncher);
                     result.addView(button);
-
                 }
 
                 final TextView nameView = new TextView(parent.getContext());
@@ -590,7 +663,6 @@ public class DictionaryActivity extends SherlockListActivity {
                 layoutParams.weight = 1.0f;
                 nameView.setLayoutParams(layoutParams);
                 result.addView(nameView);
-
                 return result;
             }
 
@@ -609,7 +681,6 @@ public class DictionaryActivity extends SherlockListActivity {
                 return installedDicts.size();
             }
         });
-
         dialog.show();
     }
 
@@ -931,7 +1002,7 @@ public class DictionaryActivity extends SherlockListActivity {
             indexAdapter = new IndexAdapter(index);
             setListAdapter(indexAdapter);
             Log.d(LOG, "changingIndex, newLang=" + index.longName);
-            setDictionaryPrefs(this, dictFile, indexIndex, searchView.getQuery().toString());
+            setDictionaryPrefs(this, dictFile, index.shortName, searchView.getQuery().toString());
             updateLangButton();
         }
         setSearchText(newSearchText, true);