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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 private boolean developmentBuild; | 51 private boolean developmentBuild; |
52 private String preloadedPreferenceName; | 52 private String preloadedPreferenceName; |
53 private Map<String, Integer> urlToResourceIdMap; | 53 private Map<String, Integer> urlToResourceIdMap; |
54 private AdblockEngine engine; | 54 private AdblockEngine engine; |
55 private CountDownLatch engineCreated; | 55 private CountDownLatch engineCreated; |
56 private Long v8IsolateProviderPtr; | 56 private Long v8IsolateProviderPtr; |
57 private List<EngineCreatedListener> engineCreatedListeners = | 57 private List<EngineCreatedListener> engineCreatedListeners = |
58 new LinkedList<EngineCreatedListener>(); | 58 new LinkedList<EngineCreatedListener>(); |
59 private List<EngineDisposedListener> engineDisposedListeners = | 59 private List<EngineDisposedListener> engineDisposedListeners = |
60 new LinkedList<EngineDisposedListener>(); | 60 new LinkedList<EngineDisposedListener>(); |
| 61 private Object engineLock = new Object(); |
61 | 62 |
62 /* | 63 /* |
63 Simple ARC management for AdblockEngine | 64 Simple ARC management for AdblockEngine |
64 Use `retain` and `release` | 65 Use `retain` and `release` |
65 */ | 66 */ |
66 | 67 |
67 private AtomicInteger referenceCounter = new AtomicInteger(0); | 68 private AtomicInteger referenceCounter = new AtomicInteger(0); |
68 | 69 |
69 /** | 70 /** |
70 * Init with context | 71 * Init with context |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 this.engineDisposedListeners.remove(listener); | 131 this.engineDisposedListeners.remove(listener); |
131 } | 132 } |
132 | 133 |
133 public void clearEngineDisposedListeners() | 134 public void clearEngineDisposedListeners() |
134 { | 135 { |
135 this.engineDisposedListeners.clear(); | 136 this.engineDisposedListeners.clear(); |
136 } | 137 } |
137 | 138 |
138 private void createAdblock() | 139 private void createAdblock() |
139 { | 140 { |
140 ConnectivityManager connectivityManager = | 141 Log.w(TAG, "Waiting for lock"); |
141 (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVIC
E); | 142 synchronized (engineLock) |
142 IsAllowedConnectionCallback isAllowedConnectionCallback = | 143 { |
143 new IsAllowedConnectionCallbackImpl(connectivityManager); | 144 Log.d(TAG, "Creating adblock engine ..."); |
| 145 ConnectivityManager connectivityManager = |
| 146 (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERV
ICE); |
| 147 IsAllowedConnectionCallback isAllowedConnectionCallback = |
| 148 new IsAllowedConnectionCallbackImpl(connectivityManager); |
144 | 149 |
145 Log.d(TAG, "Creating adblock engine ..."); | 150 AdblockEngine.Builder builder = AdblockEngine |
| 151 .builder( |
| 152 AdblockEngine.generateAppInfo(context, developmentBuild), |
| 153 basePath) |
| 154 .setIsAllowedConnectionCallback(isAllowedConnectionCallback) |
| 155 .enableElementHiding(true); |
146 | 156 |
147 AdblockEngine.Builder builder = AdblockEngine | 157 if (v8IsolateProviderPtr != null) |
148 .builder( | 158 { |
149 AdblockEngine.generateAppInfo(context, developmentBuild), | 159 builder.useV8IsolateProvider(v8IsolateProviderPtr); |
150 basePath) | 160 } |
151 .setIsAllowedConnectionCallback(isAllowedConnectionCallback) | |
152 .enableElementHiding(true); | |
153 | 161 |
154 if (v8IsolateProviderPtr != null) | 162 // if preloaded subscriptions provided |
155 { | 163 if (preloadedPreferenceName != null) |
156 builder.useV8IsolateProvider(v8IsolateProviderPtr); | 164 { |
157 } | 165 SharedPreferences preloadedSubscriptionsPrefs = context.getSharedPrefere
nces( |
| 166 preloadedPreferenceName, |
| 167 Context.MODE_PRIVATE); |
| 168 builder.preloadSubscriptions( |
| 169 context, |
| 170 urlToResourceIdMap, |
| 171 new AndroidWebRequestResourceWrapper.SharedPrefsStorage(preloadedSubsc
riptionsPrefs)); |
| 172 } |
158 | 173 |
159 // if preloaded subscriptions provided | 174 engine = builder.build(); |
160 if (preloadedPreferenceName != null) | |
161 { | |
162 SharedPreferences preloadedSubscriptionsPrefs = context.getSharedPreferenc
es( | |
163 preloadedPreferenceName, | |
164 Context.MODE_PRIVATE); | |
165 builder.preloadSubscriptions( | |
166 context, | |
167 urlToResourceIdMap, | |
168 new AndroidWebRequestResourceWrapper.SharedPrefsStorage(preloadedSubscri
ptionsPrefs)); | |
169 } | |
170 | 175 |
171 engine = builder.build(); | 176 Log.d(TAG, "AdblockHelper engine created"); |
172 | 177 |
173 Log.d(TAG, "AdblockHelper engine created"); | 178 // sometimes we need to init AdblockEngine instance, eg. set user settings |
174 | 179 for (EngineCreatedListener listener : engineCreatedListeners) |
175 // sometimes we need to init AdblockEngine instance, eg. set user settings | 180 { |
176 for (EngineCreatedListener listener : engineCreatedListeners) | 181 listener.onAdblockEngineCreated(engine); |
177 { | 182 } |
178 listener.onAdblockEngineCreated(engine); | |
179 } | 183 } |
180 } | 184 } |
181 | 185 |
182 @Override | 186 @Override |
183 public synchronized boolean retain(boolean asynchronous) | 187 public synchronized boolean retain(boolean asynchronous) |
184 { | 188 { |
185 boolean firstInstance = false; | 189 boolean firstInstance = false; |
186 | 190 |
187 if (referenceCounter.getAndIncrement() == 0) | 191 if (referenceCounter.getAndIncrement() == 0) |
188 { | 192 { |
189 firstInstance = true; | 193 firstInstance = true; |
190 | 194 |
191 if (!asynchronous) | 195 if (!asynchronous) |
192 { | 196 { |
193 createAdblock(); | 197 createAdblock(); |
194 } | 198 } |
195 else | 199 else |
196 { | 200 { |
197 // latch is required for async (see `waitForReady()`) | 201 // latch is required for async (see `waitForReady()`) |
198 engineCreated = new CountDownLatch(1); | 202 engineCreated = new CountDownLatch(1); |
199 | 203 |
200 new Thread(new Runnable() | 204 new Thread(new Runnable() |
201 { | 205 { |
202 @Override | 206 @Override |
203 public void run() | 207 public void run() |
204 { | 208 { |
205 createAdblock(); | 209 synchronized (engineLock) |
| 210 { |
| 211 createAdblock(); |
206 | 212 |
207 // unlock waiting client thread | 213 // unlock waiting client thread |
208 engineCreated.countDown(); | 214 engineCreated.countDown(); |
| 215 } |
209 } | 216 } |
210 }).start(); | 217 }).start(); |
211 } | 218 } |
212 } | 219 } |
213 return firstInstance; | 220 return firstInstance; |
214 } | 221 } |
215 | 222 |
216 @Override | 223 @Override |
217 public void waitForReady() | 224 public void waitForReady() |
218 { | 225 { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 else | 268 else |
262 { | 269 { |
263 disposeAdblock(); | 270 disposeAdblock(); |
264 } | 271 } |
265 } | 272 } |
266 return lastInstance; | 273 return lastInstance; |
267 } | 274 } |
268 | 275 |
269 private void disposeAdblock() | 276 private void disposeAdblock() |
270 { | 277 { |
271 Log.w(TAG, "Disposing adblock engine"); | 278 Log.w(TAG, "Waiting for lock"); |
| 279 synchronized (engineLock) |
| 280 { |
| 281 Log.w(TAG, "Disposing adblock engine"); |
272 | 282 |
273 engine.dispose(); | 283 engine.dispose(); |
274 engine = null; | 284 engine = null; |
275 | 285 |
276 // sometimes we need to deinit something after AdblockEngine instance dispos
ed | 286 // sometimes we need to deinit something after AdblockEngine instance disp
osed |
277 // eg. release user settings | 287 // eg. release user settings |
278 for (EngineDisposedListener listener : engineDisposedListeners) | 288 for (EngineDisposedListener listener : engineDisposedListeners) |
279 { | 289 { |
280 listener.onAdblockEngineDisposed(); | 290 listener.onAdblockEngineDisposed(); |
| 291 } |
281 } | 292 } |
282 } | 293 } |
283 | 294 |
284 @Override | 295 @Override |
285 public int getCounter() | 296 public int getCounter() |
286 { | 297 { |
287 return referenceCounter.get(); | 298 return referenceCounter.get(); |
288 } | 299 } |
| 300 |
| 301 @Override |
| 302 public Object getEngineLock() |
| 303 { |
| 304 return engineLock; |
| 305 } |
289 } | 306 } |
OLD | NEW |