| Index: mobile/android/base/java/org/adblockplus/browser/SubscriptionContainer.java |
| =================================================================== |
| --- a/mobile/android/base/java/org/adblockplus/browser/SubscriptionContainer.java |
| +++ b/mobile/android/base/java/org/adblockplus/browser/SubscriptionContainer.java |
| @@ -12,58 +12,59 @@ |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| package org.adblockplus.browser; |
| +import java.io.BufferedReader; |
| +import java.io.InputStreamReader; |
| import java.io.IOException; |
| -import java.io.StringReader; |
| import java.lang.ref.WeakReference; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.concurrent.ConcurrentHashMap; |
| import java.util.concurrent.Semaphore; |
| import org.mozilla.gecko.util.GeckoBundle; |
| import org.mozilla.gecko.util.ThreadUtils; |
| import org.xmlpull.v1.XmlPullParser; |
| import org.xmlpull.v1.XmlPullParserException; |
| +import android.content.Context; |
| import android.util.Log; |
| import android.util.Xml; |
| -final class SubscriptionContainer implements AdblockPlusApiCallback |
| +final class SubscriptionContainer |
| { |
| private static final String TAG = SubscriptionContainer.class.getName(); |
| private final ConcurrentHashMap<String, Boolean> enableState = new ConcurrentHashMap<>(); |
| private final Semaphore entriesReady = new Semaphore(0); |
| private final List<SubscriptionContainer.Subscription> entries = new ArrayList<>(); |
| private final HashMap<String, SubscriptionContainer.Subscription> urlMap = new HashMap<>(); |
| private final List<WeakReference<SubscriptionListener>> subscriptionListeners = new ArrayList<>(); |
| - private SubscriptionContainer() |
| + // prevent external instantiation |
| + private SubscriptionContainer(final Context context) |
| { |
| - // prevent external instantiation |
| + loadSubscriptions(context); |
| } |
| - public final static SubscriptionContainer create() |
| + public final static SubscriptionContainer create(Context context) |
| { |
| - return create(true); |
| + return create(context, true); |
| } |
| - public final static SubscriptionContainer create(final boolean refresh) |
| + public final static SubscriptionContainer create(Context context, final boolean refresh) |
| { |
| - final SubscriptionContainer sc = new SubscriptionContainer(); |
| - AddOnBridge.queryValue("subscriptionsXml", sc); |
| - sc.entriesReady.acquireUninterruptibly(); |
| + final SubscriptionContainer sc = new SubscriptionContainer(context); |
| for (final SubscriptionContainer.Subscription e : sc.entries) |
| { |
| sc.urlMap.put(e.url, e); |
| sc.enableState.put(e.url, Boolean.FALSE); |
| } |
| if (refresh) |
| @@ -147,24 +148,27 @@ |
| } |
| if (shouldAddListener) |
| { |
| this.subscriptionListeners.add(new WeakReference<>(listener)); |
| } |
| } |
| - @Override |
| - public void onApiRequestSucceeded(GeckoBundle bundle) |
| + private void loadSubscriptions(Context context) |
| { |
| + |
| final XmlPullParser parser = Xml.newPullParser(); |
| try |
| { |
| + final BufferedReader reader = new BufferedReader(new InputStreamReader( |
| + context.getAssets().open("extensions/subscriptions.xml"))); |
| + |
| parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); |
| - parser.setInput(new StringReader(bundle.getString("value", ""))); |
| + parser.setInput(reader); |
| parser.nextTag(); |
| parser.require(XmlPullParser.START_TAG, null, "subscriptions"); |
| while (parser.next() != XmlPullParser.END_TAG) |
| { |
| if (parser.getEventType() != XmlPullParser.START_TAG) |
| { |
| continue; |
| } |
| @@ -181,27 +185,16 @@ |
| 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 = SubscriptionContainer.SubscriptionChangeAction.class.getName(); |
| private final SubscriptionContainer.Subscription subscription; |
| private final SubscriptionContainer parent; |
| @@ -230,23 +223,23 @@ |
| return new SubscriptionChangeAction(subscription, parent, mode).post(); |
| } |
| public SubscriptionContainer.SubscriptionChangeAction post() |
| { |
| switch (this.mode) |
| { |
| case QUERY_SUBSCRIPTION_ENABLED: |
| - AddOnBridge.querySubscriptionListStatus(this.subscription.url, this); |
| + ExtensionBridge.querySubscriptionListStatus(this.subscription.url, this); |
| break; |
| case ENABLE_SUBSCRIPTION: |
| - AddOnBridge.addSubscription(this.subscription.url, this.subscription.title, this); |
| + ExtensionBridge.addSubscription(this.subscription.url, this.subscription.title, this); |
| break; |
| case DISABLE_SUBSCRIPTION: |
| - AddOnBridge.removeSubscription(this.subscription.url, this); |
| + ExtensionBridge.removeSubscription(this.subscription.url, this); |
| break; |
| default: |
| break; |
| } |
| return this; |
| } |
| @Override |
| @@ -332,9 +325,9 @@ |
| return this.specialization + " (" + this.title + ") @ " + this.url; |
| } |
| } |
| public interface SubscriptionListener |
| { |
| void onSubscriptionUpdated(); |
| } |
| -} |
| +} |