Index: adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/MoreBlockingPreferenceCategory.java
===================================================================
--- a/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/MoreBlockingPreferenceCategory.java
+++ b/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/MoreBlockingPreferenceCategory.java
@@ -26,16 +26,17 @@ import java.util.List;
import java.util.Map;
import org.adblockplus.sbrowser.contentblocker.engine.DefaultSubscriptionInfo;
import org.adblockplus.sbrowser.contentblocker.engine.Engine;
import org.adblockplus.sbrowser.contentblocker.engine.EngineManager;
import org.adblockplus.sbrowser.contentblocker.engine.SubscriptionInfo;
import org.adblockplus.adblockplussbrowser.R;
import org.adblockplus.sbrowser.contentblocker.preferences.MultilineCheckBoxPreference;
+import org.adblockplus.sbrowser.contentblocker.util.SubscriptionUtils;
import android.content.Context;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.Preference.OnPreferenceChangeListener;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.util.Log;
@@ -209,16 +210,21 @@ public class MoreBlockingPreferenceCateg
return moreBlockingPreferenceSubscriptions;
}
for (SubscriptionInfo sub : engine.getListedSubscriptions())
{
final DefaultSubscriptionInfo info = engine.getDefaultSubscriptionInfoForUrl(sub.getUrl());
Integer resInt = URL_TO_RES_ID_MAP.get(sub.getUrl());
+ if (SubscriptionUtils.isNotificationSubscription(sub.getId()))
+ {
+ continue;
+ }
+
if (sub.getType() == SubscriptionInfo.Type.CUSTOM)
{
moreBlockingPreferenceSubscriptions.add(sub);
continue;
}
if (info != null && !info.isComplete() && sub.isEnabled())
{
Index: adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Engine.java
===================================================================
--- a/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Engine.java
+++ b/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Engine.java
@@ -421,16 +421,23 @@ public final class Engine
final Subscription exceptions = engine.subscriptions.add(Subscription
.create(engine.getPrefsDefault(SUBSCRIPTIONS_EXCEPTIONSURL))
.parseLines(readLines(exceptionsTxt)));
exceptions.putMeta(Subscription.KEY_UPDATE_TIMESTAMP, "0");
exceptions.setEnabled(true);
}
Log.d(TAG, "Added and enabled bundled exceptionslist");
+ // The Notification should be download every 24 hrs., no matter if its content changed or not.
+ final Subscription notification = engine.subscriptions.add(Subscription
+ .create(Notification.NOTIFICATION_URL));
+ notification.putMeta(Subscription.KEY_UPDATE_TIMESTAMP, "0");
+ notification.setEnabled(true);
+ Log.d(TAG, "Initialized Notification");
+
int additional = 0;
for (final Subscription sub : engine.defaultSubscriptions.createSubscriptions())
{
if (!engine.subscriptions.hasSubscription(sub.getId()))
{
additional++;
engine.subscriptions.add(sub);
}
Index: adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Notification.java
===================================================================
new file mode 100644
--- /dev/null
+++ b/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Notification.java
@@ -0,0 +1,25 @@
+/*
+ * This file is part of Adblock Plus ,
+ * Copyright (C) 2006-present eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * 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 .
+ */
+
+package org.adblockplus.sbrowser.contentblocker.engine;
+
+public class Notification
+{
+ public static final String TAG = Notification.class.getSimpleName();
+ public static final String NOTIFICATION_URL = "https://notification.adblockplus.org/notification.json";
+ public static final String NOTIFICATON_DATA_FILE_NAME = TAG.toLowerCase() + ".abp";
+}
Index: adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Subscription.java
===================================================================
--- a/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Subscription.java
+++ b/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Subscription.java
@@ -601,9 +601,37 @@ final class Subscription
if (filtersChanged)
{
this.serializeFilters(filtersFile);
this.clearFilters();
}
return filtersChanged;
}
+
+ void updateNotification(final int responseCode, final String text, final File notificationDataFile,
+ final File metaFile) throws IOException
+ {
+ if (responseCode != 200 || text == null)
+ {
+ this.meta.put(KEY_TRIED_UPDATE_TIMESTAMP, Long.toString(System.currentTimeMillis()));
+ }
+ else
+ {
+ this.meta.put(KEY_UPDATE_TIMESTAMP, Long.toString(System.currentTimeMillis()));
+ saveNotificationData(notificationDataFile, text);
+ }
+ serializeMetaData(metaFile);
+ }
+
+ private void saveNotificationData(final File filtersFile, final String text)
+ {
+ try (final DataOutputStream outputStream = new DataOutputStream(new BufferedOutputStream(
+ new GZIPOutputStream(new FileOutputStream(filtersFile)))))
+ {
+ outputStream.write(text.getBytes());
+ }
+ catch (IOException e)
+ {
+ Log.d(TAG, "Failed to write notification data to internal storage.", e);
+ }
+ }
}
Index: adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Subscriptions.java
===================================================================
--- a/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Subscriptions.java
+++ b/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/engine/Subscriptions.java
@@ -26,16 +26,17 @@ import java.nio.charset.StandardCharsets
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.adblockplus.sbrowser.contentblocker.engine.Subscription.Type;
+import org.adblockplus.sbrowser.contentblocker.util.SubscriptionUtils;
import android.util.Log;
/**
* This class holds all listed subscriptions and manages the subscription
* aggregation cache folder.
*/
final class Subscriptions
@@ -139,16 +140,21 @@ final class Subscriptions
else
{
filtersFile = new File(this.subscriptionFolder, "url_"
+ new File(sub.getURL().getPath()).getName() + ".sub");
}
return filtersFile;
}
+ private File getNotificationDataFile()
+ {
+ return new File (this.subscriptionFolder, Notification.NOTIFICATON_DATA_FILE_NAME);
+ }
+
File getMetaFile(final Subscription sub)
{
return new File(getFiltersFile(sub).getAbsolutePath() + ".meta");
}
void persistSubscription(final Subscription sub) throws IOException
{
sub.serializeSubscription(this.getMetaFile(sub), this.getFiltersFile(sub));
@@ -169,17 +175,17 @@ final class Subscriptions
* @param output
* @throws IOException
*/
private void writeFile(final File output) throws IOException
{
final HashSet filters = new HashSet<>();
for (final Subscription s : this.subscriptions.values())
{
- if (s.isEnabled())
+ if (s.isEnabled() && !SubscriptionUtils.isNotificationSubscription(s.getId()))
{
Log.d(TAG, "Adding filters for '" + s.getId() + "'");
s.deserializeFilters(this.getFiltersFile(s));
s.copyFilters(filters);
s.clearFilters();
}
if ((!s.isMetaDataValid() || !s.isFiltersValid()) && s.getURL() != null)
{
@@ -283,16 +289,21 @@ final class Subscriptions
public void updateSubscription(final String id, final int responseCode, final String text,
final Map httpHeaders)
throws IOException
{
final Subscription sub = this.subscriptions.get(id);
if (sub != null)
{
- if (sub.updateSubscription(responseCode, text, httpHeaders, this.getMetaFile(sub),
+ if (SubscriptionUtils.isNotificationSubscription(id))
+ {
+ sub.updateNotification(responseCode, text, getNotificationDataFile(), getMetaFile(sub));
+ return;
+ }
+ if (sub.updateSubscription(id, responseCode, text, httpHeaders, this.getMetaFile(sub),
this.getFiltersFile(sub)))
{
this.engine.requestUpdateBroadcast();
}
}
}
}
Index: adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/util/SubscriptionUtils.java
===================================================================
--- a/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/util/SubscriptionUtils.java
+++ b/adblockplussbrowser/src/main/java/org/adblockplus/sbrowser/contentblocker/util/SubscriptionUtils.java
@@ -17,16 +17,17 @@
package org.adblockplus.sbrowser.contentblocker.util;
import java.util.List;
import java.util.Locale;
import org.adblockplus.sbrowser.contentblocker.engine.DefaultSubscriptionInfo;
import org.adblockplus.sbrowser.contentblocker.engine.Engine;
+import org.adblockplus.sbrowser.contentblocker.engine.Notification;
import android.content.res.Resources;
public class SubscriptionUtils
{
private static final String INDONESIAN_OLD = "in";
private static final String INDONESIAN_NEW = "id";
@@ -83,9 +84,14 @@ public class SubscriptionUtils
case YIDDISH_OLD:
return YIDDISH_NEW;
case INDONESIAN_OLD:
return INDONESIAN_NEW;
default:
return language;
}
}
+
+ public static boolean isNotificationSubscription(final String id)
+ {
+ return id != null && id.contains(Notification.NOTIFICATION_URL);
+ }
}