Index: mobile/android/thirdparty/org/adblockplus/browser/SubscriptionPreferenceCategory.java |
diff --git a/mobile/android/thirdparty/org/adblockplus/browser/SubscriptionPreferenceCategory.java b/mobile/android/thirdparty/org/adblockplus/browser/SubscriptionPreferenceCategory.java |
index c23794d3b98db77c2e46e6be7e61ab3dfb8a8ba3..88360ddfc2d7d5975fec0452fde91de22097a2e0 100644 |
--- a/mobile/android/thirdparty/org/adblockplus/browser/SubscriptionPreferenceCategory.java |
+++ b/mobile/android/thirdparty/org/adblockplus/browser/SubscriptionPreferenceCategory.java |
@@ -17,49 +17,25 @@ |
package org.adblockplus.browser; |
-import java.io.IOException; |
-import java.io.StringReader; |
-import java.util.ArrayList; |
-import java.util.HashMap; |
import java.util.List; |
-import java.util.concurrent.ConcurrentHashMap; |
-import java.util.concurrent.Semaphore; |
import org.mozilla.gecko.R; |
-import org.mozilla.gecko.util.NativeJSObject; |
import org.mozilla.gecko.util.ThreadUtils; |
-import org.xmlpull.v1.XmlPullParser; |
-import org.xmlpull.v1.XmlPullParserException; |
import android.app.ProgressDialog; |
import android.content.Context; |
-import android.os.Handler; |
-import android.os.HandlerThread; |
import android.preference.CheckBoxPreference; |
import android.preference.Preference; |
import android.preference.PreferenceCategory; |
import android.util.AttributeSet; |
-import android.util.Log; |
-import android.util.Xml; |
public class SubscriptionPreferenceCategory extends PreferenceCategory |
{ |
- private static final HandlerThread HANDLER_THREAD; |
- private static final Handler HANDLER; |
- |
- private volatile static SubscriptionContainer subscriptionContainer = null; |
+ volatile static SubscriptionContainer subscriptionContainer = null; |
private final CheckBoxChangeListener checkBoxChangeListener = new CheckBoxChangeListener(); |
private boolean isEnabledList = false; |
private ProgressDialog progressDialog; |
- static |
- { |
- HANDLER_THREAD = new HandlerThread("subscription-preference-background"); |
- HANDLER_THREAD.setDaemon(true); |
- HANDLER_THREAD.start(); |
- HANDLER = new Handler(HANDLER_THREAD.getLooper()); |
- } |
- |
public SubscriptionPreferenceCategory(Context context) |
{ |
super(context); |
@@ -103,7 +79,7 @@ public class SubscriptionPreferenceCategory extends PreferenceCategory |
this.progressDialog.setMessage(this.getContext().getString(R.string.abb_adblocking_waiting)); |
this.progressDialog.show(); |
- HANDLER.post(new Runnable() |
+ AddOnBridge.postToHandler(new Runnable() |
{ |
@Override |
public void run() |
@@ -200,244 +176,5 @@ public class SubscriptionPreferenceCategory extends PreferenceCategory |
return true; |
} |
} |
- |
- private final static class SubscriptionContainer implements AdblockPlusApiCallback |
- { |
- private static final String TAG = SubscriptionContainer.class.getName(); |
- private final ConcurrentHashMap<String, Boolean> enableState = new ConcurrentHashMap<String, Boolean>(); |
- private final Semaphore entriesReady = new Semaphore(0); |
- private final List<Subscription> entries = new ArrayList<Subscription>(); |
- private final HashMap<String, Subscription> urlMap = new HashMap<String, Subscription>(); |
- |
- private SubscriptionContainer() |
- { |
- // prevent external instantiation |
- } |
- |
- public final static SubscriptionContainer create() |
- { |
- final SubscriptionContainer sc = new SubscriptionContainer(); |
- AddOnBridge.queryValue(sc, "subscriptionsXml"); |
- sc.entriesReady.acquireUninterruptibly(); |
- |
- for (final Subscription e : sc.entries) |
- { |
- sc.urlMap.put(e.url, e); |
- sc.enableState.put(e.url, Boolean.FALSE); |
- } |
- |
- sc.refresh(); |
- |
- return sc; |
- } |
- |
- public void refresh() |
- { |
- if (!this.entries.isEmpty()) |
- { |
- for (int i = 0; i < this.entries.size(); i++) |
- { |
- SubscriptionChangeAction.post(this.entries.get(i), |
- this, |
- SubscriptionChangeAction.Mode.QUERY_SUBSCRIPTION_ENABLED); |
- } |
- |
- this.entriesReady.acquireUninterruptibly(this.entries.size()); |
- } |
- } |
- |
- public List<Subscription> getSubscriptions(boolean enabled) |
- { |
- final List<Subscription> ret = new ArrayList<Subscription>(); |
- for (final Subscription e : this.entries) |
- { |
- if (this.isSubscriptionListed(e.url) == enabled) |
- { |
- ret.add(e); |
- } |
- } |
- return ret; |
- } |
- |
- public boolean isSubscriptionListed(final String url) |
- { |
- return this.enableState.containsKey(url) && this.enableState.get(url).booleanValue(); |
- } |
- |
- public void changeSubscriptionState(final String url, final boolean enable) |
- { |
- final Subscription e = this.urlMap.get(url); |
- if (e != null) |
- { |
- if (enable) |
- { |
- SubscriptionChangeAction.post(e, subscriptionContainer, |
- SubscriptionChangeAction.Mode.ENABLE_SUBSCRIPTION); |
- } |
- else |
- { |
- SubscriptionChangeAction.post(e, subscriptionContainer, |
- SubscriptionChangeAction.Mode.DISABLE_SUBSCRIPTION); |
- } |
- } |
- } |
- |
- @Override |
- public void onApiRequestSucceeded(NativeJSObject jsObject) |
- { |
- final XmlPullParser parser = Xml.newPullParser(); |
- try |
- { |
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); |
- parser.setInput(new StringReader(AddOnBridge.getStringFromJsObject(jsObject, "value", ""))); |
- parser.nextTag(); |
- parser.require(XmlPullParser.START_TAG, null, "subscriptions"); |
- while (parser.next() != XmlPullParser.END_TAG) |
- { |
- if (parser.getEventType() != XmlPullParser.START_TAG) |
- { |
- continue; |
- } |
- if ("subscription".equals(parser.getName())) |
- { |
- final String title = parser.getAttributeValue(null, "title"); |
- final String specialization = parser.getAttributeValue(null, "specialization"); |
- final String url = parser.getAttributeValue(null, "url"); |
- this.entries.add(new Subscription(title, specialization, url)); |
- } |
- parser.next(); |
- } |
- } |
- catch (XmlPullParserException e) |
- { |
- Log.e(TAG, "Failed to parse subscriptions.xml: " + e.getMessage(), e); |
- } |
- catch (IOException e) |
- { |
- Log.e(TAG, "Failed to parse subscriptions.xml: " + e.getMessage(), e); |
- } |
- finally |
- { |
- this.entriesReady.release(); |
- } |
- } |
- |
- @Override |
- public void onApiRequestFailed(String errorMessage) |
- { |
- Log.e(TAG, "Error: " + errorMessage); |
- this.entriesReady.release(); |
- } |
- |
- private static class SubscriptionChangeAction implements AdblockPlusApiCallback |
- { |
- private static final String TAG = SubscriptionChangeAction.class.getName(); |
- |
- private final Subscription subscription; |
- private final SubscriptionContainer parent; |
- private final Mode mode; |
- |
- public enum Mode |
- { |
- QUERY_SUBSCRIPTION_ENABLED, |
- ENABLE_SUBSCRIPTION, |
- DISABLE_SUBSCRIPTION, |
- } |
- |
- public SubscriptionChangeAction(final Subscription subscription, |
- final SubscriptionContainer parent, |
- final Mode mode) |
- { |
- this.subscription = subscription; |
- this.parent = parent; |
- this.mode = mode; |
- } |
- |
- public static SubscriptionChangeAction post(final Subscription subscription, |
- final SubscriptionContainer parent, |
- final Mode mode) |
- { |
- return new SubscriptionChangeAction(subscription, parent, mode).post(); |
- } |
- |
- public SubscriptionChangeAction post() |
- { |
- switch (this.mode) |
- { |
- case QUERY_SUBSCRIPTION_ENABLED: |
- AddOnBridge.querySubscriptionListStatus(this, this.subscription.url); |
- break; |
- case ENABLE_SUBSCRIPTION: |
- AddOnBridge.addSubscription(this, this.subscription.url, this.subscription.title); |
- break; |
- case DISABLE_SUBSCRIPTION: |
- AddOnBridge.removeSubscription(this, this.subscription.url); |
- break; |
- default: |
- break; |
- } |
- return this; |
- } |
- |
- @Override |
- public void onApiRequestSucceeded(NativeJSObject jsObject) |
- { |
- switch (this.mode) |
- { |
- case QUERY_SUBSCRIPTION_ENABLED: |
- try |
- { |
- this.parent.enableState.put(this.subscription.url, |
- Boolean.valueOf(AddOnBridge.getBooleanFromJsObject(jsObject, "value", false))); |
- } |
- finally |
- { |
- this.parent.entriesReady.release(); |
- } |
- break; |
- default: |
- break; |
- } |
- } |
- |
- @Override |
- public void onApiRequestFailed(String errorMessage) |
- { |
- switch (this.mode) |
- { |
- case QUERY_SUBSCRIPTION_ENABLED: |
- this.parent.enableState.put(this.subscription.url, Boolean.FALSE); |
- this.parent.entriesReady.release(); |
- break; |
- default: |
- break; |
- } |
- |
- Log.e(TAG, "Error for '" + this.subscription.url |
- + "', mode: " + this.mode + ": " |
- + errorMessage); |
- } |
- } |
- |
- public static class Subscription |
- { |
- public final String title; |
- public final String specialization; |
- public final String url; |
- |
- public Subscription(final String title, final String specialization, final String url) |
- { |
- this.title = title; |
- this.specialization = specialization; |
- this.url = url; |
- } |
- |
- @Override |
- public String toString() |
- { |
- return this.specialization + " (" + this.title + ") @ " + this.url; |
- } |
- } |
- } |
} |