]> gitweb.fperrin.net Git - Dictionary.git/blobdiff - src/com/hughes/android/dictionary/engine/TransliteratorManager.java
Clean up order of imports.
[Dictionary.git] / src / com / hughes / android / dictionary / engine / TransliteratorManager.java
index 0ec81d22a6bc1c7219844227529d11cff5b87b8e..4dfb2b67d9ccf85a114eb847b7e5b5171c16c48e 100644 (file)
 
 package com.hughes.android.dictionary.engine;
 
-import com.ibm.icu.text.Transliterator;
-
 import java.util.ArrayList;
 import java.util.List;
 
 import com.hughes.util.LRUCacheMap;
+import com.ibm.icu.text.Transliterator;
 
 public class TransliteratorManager {
 
     private static boolean starting = false;
     private static boolean ready = false;
-    private static LRUCacheMap<String, Transliterator> cache = new LRUCacheMap<String, Transliterator>(4);
+    private static ThreadSetup threadSetup = null;
+    private static final LRUCacheMap<String, Transliterator> cache = new LRUCacheMap<>(4);
 
     // Whom to notify when we're all set up and ready to go.
-    private static List<Callback> callbacks = new ArrayList<TransliteratorManager.Callback>();
+    private static final List<Callback> callbacks = new ArrayList<>();
 
-    public static synchronized Transliterator get(String rules) {
-        Transliterator result = cache.get(rules);
-        if (result == null) {
-            result = Transliterator.createFromRules("", rules, Transliterator.FORWARD);
-            cache.put(rules, result);
+    public static Transliterator get(String rules) {
+        // DO NOT make the method synchronized!
+        // synchronizing on the class would break the whole
+        // asynchronous init concept, since the runnable
+        // then holds the same lock as the init function needs.
+        Transliterator result;
+        synchronized (cache) {
+            result = cache.get(rules);
+            if (result == null) {
+                result = Transliterator.createFromRules("", rules, Transliterator.FORWARD);
+                cache.put(rules, result);
+            }
         }
         return result;
     }
 
-    public static synchronized boolean init(final Callback callback) {
+    public static synchronized boolean init(final Callback callback, final ThreadSetup setupCallback) {
         if (ready) {
             return true;
         }
@@ -48,6 +55,7 @@ public class TransliteratorManager {
         }
         if (!starting) {
             starting = true;
+            threadSetup = setupCallback;
             new Thread(init).start();
         }
         return false;
@@ -56,15 +64,18 @@ public class TransliteratorManager {
     private static final Runnable init = new Runnable() {
         @Override
         public void run() {
+            synchronized (TransliteratorManager.class) {
+                if (threadSetup != null) threadSetup.onThreadStart();
+            }
             System.out.println("Starting Transliterator load.");
             final String transliterated = get(Language.en.getDefaultNormalizerRules()).transliterate("Îñţérñåţîöñåļîžåţîờñ");
             if (!"internationalization".equals(transliterated)) {
                 System.out.println("Wrong transliteration: " + transliterated);
             }
 
-            final List<Callback> callbacks = new ArrayList<TransliteratorManager.Callback>();
+            final List<Callback> callbacks;
             synchronized (TransliteratorManager.class) {
-                callbacks.addAll(TransliteratorManager.callbacks);
+                callbacks = new ArrayList<>(TransliteratorManager.callbacks);
                 ready = true;
             }
             for (final Callback callback : callbacks) {
@@ -73,6 +84,10 @@ public class TransliteratorManager {
         }
     };
 
+    public interface ThreadSetup {
+        void onThreadStart();
+    }
+
     public interface Callback {
         void onTransliteratorReady();
     }