| 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 |
| 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; |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 this.nextUpdateBroadcast = System.currentTimeMillis() + BROADCAST_COMBINAT
ION_DELAY_MILLIS; | 161 this.nextUpdateBroadcast = System.currentTimeMillis() + BROADCAST_COMBINAT
ION_DELAY_MILLIS; |
| 158 } | 162 } |
| 159 finally | 163 finally |
| 160 { | 164 { |
| 161 this.unlock(); | 165 this.unlock(); |
| 162 } | 166 } |
| 163 } | 167 } |
| 164 | 168 |
| 165 private void sendUpdateBroadcast() | 169 private void sendUpdateBroadcast() |
| 166 { | 170 { |
| 171 createAndWriteFile(); |
| 172 |
| 167 runOnUiThread(new Runnable() | 173 runOnUiThread(new Runnable() |
| 168 { | 174 { |
| 169 @Override | 175 @Override |
| 170 public void run() | 176 public void run() |
| 171 { | 177 { |
| 172 final Intent intent = new Intent(); | 178 final Intent intent = new Intent(); |
| 173 intent.setAction(ACTION_UPDATE); | 179 intent.setAction(ACTION_UPDATE); |
| 174 intent.setData(Uri.parse("package:" + Engine.this.serviceContext.getPack
ageName())); | 180 intent.setData(Uri.parse("package:" + Engine.this.serviceContext.getPack
ageName())); |
| 175 Engine.this.serviceContext.sendBroadcast(intent); | 181 Engine.this.serviceContext.sendBroadcast(intent); |
| 176 } | 182 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 { | 235 { |
| 230 this.engineEvents.add(new ChangeEnabledStateEvent(id, enabled)); | 236 this.engineEvents.add(new ChangeEnabledStateEvent(id, enabled)); |
| 231 } | 237 } |
| 232 | 238 |
| 233 void downloadFinished(final String id, final int responseCode, final String re
sponse, | 239 void downloadFinished(final String id, final int responseCode, final String re
sponse, |
| 234 final Map<String, String> headers) | 240 final Map<String, String> headers) |
| 235 { | 241 { |
| 236 this.engineEvents.add(new DownloadFinishedEvent(id, responseCode, response,
headers)); | 242 this.engineEvents.add(new DownloadFinishedEvent(id, responseCode, response,
headers)); |
| 237 } | 243 } |
| 238 | 244 |
| 239 public File createAndWriteFile() throws IOException | 245 public void createAndWriteFile() |
| 240 { | 246 { |
| 241 this.lock(); | 247 this.lock(); |
| 242 try | 248 try |
| 243 { | 249 { |
| 244 Log.d(TAG, "Writing filters..."); | 250 Log.d(TAG, "Writing filters..."); |
| 245 return this.subscriptions.createAndWriteFile(); | 251 final File filterFile = this.subscriptions.createAndWriteFile(); |
| 252 |
| 253 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferen
ces(this.serviceContext); |
| 254 final String key = this.serviceContext.getString(R.string.key_cached_filte
r_path); |
| 255 prefs.edit().putString(key, filterFile.getAbsolutePath()).commit(); |
| 256 |
| 257 } |
| 258 catch (IOException e) |
| 259 { |
| 260 Log.e(TAG, "Failed to write filters", e); |
| 246 } | 261 } |
| 247 finally | 262 finally |
| 248 { | 263 { |
| 249 this.unlock(); | 264 this.unlock(); |
| 250 } | 265 } |
| 251 } | 266 } |
| 252 | 267 |
| 253 public static void runOnUiThread(final Runnable runnable) | 268 public static void runOnUiThread(final Runnable runnable) |
| 254 { | 269 { |
| 255 new Handler(Looper.getMainLooper()).post(runnable); | 270 new Handler(Looper.getMainLooper()).post(runnable); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 320 try | 335 try |
| 321 { | 336 { |
| 322 engine.defaultSubscriptions = DefaultSubscriptions.fromStream(subscription
sXml); | 337 engine.defaultSubscriptions = DefaultSubscriptions.fromStream(subscription
sXml); |
| 323 } | 338 } |
| 324 finally | 339 finally |
| 325 { | 340 { |
| 326 subscriptionsXml.close(); | 341 subscriptionsXml.close(); |
| 327 } | 342 } |
| 328 | 343 |
| 329 Log.d(TAG, "Finished reading 'subscriptions.xml'"); | 344 Log.d(TAG, "Finished reading 'subscriptions.xml'"); |
| 330 engine.subscriptions = Subscriptions.initialize(engine, context.getFilesDir(
), | 345 engine.subscriptions = Subscriptions.initialize(engine, getSubscriptionsDir(
context), |
| 331 context.getCacheDir()); | 346 getFilterCacheDir(context)); |
| 332 | 347 |
| 333 final InputStream prefsJson = context.getResources().openRawResource(R.raw.p
refs); | 348 final InputStream prefsJson = context.getResources().openRawResource(R.raw.p
refs); |
| 334 try | 349 try |
| 335 { | 350 { |
| 336 engine.jsonPrefs = JSONPrefs.create(prefsJson); | 351 engine.jsonPrefs = JSONPrefs.create(prefsJson); |
| 337 } | 352 } |
| 338 finally | 353 finally |
| 339 { | 354 { |
| 340 prefsJson.close(); | 355 prefsJson.close(); |
| 341 } | 356 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 { | 401 { |
| 387 additional++; | 402 additional++; |
| 388 engine.subscriptions.add(sub); | 403 engine.subscriptions.add(sub); |
| 389 } | 404 } |
| 390 } | 405 } |
| 391 | 406 |
| 392 Log.d(TAG, "Added " + additional + " additional default/built-in subscript
ions"); | 407 Log.d(TAG, "Added " + additional + " additional default/built-in subscript
ions"); |
| 393 engine.subscriptions.persistSubscriptions(); | 408 engine.subscriptions.persistSubscriptions(); |
| 394 } | 409 } |
| 395 | 410 |
| 411 final File cachedFilterFile = getCachedFilterFile(context); |
| 412 if (cachedFilterFile == null || !cachedFilterFile.exists()) |
| 413 { |
| 414 engine.sendUpdateBroadcast(); |
| 415 } |
| 416 |
| 396 engine.handlerThread = new Thread(new EventHandler(engine)); | 417 engine.handlerThread = new Thread(new EventHandler(engine)); |
| 397 engine.handlerThread.setDaemon(true); | 418 engine.handlerThread.setDaemon(true); |
| 398 engine.handlerThread.start(); | 419 engine.handlerThread.start(); |
| 399 | 420 |
| 400 engine.downloader = Downloader.create(context, engine); | 421 engine.downloader = Downloader.create(context, engine); |
| 401 | 422 |
| 402 return engine; | 423 return engine; |
| 403 } | 424 } |
| 404 | 425 |
| 405 public static String readFileAsString(InputStream instream) throws IOException | 426 public static String readFileAsString(InputStream instream) throws IOException |
| (...skipping 11 matching lines...) Expand all Loading... |
| 417 { | 438 { |
| 418 final ArrayList<String> list = new ArrayList<String>(); | 439 final ArrayList<String> list = new ArrayList<String>(); |
| 419 final BufferedReader r = new BufferedReader(new InputStreamReader(instream,
"UTF-8")); | 440 final BufferedReader r = new BufferedReader(new InputStreamReader(instream,
"UTF-8")); |
| 420 for (String line = r.readLine(); line != null; line = r.readLine()) | 441 for (String line = r.readLine(); line != null; line = r.readLine()) |
| 421 { | 442 { |
| 422 list.add(line); | 443 list.add(line); |
| 423 } | 444 } |
| 424 return list; | 445 return list; |
| 425 } | 446 } |
| 426 | 447 |
| 448 public static File getOrCreateCachedFilterFile(Context context) throws IOExcep
tion |
| 449 { |
| 450 final File cachedFilterFile = getCachedFilterFile(context); |
| 451 if (cachedFilterFile != null && cachedFilterFile.exists()) |
| 452 { |
| 453 Log.d(TAG, "Cached filter file found: " + cachedFilterFile); |
| 454 return cachedFilterFile; |
| 455 } |
| 456 |
| 457 Log.d(TAG, "Cached filter file not found. Using dummy filter file"); |
| 458 final File dummyFilterFile = getDummyFilterFile(context); |
| 459 if (!dummyFilterFile.exists()) |
| 460 { |
| 461 Log.d(TAG, "Creating dummy filter file..."); |
| 462 dummyFilterFile.getParentFile().mkdirs(); |
| 463 final BufferedWriter writer = new BufferedWriter( |
| 464 new OutputStreamWriter(new FileOutputStream(dummyFilterFile), "UTF-8")
); |
| 465 try |
| 466 { |
| 467 writeFilterHeaders(writer); |
| 468 } |
| 469 finally |
| 470 { |
| 471 writer.close(); |
| 472 } |
| 473 } |
| 474 return dummyFilterFile; |
| 475 } |
| 476 |
| 477 public static void writeFilterHeaders(Writer writer) throws IOException |
| 478 { |
| 479 writer.write("[Adblock Plus 2.0]\n"); |
| 480 writer.write("! This file was automatically created.\n"); |
| 481 } |
| 482 |
| 483 private static File getCachedFilterFile(Context context) |
| 484 { |
| 485 final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreference
s(context); |
| 486 final String cachedFilterPath = prefs.getString(context.getString(R.string.k
ey_cached_filter_path), null); |
| 487 if (cachedFilterPath != null) |
| 488 { |
| 489 return new File(cachedFilterPath); |
| 490 } |
| 491 |
| 492 return null; |
| 493 } |
| 494 |
| 495 private static File getDummyFilterFile(Context context) |
| 496 { |
| 497 return new File(getFilterCacheDir(context), "dummy.txt"); |
| 498 } |
| 499 |
| 500 private static File getFilterCacheDir(Context context) |
| 501 { |
| 502 return new File(context.getCacheDir(), "subscriptions"); |
| 503 } |
| 504 |
| 505 private static File getSubscriptionsDir(Context context) |
| 506 { |
| 507 return new File(context.getFilesDir(), "subscriptions"); |
| 508 } |
| 509 |
| 427 URL createDownloadURL(final Subscription sub) throws IOException | 510 URL createDownloadURL(final Subscription sub) throws IOException |
| 428 { | 511 { |
| 429 final StringBuilder sb = new StringBuilder(); | 512 final StringBuilder sb = new StringBuilder(); |
| 430 | 513 |
| 431 sb.append(sub.getURL()); | 514 sb.append(sub.getURL()); |
| 432 if (sub.getURL().getQuery() != null) | 515 if (sub.getURL().getQuery() != null) |
| 433 { | 516 { |
| 434 sb.append('&'); | 517 sb.append('&'); |
| 435 } | 518 } |
| 436 else | 519 else |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 Log.d(TAG, headers.toString()); | 710 Log.d(TAG, headers.toString()); |
| 628 this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(),
headers); | 711 this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(),
headers); |
| 629 } | 712 } |
| 630 } | 713 } |
| 631 | 714 |
| 632 public void connectivityChanged() | 715 public void connectivityChanged() |
| 633 { | 716 { |
| 634 this.downloader.connectivityChanged(); | 717 this.downloader.connectivityChanged(); |
| 635 } | 718 } |
| 636 } | 719 } |
| OLD | NEW |