| 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"); |
| + } |
| + } |
| } |