Merge \"Fix #29737133 : content-trigger jobs not running properly\" into nyc-dev
am: f480698298
Change-Id: I957ae07c46573f0e6a066cc1cb0a27b8bafe5811
This commit is contained in:
@@ -22,6 +22,7 @@ import android.database.ContentObserver;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
|
import android.util.Slog;
|
||||||
import android.util.TimeUtils;
|
import android.util.TimeUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
@@ -40,6 +41,7 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class ContentObserverController extends StateController {
|
public class ContentObserverController extends StateController {
|
||||||
private static final String TAG = "JobScheduler.Content";
|
private static final String TAG = "JobScheduler.Content";
|
||||||
|
private static final boolean DEBUG = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maximum number of changing URIs we will batch together to report.
|
* Maximum number of changing URIs we will batch together to report.
|
||||||
@@ -88,6 +90,9 @@ public class ContentObserverController extends StateController {
|
|||||||
if (taskStatus.contentObserverJobInstance == null) {
|
if (taskStatus.contentObserverJobInstance == null) {
|
||||||
taskStatus.contentObserverJobInstance = new JobInstance(taskStatus);
|
taskStatus.contentObserverJobInstance = new JobInstance(taskStatus);
|
||||||
}
|
}
|
||||||
|
if (DEBUG) {
|
||||||
|
Slog.i(TAG, "Tracking content-trigger job " + taskStatus);
|
||||||
|
}
|
||||||
mTrackedTasks.add(taskStatus);
|
mTrackedTasks.add(taskStatus);
|
||||||
boolean havePendingUris = false;
|
boolean havePendingUris = false;
|
||||||
// If there is a previous job associated with the new job, propagate over
|
// 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;
|
taskStatus.contentObserverJobInstance = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (DEBUG) {
|
||||||
|
Slog.i(TAG, "No longer tracking job " + taskStatus);
|
||||||
|
}
|
||||||
mTrackedTasks.remove(taskStatus);
|
mTrackedTasks.remove(taskStatus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -194,16 +202,20 @@ public class ContentObserverController extends StateController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final class ObserverInstance extends ContentObserver {
|
final class ObserverInstance extends ContentObserver {
|
||||||
final Uri mUri;
|
final JobInfo.TriggerContentUri mUri;
|
||||||
final ArraySet<JobInstance> mJobs = new ArraySet<>();
|
final ArraySet<JobInstance> mJobs = new ArraySet<>();
|
||||||
|
|
||||||
public ObserverInstance(Handler handler, Uri uri) {
|
public ObserverInstance(Handler handler, JobInfo.TriggerContentUri uri) {
|
||||||
super(handler);
|
super(handler);
|
||||||
mUri = uri;
|
mUri = uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onChange(boolean selfChange, Uri uri) {
|
public void onChange(boolean selfChange, Uri uri) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Slog.i(TAG, "onChange(self=" + selfChange + ") for " + uri
|
||||||
|
+ " when mUri=" + mUri);
|
||||||
|
}
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
final int N = mJobs.size();
|
final int N = mJobs.size();
|
||||||
for (int i=0; i<N; i++) {
|
for (int i=0; i<N; i++) {
|
||||||
@@ -255,14 +267,25 @@ public class ContentObserverController extends StateController {
|
|||||||
for (JobInfo.TriggerContentUri uri : uris) {
|
for (JobInfo.TriggerContentUri uri : uris) {
|
||||||
ObserverInstance obs = mObservers.get(uri);
|
ObserverInstance obs = mObservers.get(uri);
|
||||||
if (obs == null) {
|
if (obs == null) {
|
||||||
obs = new ObserverInstance(mHandler, uri.getUri());
|
obs = new ObserverInstance(mHandler, uri);
|
||||||
mObservers.put(uri, obs);
|
mObservers.put(uri, obs);
|
||||||
|
final boolean andDescendants = (uri.getFlags() &
|
||||||
|
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS) != 0;
|
||||||
|
if (DEBUG) {
|
||||||
|
Slog.v(TAG, "New observer " + obs + " for " + uri.getUri()
|
||||||
|
+ " andDescendants=" + andDescendants);
|
||||||
|
}
|
||||||
mContext.getContentResolver().registerContentObserver(
|
mContext.getContentResolver().registerContentObserver(
|
||||||
uri.getUri(),
|
uri.getUri(),
|
||||||
(uri.getFlags() &
|
andDescendants,
|
||||||
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)
|
|
||||||
!= 0,
|
|
||||||
obs);
|
obs);
|
||||||
|
} else {
|
||||||
|
if (DEBUG) {
|
||||||
|
final boolean andDescendants = (uri.getFlags() &
|
||||||
|
JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS) != 0;
|
||||||
|
Slog.v(TAG, "Reusing existing observer " + obs + " for " + uri.getUri()
|
||||||
|
+ " andDescendants=" + andDescendants);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
obs.mJobs.add(this);
|
obs.mJobs.add(this);
|
||||||
mMyObservers.add(obs);
|
mMyObservers.add(obs);
|
||||||
@@ -315,8 +338,11 @@ public class ContentObserverController extends StateController {
|
|||||||
final ObserverInstance obs = mMyObservers.get(i);
|
final ObserverInstance obs = mMyObservers.get(i);
|
||||||
obs.mJobs.remove(this);
|
obs.mJobs.remove(this);
|
||||||
if (obs.mJobs.size() == 0) {
|
if (obs.mJobs.size() == 0) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Slog.i(TAG, "Unregistering observer " + obs + " for " + obs.mUri.getUri());
|
||||||
|
}
|
||||||
mContext.getContentResolver().unregisterContentObserver(obs);
|
mContext.getContentResolver().unregisterContentObserver(obs);
|
||||||
mObservers.remove(obs);
|
mObservers.remove(obs.mUri);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user