diff options
Diffstat (limited to 'com/android/server/job/controllers/DeviceIdleJobsController.java')
-rw-r--r-- | com/android/server/job/controllers/DeviceIdleJobsController.java | 97 |
1 files changed, 61 insertions, 36 deletions
diff --git a/com/android/server/job/controllers/DeviceIdleJobsController.java b/com/android/server/job/controllers/DeviceIdleJobsController.java index 85993b90..374ab43c 100644 --- a/com/android/server/job/controllers/DeviceIdleJobsController.java +++ b/com/android/server/job/controllers/DeviceIdleJobsController.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.PowerManager; import android.os.UserHandle; +import android.util.ArraySet; import android.util.Slog; import com.android.internal.util.ArrayUtils; @@ -55,6 +56,9 @@ public final class DeviceIdleJobsController extends StateController { */ private boolean mDeviceIdleMode; private int[] mDeviceIdleWhitelistAppIds; + private int[] mPowerSaveTempWhitelistAppIds; + // These jobs were added when the app was in temp whitelist, these should be exempted from doze + private final ArraySet<JobStatus> mTempWhitelistedJobs; final JobStore.JobStatusFunctor mUpdateFunctor = new JobStore.JobStatusFunctor() { @Override public void process(JobStatus jobStatus) { @@ -79,15 +83,39 @@ public final class DeviceIdleJobsController extends StateController { private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - if (PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED.equals(action) - || PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED.equals(action)) { - updateIdleMode(mPowerManager != null - ? (mPowerManager.isDeviceIdleMode() - || mPowerManager.isLightDeviceIdleMode()) - : false); - } else if (PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED.equals(action)) { - updateWhitelist(); + switch (intent.getAction()) { + case PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED: + case PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED: + updateIdleMode(mPowerManager != null && (mPowerManager.isDeviceIdleMode() + || mPowerManager.isLightDeviceIdleMode())); + break; + case PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED: + synchronized (mLock) { + mDeviceIdleWhitelistAppIds = + mLocalDeviceIdleController.getPowerSaveWhitelistUserAppIds(); + if (LOG_DEBUG) { + Slog.d(LOG_TAG, "Got whitelist " + + Arrays.toString(mDeviceIdleWhitelistAppIds)); + } + } + break; + case PowerManager.ACTION_POWER_SAVE_TEMP_WHITELIST_CHANGED: + synchronized (mLock) { + mPowerSaveTempWhitelistAppIds = + mLocalDeviceIdleController.getPowerSaveTempWhitelistAppIds(); + if (LOG_DEBUG) { + Slog.d(LOG_TAG, "Got temp whitelist " + + Arrays.toString(mPowerSaveTempWhitelistAppIds)); + } + boolean changed = false; + for (int i = 0; i < mTempWhitelistedJobs.size(); i ++) { + changed |= updateTaskStateLocked(mTempWhitelistedJobs.valueAt(i)); + } + if (changed) { + mStateChangedListener.onControllerStateChanged(); + } + } + break; } } }; @@ -101,20 +129,21 @@ public final class DeviceIdleJobsController extends StateController { mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mLocalDeviceIdleController = LocalServices.getService(DeviceIdleController.LocalService.class); + mDeviceIdleWhitelistAppIds = mLocalDeviceIdleController.getPowerSaveWhitelistUserAppIds(); + mPowerSaveTempWhitelistAppIds = + mLocalDeviceIdleController.getPowerSaveTempWhitelistAppIds(); + mTempWhitelistedJobs = new ArraySet<>(); final IntentFilter filter = new IntentFilter(); filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED); filter.addAction(PowerManager.ACTION_LIGHT_DEVICE_IDLE_MODE_CHANGED); filter.addAction(PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED); + filter.addAction(PowerManager.ACTION_POWER_SAVE_TEMP_WHITELIST_CHANGED); mContext.registerReceiverAsUser( mBroadcastReceiver, UserHandle.ALL, filter, null, null); } void updateIdleMode(boolean enabled) { boolean changed = false; - // Need the whitelist to be ready when going into idle - if (mDeviceIdleWhitelistAppIds == null) { - updateWhitelist(); - } synchronized (mLock) { if (mDeviceIdleMode != enabled) { changed = true; @@ -130,46 +159,42 @@ public final class DeviceIdleJobsController extends StateController { } /** - * Fetches the latest whitelist from the device idle controller. + * Checks if the given job's scheduling app id exists in the device idle user whitelist. */ - void updateWhitelist() { - synchronized (mLock) { - if (mLocalDeviceIdleController != null) { - mDeviceIdleWhitelistAppIds = - mLocalDeviceIdleController.getPowerSaveWhitelistUserAppIds(); - if (LOG_DEBUG) { - Slog.d(LOG_TAG, "Got whitelist " + Arrays.toString(mDeviceIdleWhitelistAppIds)); - } - } - } + boolean isWhitelistedLocked(JobStatus job) { + return ArrayUtils.contains(mDeviceIdleWhitelistAppIds, + UserHandle.getAppId(job.getSourceUid())); } /** - * Checks if the given job's scheduling app id exists in the device idle user whitelist. + * Checks if the given job's scheduling app id exists in the device idle temp whitelist. */ - boolean isWhitelistedLocked(JobStatus job) { - if (mDeviceIdleWhitelistAppIds != null - && ArrayUtils.contains(mDeviceIdleWhitelistAppIds, - UserHandle.getAppId(job.getSourceUid()))) { - return true; - } - return false; + boolean isTempWhitelistedLocked(JobStatus job) { + return ArrayUtils.contains(mPowerSaveTempWhitelistAppIds, + UserHandle.getAppId(job.getSourceUid())); } - private void updateTaskStateLocked(JobStatus task) { - final boolean whitelisted = isWhitelistedLocked(task); + private boolean updateTaskStateLocked(JobStatus task) { + final boolean whitelisted = isWhitelistedLocked(task) + || (mTempWhitelistedJobs.contains(task) && isTempWhitelistedLocked(task)); final boolean enableTask = !mDeviceIdleMode || whitelisted; - task.setDeviceNotDozingConstraintSatisfied(enableTask, whitelisted); + return task.setDeviceNotDozingConstraintSatisfied(enableTask, whitelisted); } @Override public void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) { - updateTaskStateLocked(jobStatus); + if (isTempWhitelistedLocked(jobStatus)) { + mTempWhitelistedJobs.add(jobStatus); + jobStatus.setDeviceNotDozingConstraintSatisfied(true, true); + } else { + updateTaskStateLocked(jobStatus); + } } @Override public void maybeStopTrackingJobLocked(JobStatus jobStatus, JobStatus incomingJob, boolean forUpdate) { + mTempWhitelistedJobs.remove(jobStatus); } @Override |