| LEFT | RIGHT |
| (no file at all) | |
| 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 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 import android.content.Context; | 42 import android.content.Context; |
| 43 import android.content.Intent; | 43 import android.content.Intent; |
| 44 import android.content.SharedPreferences; | 44 import android.content.SharedPreferences; |
| 45 import android.content.pm.ResolveInfo; | 45 import android.content.pm.ResolveInfo; |
| 46 import android.net.ConnectivityManager; | 46 import android.net.ConnectivityManager; |
| 47 import android.net.NetworkInfo; | 47 import android.net.NetworkInfo; |
| 48 import android.net.Uri; | 48 import android.net.Uri; |
| 49 import android.os.Handler; | 49 import android.os.Handler; |
| 50 import android.os.Looper; | 50 import android.os.Looper; |
| 51 import android.preference.PreferenceManager; | 51 import android.preference.PreferenceManager; |
| 52 import android.text.TextUtils; |
| 52 import android.util.Log; | 53 import android.util.Log; |
| 53 | 54 |
| 54 public final class Engine | 55 public final class Engine |
| 55 { | 56 { |
| 56 private static final String TAG = Engine.class.getSimpleName(); | 57 private static final String TAG = Engine.class.getSimpleName(); |
| 57 | 58 |
| 58 // TODO make use of this regex's | 59 // TODO make use of this regex's |
| 59 public static final Pattern RE_SUBSCRIPTION_HEADER = Pattern.compile( | 60 public static final Pattern RE_SUBSCRIPTION_HEADER = Pattern.compile( |
| 60 "\\[Adblock(?:\\s*Plus\\s*([\\d\\.]+)?)?\\]", Pattern.CASE_INSENSITIVE); | 61 "\\[Adblock(?:\\s*Plus\\s*([\\d\\.]+)?)?\\]", Pattern.CASE_INSENSITIVE); |
| 61 public static final Pattern RE_FILTER_META = Pattern.compile("^\\s*!\\s*(\\w+)
\\s*:\\s*(.*)"); | 62 public static final Pattern RE_FILTER_META = Pattern.compile("^\\s*!\\s*(\\w+)
\\s*:\\s*(.*)"); |
| 62 public static final Pattern RE_FILTER_ELEMHIDE = Pattern | 63 public static final Pattern RE_FILTER_ELEMHIDE = Pattern |
| 63 .compile("^([^\\/\\*\\|\\@\"!]*?)#(\\@)?(?:([\\w\\-]+|\\*)((?:\\([\\w\\-]+
(?:[$^*]?=[^\\(\\)\"]*)?\\))*)|#([^{}]+))$"); | 64 .compile("^([^\\/\\*\\|\\@\"!]*?)#(\\@)?(?:([\\w\\-]+|\\*)((?:\\([\\w\\-]+
(?:[$^*]?=[^\\(\\)\"]*)?\\))*)|#([^{}]+))$"); |
| 64 public static final Pattern RE_FILTER_REGEXP = Pattern | 65 public static final Pattern RE_FILTER_REGEXP = Pattern |
| 65 .compile("^(@@)?\\/.*\\/(?:\\$~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=
[^,\\s]+)?)*)?$"); | 66 .compile("^(@@)?\\/.*\\/(?:\\$~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=
[^,\\s]+)?)*)?$"); |
| 66 public static final Pattern RE_FILTER_OPTIONS = Pattern | 67 public static final Pattern RE_FILTER_OPTIONS = Pattern |
| 67 .compile("\\$(~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=[^,\\s]+)?)*)$")
; | 68 .compile("\\$(~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=[^,\\s]+)?)*)$")
; |
| 68 public static final Pattern RE_FILTER_CSSPROPERTY = Pattern | 69 public static final Pattern RE_FILTER_CSSPROPERTY = Pattern |
| 69 .compile("\\[\\-abp\\-properties=([\"'])([^\"']+)\\1\\]"); | 70 .compile("\\[\\-abp\\-properties=([\"'])([^\"']+)\\1\\]"); |
| 70 | 71 |
| 71 public static final String USER_FILTERS_TITLE = "__filters"; | 72 public static final String USER_FILTERS_TITLE = "__filters"; |
| 72 public static final String USER_EXCEPTIONS_TITLE = "__exceptions"; | 73 public static final String USER_EXCEPTIONS_TITLE = "__exceptions"; |
| 73 | 74 |
| 74 public static final String ACTION_OPEN_SETTINGS = "com.samsung.android.sbrowse
r.contentBlocker.ACTION_SETTING"; | 75 public static final String ACTION_OPEN_SETTINGS = "com.samsung.android.sbrowse
r.contentBlocker.ACTION_SETTING"; |
| 75 public static final String ACTION_UPDATE = "com.samsung.android.sbrowser.conte
ntBlocker.ACTION_UPDATE"; | 76 public static final String ACTION_UPDATE = "com.samsung.android.sbrowser.conte
ntBlocker.ACTION_UPDATE"; |
| 76 public static final String EASYLIST_URL = "https://easylist-downloads.adblockp
lus.org/easylist.txt"; | 77 public static final String EASYLIST_URL = "https://easylist-downloads.adblockp
lus.org/easylist.txt"; |
| 77 | 78 |
| 78 public static final String SUBSCRIPTIONS_EXCEPTIONSURL = "subscriptions_except
ionsurl"; | 79 public static final String SUBSCRIPTIONS_EXCEPTIONSURL = "subscriptions_except
ionsurl"; |
| 79 | 80 |
| 80 private static final String URL_ENCODE_CHARSET = "UTF-8"; | 81 public static final String CHARSET_UTF_8 = "UTF-8"; |
| 81 private static final String PREFS_KEY_PREVIOUS_VERSION = "key_previous_version
"; | 82 private static final String PREFS_KEY_PREVIOUS_VERSION = "key_previous_version
"; |
| 82 | 83 |
| 83 // The value below specifies an interval of [x, 2*x[, where x = | 84 // The value below specifies an interval of [x, 2*x[, where x = |
| 84 // INITIAL_UPDATE_CHECK_DELAY_SECONDS | 85 // INITIAL_UPDATE_CHECK_DELAY_SECONDS |
| 85 private static final long INITIAL_UPDATE_CHECK_DELAY_SECONDS = 5; | 86 private static final long INITIAL_UPDATE_CHECK_DELAY_SECONDS = 5; |
| 86 private static final long UPDATE_CHECK_INTERVAL_MINUTES = 30; | 87 private static final long UPDATE_CHECK_INTERVAL_MINUTES = 30; |
| 87 private static final long BROADCAST_COMBINATION_DELAY_MILLIS = 2500; | 88 private static final long BROADCAST_COMBINATION_DELAY_MILLIS = 2500; |
| 88 | 89 |
| 89 public static final long MILLIS_PER_SECOND = 1000; | 90 public static final long MILLIS_PER_SECOND = 1000; |
| 90 public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND; | 91 public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND; |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 engine.handlerThread.start(); | 434 engine.handlerThread.start(); |
| 434 | 435 |
| 435 engine.downloader = Downloader.create(context, engine); | 436 engine.downloader = Downloader.create(context, engine); |
| 436 | 437 |
| 437 return engine; | 438 return engine; |
| 438 } | 439 } |
| 439 | 440 |
| 440 public static String readFileAsString(InputStream instream) throws IOException | 441 public static String readFileAsString(InputStream instream) throws IOException |
| 441 { | 442 { |
| 442 final StringBuilder sb = new StringBuilder(); | 443 final StringBuilder sb = new StringBuilder(); |
| 443 final BufferedReader r = new BufferedReader(new InputStreamReader(instream,
"UTF-8")); | 444 final BufferedReader r = new BufferedReader(new InputStreamReader(instream,
CHARSET_UTF_8)); |
| 444 for (int ch = r.read(); ch != -1; ch = r.read()) | 445 for (int ch = r.read(); ch != -1; ch = r.read()) |
| 445 { | 446 { |
| 446 sb.append((char) ch); | 447 sb.append((char) ch); |
| 447 } | 448 } |
| 448 return sb.toString(); | 449 return sb.toString(); |
| 449 } | 450 } |
| 450 | 451 |
| 451 public static List<String> readLines(InputStream instream) throws IOException | 452 public static List<String> readLines(InputStream instream) throws IOException |
| 452 { | 453 { |
| 453 final ArrayList<String> list = new ArrayList<String>(); | 454 final ArrayList<String> list = new ArrayList<String>(); |
| 454 final BufferedReader r = new BufferedReader(new InputStreamReader(instream,
"UTF-8")); | 455 final BufferedReader r = new BufferedReader(new InputStreamReader(instream,
CHARSET_UTF_8)); |
| 455 for (String line = r.readLine(); line != null; line = r.readLine()) | 456 for (String line = r.readLine(); line != null; line = r.readLine()) |
| 456 { | 457 { |
| 457 list.add(line); | 458 list.add(line); |
| 458 } | 459 } |
| 459 return list; | 460 return list; |
| 460 } | 461 } |
| 461 | 462 |
| 462 public static File getOrCreateCachedFilterFile(Context context) throws IOExcep
tion | 463 public static File getOrCreateCachedFilterFile(Context context) throws IOExcep
tion |
| 463 { | 464 { |
| 464 final File cachedFilterFile = getCachedFilterFile(context); | 465 final File cachedFilterFile = getCachedFilterFile(context); |
| 465 if (cachedFilterFile != null && cachedFilterFile.exists()) | 466 if (cachedFilterFile != null && cachedFilterFile.exists()) |
| 466 { | 467 { |
| 467 Log.d(TAG, "Cached filter file found: " + cachedFilterFile); | 468 Log.d(TAG, "Cached filter file found: " + cachedFilterFile); |
| 468 return cachedFilterFile; | 469 return cachedFilterFile; |
| 469 } | 470 } |
| 470 | 471 |
| 471 Log.d(TAG, "Cached filter file not found. Using dummy filter file"); | 472 Log.d(TAG, "Cached filter file not found. Using dummy filter file"); |
| 472 final File dummyFilterFile = getDummyFilterFile(context); | 473 final File dummyFilterFile = getDummyFilterFile(context); |
| 473 if (!dummyFilterFile.exists()) | 474 if (!dummyFilterFile.exists()) |
| 474 { | 475 { |
| 475 Log.d(TAG, "Creating dummy filter file..."); | 476 Log.d(TAG, "Creating dummy filter file..."); |
| 476 dummyFilterFile.getParentFile().mkdirs(); | 477 dummyFilterFile.getParentFile().mkdirs(); |
| 477 final BufferedWriter writer = new BufferedWriter( | 478 final BufferedWriter writer = new BufferedWriter( |
| 478 new OutputStreamWriter(new FileOutputStream(dummyFilterFile), "UTF-8")
); | 479 new OutputStreamWriter(new FileOutputStream(dummyFilterFile), CHARSET_
UTF_8)); |
| 479 try | 480 try |
| 480 { | 481 { |
| 481 writeFilterHeaders(writer); | 482 writeFilterHeaders(writer); |
| 482 } | 483 } |
| 483 finally | 484 finally |
| 484 { | 485 { |
| 485 writer.close(); | 486 writer.close(); |
| 486 } | 487 } |
| 487 } | 488 } |
| 488 return dummyFilterFile; | 489 return dummyFilterFile; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 if (sub.getURL().getQuery() != null) | 530 if (sub.getURL().getQuery() != null) |
| 530 { | 531 { |
| 531 sb.append('&'); | 532 sb.append('&'); |
| 532 } | 533 } |
| 533 else | 534 else |
| 534 { | 535 { |
| 535 sb.append('?'); | 536 sb.append('?'); |
| 536 } | 537 } |
| 537 | 538 |
| 538 sb.append("addonName="); | 539 sb.append("addonName="); |
| 539 sb.append(URLEncoder.encode(this.appInfo.addonName, URL_ENCODE_CHARSET)); | 540 sb.append(URLEncoder.encode(this.appInfo.addonName, CHARSET_UTF_8)); |
| 540 sb.append("&addonVersion="); | 541 sb.append("&addonVersion="); |
| 541 sb.append(URLEncoder.encode(this.appInfo.addonVersion, URL_ENCODE_CHARSET)); | 542 sb.append(URLEncoder.encode(this.appInfo.addonVersion, CHARSET_UTF_8)); |
| 542 sb.append("&application="); | 543 sb.append("&application="); |
| 543 sb.append(URLEncoder.encode(this.appInfo.application, URL_ENCODE_CHARSET)); | 544 sb.append(URLEncoder.encode(this.appInfo.application, CHARSET_UTF_8)); |
| 544 sb.append("&applicationVersion="); | 545 sb.append("&applicationVersion="); |
| 545 sb.append(URLEncoder.encode(this.appInfo.applicationVersion, URL_ENCODE_CHAR
SET)); | 546 sb.append(URLEncoder.encode(this.appInfo.applicationVersion, CHARSET_UTF_8))
; |
| 546 sb.append("&platform="); | 547 sb.append("&platform="); |
| 547 sb.append(URLEncoder.encode(this.appInfo.platform, URL_ENCODE_CHARSET)); | 548 sb.append(URLEncoder.encode(this.appInfo.platform, CHARSET_UTF_8)); |
| 548 sb.append("&platformVersion="); | 549 sb.append("&platformVersion="); |
| 549 sb.append(URLEncoder.encode(this.appInfo.platformVersion, URL_ENCODE_CHARSET
)); | 550 sb.append(URLEncoder.encode(this.appInfo.platformVersion, CHARSET_UTF_8)); |
| 550 sb.append("&lastVersion="); | 551 sb.append("&lastVersion="); |
| 551 sb.append(sub.getVersion()); | 552 sb.append(sub.getVersion()); |
| 552 sb.append("&downloadCount="); | 553 sb.append("&downloadCount="); |
| 553 final long downloadCount = sub.getDownloadCount(); | 554 final long downloadCount = sub.getDownloadCount(); |
| 554 if (downloadCount < 5) | 555 if (downloadCount < 5) |
| 555 { | 556 { |
| 556 sb.append(downloadCount); | 557 sb.append(downloadCount); |
| 557 } | 558 } |
| 558 else | 559 else |
| 559 { | 560 { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 this.headers.putAll(headers); | 705 this.headers.putAll(headers); |
| 705 } | 706 } |
| 706 } | 707 } |
| 707 } | 708 } |
| 708 | 709 |
| 709 public void enqueueDownload(final Subscription sub, final boolean forced) thro
ws IOException | 710 public void enqueueDownload(final Subscription sub, final boolean forced) thro
ws IOException |
| 710 { | 711 { |
| 711 if (sub.getURL() != null && sub.shouldUpdate(forced)) | 712 if (sub.getURL() != null && sub.shouldUpdate(forced)) |
| 712 { | 713 { |
| 713 final HashMap<String, String> headers = new HashMap<String, String>(); | 714 final HashMap<String, String> headers = new HashMap<String, String>(); |
| 714 final String lastModified = sub.getMeta(Subscription.KEY_HTTP_LAST_MODIFIE
D); | 715 if (sub.isMetaDataValid() && sub.isFiltersValid()) |
| 715 if (lastModified != null) | 716 { |
| 716 { | 717 final String lastModified = sub.getMeta(Subscription.KEY_HTTP_LAST_MODIF
IED); |
| 717 headers.put("If-Modified-Since", lastModified); | 718 if (!TextUtils.isEmpty(lastModified)) |
| 718 } | 719 { |
| 719 final String etag = sub.getMeta(Subscription.KEY_HTTP_ETAG); | 720 headers.put("If-Modified-Since", lastModified); |
| 720 if (etag != null) | 721 } |
| 721 { | 722 final String etag = sub.getMeta(Subscription.KEY_HTTP_ETAG); |
| 722 headers.put("If-None-Match", etag); | 723 if (!TextUtils.isEmpty(etag)) |
| 724 { |
| 725 headers.put("If-None-Match", etag); |
| 726 } |
| 723 } | 727 } |
| 724 Log.d(TAG, headers.toString()); | 728 Log.d(TAG, headers.toString()); |
| 725 this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(),
headers); | 729 this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(),
headers); |
| 726 } | 730 } |
| 727 } | 731 } |
| 728 | 732 |
| 729 public void connectivityChanged() | 733 public void connectivityChanged() |
| 730 { | 734 { |
| 731 this.downloader.connectivityChanged(); | 735 this.downloader.connectivityChanged(); |
| 732 } | 736 } |
| 733 } | 737 } |
| LEFT | RIGHT |