X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryApplication.java;h=297e704fc15b6fc7147f63f157d395d1d94e2707;hb=9babb854fd0ab5925c3eb6660cc8d60358ffeec9;hp=a16ad0e163dafa3112ce9c8740af40a97f373461;hpb=ec41a2b17c280999e264d7fcded56d323f5da9f8;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryApplication.java b/src/com/hughes/android/dictionary/DictionaryApplication.java index a16ad0e..297e704 100644 --- a/src/com/hughes/android/dictionary/DictionaryApplication.java +++ b/src/com/hughes/android/dictionary/DictionaryApplication.java @@ -53,12 +53,21 @@ public class DictionaryApplication extends Application { static Map DOWNLOADABLE_NAME_TO_INFO = null; static final class DictionaryConfig implements Serializable { - private static final long serialVersionUID = -1444177164708201260L; + private static final long serialVersionUID = -1444177164708201262L; // User-ordered list, persisted, just the ones that are/have been present. - final List dictionaryFiles = new ArrayList(); + final List dictionaryFilesOrdered = new ArrayList(); + final Set invalidatedFilenames = new LinkedHashSet(); } DictionaryConfig dictionaryConfig = null; - + + static final class DictionaryHistory implements Serializable { + private static final long serialVersionUID = -4842995032541390284L; + // User-ordered list, persisted, just the ones that are/have been present. + final List dictionaryLinks = new ArrayList(); + } + DictionaryHistory dictionaryHistory = null; + + @Override public void onCreate() { super.onCreate(); @@ -119,21 +128,37 @@ public class DictionaryApplication extends Application { } } - private File getPath(String uncompressedFilename) { + public File getPath(String uncompressedFilename) { return new File(DICT_DIR, uncompressedFilename); } public List getUsableDicts() { - final List result = new ArrayList(dictionaryConfig.dictionaryFiles.size()); - for (final String uncompressedFilename : dictionaryConfig.dictionaryFiles) { - final DictionaryInfo dictionaryInfo = Dictionary.getDictionaryInfo(getPath(uncompressedFilename)); + final List result = new ArrayList(dictionaryConfig.dictionaryFilesOrdered.size()); + for (int i = 0; i < dictionaryConfig.dictionaryFilesOrdered.size(); ++i) { + DictionaryInfo dictionaryInfo = dictionaryConfig.dictionaryFilesOrdered.get(i); + if (dictionaryConfig.invalidatedFilenames.contains(dictionaryInfo.uncompressedFilename)) { + dictionaryInfo = Dictionary.getDictionaryInfo(getPath(dictionaryInfo.uncompressedFilename)); + if (dictionaryInfo != null) { + dictionaryConfig.dictionaryFilesOrdered.set(i, dictionaryInfo); + } + } if (dictionaryInfo != null) { result.add(dictionaryInfo); } } + if (!dictionaryConfig.invalidatedFilenames.isEmpty()) { + dictionaryConfig.invalidatedFilenames.clear(); + PersistentObjectCache.getInstance().write(C.DICTIONARY_CONFIGS, dictionaryConfig); + } return result; } + + public String getLanguageName(final String isoCode) { + final Integer langCode = Language.isoCodeToResourceId.get(isoCode); + final String lang = langCode != null ? getApplicationContext().getString(langCode) : isoCode; + return lang; + } final Map fileToNameCache = new LinkedHashMap(); public synchronized String getDictionaryName(final String uncompressedFilename) { @@ -143,16 +168,13 @@ public class DictionaryApplication extends Application { } final DictionaryInfo dictionaryInfo = DOWNLOADABLE_NAME_TO_INFO.get(uncompressedFilename); - final Context context = getApplicationContext(); if (dictionaryInfo != null) { final StringBuilder nameBuilder = new StringBuilder(); for (int i = 0; i < dictionaryInfo.indexInfos.size(); ++i) { - final Integer langCode = Language.isoCodeToResourceId.get(dictionaryInfo.indexInfos.get(i).shortName); - final String lang = langCode != null ? context.getString(langCode) : dictionaryInfo.indexInfos.get(i).shortName; if (i > 0) { nameBuilder.append("-"); } - nameBuilder.append(lang); + nameBuilder.append(getLanguageName(dictionaryInfo.indexInfos.get(i).shortName)); } name = nameBuilder.toString(); } else { @@ -162,17 +184,26 @@ public class DictionaryApplication extends Application { return name; } - public void moveDictionaryToTop(final String canonicalPath) { - dictionaryConfig.dictionaryFiles.remove(canonicalPath); - dictionaryConfig.dictionaryFiles.add(0, canonicalPath); + public void moveDictionaryToTop(final DictionaryInfo dictionaryInfo) { + dictionaryConfig.dictionaryFilesOrdered.remove(dictionaryInfo); + dictionaryConfig.dictionaryFilesOrdered.add(0, dictionaryInfo); PersistentObjectCache.getInstance().write(C.DICTIONARY_CONFIGS, dictionaryConfig); } - public void deleteDictionary(String canonicalPath) { - while (dictionaryConfig.dictionaryFiles.remove(canonicalPath)) {}; + public void deleteDictionary(final DictionaryInfo dictionaryInfo) { + while (dictionaryConfig.dictionaryFilesOrdered.remove(dictionaryInfo)) {}; + getPath(dictionaryInfo.uncompressedFilename).delete(); PersistentObjectCache.getInstance().write(C.DICTIONARY_CONFIGS, dictionaryConfig); } + final Collator collator = Collator.getInstance(); + final Comparator comparator = new Comparator() { + @Override + public int compare(DictionaryInfo object1, DictionaryInfo object2) { + return collator.compare(getDictionaryName(object1.uncompressedFilename), getDictionaryName(object2.uncompressedFilename)); + } + }; + public List getAllDictionaries() { final List result = getUsableDicts(); @@ -181,10 +212,13 @@ public class DictionaryApplication extends Application { for (final DictionaryInfo usable : result) { known.add(usable.uncompressedFilename); } + if (!dictionaryConfig.invalidatedFilenames.isEmpty()) { + dictionaryConfig.invalidatedFilenames.clear(); + } // 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. - boolean foundNew = false; + final List toAddSorted = new ArrayList(); final File[] dictDirFiles = DICT_DIR.listFiles(); for (final File file : dictDirFiles) { if (!file.getName().endsWith(".quickdic")) { @@ -200,27 +234,25 @@ public class DictionaryApplication extends Application { continue; } known.add(file.getName()); - foundNew = true; - dictionaryConfig.dictionaryFiles.add(file.getName()); - result.add(dictionaryInfo); + toAddSorted.add(dictionaryInfo); } - if (foundNew) { + if (!toAddSorted.isEmpty()) { + Collections.sort(toAddSorted, comparator); + result.addAll(toAddSorted); +// for (final DictionaryInfo dictionaryInfo : toAddSorted) { +// dictionaryConfig.dictionaryFilesOrdered.add(dictionaryInfo.uncompressedFilename); +// } + dictionaryConfig.dictionaryFilesOrdered.addAll(toAddSorted); PersistentObjectCache.getInstance().write(C.DICTIONARY_CONFIGS, dictionaryConfig); } // The downloadable ones. final Map remaining = new LinkedHashMap(DOWNLOADABLE_NAME_TO_INFO); remaining.keySet().removeAll(known); - final List remainingSorted = new ArrayList(remaining.values()); - final Collator collator = Collator.getInstance(); - Collections.sort(remainingSorted, new Comparator() { - @Override - public int compare(DictionaryInfo object1, DictionaryInfo object2) { - return collator.compare(getDictionaryName(object1.uncompressedFilename), getDictionaryName(object2.uncompressedFilename)); - } - }); - - result.addAll(remainingSorted); + toAddSorted.clear(); + toAddSorted.addAll(remaining.values()); + Collections.sort(toAddSorted, comparator); + result.addAll(toAddSorted); return result; } @@ -228,5 +260,19 @@ public class DictionaryApplication extends Application { return getPath(uncompressedFilename).canRead(); } + public boolean updateAvailable(final DictionaryInfo dictionaryInfo) { + final DictionaryInfo downloadable = DOWNLOADABLE_NAME_TO_INFO.get(dictionaryInfo.uncompressedFilename); + return downloadable != null && downloadable.creationMillis > dictionaryInfo.creationMillis; + } + + public DictionaryInfo getDownloadable(final String uncompressedFilename) { + final DictionaryInfo downloadable = DOWNLOADABLE_NAME_TO_INFO.get(uncompressedFilename); + return downloadable; + } + + public void invalidateDictionaryInfo(final String uncompressedFilename) { + dictionaryConfig.invalidatedFilenames.add(uncompressedFilename); + PersistentObjectCache.getInstance().write(C.DICTIONARY_CONFIGS, dictionaryConfig); + } }