Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/org/adblockplus/sbrowser/contentblocker/engine/Engine.java

Issue 29355386: Issue 4463 - Content blocker unavailable error message (Closed)
Patch Set: Created Sept. 30, 2016, 2:44 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
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-2016 Eyeo GmbH 3 * Copyright (C) 2006-2016 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
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details. 12 * GNU General Public License for more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License 14 * You should have received a copy of the GNU General Public License
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
16 */ 16 */
17 17
18 package org.adblockplus.sbrowser.contentblocker.engine; 18 package org.adblockplus.sbrowser.contentblocker.engine;
19 19
20 import java.io.BufferedReader; 20 import java.io.BufferedReader;
21 import java.io.BufferedWriter;
21 import java.io.File; 22 import java.io.File;
23 import java.io.FileOutputStream;
22 import java.io.IOException; 24 import java.io.IOException;
23 import java.io.InputStream; 25 import java.io.InputStream;
24 import java.io.InputStreamReader; 26 import java.io.InputStreamReader;
27 import java.io.OutputStreamWriter;
28 import java.io.Writer;
25 import java.net.URL; 29 import java.net.URL;
26 import java.net.URLEncoder; 30 import java.net.URLEncoder;
27 import java.util.ArrayList; 31 import java.util.ArrayList;
28 import java.util.HashMap; 32 import java.util.HashMap;
29 import java.util.List; 33 import java.util.List;
30 import java.util.Map; 34 import java.util.Map;
31 import java.util.concurrent.LinkedBlockingQueue; 35 import java.util.concurrent.LinkedBlockingQueue;
32 import java.util.concurrent.TimeUnit; 36 import java.util.concurrent.TimeUnit;
33 import java.util.concurrent.locks.ReentrantLock; 37 import java.util.concurrent.locks.ReentrantLock;
34 import java.util.regex.Pattern; 38 import java.util.regex.Pattern;
35 39
36 import org.adblockplus.adblockplussbrowser.R; 40 import org.adblockplus.adblockplussbrowser.R;
37 41
38 import android.content.Context; 42 import android.content.Context;
39 import android.content.Intent; 43 import android.content.Intent;
40 import android.content.SharedPreferences; 44 import android.content.SharedPreferences;
41 import android.content.pm.ResolveInfo; 45 import android.content.pm.ResolveInfo;
42 import android.net.ConnectivityManager; 46 import android.net.ConnectivityManager;
43 import android.net.NetworkInfo; 47 import android.net.NetworkInfo;
44 import android.net.Uri; 48 import android.net.Uri;
45 import android.os.Handler; 49 import android.os.Handler;
46 import android.os.Looper; 50 import android.os.Looper;
47 import android.preference.PreferenceManager; 51 import android.preference.PreferenceManager;
48 import android.util.Log; 52 import android.util.Log;
49 53
50 public final class Engine 54 public final class Engine
51 { 55 {
52 private static final String TAG = Engine.class.getSimpleName(); 56 private static final String TAG = Engine.class.getSimpleName();
53 57
58 public static final String ABP_VERSION = "2.0";
Felix Dahlke 2016/09/30 07:11:41 I think we can safely hard code it (the way it was
diegocarloslima 2016/09/30 14:06:38 OK I'll revert that change
59
54 // TODO make use of this regex's 60 // TODO make use of this regex's
55 public static final Pattern RE_SUBSCRIPTION_HEADER = Pattern.compile( 61 public static final Pattern RE_SUBSCRIPTION_HEADER = Pattern.compile(
56 "\\[Adblock(?:\\s*Plus\\s*([\\d\\.]+)?)?\\]", Pattern.CASE_INSENSITIVE); 62 "\\[Adblock(?:\\s*Plus\\s*([\\d\\.]+)?)?\\]", Pattern.CASE_INSENSITIVE);
57 public static final Pattern RE_FILTER_META = Pattern.compile("^\\s*!\\s*(\\w+) \\s*:\\s*(.*)"); 63 public static final Pattern RE_FILTER_META = Pattern.compile("^\\s*!\\s*(\\w+) \\s*:\\s*(.*)");
58 public static final Pattern RE_FILTER_ELEMHIDE = Pattern 64 public static final Pattern RE_FILTER_ELEMHIDE = Pattern
59 .compile("^([^\\/\\*\\|\\@\"!]*?)#(\\@)?(?:([\\w\\-]+|\\*)((?:\\([\\w\\-]+ (?:[$^*]?=[^\\(\\)\"]*)?\\))*)|#([^{}]+))$"); 65 .compile("^([^\\/\\*\\|\\@\"!]*?)#(\\@)?(?:([\\w\\-]+|\\*)((?:\\([\\w\\-]+ (?:[$^*]?=[^\\(\\)\"]*)?\\))*)|#([^{}]+))$");
60 public static final Pattern RE_FILTER_REGEXP = Pattern 66 public static final Pattern RE_FILTER_REGEXP = Pattern
61 .compile("^(@@)?\\/.*\\/(?:\\$~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:= [^,\\s]+)?)*)?$"); 67 .compile("^(@@)?\\/.*\\/(?:\\$~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:= [^,\\s]+)?)*)?$");
62 public static final Pattern RE_FILTER_OPTIONS = Pattern 68 public static final Pattern RE_FILTER_OPTIONS = Pattern
63 .compile("\\$(~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=[^,\\s]+)?)*)$") ; 69 .compile("\\$(~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=[^,\\s]+)?)*)$") ;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 this.nextUpdateBroadcast = System.currentTimeMillis() + BROADCAST_COMBINAT ION_DELAY_MILLIS; 163 this.nextUpdateBroadcast = System.currentTimeMillis() + BROADCAST_COMBINAT ION_DELAY_MILLIS;
158 } 164 }
159 finally 165 finally
160 { 166 {
161 this.unlock(); 167 this.unlock();
162 } 168 }
163 } 169 }
164 170
165 private void sendUpdateBroadcast() 171 private void sendUpdateBroadcast()
166 { 172 {
173 createAndWriteFile();
174
167 runOnUiThread(new Runnable() 175 runOnUiThread(new Runnable()
168 { 176 {
169 @Override 177 @Override
170 public void run() 178 public void run()
171 { 179 {
172 final Intent intent = new Intent(); 180 final Intent intent = new Intent();
173 intent.setAction(ACTION_UPDATE); 181 intent.setAction(ACTION_UPDATE);
174 intent.setData(Uri.parse("package:" + Engine.this.serviceContext.getPack ageName())); 182 intent.setData(Uri.parse("package:" + Engine.this.serviceContext.getPack ageName()));
175 Engine.this.serviceContext.sendBroadcast(intent); 183 Engine.this.serviceContext.sendBroadcast(intent);
176 } 184 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 { 237 {
230 this.engineEvents.add(new ChangeEnabledStateEvent(id, enabled)); 238 this.engineEvents.add(new ChangeEnabledStateEvent(id, enabled));
231 } 239 }
232 240
233 void downloadFinished(final String id, final int responseCode, final String re sponse, 241 void downloadFinished(final String id, final int responseCode, final String re sponse,
234 final Map<String, String> headers) 242 final Map<String, String> headers)
235 { 243 {
236 this.engineEvents.add(new DownloadFinishedEvent(id, responseCode, response, headers)); 244 this.engineEvents.add(new DownloadFinishedEvent(id, responseCode, response, headers));
237 } 245 }
238 246
239 public File createAndWriteFile() throws IOException 247 public void createAndWriteFile()
240 { 248 {
241 this.lock(); 249 this.lock();
242 try 250 try
243 { 251 {
244 Log.d(TAG, "Writing filters..."); 252 Log.d(TAG, "Writing filters...");
245 return this.subscriptions.createAndWriteFile(); 253 final File filterFile = this.subscriptions.createAndWriteFile();
254
255 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferen ces(this.serviceContext);
256 final String key = this.serviceContext.getString(R.string.key_cached_filte r_path);
257 prefs.edit().putString(key, filterFile.getAbsolutePath()).commit();
258
259 }
260 catch (IOException e)
261 {
262 Log.e(TAG, "Failed to write filters", e);
246 } 263 }
247 finally 264 finally
248 { 265 {
249 this.unlock(); 266 this.unlock();
250 } 267 }
251 } 268 }
252 269
253 public static void runOnUiThread(final Runnable runnable) 270 public static void runOnUiThread(final Runnable runnable)
254 { 271 {
255 new Handler(Looper.getMainLooper()).post(runnable); 272 new Handler(Looper.getMainLooper()).post(runnable);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 try 337 try
321 { 338 {
322 engine.defaultSubscriptions = DefaultSubscriptions.fromStream(subscription sXml); 339 engine.defaultSubscriptions = DefaultSubscriptions.fromStream(subscription sXml);
323 } 340 }
324 finally 341 finally
325 { 342 {
326 subscriptionsXml.close(); 343 subscriptionsXml.close();
327 } 344 }
328 345
329 Log.d(TAG, "Finished reading 'subscriptions.xml'"); 346 Log.d(TAG, "Finished reading 'subscriptions.xml'");
330 engine.subscriptions = Subscriptions.initialize(engine, context.getFilesDir( ), 347 engine.subscriptions = Subscriptions.initialize(engine, getSubscriptionsDir( context),
331 context.getCacheDir()); 348 getFilterCacheDir(context));
332 349
333 final InputStream prefsJson = context.getResources().openRawResource(R.raw.p refs); 350 final InputStream prefsJson = context.getResources().openRawResource(R.raw.p refs);
334 try 351 try
335 { 352 {
336 engine.jsonPrefs = JSONPrefs.create(prefsJson); 353 engine.jsonPrefs = JSONPrefs.create(prefsJson);
337 } 354 }
338 finally 355 finally
339 { 356 {
340 prefsJson.close(); 357 prefsJson.close();
341 } 358 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 { 403 {
387 additional++; 404 additional++;
388 engine.subscriptions.add(sub); 405 engine.subscriptions.add(sub);
389 } 406 }
390 } 407 }
391 408
392 Log.d(TAG, "Added " + additional + " additional default/built-in subscript ions"); 409 Log.d(TAG, "Added " + additional + " additional default/built-in subscript ions");
393 engine.subscriptions.persistSubscriptions(); 410 engine.subscriptions.persistSubscriptions();
394 } 411 }
395 412
413 final File cachedFilterFile = getCachedFilterFile(context);
414 if (cachedFilterFile == null || !cachedFilterFile.exists())
415 {
416 engine.sendUpdateBroadcast();
417 }
418
396 engine.handlerThread = new Thread(new EventHandler(engine)); 419 engine.handlerThread = new Thread(new EventHandler(engine));
397 engine.handlerThread.setDaemon(true); 420 engine.handlerThread.setDaemon(true);
398 engine.handlerThread.start(); 421 engine.handlerThread.start();
399 422
400 engine.downloader = Downloader.create(context, engine); 423 engine.downloader = Downloader.create(context, engine);
401 424
402 return engine; 425 return engine;
403 } 426 }
404 427
405 public static String readFileAsString(InputStream instream) throws IOException 428 public static String readFileAsString(InputStream instream) throws IOException
(...skipping 11 matching lines...) Expand all
417 { 440 {
418 final ArrayList<String> list = new ArrayList<String>(); 441 final ArrayList<String> list = new ArrayList<String>();
419 final BufferedReader r = new BufferedReader(new InputStreamReader(instream, "UTF-8")); 442 final BufferedReader r = new BufferedReader(new InputStreamReader(instream, "UTF-8"));
420 for (String line = r.readLine(); line != null; line = r.readLine()) 443 for (String line = r.readLine(); line != null; line = r.readLine())
421 { 444 {
422 list.add(line); 445 list.add(line);
423 } 446 }
424 return list; 447 return list;
425 } 448 }
426 449
450 public static File getOrCreateCachedFilterFile(Context context) throws IOExcep tion
451 {
452 final File cachedFilterFile = getCachedFilterFile(context);
453 if (cachedFilterFile != null && cachedFilterFile.exists())
454 {
455 Log.d(TAG, "Cached filter file found: " + cachedFilterFile);
456 return cachedFilterFile;
457 }
458
459 Log.d(TAG, "Cached filter file not found. Using dummy filter file");
460 final File dummyFilterFile = getDummyFilterFile(context);
461 if (!dummyFilterFile.exists())
462 {
463 Log.d(TAG, "Creating dummy filter file...");
464 dummyFilterFile.getParentFile().mkdirs();
465 final BufferedWriter writer = new BufferedWriter(
466 new OutputStreamWriter(new FileOutputStream(dummyFilterFile), "UTF-8") );
467 try
468 {
469 writeFilterHeaders(writer);
470 }
471 finally
472 {
473 writer.close();
474 }
475 }
476 return dummyFilterFile;
477 }
478
479 public static void writeFilterHeaders(Writer writer) throws IOException
480 {
481 writer.write("[Adblock Plus" + ABP_VERSION + "]\n");
Felix Dahlke 2016/09/30 07:11:41 Shouldn't there be a space between "Adblock Plus"
482 writer.write("! This file was automatically created.\n");
483 }
484
485 private static File getCachedFilterFile(Context context)
486 {
487 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreference s(context);
488 final String cachedFilterPath = prefs.getString(context.getString(R.string.k ey_cached_filter_path), null);
489 if (cachedFilterPath != null)
490 {
491 return new File(cachedFilterPath);
492 }
493
494 return null;
495 }
496
497 private static File getDummyFilterFile(Context context)
498 {
499 return new File(getFilterCacheDir(context), "dummy.txt");
500 }
501
502 private static File getFilterCacheDir(Context context)
503 {
504 return new File(context.getCacheDir(), "subscriptions");
505 }
506
507 private static File getSubscriptionsDir(Context context)
508 {
509 return new File(context.getFilesDir(), "subscriptions");
510 }
511
427 URL createDownloadURL(final Subscription sub) throws IOException 512 URL createDownloadURL(final Subscription sub) throws IOException
428 { 513 {
429 final StringBuilder sb = new StringBuilder(); 514 final StringBuilder sb = new StringBuilder();
430 515
431 sb.append(sub.getURL()); 516 sb.append(sub.getURL());
432 if (sub.getURL().getQuery() != null) 517 if (sub.getURL().getQuery() != null)
433 { 518 {
434 sb.append('&'); 519 sb.append('&');
435 } 520 }
436 else 521 else
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 Log.d(TAG, headers.toString()); 712 Log.d(TAG, headers.toString());
628 this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(), headers); 713 this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(), headers);
629 } 714 }
630 } 715 }
631 716
632 public void connectivityChanged() 717 public void connectivityChanged()
633 { 718 {
634 this.downloader.connectivityChanged(); 719 this.downloader.connectivityChanged();
635 } 720 }
636 } 721 }
OLDNEW

Powered by Google App Engine
This is Rietveld