Loading apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java +26 −16 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.job.controllers; import static com.android.server.job.JobSchedulerService.NEVER_INDEX; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.os.SystemClock; import android.os.UserHandle; Loading Loading @@ -59,6 +60,8 @@ public final class BackgroundJobsController extends StateController { private final AppStateTrackerImpl mAppStateTracker; private final UpdateJobFunctor mUpdateJobFunctor = new UpdateJobFunctor(); public BackgroundJobsController(JobSchedulerService service) { super(service); Loading @@ -69,7 +72,7 @@ public final class BackgroundJobsController extends StateController { @Override public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) { updateSingleJobRestrictionLocked(jobStatus, UNKNOWN); updateSingleJobRestrictionLocked(jobStatus, sElapsedRealtimeClock.millis(), UNKNOWN); } @Override Loading @@ -79,7 +82,7 @@ public final class BackgroundJobsController extends StateController { @Override public void evaluateStateLocked(JobStatus jobStatus) { updateSingleJobRestrictionLocked(jobStatus, UNKNOWN); updateSingleJobRestrictionLocked(jobStatus, sElapsedRealtimeClock.millis(), UNKNOWN); } @Override Loading Loading @@ -163,33 +166,34 @@ public final class BackgroundJobsController extends StateController { } private void updateJobRestrictionsLocked(int filterUid, int newActiveState) { final UpdateJobFunctor updateTrackedJobs = new UpdateJobFunctor(newActiveState); mUpdateJobFunctor.prepare(newActiveState); final long start = DEBUG ? SystemClock.elapsedRealtimeNanos() : 0; final JobStore store = mService.getJobStore(); if (filterUid > 0) { store.forEachJobForSourceUid(filterUid, updateTrackedJobs); store.forEachJobForSourceUid(filterUid, mUpdateJobFunctor); } else { store.forEachJob(updateTrackedJobs); store.forEachJob(mUpdateJobFunctor); } final long time = DEBUG ? (SystemClock.elapsedRealtimeNanos() - start) : 0; if (DEBUG) { Slog.d(TAG, String.format( "Job status updated: %d/%d checked/total jobs, %d us", updateTrackedJobs.mCheckedCount, updateTrackedJobs.mTotalCount, mUpdateJobFunctor.mCheckedCount, mUpdateJobFunctor.mTotalCount, (time / 1000) )); } if (updateTrackedJobs.mChanged) { if (mUpdateJobFunctor.mChanged) { mStateChangedListener.onControllerStateChanged(); } } boolean updateSingleJobRestrictionLocked(JobStatus jobStatus, int activeState) { boolean updateSingleJobRestrictionLocked(JobStatus jobStatus, final long nowElapsed, int activeState) { final int uid = jobStatus.getSourceUid(); final String packageName = jobStatus.getSourcePackageName(); Loading @@ -205,26 +209,32 @@ public final class BackgroundJobsController extends StateController { if (isActive && jobStatus.getStandbyBucket() == NEVER_INDEX) { jobStatus.maybeLogBucketMismatch(); } boolean didChange = jobStatus.setBackgroundNotRestrictedConstraintSatisfied(canRun); boolean didChange = jobStatus.setBackgroundNotRestrictedConstraintSatisfied(nowElapsed, canRun); didChange |= jobStatus.setUidActive(isActive); return didChange; } private final class UpdateJobFunctor implements Consumer<JobStatus> { final int activeState; int mActiveState; boolean mChanged = false; int mTotalCount = 0; int mCheckedCount = 0; public UpdateJobFunctor(int newActiveState) { activeState = newActiveState; long mUpdateTimeElapsed = 0; void prepare(int newActiveState) { mActiveState = newActiveState; mUpdateTimeElapsed = sElapsedRealtimeClock.millis(); mChanged = false; mTotalCount = 0; mCheckedCount = 0; } @Override public void accept(JobStatus jobStatus) { mTotalCount++; mCheckedCount++; if (updateSingleJobRestrictionLocked(jobStatus, activeState)) { if (updateSingleJobRestrictionLocked(jobStatus, mUpdateTimeElapsed, mActiveState)) { mChanged = true; } } Loading apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java +7 −4 Original line number Diff line number Diff line Loading @@ -65,10 +65,12 @@ public final class BatteryController extends RestrictingController { @Override public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) { if (taskStatus.hasPowerConstraint()) { final long nowElapsed = sElapsedRealtimeClock.millis(); mTrackedTasks.add(taskStatus); taskStatus.setTrackingController(JobStatus.TRACKING_BATTERY); taskStatus.setChargingConstraintSatisfied(mChargeTracker.isOnStablePower()); taskStatus.setBatteryNotLowConstraintSatisfied(mChargeTracker.isBatteryNotLow()); taskStatus.setChargingConstraintSatisfied(nowElapsed, mChargeTracker.isOnStablePower()); taskStatus.setBatteryNotLowConstraintSatisfied( nowElapsed, mChargeTracker.isBatteryNotLow()); } } Loading Loading @@ -97,14 +99,15 @@ public final class BatteryController extends RestrictingController { if (DEBUG) { Slog.d(TAG, "maybeReportNewChargingStateLocked: " + stablePower); } final long nowElapsed = sElapsedRealtimeClock.millis(); boolean reportChange = false; for (int i = mTrackedTasks.size() - 1; i >= 0; i--) { final JobStatus ts = mTrackedTasks.valueAt(i); boolean previous = ts.setChargingConstraintSatisfied(stablePower); boolean previous = ts.setChargingConstraintSatisfied(nowElapsed, stablePower); if (previous != stablePower) { reportChange = true; } previous = ts.setBatteryNotLowConstraintSatisfied(batteryNotLow); previous = ts.setBatteryNotLowConstraintSatisfied(nowElapsed, batteryNotLow); if (previous != batteryNotLow) { reportChange = true; } Loading apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java +8 −5 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.annotation.Nullable; import android.app.job.JobInfo; Loading Loading @@ -461,11 +462,12 @@ public final class ConnectivityController extends RestrictingController implemen final Network network = mConnManager.getActiveNetworkForUid( jobStatus.getSourceUid(), jobStatus.shouldIgnoreNetworkBlocking()); final NetworkCapabilities capabilities = getNetworkCapabilities(network); return updateConstraintsSatisfied(jobStatus, network, capabilities); return updateConstraintsSatisfied(jobStatus, sElapsedRealtimeClock.millis(), network, capabilities); } private boolean updateConstraintsSatisfied(JobStatus jobStatus, Network network, NetworkCapabilities capabilities) { private boolean updateConstraintsSatisfied(JobStatus jobStatus, final long nowElapsed, Network network, NetworkCapabilities capabilities) { // TODO: consider matching against non-active networks final boolean ignoreBlocked = jobStatus.shouldIgnoreNetworkBlocking(); Loading @@ -476,7 +478,7 @@ public final class ConnectivityController extends RestrictingController implemen final boolean satisfied = isSatisfied(jobStatus, network, capabilities, mConstants); final boolean changed = jobStatus .setConnectivityConstraintSatisfied(connected && satisfied); .setConnectivityConstraintSatisfied(nowElapsed, connected && satisfied); // Pass along the evaluated network for job to use; prevents race // conditions as default routes change over time, and opens the door to Loading Loading @@ -530,6 +532,7 @@ public final class ConnectivityController extends RestrictingController implemen NetworkCapabilities exemptedNetworkCapabilities = null; boolean exemptedNetworkMatch = false; final long nowElapsed = sElapsedRealtimeClock.millis(); boolean changed = false; for (int i = jobs.size() - 1; i >= 0; i--) { final JobStatus js = jobs.valueAt(i); Loading @@ -555,7 +558,7 @@ public final class ConnectivityController extends RestrictingController implemen // job hasn't yet been evaluated against the currently // active network; typically when we just lost a network. if (match || !Objects.equals(js.network, net)) { changed |= updateConstraintsSatisfied(js, net, netCap); changed |= updateConstraintsSatisfied(js, nowElapsed, net, netCap); } } return changed; Loading apex/jobscheduler/service/java/com/android/server/job/controllers/ContentObserverController.java +6 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.job.controllers; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.annotation.UserIdInt; import android.app.job.JobInfo; import android.database.ContentObserver; Loading Loading @@ -74,6 +76,7 @@ public final class ContentObserverController extends StateController { @Override public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) { if (taskStatus.hasContentTriggerConstraint()) { final long nowElapsed = sElapsedRealtimeClock.millis(); if (taskStatus.contentObserverJobInstance == null) { taskStatus.contentObserverJobInstance = new JobInstance(taskStatus); } Loading Loading @@ -110,7 +113,7 @@ public final class ContentObserverController extends StateController { } taskStatus.changedAuthorities = null; taskStatus.changedUris = null; taskStatus.setContentTriggerConstraintSatisfied(havePendingUris); taskStatus.setContentTriggerConstraintSatisfied(nowElapsed, havePendingUris); } if (lastJob != null && lastJob.contentObserverJobInstance != null) { // And now we can detach the instance state from the last job. Loading Loading @@ -295,7 +298,8 @@ public final class ContentObserverController extends StateController { boolean reportChange = false; synchronized (mLock) { if (mTriggerPending) { if (mJobStatus.setContentTriggerConstraintSatisfied(true)) { final long nowElapsed = sElapsedRealtimeClock.millis(); if (mJobStatus.setContentTriggerConstraintSatisfied(nowElapsed, true)) { reportChange = true; } unscheduleLocked(); Loading apex/jobscheduler/service/java/com/android/server/job/controllers/DeviceIdleJobsController.java +18 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.job.controllers; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.app.job.JobInfo; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -104,8 +106,10 @@ public final class DeviceIdleJobsController extends StateController { + Arrays.toString(mPowerSaveTempWhitelistAppIds)); } boolean changed = false; final long nowElapsed = sElapsedRealtimeClock.millis(); for (int i = 0; i < mAllowInIdleJobs.size(); i++) { changed |= updateTaskStateLocked(mAllowInIdleJobs.valueAt(i)); changed |= updateTaskStateLocked(mAllowInIdleJobs.valueAt(i), nowElapsed); } if (changed) { mStateChangedListener.onControllerStateChanged(); Loading Loading @@ -147,6 +151,7 @@ public final class DeviceIdleJobsController extends StateController { } mDeviceIdleMode = enabled; if (DEBUG) Slog.d(TAG, "mDeviceIdleMode=" + mDeviceIdleMode); mDeviceIdleUpdateFunctor.prepare(); if (enabled) { mHandler.removeMessages(PROCESS_BACKGROUND_JOBS); mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor); Loading Loading @@ -180,7 +185,7 @@ public final class DeviceIdleJobsController extends StateController { Slog.d(TAG, "uid " + uid + " going " + (active ? "active" : "inactive")); } mForegroundUids.put(uid, active); mDeviceIdleUpdateFunctor.mChanged = false; mDeviceIdleUpdateFunctor.prepare(); mService.getJobStore().forEachJobForSourceUid(uid, mDeviceIdleUpdateFunctor); if (mDeviceIdleUpdateFunctor.mChanged) { mStateChangedListener.onControllerStateChanged(); Loading @@ -203,12 +208,12 @@ public final class DeviceIdleJobsController extends StateController { UserHandle.getAppId(job.getSourceUid())); } private boolean updateTaskStateLocked(JobStatus task) { private boolean updateTaskStateLocked(JobStatus task, final long nowElapsed) { final boolean allowInIdle = ((task.getFlags()&JobInfo.FLAG_IMPORTANT_WHILE_FOREGROUND) != 0) && (mForegroundUids.get(task.getSourceUid()) || isTempWhitelistedLocked(task)); final boolean whitelisted = isWhitelistedLocked(task); final boolean enableTask = !mDeviceIdleMode || whitelisted || allowInIdle; return task.setDeviceNotDozingConstraintSatisfied(enableTask, whitelisted); return task.setDeviceNotDozingConstraintSatisfied(nowElapsed, enableTask, whitelisted); } @Override Loading @@ -216,7 +221,7 @@ public final class DeviceIdleJobsController extends StateController { if ((jobStatus.getFlags()&JobInfo.FLAG_IMPORTANT_WHILE_FOREGROUND) != 0) { mAllowInIdleJobs.add(jobStatus); } updateTaskStateLocked(jobStatus); updateTaskStateLocked(jobStatus, sElapsedRealtimeClock.millis()); } @Override Loading Loading @@ -282,10 +287,16 @@ public final class DeviceIdleJobsController extends StateController { final class DeviceIdleUpdateFunctor implements Consumer<JobStatus> { boolean mChanged; long mUpdateTimeElapsed = 0; void prepare() { mChanged = false; mUpdateTimeElapsed = sElapsedRealtimeClock.millis(); } @Override public void accept(JobStatus jobStatus) { mChanged |= updateTaskStateLocked(jobStatus); mChanged |= updateTaskStateLocked(jobStatus, mUpdateTimeElapsed); } } Loading @@ -300,7 +311,7 @@ public final class DeviceIdleJobsController extends StateController { case PROCESS_BACKGROUND_JOBS: // Just process all the jobs, the ones in foreground should already be running. synchronized (mLock) { mDeviceIdleUpdateFunctor.mChanged = false; mDeviceIdleUpdateFunctor.prepare(); mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor); if (mDeviceIdleUpdateFunctor.mChanged) { mStateChangedListener.onControllerStateChanged(); Loading Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java +26 −16 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.job.controllers; import static com.android.server.job.JobSchedulerService.NEVER_INDEX; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.os.SystemClock; import android.os.UserHandle; Loading Loading @@ -59,6 +60,8 @@ public final class BackgroundJobsController extends StateController { private final AppStateTrackerImpl mAppStateTracker; private final UpdateJobFunctor mUpdateJobFunctor = new UpdateJobFunctor(); public BackgroundJobsController(JobSchedulerService service) { super(service); Loading @@ -69,7 +72,7 @@ public final class BackgroundJobsController extends StateController { @Override public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) { updateSingleJobRestrictionLocked(jobStatus, UNKNOWN); updateSingleJobRestrictionLocked(jobStatus, sElapsedRealtimeClock.millis(), UNKNOWN); } @Override Loading @@ -79,7 +82,7 @@ public final class BackgroundJobsController extends StateController { @Override public void evaluateStateLocked(JobStatus jobStatus) { updateSingleJobRestrictionLocked(jobStatus, UNKNOWN); updateSingleJobRestrictionLocked(jobStatus, sElapsedRealtimeClock.millis(), UNKNOWN); } @Override Loading Loading @@ -163,33 +166,34 @@ public final class BackgroundJobsController extends StateController { } private void updateJobRestrictionsLocked(int filterUid, int newActiveState) { final UpdateJobFunctor updateTrackedJobs = new UpdateJobFunctor(newActiveState); mUpdateJobFunctor.prepare(newActiveState); final long start = DEBUG ? SystemClock.elapsedRealtimeNanos() : 0; final JobStore store = mService.getJobStore(); if (filterUid > 0) { store.forEachJobForSourceUid(filterUid, updateTrackedJobs); store.forEachJobForSourceUid(filterUid, mUpdateJobFunctor); } else { store.forEachJob(updateTrackedJobs); store.forEachJob(mUpdateJobFunctor); } final long time = DEBUG ? (SystemClock.elapsedRealtimeNanos() - start) : 0; if (DEBUG) { Slog.d(TAG, String.format( "Job status updated: %d/%d checked/total jobs, %d us", updateTrackedJobs.mCheckedCount, updateTrackedJobs.mTotalCount, mUpdateJobFunctor.mCheckedCount, mUpdateJobFunctor.mTotalCount, (time / 1000) )); } if (updateTrackedJobs.mChanged) { if (mUpdateJobFunctor.mChanged) { mStateChangedListener.onControllerStateChanged(); } } boolean updateSingleJobRestrictionLocked(JobStatus jobStatus, int activeState) { boolean updateSingleJobRestrictionLocked(JobStatus jobStatus, final long nowElapsed, int activeState) { final int uid = jobStatus.getSourceUid(); final String packageName = jobStatus.getSourcePackageName(); Loading @@ -205,26 +209,32 @@ public final class BackgroundJobsController extends StateController { if (isActive && jobStatus.getStandbyBucket() == NEVER_INDEX) { jobStatus.maybeLogBucketMismatch(); } boolean didChange = jobStatus.setBackgroundNotRestrictedConstraintSatisfied(canRun); boolean didChange = jobStatus.setBackgroundNotRestrictedConstraintSatisfied(nowElapsed, canRun); didChange |= jobStatus.setUidActive(isActive); return didChange; } private final class UpdateJobFunctor implements Consumer<JobStatus> { final int activeState; int mActiveState; boolean mChanged = false; int mTotalCount = 0; int mCheckedCount = 0; public UpdateJobFunctor(int newActiveState) { activeState = newActiveState; long mUpdateTimeElapsed = 0; void prepare(int newActiveState) { mActiveState = newActiveState; mUpdateTimeElapsed = sElapsedRealtimeClock.millis(); mChanged = false; mTotalCount = 0; mCheckedCount = 0; } @Override public void accept(JobStatus jobStatus) { mTotalCount++; mCheckedCount++; if (updateSingleJobRestrictionLocked(jobStatus, activeState)) { if (updateSingleJobRestrictionLocked(jobStatus, mUpdateTimeElapsed, mActiveState)) { mChanged = true; } } Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java +7 −4 Original line number Diff line number Diff line Loading @@ -65,10 +65,12 @@ public final class BatteryController extends RestrictingController { @Override public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) { if (taskStatus.hasPowerConstraint()) { final long nowElapsed = sElapsedRealtimeClock.millis(); mTrackedTasks.add(taskStatus); taskStatus.setTrackingController(JobStatus.TRACKING_BATTERY); taskStatus.setChargingConstraintSatisfied(mChargeTracker.isOnStablePower()); taskStatus.setBatteryNotLowConstraintSatisfied(mChargeTracker.isBatteryNotLow()); taskStatus.setChargingConstraintSatisfied(nowElapsed, mChargeTracker.isOnStablePower()); taskStatus.setBatteryNotLowConstraintSatisfied( nowElapsed, mChargeTracker.isBatteryNotLow()); } } Loading Loading @@ -97,14 +99,15 @@ public final class BatteryController extends RestrictingController { if (DEBUG) { Slog.d(TAG, "maybeReportNewChargingStateLocked: " + stablePower); } final long nowElapsed = sElapsedRealtimeClock.millis(); boolean reportChange = false; for (int i = mTrackedTasks.size() - 1; i >= 0; i--) { final JobStatus ts = mTrackedTasks.valueAt(i); boolean previous = ts.setChargingConstraintSatisfied(stablePower); boolean previous = ts.setChargingConstraintSatisfied(nowElapsed, stablePower); if (previous != stablePower) { reportChange = true; } previous = ts.setBatteryNotLowConstraintSatisfied(batteryNotLow); previous = ts.setBatteryNotLowConstraintSatisfied(nowElapsed, batteryNotLow); if (previous != batteryNotLow) { reportChange = true; } Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/ConnectivityController.java +8 −5 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.annotation.Nullable; import android.app.job.JobInfo; Loading Loading @@ -461,11 +462,12 @@ public final class ConnectivityController extends RestrictingController implemen final Network network = mConnManager.getActiveNetworkForUid( jobStatus.getSourceUid(), jobStatus.shouldIgnoreNetworkBlocking()); final NetworkCapabilities capabilities = getNetworkCapabilities(network); return updateConstraintsSatisfied(jobStatus, network, capabilities); return updateConstraintsSatisfied(jobStatus, sElapsedRealtimeClock.millis(), network, capabilities); } private boolean updateConstraintsSatisfied(JobStatus jobStatus, Network network, NetworkCapabilities capabilities) { private boolean updateConstraintsSatisfied(JobStatus jobStatus, final long nowElapsed, Network network, NetworkCapabilities capabilities) { // TODO: consider matching against non-active networks final boolean ignoreBlocked = jobStatus.shouldIgnoreNetworkBlocking(); Loading @@ -476,7 +478,7 @@ public final class ConnectivityController extends RestrictingController implemen final boolean satisfied = isSatisfied(jobStatus, network, capabilities, mConstants); final boolean changed = jobStatus .setConnectivityConstraintSatisfied(connected && satisfied); .setConnectivityConstraintSatisfied(nowElapsed, connected && satisfied); // Pass along the evaluated network for job to use; prevents race // conditions as default routes change over time, and opens the door to Loading Loading @@ -530,6 +532,7 @@ public final class ConnectivityController extends RestrictingController implemen NetworkCapabilities exemptedNetworkCapabilities = null; boolean exemptedNetworkMatch = false; final long nowElapsed = sElapsedRealtimeClock.millis(); boolean changed = false; for (int i = jobs.size() - 1; i >= 0; i--) { final JobStatus js = jobs.valueAt(i); Loading @@ -555,7 +558,7 @@ public final class ConnectivityController extends RestrictingController implemen // job hasn't yet been evaluated against the currently // active network; typically when we just lost a network. if (match || !Objects.equals(js.network, net)) { changed |= updateConstraintsSatisfied(js, net, netCap); changed |= updateConstraintsSatisfied(js, nowElapsed, net, netCap); } } return changed; Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/ContentObserverController.java +6 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.job.controllers; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.annotation.UserIdInt; import android.app.job.JobInfo; import android.database.ContentObserver; Loading Loading @@ -74,6 +76,7 @@ public final class ContentObserverController extends StateController { @Override public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) { if (taskStatus.hasContentTriggerConstraint()) { final long nowElapsed = sElapsedRealtimeClock.millis(); if (taskStatus.contentObserverJobInstance == null) { taskStatus.contentObserverJobInstance = new JobInstance(taskStatus); } Loading Loading @@ -110,7 +113,7 @@ public final class ContentObserverController extends StateController { } taskStatus.changedAuthorities = null; taskStatus.changedUris = null; taskStatus.setContentTriggerConstraintSatisfied(havePendingUris); taskStatus.setContentTriggerConstraintSatisfied(nowElapsed, havePendingUris); } if (lastJob != null && lastJob.contentObserverJobInstance != null) { // And now we can detach the instance state from the last job. Loading Loading @@ -295,7 +298,8 @@ public final class ContentObserverController extends StateController { boolean reportChange = false; synchronized (mLock) { if (mTriggerPending) { if (mJobStatus.setContentTriggerConstraintSatisfied(true)) { final long nowElapsed = sElapsedRealtimeClock.millis(); if (mJobStatus.setContentTriggerConstraintSatisfied(nowElapsed, true)) { reportChange = true; } unscheduleLocked(); Loading
apex/jobscheduler/service/java/com/android/server/job/controllers/DeviceIdleJobsController.java +18 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.job.controllers; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.app.job.JobInfo; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -104,8 +106,10 @@ public final class DeviceIdleJobsController extends StateController { + Arrays.toString(mPowerSaveTempWhitelistAppIds)); } boolean changed = false; final long nowElapsed = sElapsedRealtimeClock.millis(); for (int i = 0; i < mAllowInIdleJobs.size(); i++) { changed |= updateTaskStateLocked(mAllowInIdleJobs.valueAt(i)); changed |= updateTaskStateLocked(mAllowInIdleJobs.valueAt(i), nowElapsed); } if (changed) { mStateChangedListener.onControllerStateChanged(); Loading Loading @@ -147,6 +151,7 @@ public final class DeviceIdleJobsController extends StateController { } mDeviceIdleMode = enabled; if (DEBUG) Slog.d(TAG, "mDeviceIdleMode=" + mDeviceIdleMode); mDeviceIdleUpdateFunctor.prepare(); if (enabled) { mHandler.removeMessages(PROCESS_BACKGROUND_JOBS); mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor); Loading Loading @@ -180,7 +185,7 @@ public final class DeviceIdleJobsController extends StateController { Slog.d(TAG, "uid " + uid + " going " + (active ? "active" : "inactive")); } mForegroundUids.put(uid, active); mDeviceIdleUpdateFunctor.mChanged = false; mDeviceIdleUpdateFunctor.prepare(); mService.getJobStore().forEachJobForSourceUid(uid, mDeviceIdleUpdateFunctor); if (mDeviceIdleUpdateFunctor.mChanged) { mStateChangedListener.onControllerStateChanged(); Loading @@ -203,12 +208,12 @@ public final class DeviceIdleJobsController extends StateController { UserHandle.getAppId(job.getSourceUid())); } private boolean updateTaskStateLocked(JobStatus task) { private boolean updateTaskStateLocked(JobStatus task, final long nowElapsed) { final boolean allowInIdle = ((task.getFlags()&JobInfo.FLAG_IMPORTANT_WHILE_FOREGROUND) != 0) && (mForegroundUids.get(task.getSourceUid()) || isTempWhitelistedLocked(task)); final boolean whitelisted = isWhitelistedLocked(task); final boolean enableTask = !mDeviceIdleMode || whitelisted || allowInIdle; return task.setDeviceNotDozingConstraintSatisfied(enableTask, whitelisted); return task.setDeviceNotDozingConstraintSatisfied(nowElapsed, enableTask, whitelisted); } @Override Loading @@ -216,7 +221,7 @@ public final class DeviceIdleJobsController extends StateController { if ((jobStatus.getFlags()&JobInfo.FLAG_IMPORTANT_WHILE_FOREGROUND) != 0) { mAllowInIdleJobs.add(jobStatus); } updateTaskStateLocked(jobStatus); updateTaskStateLocked(jobStatus, sElapsedRealtimeClock.millis()); } @Override Loading Loading @@ -282,10 +287,16 @@ public final class DeviceIdleJobsController extends StateController { final class DeviceIdleUpdateFunctor implements Consumer<JobStatus> { boolean mChanged; long mUpdateTimeElapsed = 0; void prepare() { mChanged = false; mUpdateTimeElapsed = sElapsedRealtimeClock.millis(); } @Override public void accept(JobStatus jobStatus) { mChanged |= updateTaskStateLocked(jobStatus); mChanged |= updateTaskStateLocked(jobStatus, mUpdateTimeElapsed); } } Loading @@ -300,7 +311,7 @@ public final class DeviceIdleJobsController extends StateController { case PROCESS_BACKGROUND_JOBS: // Just process all the jobs, the ones in foreground should already be running. synchronized (mLock) { mDeviceIdleUpdateFunctor.mChanged = false; mDeviceIdleUpdateFunctor.prepare(); mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor); if (mDeviceIdleUpdateFunctor.mChanged) { mStateChangedListener.onControllerStateChanged(); Loading