| 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-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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 import android.content.pm.PackageInfo; | 52 import android.content.pm.PackageInfo; |
| 53 import android.content.pm.PackageManager; | 53 import android.content.pm.PackageManager; |
| 54 import android.content.pm.ResolveInfo; | 54 import android.content.pm.ResolveInfo; |
| 55 import android.net.ConnectivityManager; | 55 import android.net.ConnectivityManager; |
| 56 import android.net.NetworkInfo; | 56 import android.net.NetworkInfo; |
| 57 import android.net.Uri; | 57 import android.net.Uri; |
| 58 import android.os.Handler; | 58 import android.os.Handler; |
| 59 import android.os.Looper; | 59 import android.os.Looper; |
| 60 import android.preference.PreferenceManager; | 60 import android.preference.PreferenceManager; |
| 61 import android.text.TextUtils; | 61 import android.text.TextUtils; |
| 62 import android.text.format.DateUtils; |
| 62 import android.util.Log; | 63 import android.util.Log; |
| 63 | 64 |
| 64 public final class Engine | 65 public final class Engine |
| 65 { | 66 { |
| 66 private static final String TAG = Engine.class.getSimpleName(); | 67 private static final String TAG = Engine.class.getSimpleName(); |
| 67 | 68 |
| 68 // TODO make use of this regex's | 69 // TODO make use of this regex's |
| 69 public static final Pattern RE_SUBSCRIPTION_HEADER = Pattern.compile( | 70 public static final Pattern RE_SUBSCRIPTION_HEADER = Pattern.compile( |
| 70 "\\[Adblock(?:\\s*Plus\\s*([\\d\\.]+)?)?\\]", Pattern.CASE_INSENSITIVE); | 71 "\\[Adblock(?:\\s*Plus\\s*([\\d\\.]+)?)?\\]", Pattern.CASE_INSENSITIVE); |
| 71 public static final Pattern RE_FILTER_META = Pattern.compile("^\\s*!\\s*(\\w+)
\\s*:\\s*(.*)"); | 72 public static final Pattern RE_FILTER_META = Pattern.compile("^\\s*!\\s*(\\w+)
\\s*:\\s*(.*)"); |
| 72 public static final Pattern RE_FILTER_ELEMHIDE = Pattern | 73 public static final Pattern RE_FILTER_ELEMHIDE = Pattern |
| 73 .compile("^([^\\/\\*\\|\\@\"!]*?)#(\\@)?(?:([\\w\\-]+|\\*)((?:\\([\\w\\-]+
(?:[$^*]?=[^\\(\\)\"]*)?\\))*)|#([^{}]+))$"); | 74 .compile("^([^\\/\\*\\|\\@\"!]*?)#(\\@)?(?:([\\w\\-]+|\\*)((?:\\([\\w\\-]+
(?:[$^*]?=[^\\(\\)\"]*)?\\))*)|#([^{}]+))$"); |
| 74 public static final Pattern RE_FILTER_REGEXP = Pattern | 75 public static final Pattern RE_FILTER_REGEXP = Pattern |
| 75 .compile("^(@@)?\\/.*\\/(?:\\$~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=
[^,\\s]+)?)*)?$"); | 76 .compile("^(@@)?\\/.*\\/(?:\\$~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=
[^,\\s]+)?)*)?$"); |
| 76 public static final Pattern RE_FILTER_OPTIONS = Pattern | 77 public static final Pattern RE_FILTER_OPTIONS = Pattern |
| 77 .compile("\\$(~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=[^,\\s]+)?)*)$")
; | 78 .compile("\\$(~?[\\w\\-]+(?:=[^,\\s]+)?(?:,~?[\\w\\-]+(?:=[^,\\s]+)?)*)$")
; |
| 78 public static final Pattern RE_FILTER_CSSPROPERTY = Pattern | 79 public static final Pattern RE_FILTER_CSSPROPERTY = Pattern |
| 79 .compile("\\[\\-abp\\-properties=([\"'])([^\"']+)\\1\\]"); | 80 .compile("\\[\\-abp\\-properties=([\"'])([^\"']+)\\1\\]"); |
| 80 | 81 |
| 81 public static final String USER_FILTERS_TITLE = "__filters"; | 82 public static final String USER_FILTERS_TITLE = "__filters"; |
| 82 public static final String USER_EXCEPTIONS_TITLE = "__exceptions"; | 83 public static final String USER_EXCEPTIONS_TITLE = "__exceptions"; |
| 83 | 84 |
| 84 public static final String SBROWSER_APP_ID = "com.sec.android.app.sbrowser"; | 85 public static final String SBROWSER_APP_ID = "com.sec.android.app.sbrowser"; |
| 85 public static final String ACTION_OPEN_SETTINGS = "com.samsung.android.sbrowse
r.contentBlocker.ACTION_SETTING"; | 86 private static final String ACTION_OPEN_SETTINGS = "com.samsung.android.sbrows
er.contentBlocker.ACTION_SETTING"; |
| 86 public static final String ACTION_UPDATE = "com.samsung.android.sbrowser.conte
ntBlocker.ACTION_UPDATE"; | 87 private static final String ACTION_UPDATE = "com.samsung.android.sbrowser.cont
entBlocker.ACTION_UPDATE"; |
| 87 public static final String EASYLIST_URL = "https://easylist-downloads.adblockp
lus.org/easylist.txt"; | 88 private static final String EASYLIST_URL = "https://easylist-downloads.adblock
plus.org/easylist.txt"; |
| 88 | 89 |
| 89 public static final String SUBSCRIPTIONS_EXCEPTIONSURL = "subscriptions_except
ionsurl"; | 90 public static final String SUBSCRIPTIONS_EXCEPTIONSURL = "subscriptions_except
ionsurl"; |
| 90 | 91 |
| 91 private static final String PREFS_KEY_PREVIOUS_VERSION = "key_previous_version
"; | 92 private static final String PREFS_KEY_PREVIOUS_VERSION = "key_previous_version
"; |
| 92 | 93 |
| 93 // The value below specifies an interval of [x, 2*x[, where x = | 94 // The value below specifies an interval of [x, 2*x[, where x = |
| 94 // INITIAL_UPDATE_CHECK_DELAY_SECONDS | 95 // INITIAL_UPDATE_CHECK_DELAY |
| 95 private static final long INITIAL_UPDATE_CHECK_DELAY_SECONDS = 5; | 96 private static final long INITIAL_UPDATE_CHECK_DELAY = 5 * DateUtils.SECOND_IN
_MILLIS; |
| 96 private static final long UPDATE_CHECK_INTERVAL_MINUTES = 30; | 97 private static final long UPDATE_CHECK_INTERVAL = 30 * DateUtils.MINUTE_IN_MIL
LIS; |
| 97 private static final long BROADCAST_COMBINATION_DELAY_MILLIS = 2500; | 98 private static final long BROADCAST_COMBINATION_DELAY = 2500; |
| 98 | |
| 99 public static final long MILLIS_PER_SECOND = 1000; | |
| 100 public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND; | |
| 101 public static final long MILLIS_PER_HOUR = 60 * MILLIS_PER_MINUTE; | |
| 102 public static final long MILLIS_PER_DAY = 24 * MILLIS_PER_HOUR; | |
| 103 | 99 |
| 104 private static final int NO_FLAG = 0; | 100 private static final int NO_FLAG = 0; |
| 105 private static final int OLDEST_SAMSUNG_INTERNET_5_VERSIONCODE = 500000000; | 101 private static final int OLDEST_SAMSUNG_INTERNET_5_VERSIONCODE = 500000000; |
| 106 | 102 |
| 107 private final ReentrantLock accessLock = new ReentrantLock(); | 103 private final ReentrantLock accessLock = new ReentrantLock(); |
| 108 private DefaultSubscriptions defaultSubscriptions; | 104 private DefaultSubscriptions defaultSubscriptions; |
| 109 private Subscriptions subscriptions; | 105 private Subscriptions subscriptions; |
| 110 private JSONPrefs jsonPrefs; | 106 private JSONPrefs jsonPrefs; |
| 111 private AppInfo appInfo; | 107 private AppInfo appInfo; |
| 112 private LinkedBlockingQueue<EngineEvent> engineEvents = new LinkedBlockingQueu
e<>(); | 108 private final LinkedBlockingQueue<EngineEvent> engineEvents = new LinkedBlocki
ngQueue<>(); |
| 113 private Thread handlerThread; | 109 private Thread handlerThread; |
| 114 private Downloader downloader; | 110 private Downloader downloader; |
| 115 private final Context serviceContext; | 111 private final Context serviceContext; |
| 116 private boolean wasFirstRun = false; | 112 private boolean wasFirstRun = false; |
| 117 private long nextUpdateBroadcast = Long.MAX_VALUE; | 113 private long nextUpdateBroadcast = Long.MAX_VALUE; |
| 118 | 114 |
| 119 private Engine(final Context context) | 115 private Engine(final Context context) |
| 120 { | 116 { |
| 121 this.serviceContext = context; | 117 this.serviceContext = context; |
| 122 } | 118 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 Log.d(TAG, "No compatible Samsung Browser found.", e); | 183 Log.d(TAG, "No compatible Samsung Browser found.", e); |
| 188 return false; | 184 return false; |
| 189 } | 185 } |
| 190 } | 186 } |
| 191 | 187 |
| 192 public void requestUpdateBroadcast() | 188 public void requestUpdateBroadcast() |
| 193 { | 189 { |
| 194 this.lock(); | 190 this.lock(); |
| 195 try | 191 try |
| 196 { | 192 { |
| 197 this.nextUpdateBroadcast = System.currentTimeMillis() + BROADCAST_COMBINAT
ION_DELAY_MILLIS; | 193 this.nextUpdateBroadcast = System.currentTimeMillis() + BROADCAST_COMBINAT
ION_DELAY; |
| 198 } | 194 } |
| 199 finally | 195 finally |
| 200 { | 196 { |
| 201 this.unlock(); | 197 this.unlock(); |
| 202 } | 198 } |
| 203 } | 199 } |
| 204 | 200 |
| 205 private void writeFileAndSendUpdateBroadcast() | 201 private void writeFileAndSendUpdateBroadcast() |
| 206 { | 202 { |
| 207 createAndWriteFile(); | 203 createAndWriteFile(); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 436 } | 432 } |
| 437 | 433 |
| 438 Log.d(TAG, "Added " + additional + " additional default/built-in subscript
ions"); | 434 Log.d(TAG, "Added " + additional + " additional default/built-in subscript
ions"); |
| 439 engine.subscriptions.persistSubscriptions(); | 435 engine.subscriptions.persistSubscriptions(); |
| 440 } | 436 } |
| 441 | 437 |
| 442 engine.handlerThread = new Thread(new EventHandler(engine)); | 438 engine.handlerThread = new Thread(new EventHandler(engine)); |
| 443 engine.handlerThread.setDaemon(true); | 439 engine.handlerThread.setDaemon(true); |
| 444 engine.handlerThread.start(); | 440 engine.handlerThread.start(); |
| 445 | 441 |
| 446 engine.downloader = Downloader.create(context, engine); | 442 engine.downloader = Downloader.create(engine); |
| 447 | 443 |
| 448 final File cachedFilterFile = getCachedFilterFile(context); | 444 final File cachedFilterFile = getCachedFilterFile(context); |
| 449 if (cachedFilterFile == null || !cachedFilterFile.exists()) | 445 if (cachedFilterFile == null || !cachedFilterFile.exists()) |
| 450 { | 446 { |
| 451 engine.writeFileAndSendUpdateBroadcast(); | 447 engine.writeFileAndSendUpdateBroadcast(); |
| 452 } | 448 } |
| 453 | 449 |
| 454 return engine; | 450 return engine; |
| 455 } | 451 } |
| 456 | 452 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 621 { | 617 { |
| 622 this.engine = engine; | 618 this.engine = engine; |
| 623 } | 619 } |
| 624 | 620 |
| 625 @Override | 621 @Override |
| 626 public void run() | 622 public void run() |
| 627 { | 623 { |
| 628 Log.d(TAG, "Handler thread started"); | 624 Log.d(TAG, "Handler thread started"); |
| 629 boolean interrupted = false; | 625 boolean interrupted = false; |
| 630 long nextUpdateCheck = System.currentTimeMillis() | 626 long nextUpdateCheck = System.currentTimeMillis() |
| 631 + (long) ((1 + Math.random()) * INITIAL_UPDATE_CHECK_DELAY_SECONDS * M
ILLIS_PER_SECOND); | 627 + (long) ((1 + Math.random()) * INITIAL_UPDATE_CHECK_DELAY); |
| 632 while (!interrupted) | 628 while (!interrupted) |
| 633 { | 629 { |
| 634 try | 630 try |
| 635 { | 631 { |
| 636 final EngineEvent event = this.engine.engineEvents.poll(100, TimeUnit.
MILLISECONDS); | 632 final EngineEvent event = this.engine.engineEvents.poll(100, TimeUnit.
MILLISECONDS); |
| 637 engine.lock(); | 633 engine.lock(); |
| 638 try | 634 try |
| 639 { | 635 { |
| 640 if (event != null) | 636 if (event != null) |
| 641 { | 637 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 659 } | 655 } |
| 660 default: | 656 default: |
| 661 Log.d(TAG, "Unhandled type: " + event.getType()); | 657 Log.d(TAG, "Unhandled type: " + event.getType()); |
| 662 break; | 658 break; |
| 663 } | 659 } |
| 664 } | 660 } |
| 665 | 661 |
| 666 final long currentTime = System.currentTimeMillis(); | 662 final long currentTime = System.currentTimeMillis(); |
| 667 if (currentTime > nextUpdateCheck) | 663 if (currentTime > nextUpdateCheck) |
| 668 { | 664 { |
| 669 nextUpdateCheck = currentTime + UPDATE_CHECK_INTERVAL_MINUTES * MI
LLIS_PER_MINUTE; | 665 nextUpdateCheck = currentTime + UPDATE_CHECK_INTERVAL; |
| 670 | 666 |
| 671 this.engine.subscriptions.checkForUpdates(); | 667 this.engine.subscriptions.checkForUpdates(); |
| 672 } | 668 } |
| 673 | 669 |
| 674 if (currentTime > this.engine.nextUpdateBroadcast) | 670 if (currentTime > this.engine.nextUpdateBroadcast) |
| 675 { | 671 { |
| 676 this.engine.nextUpdateBroadcast = Long.MAX_VALUE; | 672 this.engine.nextUpdateBroadcast = Long.MAX_VALUE; |
| 677 Log.d(TAG, "Sending update broadcast"); | 673 Log.d(TAG, "Sending update broadcast"); |
| 678 this.engine.writeFileAndSendUpdateBroadcast(); | 674 this.engine.writeFileAndSendUpdateBroadcast(); |
| 679 } | 675 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 701 { | 697 { |
| 702 public enum EngineEventType | 698 public enum EngineEventType |
| 703 { | 699 { |
| 704 CHANGE_ENABLED_STATE, | 700 CHANGE_ENABLED_STATE, |
| 705 FORCE_DOWNLOAD, | 701 FORCE_DOWNLOAD, |
| 706 DOWNLOAD_FINISHED | 702 DOWNLOAD_FINISHED |
| 707 } | 703 } |
| 708 | 704 |
| 709 private final EngineEventType type; | 705 private final EngineEventType type; |
| 710 | 706 |
| 711 protected EngineEvent(final EngineEventType type) | 707 EngineEvent(final EngineEventType type) |
| 712 { | 708 { |
| 713 this.type = type; | 709 this.type = type; |
| 714 } | 710 } |
| 715 | 711 |
| 716 public EngineEventType getType() | 712 public EngineEventType getType() |
| 717 { | 713 { |
| 718 return this.type; | 714 return this.type; |
| 719 } | 715 } |
| 720 } | 716 } |
| 721 | 717 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 776 Log.d(TAG, headers.toString()); | 772 Log.d(TAG, headers.toString()); |
| 777 this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(),
headers); | 773 this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(),
headers); |
| 778 } | 774 } |
| 779 } | 775 } |
| 780 | 776 |
| 781 public void connectivityChanged() | 777 public void connectivityChanged() |
| 782 { | 778 { |
| 783 this.downloader.connectivityChanged(); | 779 this.downloader.connectivityChanged(); |
| 784 } | 780 } |
| 785 } | 781 } |
| OLD | NEW |