Upstream version 8.36.161.0
[platform/framework/web/crosswalk.git] / src / xwalk / runtime / android / core / src / org / xwalk / core / XWalkPreferences.java
index 08a0b78..3c0a7c5 100644 (file)
@@ -4,11 +4,7 @@
 
 package org.xwalk.core;
 
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
+import org.xwalk.core.internal.XWalkPreferencesInternal;
 
 /**
  * This class represents the preferences and could be set by callers.
@@ -16,36 +12,47 @@ import java.util.Map;
  * Afterwards, the preference could be read from all threads and can impact
  * all XWalkView instances.
  */
-public final class XWalkPreferences {
-    private static HashMap<String, Boolean> sPrefMap = new HashMap<String, Boolean>();
-    // Here we use WeakReference to make sure the KeyValueChangeListener instance
-    // can be GC-ed to avoid memory leaking issue.
-    private static ArrayList<WeakReference<KeyValueChangeListener> > sListeners =
-            new ArrayList<WeakReference<KeyValueChangeListener> >();
-    private static ReferenceQueue<KeyValueChangeListener> sRefQueue =
-            new ReferenceQueue<KeyValueChangeListener>();
-
+public final class XWalkPreferences extends XWalkPreferencesInternal {
     /**
      * The key string to enable/disable remote debugging.
+     * @since 1.0
      */
     public static final String REMOTE_DEBUGGING = "remote-debugging";
 
-    static {
-        sPrefMap.put(REMOTE_DEBUGGING, Boolean.FALSE);
-    }
+    /**
+     * The key string to enable/disable animatable XWalkView. Default value is
+     * false.
+     *
+     * If this key is set to True, the XWalkView created by Crosswalk can be
+     * transformed and animated. Internally, Crosswalk is alternatively using
+     * TextureView as the backend of XWalkView.
+     *
+     * <a href="http://developer.android.com/reference/android/view/TextureView.html">
+     * TextureView</a> is a kind of
+     * <a href="http://developer.android.com/reference/android/view/View.html">
+     * android.view.View</a> that is different from
+     * <a href="http://developer.android.com/reference/android/view/SurfaceView.html">
+     * SurfaceView</a>. Unlike SurfaceView, it can be resized, transformed and
+     * animated. Once this key is set to True, all XWalkView will use TextureView
+     * as the rendering target instead of SurfaceView. The downside of TextureView
+     * is, it would consume more graphics memory than SurfaceView and may have
+     * 1~3 extra frames of latency to display updates.
+     *
+     * Note this key MUST be set before creating the first XWalkView, otherwise
+     * a RuntimeException will be thrown.
+     * @since 2.0
+     */
+    public static final String ANIMATABLE_XWALK_VIEW = "animatable-xwalk-view";
 
     /**
      * Set a preference value into Crosswalk. An exception will be thrown if
      * the key for the preference is not valid.
      * @param key the string name of the key.
      * @param enabled true if setting it as enabled.
+     * @since 1.0
      */
     public static synchronized void setValue(String key, boolean enabled) throws RuntimeException {
-        checkKey(key);
-        if (sPrefMap.get(key) != enabled) {
-            sPrefMap.put(key, new Boolean(enabled));
-            onKeyValueChanged(key, enabled);
-        }
+        XWalkPreferencesInternal.setValue(key, enabled);
     }
 
     /**
@@ -53,75 +60,9 @@ public final class XWalkPreferences {
      * the key for the preference is not valid.
      * @param key the string name of the key.
      * @return true if it's enabled.
+     * @since 1.0
      */
     public static synchronized boolean getValue(String key) throws RuntimeException {
-        checkKey(key);
-        return sPrefMap.get(key);
-    }
-
-    // TODO(yongsheng): I believe this is needed?
-    /*public static synchronized void setValue(String key, int value) throws RuntimeException {
-    }*/
-
-    static synchronized void load(KeyValueChangeListener listener) {
-        // Load current settings for initialization of a listener implementor.
-        for (Map.Entry<String, Boolean> entry : sPrefMap.entrySet()) {
-            listener.onKeyValueChanged(entry.getKey(), entry.getValue());
-        }
-
-        registerListener(listener);
-    }
-
-    static synchronized void unload(KeyValueChangeListener listener) {
-        unregisterListener(listener);
-    }
-
-    // Listen to value changes.
-    interface KeyValueChangeListener {
-        public void onKeyValueChanged(String key, boolean value);
-    }
-
-    private static synchronized void registerListener(KeyValueChangeListener listener) {
-        removeEnqueuedReference();
-        WeakReference<KeyValueChangeListener> weakListener =
-                new WeakReference<KeyValueChangeListener>(listener, sRefQueue);
-        sListeners.add(weakListener);
-    }
-
-    private static synchronized void unregisterListener(KeyValueChangeListener listener) {
-        removeEnqueuedReference();
-        for (WeakReference<KeyValueChangeListener> weakListener : sListeners) {
-            if (weakListener.get() == listener) {
-                sListeners.remove(weakListener);
-                break;
-            }
-        }
-    }
-
-    private static void onKeyValueChanged(String key, boolean enabled) {
-        for (WeakReference<KeyValueChangeListener> weakListener : sListeners) {
-            KeyValueChangeListener listener = weakListener.get();
-            if (listener != null) listener.onKeyValueChanged(key, enabled);
-        }
-    }
-
-    private static void checkKey(String key) throws RuntimeException {
-        removeEnqueuedReference();
-        if (!sPrefMap.containsKey(key)) {
-            throw new RuntimeException("Warning: the preference key " + key +
-                    " is not supported by Crosswalk.");
-        }
-    }
-
-    /**
-     * Internal method to keep track of weak references and remove the enqueued
-     * references from listener list by polling the reference queue.
-     */
-    @SuppressWarnings("unchecked")
-    private static void removeEnqueuedReference() {
-        WeakReference<KeyValueChangeListener> toRemove;
-        while ((toRemove = (WeakReference<KeyValueChangeListener>) sRefQueue.poll()) != null) {
-            sListeners.remove(toRemove);
-        }
+        return XWalkPreferencesInternal.getValue(key);
     }
 }