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 |
@@ -42,24 +42,28 @@ import java.util.concurrent.LinkedBlocki |
import java.util.concurrent.TimeUnit; |
import java.util.concurrent.locks.ReentrantLock; |
import org.adblockplus.adblockplussbrowser.R; |
import org.adblockplus.sbrowser.contentblocker.util.ConnectivityUtils; |
import org.adblockplus.sbrowser.contentblocker.util.SharedPrefsUtils; |
import org.adblockplus.sbrowser.contentblocker.util.SubscriptionUtils; |
+import android.app.job.JobInfo; |
+import android.app.job.JobScheduler; |
+import android.content.ComponentName; |
import android.content.Context; |
import android.content.Intent; |
import android.content.pm.PackageInfo; |
import android.content.pm.PackageManager; |
import android.content.pm.ResolveInfo; |
import android.net.Uri; |
import android.os.Handler; |
import android.os.Looper; |
+import android.os.PersistableBundle; |
import android.text.TextUtils; |
import android.text.format.DateUtils; |
import android.util.Log; |
import android.widget.Toast; |
public final class Engine |
{ |
private static final String TAG = Engine.class.getSimpleName(); |
@@ -87,22 +91,25 @@ public final class Engine |
private Subscriptions subscriptions; |
private JSONPrefs jsonPrefs; |
private AppInfo appInfo; |
private final LinkedBlockingQueue<EngineEvent> engineEvents = new LinkedBlockingQueue<>(); |
private Thread handlerThread; |
private Downloader downloader; |
private SubscriptionUpdateCallback subscriptionUpdateCallback; |
private final Context context; |
+ private ComponentName componentName; |
private boolean wasFirstRun = false; |
private long nextUpdateBroadcast = Long.MAX_VALUE; |
+ private int jobId = 0; |
private Engine(final Context context) |
{ |
this.context = context; |
+ this.componentName = new ComponentName(context, DownloadJobService.class); |
} |
public String getPrefsDefault(final String key) |
{ |
return this.jsonPrefs.getDefaults(key); |
} |
DefaultSubscriptionInfo getDefaultSubscriptionInfo(final Subscription sub) |
@@ -420,16 +427,22 @@ 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 regularly. |
+ // See https://issues.adblockplus.org/ticket/6238 |
+ final Subscription notification = engine.subscriptions.add(Subscription |
+ .create(Notification.NOTIFICATION_URL)); |
+ notification.setEnabled(true); |
+ |
int additional = 0; |
for (final Subscription sub : engine.defaultSubscriptions.createSubscriptions()) |
{ |
if (!engine.subscriptions.hasSubscription(sub.getId())) |
{ |
additional++; |
engine.subscriptions.add(sub); |
} |
@@ -650,18 +663,26 @@ public final class Engine |
engine.subscriptions.changeSubscriptionState(cese.id, cese.enabled); |
break; |
} |
case DOWNLOAD_FINISHED: |
{ |
final DownloadFinishedEvent dfe = (DownloadFinishedEvent) event; |
Log.d(TAG, "Download finished for '" + dfe.id + "' with response code " |
+ dfe.responseCode); |
- this.engine.subscriptions.updateSubscription(dfe.id, dfe.responseCode, |
- dfe.response, dfe.headers); |
+ if (SubscriptionUtils.isNotificationSubscription(dfe.id)) |
+ { |
+ Notification.update(engine.context, dfe.responseCode, dfe.response, |
+ engine.subscriptions.getNotificationDataFile()); |
+ } |
+ else |
+ { |
+ this.engine.subscriptions.updateSubscription(dfe.id, dfe.responseCode, |
+ dfe.response, dfe.headers); |
+ } |
break; |
} |
default: |
Log.d(TAG, "Unhandled type: " + event.getType()); |
break; |
} |
} |
@@ -755,34 +776,64 @@ public final class Engine |
this.headers.putAll(headers); |
} |
} |
} |
public void enqueueDownload(final Subscription sub, final boolean forced, |
final boolean allowMetered) throws IOException |
{ |
- if (sub.getURL() != null && sub.shouldUpdate(forced)) |
+ // For now we want to use JobScheduler only for the Notification download. |
+ // See https://issues.adblockplus.org/ticket/6238. |
+ if (SubscriptionUtils.isNotificationSubscription(sub.getId())) |
{ |
- final HashMap<String, String> headers = new HashMap<>(); |
- if (sub.isMetaDataValid() && sub.isFiltersValid()) |
+ if (Notification.shouldUpdate(context)) |
{ |
- final String lastModified = sub.getMeta(Subscription.KEY_HTTP_LAST_MODIFIED); |
- if (!TextUtils.isEmpty(lastModified)) |
+ scheduleJob(this.createDownloadURL(sub), sub.getId(), allowMetered); |
+ } |
+ } |
+ else |
+ { |
+ if (sub.getURL() != null && sub.shouldUpdate(forced)) |
+ { |
+ final HashMap<String, String> headers = new HashMap<>(); |
+ if (sub.isMetaDataValid() && sub.isFiltersValid()) |
{ |
- headers.put("If-Modified-Since", lastModified); |
+ final String lastModified = sub.getMeta(Subscription.KEY_HTTP_LAST_MODIFIED); |
+ if (!TextUtils.isEmpty(lastModified)) |
+ { |
+ headers.put("If-Modified-Since", lastModified); |
+ } |
+ final String etag = sub.getMeta(Subscription.KEY_HTTP_ETAG); |
+ if (!TextUtils.isEmpty(etag)) |
+ { |
+ headers.put("If-None-Match", etag); |
+ } |
} |
- final String etag = sub.getMeta(Subscription.KEY_HTTP_ETAG); |
- if (!TextUtils.isEmpty(etag)) |
- { |
- headers.put("If-None-Match", etag); |
- } |
+ this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(), headers, allowMetered); |
} |
- Log.d(TAG, headers.toString()); |
- this.downloader.enqueueDownload(this.createDownloadURL(sub), sub.getId(), headers, allowMetered); |
+ } |
+ } |
+ |
+ private void scheduleJob(final URL url, final String id, final boolean allowMetered) |
+ { |
+ final JobInfo.Builder builder = new JobInfo.Builder(jobId++, componentName); |
+ builder.setRequiredNetworkType(allowMetered |
+ ? JobInfo.NETWORK_TYPE_UNMETERED |
+ : JobInfo.NETWORK_TYPE_ANY); |
+ |
+ final PersistableBundle extras = new PersistableBundle(); |
+ extras.putString(Notification.KEY_EXTRA_ID, id); |
+ extras.putString(Notification.KEY_EXTRA_URL, url.toString()); |
+ builder.setExtras(extras); |
+ |
+ final JobScheduler scheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); |
+ if (scheduler != null) |
+ { |
+ scheduler.schedule(builder.build()); |
} |
} |
public void connectivityChanged() |
{ |
this.downloader.connectivityChanged(); |
} |