Index: adblockplussbrowser/src/org/adblockplus/sbrowser/contentblocker/engine/Engine.java |
=================================================================== |
--- a/adblockplussbrowser/src/org/adblockplus/sbrowser/contentblocker/engine/Engine.java |
+++ b/adblockplussbrowser/src/org/adblockplus/sbrowser/contentblocker/engine/Engine.java |
@@ -12,16 +12,34 @@ |
* GNU General Public License for more details. |
* |
* You should have received a copy of the GNU General Public License |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
package org.adblockplus.sbrowser.contentblocker.engine; |
+import android.content.Context; |
+import android.content.Intent; |
+import android.content.SharedPreferences; |
+import android.content.pm.PackageInfo; |
+import android.content.pm.PackageManager; |
+import android.content.pm.ResolveInfo; |
+import android.net.ConnectivityManager; |
+import android.net.NetworkInfo; |
+import android.net.Uri; |
+import android.os.AsyncTask; |
+import android.os.Handler; |
+import android.os.Looper; |
+import android.preference.PreferenceManager; |
+import android.text.TextUtils; |
+import android.util.Log; |
+ |
+import org.adblockplus.adblockplussbrowser.R; |
+ |
import java.io.BufferedReader; |
import java.io.BufferedWriter; |
import java.io.File; |
import java.io.FileOutputStream; |
import java.io.IOException; |
import java.io.InputStream; |
import java.io.InputStreamReader; |
import java.io.OutputStreamWriter; |
@@ -37,34 +55,16 @@ |
import java.util.Map; |
import java.util.Set; |
import java.util.TreeSet; |
import java.util.concurrent.LinkedBlockingQueue; |
import java.util.concurrent.TimeUnit; |
import java.util.concurrent.locks.ReentrantLock; |
import java.util.regex.Pattern; |
-import org.adblockplus.adblockplussbrowser.R; |
-import org.adblockplus.sbrowser.contentblocker.MainPreferences; |
- |
-import android.content.Context; |
-import android.content.Intent; |
-import android.content.SharedPreferences; |
-import android.content.pm.PackageInfo; |
-import android.content.pm.PackageManager; |
-import android.content.pm.ResolveInfo; |
-import android.net.ConnectivityManager; |
-import android.net.NetworkInfo; |
-import android.net.Uri; |
-import android.os.Handler; |
-import android.os.Looper; |
-import android.preference.PreferenceManager; |
-import android.text.TextUtils; |
-import android.util.Log; |
- |
public final class Engine |
{ |
private static final String TAG = Engine.class.getSimpleName(); |
// TODO make use of this regex's |
public static final Pattern RE_SUBSCRIPTION_HEADER = Pattern.compile( |
"\\[Adblock(?:\\s*Plus\\s*([\\d\\.]+)?)?\\]", Pattern.CASE_INSENSITIVE); |
public static final Pattern RE_FILTER_META = Pattern.compile("^\\s*!\\s*(\\w+)\\s*:\\s*(.*)"); |
@@ -275,50 +275,17 @@ |
void downloadFinished(final String id, final int responseCode, final String response, |
final Map<String, String> headers) |
{ |
this.engineEvents.add(new DownloadFinishedEvent(id, responseCode, response, headers)); |
} |
private void createAndWriteFile() |
{ |
- this.lock(); |
- try |
- { |
- Log.d(TAG, "Writing filters..."); |
- final File filterFile = this.subscriptions.createAndWriteFile(); |
- writeWhitelistedWebsites(this.serviceContext, filterFile); |
- |
- final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.serviceContext); |
- final String key = this.serviceContext.getString(R.string.key_cached_filter_path); |
- prefs.edit().putString(key, filterFile.getAbsolutePath()).commit(); |
- |
- Log.d(TAG, "Cleaning up cache..."); |
- final File dummyFile = getDummyFilterFile(this.serviceContext); |
- final File[] cacheDirFiles = getFilterCacheDir(this.serviceContext).listFiles(); |
- if (cacheDirFiles != null) |
- { |
- for (final File file : cacheDirFiles) |
- { |
- if (!file.equals(dummyFile) && !file.equals(filterFile)) |
- { |
- Log.d(TAG, "Deleting file:" + file); |
- file.delete(); |
- } |
- } |
- } |
- } |
- catch (IOException e) |
- { |
- Log.e(TAG, "Failed to write filters", e); |
- } |
- finally |
- { |
- this.unlock(); |
- } |
+ new CreateAndWriteFileAsyncTask().execute(serviceContext, subscriptions); |
diegocarloslima
2017/05/25 21:20:45
I might be wrong, but it seems that the freezing i
jens
2017/06/01 15:32:08
Acknowledged.
|
} |
public static void runOnUiThread(final Runnable runnable) |
{ |
new Handler(Looper.getMainLooper()).post(runnable); |
} |
public boolean isAcceptableAdsEnabled() |
@@ -801,9 +768,92 @@ |
this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(), headers); |
} |
} |
public void connectivityChanged() |
{ |
this.downloader.connectivityChanged(); |
} |
+ |
+ private static class CreateAndWriteFileAsyncTask extends AsyncTask<Object, Void, Void> |
+ { |
+ private static final String TAG = CreateAndWriteFileAsyncTask.class.getSimpleName(); |
+ |
+ @Override |
+ protected Void doInBackground(Object... params) |
+ { |
+ final Context serviceContext = (Context) params[0]; |
+ final Subscriptions subscriptions = (Subscriptions) params[1]; |
+ |
+ createAndWriteFile(serviceContext, subscriptions); |
+ return null; |
+ } |
+ |
+ private void createAndWriteFile(Context serviceContext, Subscriptions subscriptions) |
+ { |
+ try |
+ { |
+ Log.d(TAG, "Writing filters..."); |
+ final File filterFile = subscriptions.createAndWriteFile(); |
+ writeWhitelistedWebsites(serviceContext, filterFile); |
+ |
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(serviceContext); |
+ final String key = serviceContext.getString(R.string.key_cached_filter_path); |
+ prefs.edit().putString(key, filterFile.getAbsolutePath()).commit(); |
+ |
+ Log.d(TAG, "Cleaning up cache..."); |
+ final File dummyFile = getDummyFilterFile(serviceContext); |
+ final File[] cacheDirFiles = getFilterCacheDir(serviceContext).listFiles(); |
+ if (cacheDirFiles != null) |
+ { |
+ for (final File file : cacheDirFiles) |
+ { |
+ if (!file.equals(dummyFile) && !file.equals(filterFile)) |
+ { |
+ Log.d(TAG, "Deleting file:" + file); |
+ file.delete(); |
+ } |
+ } |
+ } |
+ } |
+ catch (IOException e) |
+ { |
+ Log.e(TAG, "Failed to write filters", e); |
+ } |
+ } |
+ |
+ private void writeWhitelistedWebsites(Context context, File filterFile) throws IOException |
+ { |
+ Log.d(TAG, "Writing whitelisted websites..."); |
+ final SharedPreferences prefs = |
+ PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); |
+ final String key = context.getString(R.string.key_whitelisted_websites); |
+ |
+ final Set<String> whitelistedWebsites = new TreeSet<>(); |
+ whitelistedWebsites.addAll(prefs.getStringSet(key, Collections.<String>emptySet())); |
+ |
+ try (BufferedWriter w = new BufferedWriter( |
+ new OutputStreamWriter(new FileOutputStream(filterFile, true), Engine.CHARSET_UTF_8))) { |
+ for (final String url : whitelistedWebsites) { |
+ try { |
+ final URI uri = new URI(url); |
+ final String host = uri.getHost() != null ? uri.getHost() : uri.getPath(); |
+ w.write("@@||" + host + "^$document"); |
+ w.write('\n'); |
+ } catch (URISyntaxException e) { |
+ Log.w(TAG, "Failed to parse whitelisted website: " + url); |
+ } |
+ } |
+ } |
+ } |
+ |
+ private static File getDummyFilterFile(Context context) |
+ { |
+ return new File(getFilterCacheDir(context), "dummy.txt"); |
+ } |
+ |
+ private static File getFilterCacheDir(Context context) |
+ { |
+ return new File(context.getCacheDir(), "subscriptions"); |
+ } |
+ } |
} |