OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 12 matching lines...) Expand all Loading... |
23 import android.annotation.SuppressLint; | 23 import android.annotation.SuppressLint; |
24 import android.content.Context; | 24 import android.content.Context; |
25 import android.content.SharedPreferences; | 25 import android.content.SharedPreferences; |
26 import android.os.Handler; | 26 import android.os.Handler; |
27 import android.os.HandlerThread; | 27 import android.os.HandlerThread; |
28 import android.util.Log; | 28 import android.util.Log; |
29 | 29 |
30 import org.json.JSONArray; | 30 import org.json.JSONArray; |
31 import org.json.JSONException; | 31 import org.json.JSONException; |
32 import org.mozilla.gecko.EventDispatcher; | 32 import org.mozilla.gecko.EventDispatcher; |
33 import org.mozilla.gecko.GeckoAppShell; | |
34 import org.mozilla.gecko.util.BundleEventListener; | 33 import org.mozilla.gecko.util.BundleEventListener; |
35 import org.mozilla.gecko.util.EventCallback; | 34 import org.mozilla.gecko.util.EventCallback; |
36 import org.mozilla.gecko.util.GeckoBundle; | 35 import org.mozilla.gecko.util.GeckoBundle; |
37 | 36 |
38 @SuppressLint("DefaultLocale") | 37 @SuppressLint("DefaultLocale") |
39 public class AddOnBridge | 38 public class ExtensionBridge |
40 { | 39 { |
41 private static final String TAG = "AdblockBrowser.AddOnBridge"; | 40 private static final String TAG = "AdblockBrowser.ExtensionBridge"; |
42 private static final String REQUEST_NAME = "AdblockPlus:Api"; | 41 private static final String REQUEST_NAME = "Abb:Api"; |
43 // Handler+HandlerThread for posting delayed re-tries without interfering with | 42 // Handler+HandlerThread for posting delayed re-tries without interfering with |
44 // other threads (e.g. the UI or Gecko thread) | 43 // other threads (e.g. the UI or Gecko thread) |
45 private static final HandlerThread PRIVATE_HANDLER_THREAD; | 44 private static final HandlerThread PRIVATE_HANDLER_THREAD; |
46 private static final Handler PRIVATE_HANDLER; | 45 private static final Handler PRIVATE_HANDLER; |
47 // Global handler, for e.g. UI tasks | 46 // Global handler, for e.g. UI tasks |
48 private static final HandlerThread GLOBAL_HANDLER_THREAD; | 47 private static final HandlerThread GLOBAL_HANDLER_THREAD; |
49 private static final Handler GLOBAL_HANDLER; | 48 private static final Handler GLOBAL_HANDLER; |
50 // Sometimes, the app is killed before the extension is able to save all chang
es regarding | 49 // Sometimes, the app is killed before the extension is able to save all chang
es regarding |
51 // AddOnBridge requests. Given that, we need to store the pending requests on
SharedPrefs, | 50 // ExtensionBridge requests. Given that, we need to store the pending requests
on SharedPrefs, |
52 // so we can resend them to the extension once the app restarts | 51 // so we can resend them to the extension once the app restarts |
53 // See https://issues.adblockplus.org/ticket/2853 | 52 // See https://issues.adblockplus.org/ticket/2853 |
54 private static final AddOnEventListener ADD_ON_EVENT_LISTENER = new AddOnEvent
Listener(); | 53 private static final AddOnEventListener ADD_ON_EVENT_LISTENER = new AddOnEvent
Listener(); |
55 private static final String ON_FILTERS_LOAD_EVENT = "Abb:OnFiltersLoad"; | 54 private static final String ON_LOADED_EVENT = "Abb:OnLoaded"; |
56 private static final String ON_FILTERS_SAVE_EVENT = "Abb:OnFiltersSave"; | 55 private static final String ON_FILTERS_SAVED_EVENT = "Abb:OnFiltersSaved"; |
57 private static final List<GeckoBundle> PENDING_REQUESTS = new ArrayList<>(); | 56 private static final List<GeckoBundle> PENDING_REQUESTS = new ArrayList<>(); |
58 private static final String PENDING_REQUESTS_PREFS_KEY = "PENDING_REQUESTS_PRE
FS_KEY"; | 57 private static final String PENDING_REQUESTS_PREFS_KEY = "PENDING_REQUESTS_PRE
FS_KEY"; |
59 | 58 |
60 private static SharedPreferences sharedPrefs; | 59 private static SharedPreferences sharedPrefs; |
61 private static boolean filtersLoaded; | 60 private static boolean filtersLoaded; |
62 | 61 |
63 static | 62 static |
64 { | 63 { |
65 PRIVATE_HANDLER_THREAD = new HandlerThread("abp-private-handler"); | 64 PRIVATE_HANDLER_THREAD = new HandlerThread("abp-private-handler"); |
66 PRIVATE_HANDLER_THREAD.setDaemon(true); | 65 PRIVATE_HANDLER_THREAD.setDaemon(true); |
67 PRIVATE_HANDLER_THREAD.start(); | 66 PRIVATE_HANDLER_THREAD.start(); |
68 PRIVATE_HANDLER = new Handler(PRIVATE_HANDLER_THREAD.getLooper()); | 67 PRIVATE_HANDLER = new Handler(PRIVATE_HANDLER_THREAD.getLooper()); |
69 | 68 |
70 GLOBAL_HANDLER_THREAD = new HandlerThread("abp-global-handler"); | 69 GLOBAL_HANDLER_THREAD = new HandlerThread("abp-global-handler"); |
71 GLOBAL_HANDLER_THREAD.setDaemon(true); | 70 GLOBAL_HANDLER_THREAD.setDaemon(true); |
72 GLOBAL_HANDLER_THREAD.start(); | 71 GLOBAL_HANDLER_THREAD.start(); |
73 GLOBAL_HANDLER = new Handler(GLOBAL_HANDLER_THREAD.getLooper()); | 72 GLOBAL_HANDLER = new Handler(GLOBAL_HANDLER_THREAD.getLooper()); |
74 } | 73 } |
75 | 74 |
76 public static void init(Context context) | 75 public static void init(Context context) |
77 { | 76 { |
78 sharedPrefs = context.getSharedPreferences(AddOnBridge.class.getName(), Cont
ext.MODE_PRIVATE); | 77 sharedPrefs = context.getSharedPreferences(ExtensionBridge.class.getName(),
Context.MODE_PRIVATE); |
79 EventDispatcher.getInstance().registerGeckoThreadListener( | 78 EventDispatcher.getInstance().registerGeckoThreadListener( |
80 ADD_ON_EVENT_LISTENER, ON_FILTERS_LOAD_EVENT, ON_FILTERS_SAVE_EVENT); | 79 ADD_ON_EVENT_LISTENER, ON_LOADED_EVENT, ON_FILTERS_SAVED_EVENT); |
81 loadPendingRequests(); | 80 loadPendingRequests(); |
82 } | 81 } |
83 | 82 |
84 public static void postToHandler(Runnable runnable) | 83 public static void postToHandler(Runnable runnable) |
85 { | 84 { |
86 GLOBAL_HANDLER.post(runnable); | 85 GLOBAL_HANDLER.post(runnable); |
87 } | 86 } |
88 | 87 |
89 public static void postToHandlerDelayed(Runnable runnable, long delayMillis) | 88 public static void postToHandlerDelayed(Runnable runnable, long delayMillis) |
90 { | 89 { |
(...skipping 12 matching lines...) Expand all Loading... |
103 final GeckoBundle data = new GeckoBundle(); | 102 final GeckoBundle data = new GeckoBundle(); |
104 data.putBoolean("enable", enable); | 103 data.putBoolean("enable", enable); |
105 callFunction("set" + makeFirstCharacterUppercase(name), data, true, callback
); | 104 callFunction("set" + makeFirstCharacterUppercase(name), data, true, callback
); |
106 } | 105 } |
107 | 106 |
108 public static void querySubscriptionListStatus(String url, AdblockPlusApiCallb
ack callback) | 107 public static void querySubscriptionListStatus(String url, AdblockPlusApiCallb
ack callback) |
109 { | 108 { |
110 Log.d(TAG, "querySubscriptionListStatus for " + url); | 109 Log.d(TAG, "querySubscriptionListStatus for " + url); |
111 final GeckoBundle data = new GeckoBundle(); | 110 final GeckoBundle data = new GeckoBundle(); |
112 data.putString("url", url); | 111 data.putString("url", url); |
113 callFunction("isSubscriptionListed", data, callback); | 112 callFunction("isSubscriptionEnabled", data, callback); |
114 } | 113 } |
115 | 114 |
116 public static void addSubscription(String url, String title, AdblockPlusApiCal
lback callback) | 115 public static void addSubscription(String url, String title, AdblockPlusApiCal
lback callback) |
117 { | 116 { |
118 Log.d(TAG, "addSubscription for " + url + " (" + title + ")"); | 117 Log.d(TAG, "addSubscription for " + url + " (" + title + ")"); |
119 final GeckoBundle data = new GeckoBundle(); | 118 final GeckoBundle data = new GeckoBundle(); |
120 data.putString("url", url); | 119 data.putString("url", url); |
121 if (title != null) | 120 if (title != null) |
122 { | 121 { |
123 data.putString("title", title); | 122 data.putString("title", title); |
124 } | 123 } |
125 callFunction("addSubscription", data, true, callback); | 124 callFunction("addSubscription", data, true, callback); |
126 } | 125 } |
127 | 126 |
128 public static void queryActiveSubscriptions(AdblockPlusApiCallback callback) | 127 public static void queryActiveSubscriptions(AdblockPlusApiCallback callback) |
129 { | 128 { |
130 Log.d(TAG, "queryActiveSubscriptions"); | 129 Log.d(TAG, "queryActiveSubscriptions"); |
131 callFunction("getActiveSubscriptions", null, callback); | 130 callFunction("getEnabledSubscriptions", null, callback); |
132 } | 131 } |
133 | 132 |
134 public static void removeSubscription(String url, AdblockPlusApiCallback callb
ack) | 133 public static void removeSubscription(String url, AdblockPlusApiCallback callb
ack) |
135 { | 134 { |
136 Log.d(TAG, "removeSubscription for " + url); | 135 Log.d(TAG, "removeSubscription for " + url); |
137 final GeckoBundle data = new GeckoBundle(); | 136 final GeckoBundle data = new GeckoBundle(); |
138 data.putString("url", url); | 137 data.putString("url", url); |
139 callFunction("removeSubscription", data, true, callback); | 138 callFunction("removeSubscription", data, true, callback); |
140 } | 139 } |
141 | 140 |
142 public static void queryWhitelistedWebsites(final AdblockPlusApiCallback callb
ack) { | 141 public static void queryWhitelistedWebsites(final AdblockPlusApiCallback callb
ack) { |
143 Log.d(TAG, "queryWhitelistedWebsites"); | 142 Log.d(TAG, "queryWhitelistedWebsites"); |
144 callFunction("getWhitelistedWebsites", null, callback); | 143 callFunction("getWhitelistedDomains", null, callback); |
145 } | 144 } |
146 | 145 |
147 public static void queryIsWebsiteWhitelisted(String url, AdblockPlusApiCallbac
k callback) | 146 public static void queryIsWebsiteWhitelisted(String url, AdblockPlusApiCallbac
k callback) |
148 { | 147 { |
149 Log.d(TAG, "queryIsWebsiteWhitelisted for " + url); | 148 Log.d(TAG, "queryIsWebsiteWhitelisted for " + url); |
150 final GeckoBundle data = new GeckoBundle(); | 149 final GeckoBundle data = new GeckoBundle(); |
151 data.putString("url", url); | 150 data.putString("url", url); |
152 data.putString("host", UrlUtils.getHostFromUrl(url)); | 151 data.putString("host", UrlUtils.getHostFromUrl(url)); |
153 callFunction("isWebsiteWhitelisted", data, callback); | 152 callFunction("isDomainWhitelisted", data, callback); |
154 } | 153 } |
155 | 154 |
156 public static void whitelistWebsite(String url, boolean whitelisted, AdblockPl
usApiCallback callback) | 155 public static void whitelistWebsite(String url, boolean whitelisted, AdblockPl
usApiCallback callback) |
157 { | 156 { |
158 Log.d(TAG, "whitelistWebsite for " + url); | 157 Log.d(TAG, "whitelistWebsite for " + url); |
159 final GeckoBundle data = new GeckoBundle(); | 158 final GeckoBundle data = new GeckoBundle(); |
160 data.putString("url", UrlUtils.formatUrl(url)); | 159 data.putString("url", UrlUtils.formatUrl(url)); |
161 data.putString("host", UrlUtils.getHostFromUrl(url)); | 160 data.putString("host", UrlUtils.getHostFromUrl(url)); |
162 data.putBoolean("whitelisted", whitelisted); | 161 data.putBoolean("enable", whitelisted); |
163 callFunction("whitelistWebsite", data, true, callback); | 162 callFunction("whitelistDomain", data, true, callback); |
164 } | 163 } |
165 | 164 |
166 private static String makeFirstCharacterUppercase(String str) | 165 private static String makeFirstCharacterUppercase(String str) |
167 { | 166 { |
168 if (Character.isUpperCase(str.charAt(0))) | 167 if (Character.isUpperCase(str.charAt(0))) |
169 { | 168 { |
170 return str; | 169 return str; |
171 } | 170 } |
172 return Character.toString(Character.toUpperCase(str.charAt(0))) + str.substr
ing(1); | 171 return Character.toString(Character.toUpperCase(str.charAt(0))) + str.substr
ing(1); |
173 } | 172 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 callback.onApiRequestFailed(error); | 340 callback.onApiRequestFailed(error); |
342 } | 341 } |
343 }); | 342 }); |
344 } | 343 } |
345 | 344 |
346 private static class AddOnEventListener implements BundleEventListener | 345 private static class AddOnEventListener implements BundleEventListener |
347 { | 346 { |
348 @Override | 347 @Override |
349 public void handleMessage(String event, GeckoBundle message, EventCallback c
allback) | 348 public void handleMessage(String event, GeckoBundle message, EventCallback c
allback) |
350 { | 349 { |
351 if (ON_FILTERS_LOAD_EVENT.equals(event)) | 350 Log.d(TAG, "handleMessage event: " + event + " message: " + message); |
| 351 if (ON_LOADED_EVENT.equals(event)) |
352 { | 352 { |
353 // The filters have been loaded by the extension. Given that, we can sen
d all pending requests | 353 // The extension has been loaded. Given that, we can send all pending re
quests |
354 filtersLoaded = true; | 354 filtersLoaded = true; |
355 sendPendingRequests(); | 355 sendPendingRequests(); |
356 } | 356 } |
357 else if (ON_FILTERS_SAVE_EVENT.equals(event)) | 357 else if (ON_FILTERS_SAVED_EVENT.equals(event)) |
358 { | 358 { |
359 // All changes have been saved by the extension. That way, we can clear
our list of | 359 // All changes have been saved by the extension. That way, we can clear
our list of |
360 // pending requests | 360 // pending requests |
361 // See https://issues.adblockplus.org/ticket/2853 | 361 // See https://issues.adblockplus.org/ticket/2853 |
362 clearPendingRequests(); | 362 clearPendingRequests(); |
363 } | 363 } |
364 } | 364 } |
365 } | 365 } |
366 } | 366 } |
OLD | NEW |