| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * This file is part of the Adblock Plus, | 2 * This file is part of the Adblock Plus, |
| 3 * Copyright (C) 2006-2012 Eyeo GmbH | 3 * Copyright (C) 2006-2012 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 43 import javax.xml.parsers.SAXParser; | 43 import javax.xml.parsers.SAXParser; |
| 44 import javax.xml.parsers.SAXParserFactory; | 44 import javax.xml.parsers.SAXParserFactory; |
| 45 | 45 |
| 46 import org.adblockplus.android.updater.AlarmReceiver; | 46 import org.adblockplus.android.updater.AlarmReceiver; |
| 47 import org.apache.commons.lang.StringEscapeUtils; | 47 import org.apache.commons.lang.StringEscapeUtils; |
| 48 import org.apache.commons.lang.StringUtils; | 48 import org.apache.commons.lang.StringUtils; |
| 49 import org.json.JSONException; | 49 import org.json.JSONException; |
| 50 import org.json.JSONObject; | 50 import org.json.JSONObject; |
| 51 import org.xml.sax.SAXException; | 51 import org.xml.sax.SAXException; |
| 52 | 52 |
| 53 import android.app.ActivityManager; | |
| 53 import android.app.AlarmManager; | 54 import android.app.AlarmManager; |
| 54 import android.app.Application; | 55 import android.app.Application; |
| 55 import android.app.PendingIntent; | 56 import android.app.PendingIntent; |
| 57 import android.app.ActivityManager.RunningServiceInfo; | |
| 56 import android.content.Context; | 58 import android.content.Context; |
| 57 import android.content.Intent; | 59 import android.content.Intent; |
| 58 import android.content.SharedPreferences; | 60 import android.content.SharedPreferences; |
| 59 import android.content.pm.PackageInfo; | 61 import android.content.pm.PackageInfo; |
| 60 import android.content.pm.PackageManager; | 62 import android.content.pm.PackageManager; |
| 61 import android.content.pm.PackageManager.NameNotFoundException; | 63 import android.content.pm.PackageManager.NameNotFoundException; |
| 62 import android.content.res.AssetManager; | 64 import android.content.res.AssetManager; |
| 63 import android.net.ConnectivityManager; | 65 import android.net.ConnectivityManager; |
| 64 import android.net.NetworkInfo; | 66 import android.net.NetworkInfo; |
| 65 import android.net.Uri; | 67 import android.net.Uri; |
| 66 import android.os.AsyncTask; | 68 import android.os.AsyncTask; |
| 67 import android.os.Build; | 69 import android.os.Build; |
| 68 import android.os.Bundle; | 70 import android.os.Bundle; |
| 69 import android.os.Handler; | 71 import android.os.Handler; |
| 70 import android.os.Message; | 72 import android.os.Message; |
| 71 import android.os.SystemClock; | 73 import android.os.SystemClock; |
| 72 import android.preference.PreferenceManager; | 74 import android.preference.PreferenceManager; |
| 73 import android.provider.Settings; | 75 import android.provider.Settings; |
| 74 import android.util.Log; | 76 import android.util.Log; |
| 75 import android.widget.Toast; | 77 import android.widget.Toast; |
| 76 | 78 |
| 77 public class AdblockPlus extends Application | 79 public class AdblockPlus extends Application |
| 78 { | 80 { |
| 79 private final static String TAG = "Application"; | 81 private final static String TAG = "Application"; |
| 80 | 82 |
| 81 private final static int MSG_TOAST = 1; | 83 private final static int MSG_TOAST = 1; |
| 82 | 84 |
| 83 /** | 85 /** |
| 86 * Broadcasted when filtering is enabled or disabled. | |
| 87 */ | |
| 88 public static final String BROADCAST_FILTERING_CHANGE = "org.adblockplus.andro id.filtering.status"; | |
| 89 /** | |
| 84 * Broadcasted when subscription status changes. | 90 * Broadcasted when subscription status changes. |
| 85 */ | 91 */ |
| 86 public final static String BROADCAST_SUBSCRIPTION_STATUS = "org.adblockplus.an droid.subscription.status"; | 92 public final static String BROADCAST_SUBSCRIPTION_STATUS = "org.adblockplus.an droid.subscription.status"; |
| 87 /** | 93 /** |
| 88 * Broadcasted when filter match check is performed. | 94 * Broadcasted when filter match check is performed. |
| 89 */ | 95 */ |
| 90 public final static String BROADCAST_FILTER_MATCHES = "org.adblockplus.android .filter.matches"; | 96 public final static String BROADCAST_FILTER_MATCHES = "org.adblockplus.android .filter.matches"; |
| 91 | 97 |
| 92 private List<Subscription> subscriptions; | 98 private List<Subscription> subscriptions; |
| 93 | 99 |
| 94 private JSThread js; | 100 private JSThread js; |
| 95 | 101 |
| 96 /** | 102 /** |
| 97 * Indicates interactive mode (used to listen for subscription status | 103 * Indicates interactive mode (used to listen for subscription status |
| 98 * changes). | 104 * changes). |
| 99 */ | 105 */ |
| 100 private boolean interactive = false; | 106 private boolean interactive = false; |
| 101 | 107 |
| 108 /** | |
| 109 * Indicates whether filtering is enabled or not. | |
| 110 */ | |
| 111 private boolean filteringEnabled = false; | |
| 112 | |
| 102 private static AdblockPlus instance; | 113 private static AdblockPlus instance; |
| 103 | 114 |
| 104 /** | 115 /** |
| 105 * Returns pointer to itself (singleton pattern). | 116 * Returns pointer to itself (singleton pattern). |
| 106 */ | 117 */ |
| 107 public static AdblockPlus getApplication() | 118 public static AdblockPlus getApplication() |
| 108 { | 119 { |
| 109 return instance; | 120 return instance; |
| 110 } | 121 } |
| 111 | 122 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 198 public static boolean isWiFiConnected(Context context) | 209 public static boolean isWiFiConnected(Context context) |
| 199 { | 210 { |
| 200 ConnectivityManager connectivityManager = (ConnectivityManager) context.getS ystemService(Context.CONNECTIVITY_SERVICE); | 211 ConnectivityManager connectivityManager = (ConnectivityManager) context.getS ystemService(Context.CONNECTIVITY_SERVICE); |
| 201 NetworkInfo networkInfo = null; | 212 NetworkInfo networkInfo = null; |
| 202 if (connectivityManager != null) | 213 if (connectivityManager != null) |
| 203 { | 214 { |
| 204 networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_ WIFI); | 215 networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_ WIFI); |
| 205 } | 216 } |
| 206 return networkInfo == null ? false : networkInfo.isConnected(); | 217 return networkInfo == null ? false : networkInfo.isConnected(); |
| 207 } | 218 } |
| 219 | |
| 220 /** | |
| 221 * Checks if ProxyService is running. | |
| 222 * | |
| 223 * @return true if service is running | |
| 224 */ | |
| 225 public boolean isServiceRunning() | |
| 226 { | |
| 227 ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVIC E); | |
| 228 // Actually it returns not only running services, so extra check is required | |
| 229 for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VAL UE)) | |
| 230 { | |
| 231 if ("org.adblockplus.android.ProxyService".equals(service.service.getClass Name()) && service.pid > 0) | |
|
Felix Dahlke
2013/03/11 06:57:38
How about ProxyService.getClass().getCanonicalName
Andrey Novikov
2013/03/11 07:32:55
ProxyService.class.getCanonicalName(), done
| |
| 232 return true; | |
| 233 } | |
| 234 return false; | |
| 235 } | |
| 208 | 236 |
| 209 /** | 237 /** |
| 210 * Checks if application can write to external storage. | 238 * Checks if application can write to external storage. |
| 211 */ | 239 */ |
| 212 public boolean checkWriteExternalPermission() | 240 public boolean checkWriteExternalPermission() |
| 213 { | 241 { |
| 214 String permission = "android.permission.WRITE_EXTERNAL_STORAGE"; | 242 String permission = "android.permission.WRITE_EXTERNAL_STORAGE"; |
| 215 int res = checkCallingOrSelfPermission(permission); | 243 int res = checkCallingOrSelfPermission(permission); |
| 216 return res == PackageManager.PERMISSION_GRANTED; | 244 return res == PackageManager.PERMISSION_GRANTED; |
| 217 } | 245 } |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 396 return false; | 424 return false; |
| 397 } | 425 } |
| 398 | 426 |
| 399 /** | 427 /** |
| 400 * Returns ElemHide selectors for domain. | 428 * Returns ElemHide selectors for domain. |
| 401 * | 429 * |
| 402 * @return ready to use HTML element with CSS selectors | 430 * @return ready to use HTML element with CSS selectors |
| 403 */ | 431 */ |
| 404 public String getSelectorsForDomain(final String domain) | 432 public String getSelectorsForDomain(final String domain) |
| 405 { | 433 { |
| 434 if (!filteringEnabled) | |
| 435 return null; | |
| 436 | |
| 406 Future<String> future = js.submit(new Callable<String>() | 437 Future<String> future = js.submit(new Callable<String>() |
| 407 { | 438 { |
| 408 @Override | 439 @Override |
| 409 public String call() throws Exception | 440 public String call() throws Exception |
| 410 { | 441 { |
| 411 String result = (String) js.evaluate("ElemHide.getSelectorsForDomain('" + domain + "')"); | 442 String result = (String) js.evaluate("ElemHide.getSelectorsForDomain('" + domain + "')"); |
| 412 return result; | 443 return result; |
| 413 } | 444 } |
| 414 }); | 445 }); |
| 415 try | 446 try |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 465 * Request host | 496 * Request host |
| 466 * @param refHost | 497 * @param refHost |
| 467 * Request referrer header | 498 * Request referrer header |
| 468 * @param accept | 499 * @param accept |
| 469 * Request accept header | 500 * Request accept header |
| 470 * @return true if matched filter was found | 501 * @return true if matched filter was found |
| 471 * @throws Exception | 502 * @throws Exception |
| 472 */ | 503 */ |
| 473 public boolean matches(String url, String query, String reqHost, String refHos t, String accept) throws Exception | 504 public boolean matches(String url, String query, String reqHost, String refHos t, String accept) throws Exception |
| 474 { | 505 { |
| 506 if (!filteringEnabled) | |
| 507 return false; | |
| 508 | |
| 475 Callable<Boolean> callable = new MatchesCallable(url, query, reqHost, refHos t, accept); | 509 Callable<Boolean> callable = new MatchesCallable(url, query, reqHost, refHos t, accept); |
| 476 Future<Boolean> future = js.submit(callable); | 510 Future<Boolean> future = js.submit(callable); |
| 477 boolean matches = future.get().booleanValue(); | 511 boolean matches = future.get().booleanValue(); |
| 478 sendBroadcast(new Intent(BROADCAST_FILTER_MATCHES).putExtra("url", url).putE xtra("matches", matches)); | 512 sendBroadcast(new Intent(BROADCAST_FILTER_MATCHES).putExtra("url", url).putE xtra("matches", matches)); |
| 479 return matches; | 513 return matches; |
| 480 } | 514 } |
| 481 | 515 |
| 482 /** | 516 /** |
| 517 * Checks if filtering is enabled. | |
| 518 */ | |
| 519 public boolean isFilteringEnabled() | |
| 520 { | |
| 521 return filteringEnabled; | |
| 522 } | |
| 523 | |
| 524 /** | |
| 525 * Enables or disables filtering. | |
| 526 */ | |
| 527 public void setFilteringEnabled(boolean enable) | |
| 528 { | |
| 529 filteringEnabled = enable; | |
| 530 sendBroadcast(new Intent(BROADCAST_FILTERING_CHANGE).putExtra("enabled", fil teringEnabled)); | |
| 531 } | |
| 532 | |
| 533 /** | |
| 483 * Notifies JS code that application entered interactive mode. | 534 * Notifies JS code that application entered interactive mode. |
| 484 */ | 535 */ |
| 485 public void startInteractive() | 536 public void startInteractive() |
| 486 { | 537 { |
| 487 js.execute(new Runnable() | 538 js.execute(new Runnable() |
| 488 { | 539 { |
| 489 @Override | 540 @Override |
| 490 public void run() | 541 public void run() |
| 491 { | 542 { |
| 492 js.evaluate("startInteractive()"); | 543 js.evaluate("startInteractive()"); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 559 /** | 610 /** |
| 560 * Stops JS engine. | 611 * Stops JS engine. |
| 561 * | 612 * |
| 562 * @param implicitly | 613 * @param implicitly |
| 563 * stop even in interactive mode | 614 * stop even in interactive mode |
| 564 */ | 615 */ |
| 565 public void stopEngine(boolean implicitly) | 616 public void stopEngine(boolean implicitly) |
| 566 { | 617 { |
| 567 if ((implicitly || !interactive) && js != null) | 618 if ((implicitly || !interactive) && js != null) |
| 568 { | 619 { |
| 620 Log.i(TAG, "stopEngine"); | |
| 569 js.stopEngine(); | 621 js.stopEngine(); |
| 570 try | 622 try |
| 571 { | 623 { |
| 572 js.join(); | 624 js.join(); |
| 573 } | 625 } |
| 574 catch (InterruptedException e) | 626 catch (InterruptedException e) |
| 575 { | 627 { |
| 576 Log.e(TAG, e.getMessage(), e); | 628 Log.e(TAG, e.getMessage(), e); |
| 577 } | 629 } |
| 630 Log.i(TAG, "Engine stopped"); | |
| 578 js = null; | 631 js = null; |
| 579 } | 632 } |
| 580 } | 633 } |
| 581 | 634 |
| 582 /** | 635 /** |
| 583 * Sets Alarm to call updater after specified number of minutes or after one | 636 * Sets Alarm to call updater after specified number of minutes or after one |
| 584 * day if | 637 * day if |
| 585 * minutes are set to 0. | 638 * minutes are set to 0. |
| 586 * | 639 * |
| 587 * @param minutes | 640 * @param minutes |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 857 jsEngine.callback(callback, params); | 910 jsEngine.callback(callback, params); |
| 858 } | 911 } |
| 859 | 912 |
| 860 public final void stopEngine() | 913 public final void stopEngine() |
| 861 { | 914 { |
| 862 run = false; | 915 run = false; |
| 863 synchronized (queue) | 916 synchronized (queue) |
| 864 { | 917 { |
| 865 queue.notify(); | 918 queue.notify(); |
| 866 } | 919 } |
| 920 System.gc(); | |
|
Felix Dahlke
2013/03/11 06:57:38
I think we shouldn't do this, won't help us work a
Andrey Novikov
2013/03/11 07:32:55
Done.
| |
| 867 } | 921 } |
| 868 | 922 |
| 869 public void execute(Runnable r) | 923 public void execute(Runnable r) |
| 870 { | 924 { |
| 871 synchronized (queue) | 925 synchronized (queue) |
| 872 { | 926 { |
| 873 queue.addLast(r); | 927 queue.addLast(r); |
| 874 queue.notify(); | 928 queue.notify(); |
| 875 } | 929 } |
| 876 } | 930 } |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1089 } | 1143 } |
| 1090 return result; | 1144 return result; |
| 1091 } | 1145 } |
| 1092 | 1146 |
| 1093 protected void onProgressUpdate(Integer... progress) | 1147 protected void onProgressUpdate(Integer... progress) |
| 1094 { | 1148 { |
| 1095 Log.d("HTTP", "Progress: " + progress[0].intValue()); | 1149 Log.d("HTTP", "Progress: " + progress[0].intValue()); |
| 1096 } | 1150 } |
| 1097 } | 1151 } |
| 1098 } | 1152 } |
| OLD | NEW |