]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - src/com/hughes/android/dictionary/DictionaryApplication.java
Switch to app compat preferences.
[Dictionary.git] / src / com / hughes / android / dictionary / DictionaryApplication.java
index 3f2463d68e8684b8d30ba4245e250807c55169ef..1e3788be869e7d830511705e391282e1af33c0ca 100644 (file)
@@ -14,7 +14,6 @@
 
 package com.hughes.android.dictionary;
 
-import android.app.Application;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -22,28 +21,19 @@ import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Environment;
-import android.preference.PreferenceManager;
+import android.support.v7.preference.PreferenceManager;
 import android.support.v4.view.MenuItemCompat;
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.MenuItem.OnMenuItemClickListener;
-import android.view.View;
-import android.widget.Button;
-import android.widget.ImageButton;
-import android.widget.ImageView.ScaleType;
-import android.widget.LinearLayout;
-import android.widget.Toast;
 
 import com.hughes.android.dictionary.DictionaryInfo.IndexInfo;
 import com.hughes.android.dictionary.engine.Dictionary;
-import com.hughes.android.dictionary.engine.Language;
-import com.hughes.android.dictionary.engine.Language.LanguageResources;
 import com.hughes.android.dictionary.engine.TransliteratorManager;
 import com.hughes.android.util.PersistentObjectCache;
 import com.hughes.util.ListUtil;
