OSDN Git Service

Fix issue #29545190: JobScheduler ContentUri NOTIFY_FOR_DESCENDANTS flag...
authorDianne Hackborn <hackbod@google.com>
Wed, 22 Jun 2016 03:39:02 +0000 (20:39 -0700)
committerDianne Hackborn <hackbod@google.com>
Wed, 22 Jun 2016 03:39:02 +0000 (20:39 -0700)
...isn't respected if previous job was scheduled with same URI

Change-Id: Ib04f6d7cf72e7efc8e84c1a759e91ba520eda139

core/java/android/app/job/JobInfo.java
services/core/java/com/android/server/job/controllers/ContentObserverController.java

index c4ca82e..5823abf 100644 (file)
@@ -28,6 +28,7 @@ import android.os.PersistableBundle;
 import android.util.Log;
 
 import java.util.ArrayList;
+import java.util.Objects;
 
 /**
  * Container of data passed to the {@link android.app.job.JobScheduler} fully encapsulating the
@@ -494,6 +495,20 @@ public class JobInfo implements Parcelable {
             return mFlags;
         }
 
+        @Override
+        public boolean equals(Object o) {
+            if (!(o instanceof TriggerContentUri)) {
+                return false;
+            }
+            TriggerContentUri t = (TriggerContentUri) o;
+            return Objects.equals(t.mUri, mUri) && t.mFlags == mFlags;
+        }
+
+        @Override
+        public int hashCode() {
+            return (mUri == null ? 0 : mUri.hashCode()) ^ mFlags;
+        }
+
         private TriggerContentUri(Parcel in) {
             mUri = Uri.CREATOR.createFromParcel(in);
             mFlags = in.readInt();
index 26660e8..9dce070 100644 (file)
@@ -57,7 +57,7 @@ public class ContentObserverController extends StateController {
     private static volatile ContentObserverController sController;
 
     final private List<JobStatus> mTrackedTasks = new ArrayList<JobStatus>();
-    ArrayMap<Uri, ObserverInstance> mObservers = new ArrayMap<>();
+    ArrayMap<JobInfo.TriggerContentUri, ObserverInstance> mObservers = new ArrayMap<>();
     final Handler mHandler;
 
     public static ContentObserverController get(JobSchedulerService taskManagerService) {
@@ -253,10 +253,10 @@ public class ContentObserverController extends StateController {
             final JobInfo.TriggerContentUri[] uris = jobStatus.getJob().getTriggerContentUris();
             if (uris != null) {
                 for (JobInfo.TriggerContentUri uri : uris) {
-                    ObserverInstance obs = mObservers.get(uri.getUri());
+                    ObserverInstance obs = mObservers.get(uri);
                     if (obs == null) {
                         obs = new ObserverInstance(mHandler, uri.getUri());
-                        mObservers.put(uri.getUri(), obs);
+                        mObservers.put(uri, obs);
                         mContext.getContentResolver().registerContentObserver(
                                 uri.getUri(),
                                 (uri.getFlags() &
@@ -316,7 +316,7 @@ public class ContentObserverController extends StateController {
                 obs.mJobs.remove(this);
                 if (obs.mJobs.size() == 0) {
                     mContext.getContentResolver().unregisterContentObserver(obs);
-                    mObservers.remove(obs.mUri);
+                    mObservers.remove(obs);
                 }
             }
         }
@@ -355,7 +355,10 @@ public class ContentObserverController extends StateController {
                     continue;
                 }
                 pw.print("    ");
-                pw.print(mObservers.keyAt(i));
+                JobInfo.TriggerContentUri trigger = mObservers.keyAt(i);
+                pw.print(trigger.getUri());
+                pw.print(" 0x");
+                pw.print(Integer.toHexString(trigger.getFlags()));
                 pw.print(" (");
                 pw.print(System.identityHashCode(obs));
                 pw.println("):");