From 4b425712c6a777148af767cb30240d632c51f55b Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Mon, 27 Jun 2016 16:12:41 -0700 Subject: [PATCH] Fix #29737133 : content-trigger jobs not running properly When removing the ContentObserver wrapper from our internal bookkeeping we were using the wrong key. That led to future re-registrations thinking they were reusing a currently- registered observers, but instead never getting onChange() notifications. Change-Id: Id3111db057ae63194049d7d48d45b75be6bb0000 --- .../ContentObserverController.java | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/job/controllers/ContentObserverController.java b/services/core/java/com/android/server/job/controllers/ContentObserverController.java index 9dce070221bcd..a42d0cd4c831c 100644 --- a/services/core/java/com/android/server/job/controllers/ContentObserverController.java +++ b/services/core/java/com/android/server/job/controllers/ContentObserverController.java @@ -22,6 +22,7 @@ import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.UserHandle; +import android.util.Slog; import android.util.TimeUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -40,6 +41,7 @@ import java.util.List; */ public class ContentObserverController extends StateController { private static final String TAG = "JobScheduler.Content"; + private static final boolean DEBUG = false; /** * Maximum number of changing URIs we will batch together to report. @@ -88,6 +90,9 @@ public class ContentObserverController extends StateController { if (taskStatus.contentObserverJobInstance == null) { taskStatus.contentObserverJobInstance = new JobInstance(taskStatus); } + if (DEBUG) { + Slog.i(TAG, "Tracking content-trigger job " + taskStatus); + } mTrackedTasks.add(taskStatus); boolean havePendingUris = false; // If there is a previous job associated with the new job, propagate over @@ -175,6 +180,9 @@ public class ContentObserverController extends StateController { taskStatus.contentObserverJobInstance = null; } } + if (DEBUG) { + Slog.i(TAG, "No longer tracking job " + taskStatus); + } mTrackedTasks.remove(taskStatus); } } @@ -194,16 +202,20 @@ public class ContentObserverController extends StateController { } final class ObserverInstance extends ContentObserver { - final Uri mUri; + final JobInfo.TriggerContentUri mUri; final ArraySet mJobs = new ArraySet<>(); - public ObserverInstance(Handler handler, Uri uri) { + public ObserverInstance(Handler handler, JobInfo.TriggerContentUri uri) { super(handler); mUri = uri; } @Override public void onChange(boolean selfChange, Uri uri) { + if (DEBUG) { + Slog.i(TAG, "onChange(self=" + selfChange + ") for " + uri + + " when mUri=" + mUri); + } synchronized (mLock) { final int N = mJobs.size(); for (int i=0; i