X-Git-Url: http://gitweb.fperrin.net/?p=Dictionary.git;a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryApplication.java;h=1e3788be869e7d830511705e391282e1af33c0ca;hp=3f2463d68e8684b8d30ba4245e250807c55169ef;hb=c76660b2772122109529d3616289980a7084eeeb;hpb=01332c7697b595328bbd5397e95341a0dd575493 diff --git a/src/com/hughes/android/dictionary/DictionaryApplication.java b/src/com/hughes/android/dictionary/DictionaryApplication.java index 3f2463d..1e3788b 100644 --- a/src/com/hughes/android/dictionary/DictionaryApplication.java +++ b/src/com/hughes/android/dictionary/DictionaryApplication.java @@ -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 dictionaryFilesOrdered = new ArrayList(); + final List dictionaryFilesOrdered = new ArrayList<>(); - final Map uncompressedFilenameToDictionaryInfo = new HashMap(); + final Map 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(); + 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 fileToNameCache = new HashMap(); + final Map fileToNameCache = new HashMap<>(); public List sortedIndexInfos(List indexInfos) { // Hack to put the default locale first in the name. if (indexInfos.size() > 1 && indexInfos.get(1).shortName.toLowerCase().equals(defaultLangISO2)) { - List result = new ArrayList(indexInfos); + List 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 collator = USE_COLLATOR ? CollatorWrapper.getInstance() : null; final Comparator uncompressedFilenameComparator = new Comparator() { @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 dictionaryInfoComparator = new Comparator() { @@ -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 toAddSorted = new ArrayList(); + final List 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 getDictionariesOnDevice(String[] filters) { - final List result = new ArrayList( - dictionaryConfig.dictionaryFilesOrdered.size()); + final List 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 getDownloadableDictionaries(String[] filters) { - final List result = new ArrayList( - dictionaryConfig.dictionaryFilesOrdered.size()); + final List result = new ArrayList<>( + dictionaryConfig.dictionaryFilesOrdered.size()); - final Map remaining = new HashMap( - DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO); + final Map 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); } }