-import java.text.Collator;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -58,7 +48,10 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
-public class DictionaryApplication extends Application {
+public enum DictionaryApplication {
+    INSTANCE;
+
+    private Context appContext;
 
     static final String LOG = "QuickDicApp";
 
@@ -70,9 +63,9 @@ public class DictionaryApplication extends Application {
     // Leave it enabled by default for correctness except
     // for my known broken development/performance test device config.
     //static public final boolean USE_COLLATOR = !android.os.Build.FINGERPRINT.equals("Samsung/cm_tassve/tassve:4.4.4/KTU84Q/20150211:userdebug/release-keys");
-    static public final boolean USE_COLLATOR = true;
+    public static final boolean USE_COLLATOR = true;
 
-    static public final TransliteratorManager.ThreadSetup threadBackground = new TransliteratorManager.ThreadSetup() {
+    public static final TransliteratorManager.ThreadSetup threadBackground = new TransliteratorManager.ThreadSetup() {
         @Override
         public void onThreadStart() {
             // THREAD_PRIORITY_BACKGROUND seemed like a good idea, but it
@@ -124,14 +117,14 @@ public class DictionaryApplication extends Application {
         private static final long serialVersionUID = -1444177164708201263L;
         // User-ordered list, persisted, just the ones that are/have been
         // present.
-        final List<String> dictionaryFilesOrdered = new ArrayList<String>();
+        final List<String> dictionaryFilesOrdered = new ArrayList<>();
 
-        final Map<String, DictionaryInfo> uncompressedFilenameToDictionaryInfo = new HashMap<String, DictionaryInfo>();
+        final Map<String, DictionaryInfo> uncompressedFilenameToDictionaryInfo = new HashMap<>();
 
         /**
          * Sometimes a deserialized version of this data structure isn't valid.
-         * @return
          */
+        @SuppressWarnings("ConstantConditions")
         boolean isValid() {
             return uncompressedFilenameToDictionaryInfo != null && dictionaryFilesOrdered != null;
         }
@@ -145,7 +138,7 @@ public class DictionaryApplication extends Application {
         if (DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO != null) {
             return;
         }
-        DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO = new HashMap<String, DictionaryInfo>();
+        DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO = new HashMap<>();
         final BufferedReader reader = new BufferedReader(
             new InputStreamReader(context.getResources().openRawResource(R.raw.dictionary_info)));
         try {
@@ -163,23 +156,24 @@ public class DictionaryApplication extends Application {
         }
         try {
             reader.close();
-        } catch (IOException e) {}
+        } catch (IOException ignored) {}
     }
 
-    private File dictDir;
-
-    @Override
-    public void onCreate() {
-        super.onCreate();
+    public synchronized void init(Context c) {
+        if (appContext != null) {
+            assert c == appContext;
+            return;
+        }
+        appContext = c;
         Log.d("QuickDic", "Application: onCreate");
         TransliteratorManager.init(null, threadBackground);
-        staticInit(getApplicationContext());
+        staticInit(appContext);
 
         languageButtonPixels = (int) TypedValue.applyDimension(
-                                   TypedValue.COMPLEX_UNIT_DIP, 60, getResources().getDisplayMetrics());
+                                   TypedValue.COMPLEX_UNIT_DIP, 60, appContext.getResources().getDisplayMetrics());
 
         // Load the dictionaries we know about.
-        dictionaryConfig = PersistentObjectCache.init(getApplicationContext()).read(
+        dictionaryConfig = PersistentObjectCache.init(appContext).read(
                                C.DICTIONARY_CONFIGS, DictionaryConfig.class);
         if (dictionaryConfig == null) {
             dictionaryConfig = new DictionaryConfig();
@@ -189,59 +183,61 @@ public class DictionaryApplication extends Application {
         }
 
         // Theme stuff.
-        setTheme(getSelectedTheme().themeId);
-        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+        appContext.setTheme(getSelectedTheme().themeId);
+        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
         prefs.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() {
             @Override
             public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                                                   String key) {
                 Log.d("QuickDic", "prefs changed: " + key);
-                if (key.equals(getString(R.string.themeKey))) {
-                    setTheme(getSelectedTheme().themeId);
+                if (key.equals(appContext.getString(R.string.themeKey))) {
+                    appContext.setTheme(getSelectedTheme().themeId);
                 }
             }
         });
     }
 
-    public void onCreateGlobalOptionsMenu(
+    public static void onCreateGlobalOptionsMenu(
         final Context context, final Menu menu) {
-        final MenuItem about = menu.add(getString(R.string.about));
-        MenuItemCompat.setShowAsAction(about, MenuItem.SHOW_AS_ACTION_NEVER);
-        about.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+        final Context c = context.getApplicationContext();
+
+        final MenuItem preferences = menu.add(c.getString(R.string.settings));
+        MenuItemCompat.setShowAsAction(preferences, MenuItem.SHOW_AS_ACTION_NEVER);
+        preferences.setOnMenuItemClickListener(new OnMenuItemClickListener() {
             public boolean onMenuItemClick(final MenuItem menuItem) {
-                final Intent intent = new Intent(getApplicationContext(), AboutActivity.class);
+                PreferenceActivity.prefsMightHaveChanged = true;
+                final Intent intent = new Intent(c, PreferenceActivity.class);
                 context.startActivity(intent);
                 return false;
             }
         });
 
-        final MenuItem help = menu.add(getString(R.string.help));
+        final MenuItem help = menu.add(c.getString(R.string.help));
         MenuItemCompat.setShowAsAction(help, MenuItem.SHOW_AS_ACTION_NEVER);
         help.setOnMenuItemClickListener(new OnMenuItemClickListener() {
             public boolean onMenuItemClick(final MenuItem menuItem) {
-                context.startActivity(HtmlDisplayActivity.getHelpLaunchIntent(getApplicationContext()));
+                context.startActivity(HtmlDisplayActivity.getHelpLaunchIntent(c));
                 return false;
             }
         });
 
-        final MenuItem preferences = menu.add(getString(R.string.settings));
-        MenuItemCompat.setShowAsAction(preferences, MenuItem.SHOW_AS_ACTION_NEVER);
-        preferences.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+        final MenuItem reportIssue = menu.add(c.getString(R.string.reportIssue));
+        MenuItemCompat.setShowAsAction(reportIssue, MenuItem.SHOW_AS_ACTION_NEVER);
+        reportIssue.setOnMenuItemClickListener(new OnMenuItemClickListener() {
             public boolean onMenuItemClick(final MenuItem menuItem) {
-                PreferenceActivity.prefsMightHaveChanged = true;
-                final Intent intent = new Intent(getApplicationContext(), PreferenceActivity.class);
+                final Intent intent = new Intent(Intent.ACTION_VIEW);
+                intent.setData(Uri
+                               .parse("https://github.com/rdoeffinger/Dictionary/issues"));
                 context.startActivity(intent);
                 return false;
             }
         });
 
-        final MenuItem reportIssue = menu.add(getString(R.string.reportIssue));
-        MenuItemCompat.setShowAsAction(reportIssue, MenuItem.SHOW_AS_ACTION_NEVER);
-        reportIssue.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+        final MenuItem about = menu.add(c.getString(R.string.about));
+        MenuItemCompat.setShowAsAction(about, MenuItem.SHOW_AS_ACTION_NEVER);
+        about.setOnMenuItemClickListener(new OnMenuItemClickListener() {
             public boolean onMenuItemClick(final MenuItem menuItem) {
-                final Intent intent = new Intent(Intent.ACTION_VIEW);
-                intent.setData(Uri
-                               .parse("http://github.com/rdoeffinger/Dictionary/issues"));
+                final Intent intent = new Intent(c, AboutActivity.class);
                 context.startActivity(intent);
                 return false;
             }
@@ -258,20 +254,20 @@ public class DictionaryApplication extends Application {
         }
         File efd = null;
         try {
-            efd = getApplicationContext().getExternalFilesDir(null);
-        } catch (Exception e) {
+            efd = appContext.getExternalFilesDir(null);
+        } catch (Exception ignored) {
         }
         if (efd != null) {
             efd.mkdirs();
             if (!dictDir.isDirectory() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-                getApplicationContext().getExternalFilesDirs(null);
+                appContext.getExternalFilesDirs(null);
             }
             if (efd.isDirectory() && efd.canWrite() && checkFileCreate(efd)) {
                 return efd.getAbsolutePath();
             }
         }
         if (!dictDir.isDirectory() && !dictDir.mkdirs()) {
-            return getApplicationContext().getFilesDir().getAbsolutePath();
+            return appContext.getFilesDir().getAbsolutePath();
         }
         return dir;
     }
@@ -279,33 +275,33 @@ public class DictionaryApplication extends Application {
     public synchronized File getDictDir() {
         // This metaphor doesn't work, because we've already reset
         // prefsMightHaveChanged.
-        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-        String dir = prefs.getString(getString(R.string.quickdicDirectoryKey), "");
+        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
+        String dir = prefs.getString(appContext.getString(R.string.quickdicDirectoryKey), "");
         if (dir.isEmpty()) {
             dir = selectDefaultDir();
         }
-        dictDir = new File(dir);
+        File dictDir = new File(dir);
         dictDir.mkdirs();
         if (!dictDir.isDirectory() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-            getApplicationContext().getExternalFilesDirs(null);
+            appContext.getExternalFilesDirs(null);
         }
         return dictDir;
     }
 
-    static public boolean checkFileCreate(File dir) {
+    public static boolean checkFileCreate(File dir) {
         boolean res = false;
         File testfile = new File(dir, "quickdic_writetest");
         try {
             testfile.delete();
             res = testfile.createNewFile() & testfile.delete();
-        } catch (Exception e) {
+        } catch (Exception ignored) {
         }
         return res;
     }
 
     public File getWordListFile() {
-        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-        String file = prefs.getString(getString(R.string.wordListFileKey), "");
+        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
+        String file = prefs.getString(appContext.getString(R.string.wordListFileKey), "");
         if (file.isEmpty()) {
             return new File(getDictDir(), "wordList.txt");
         }
@@ -313,8 +309,8 @@ public class DictionaryApplication extends Application {
     }
 
     public Theme getSelectedTheme() {
-        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-        final String theme = prefs.getString(getString(R.string.themeKey), "themeLight");
+        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
+        final String theme = prefs.getString(appContext.getString(R.string.themeKey), "themeLight");
         if (theme.equals("themeLight")) {
             return Theme.LIGHT;
         } else {
@@ -328,13 +324,13 @@ public class DictionaryApplication extends Application {
 
     String defaultLangISO2 = Locale.getDefault().getLanguage().toLowerCase();
     String defaultLangName = null;
-    final Map<String, String> fileToNameCache = new HashMap<String, String>();
+    final Map<String, String> fileToNameCache = new HashMap<>();
 
     public List<IndexInfo> sortedIndexInfos(List<IndexInfo> indexInfos) {
         // Hack to put the default locale first in the name.
         if (indexInfos.size() > 1 &&
                 indexInfos.get(1).shortName.toLowerCase().equals(defaultLangISO2)) {
-            List<IndexInfo> result = new ArrayList<DictionaryInfo.IndexInfo>(indexInfos);
+            List<IndexInfo> result = new ArrayList<>(indexInfos);
             ListUtil.swap(result, 0, 1);
             return result;
         }
@@ -349,7 +345,7 @@ public class DictionaryApplication extends Application {
             defaultLangName = null;
         }
         if (defaultLangName == null) {
-            defaultLangName = IsoUtils.INSTANCE.isoCodeToLocalizedLanguageName(getApplicationContext(), defaultLangISO2);
+            defaultLangName = IsoUtils.INSTANCE.isoCodeToLocalizedLanguageName(appContext, defaultLangISO2);
         }
 
         String name = fileToNameCache.get(uncompressedFilename);
@@ -368,7 +364,7 @@ public class DictionaryApplication extends Application {
                     nameBuilder.append("-");
                 }
                 nameBuilder
-                .append(IsoUtils.INSTANCE.isoCodeToLocalizedLanguageName(getApplicationContext(), sortedIndexInfos.get(i).shortName));
+                .append(IsoUtils.INSTANCE.isoCodeToLocalizedLanguageName(appContext, sortedIndexInfos.get(i).shortName));
             }
             name = nameBuilder.toString();
         } else {
@@ -398,7 +394,7 @@ public class DictionaryApplication extends Application {
         PersistentObjectCache.getInstance().write(C.DICTIONARY_CONFIGS, dictionaryConfig);
     }
 
-    final Comparator collator = USE_COLLATOR ? Collator.getInstance() : String.CASE_INSENSITIVE_ORDER;
+    final Comparator<Object> collator = USE_COLLATOR ? CollatorWrapper.getInstance() : null;
     final Comparator<String> uncompressedFilenameComparator = new Comparator<String>() {
         @Override
         public int compare(String uncompressedFilename1, String uncompressedFilename2) {
@@ -409,11 +405,11 @@ public class DictionaryApplication extends Application {
                         && !name2.startsWith(defaultLangName + "-")) {
                     return -1;
                 } else if (name2.startsWith(defaultLangName + "-")
-                           && !name1.startsWith(defaultLangName + "-")) {
+                        && !name1.startsWith(defaultLangName + "-")) {
                     return 1;
                 }
             }
-            return collator.compare(name1, name2);
+            return collator != null ? collator.compare(name1, name2) : name1.compareToIgnoreCase(name2);
         }
     };
     final Comparator<DictionaryInfo> dictionaryInfoComparator = new Comparator<DictionaryInfo>() {
@@ -451,7 +447,7 @@ public class DictionaryApplication extends Application {
                 // Are there dictionaries on the device that we didn't know
                 // about already?
                 // Pick them up and put them at the end of the list.
-                final List<String> toAddSorted = new ArrayList<String>();
+                final List<String> toAddSorted = new ArrayList<>();
                 final File[] dictDirFiles = getDictDir().listFiles();
                 if (dictDirFiles != null) {
                     for (final File file : dictDirFiles) {
@@ -506,7 +502,7 @@ public class DictionaryApplication extends Application {
         }).start();
     }
 
-    public boolean matchesFilters(final DictionaryInfo dictionaryInfo, final String[] filters) {
+    private boolean matchesFilters(final DictionaryInfo dictionaryInfo, final String[] filters) {
         if (filters == null) {
             return true;
         }
@@ -520,8 +516,8 @@ public class DictionaryApplication extends Application {
     }
 
     public synchronized List<DictionaryInfo> getDictionariesOnDevice(String[] filters) {
-        final List<DictionaryInfo> result = new ArrayList<DictionaryInfo>(
-            dictionaryConfig.dictionaryFilesOrdered.size());
+        final List<DictionaryInfo> result = new ArrayList<>(
+                dictionaryConfig.dictionaryFilesOrdered.size());
         for (final String uncompressedFilename : dictionaryConfig.dictionaryFilesOrdered) {
             final DictionaryInfo dictionaryInfo = dictionaryConfig.uncompressedFilenameToDictionaryInfo
                                                   .get(uncompressedFilename);
@@ -533,11 +529,11 @@ public class DictionaryApplication extends Application {
     }
 
     public List<DictionaryInfo> getDownloadableDictionaries(String[] filters) {
-        final List<DictionaryInfo> result = new ArrayList<DictionaryInfo>(
-            dictionaryConfig.dictionaryFilesOrdered.size());
+        final List<DictionaryInfo> result = new ArrayList<>(
+                dictionaryConfig.dictionaryFilesOrdered.size());
 
-        final Map<String, DictionaryInfo> remaining = new HashMap<String, DictionaryInfo>(
-            DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO);
+        final Map<String, DictionaryInfo> remaining = new HashMap<>(
+                DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO);
         remaining.keySet().removeAll(dictionaryConfig.dictionaryFilesOrdered);
         for (final DictionaryInfo dictionaryInfo : remaining.values()) {
             if (matchesFilters(dictionaryInfo, filters)) {
@@ -548,10 +544,6 @@ public class DictionaryApplication extends Application {
         return result;
     }
 
-    public synchronized boolean isDictionaryOnDevice(String uncompressedFilename) {
-        return dictionaryConfig.uncompressedFilenameToDictionaryInfo.get(uncompressedFilename) != null;
-    }
-
     public boolean updateAvailable(final DictionaryInfo dictionaryInfo) {
         final DictionaryInfo downloadable =
             DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO.get(
@@ -561,9 +553,7 @@ public class DictionaryApplication extends Application {
     }
 
     public DictionaryInfo getDownloadable(final String uncompressedFilename) {
-        final DictionaryInfo downloadable = DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO
-                                            .get(uncompressedFilename);
-        return downloadable;
+        return DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO.get(uncompressedFilename);
     }
 
 }