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.
* 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);
}
/**
* 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);
}
}