diff options
| -rw-r--r-- | Android.mk | 1 | ||||
| -rw-r--r-- | core/java/android/os/IDeviceIdleController.aidl | 3 | ||||
| -rw-r--r-- | core/java/android/os/IMaintenanceActivityListener.aidl | 22 | ||||
| -rw-r--r-- | core/res/res/values/config.xml | 6 | ||||
| -rw-r--r-- | core/res/res/values/symbols.xml | 3 | ||||
| -rw-r--r-- | services/core/java/com/android/server/DeviceIdleController.java | 60 | ||||
| -rw-r--r-- | services/core/java/com/android/server/job/controllers/IdleController.java | 17 |
7 files changed, 105 insertions, 7 deletions
diff --git a/Android.mk b/Android.mk index 960fb3c5ee2b..282b2af68ae4 100644 --- a/Android.mk +++ b/Android.mk @@ -209,6 +209,7 @@ LOCAL_SRC_FILES += \ core/java/android/os/IBatteryPropertiesRegistrar.aidl \ core/java/android/os/ICancellationSignal.aidl \ core/java/android/os/IDeviceIdleController.aidl \ + core/java/android/os/IMaintenanceActivityListener.aidl \ core/java/android/os/IMessenger.aidl \ core/java/android/os/INetworkActivityListener.aidl \ core/java/android/os/INetworkManagementService.aidl \ diff --git a/core/java/android/os/IDeviceIdleController.aidl b/core/java/android/os/IDeviceIdleController.aidl index 7a1a6a29ad12..838279bf38f9 100644 --- a/core/java/android/os/IDeviceIdleController.aidl +++ b/core/java/android/os/IDeviceIdleController.aidl @@ -16,6 +16,7 @@ package android.os; +import android.os.IMaintenanceActivityListener; import android.os.UserHandle; /** @hide */ @@ -37,4 +38,6 @@ interface IDeviceIdleController { void exitIdle(String reason); void downloadServiceActive(IBinder token); void downloadServiceInactive(); + boolean registerMaintenanceActivityListener(IMaintenanceActivityListener listener); + void unregisterMaintenanceActivityListener(IMaintenanceActivityListener listener); } diff --git a/core/java/android/os/IMaintenanceActivityListener.aidl b/core/java/android/os/IMaintenanceActivityListener.aidl new file mode 100644 index 000000000000..6a2581faaa58 --- /dev/null +++ b/core/java/android/os/IMaintenanceActivityListener.aidl @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2016, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.os; + +/** @hide */ +oneway interface IMaintenanceActivityListener { + void onMaintenanceActivityChanged(boolean active); +} diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index e4a73755d3b5..3f6a0c194d61 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2429,4 +2429,10 @@ <!-- List of comma separated package names for which we the system will not show crash, ANR, etc. dialogs. --> <string translatable="false" name="config_appsNotReportingCrashes"></string> + + <!-- Inactivity threshold (in milliseconds) used in JobScheduler. JobScheduler will consider + the device to be "idle" after being inactive for this long. --> + <integer name="config_jobSchedulerInactivityIdleThreshold">4260000</integer> + <!-- The alarm window (in milliseconds) that JobScheduler uses to enter the idle state --> + <integer name="config_jobSchedulerIdleWindowSlop">300000</integer> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 32510397c56a..e65ce5e7a181 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2258,6 +2258,9 @@ <java-symbol type="integer" name="config_defaultNightMode" /> + <java-symbol type="integer" name="config_jobSchedulerInactivityIdleThreshold" /> + <java-symbol type="integer" name="config_jobSchedulerIdleWindowSlop" /> + <java-symbol type="style" name="Animation.ImmersiveModeConfirmation" /> <java-symbol type="integer" name="config_screen_magnification_multi_tap_adjustment" /> diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index bd9589234b38..58a0356e23b6 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -50,11 +50,13 @@ import android.os.FileUtils; import android.os.Handler; import android.os.IBinder; import android.os.IDeviceIdleController; +import android.os.IMaintenanceActivityListener; import android.os.Looper; import android.os.Message; import android.os.PowerManager; import android.os.PowerManagerInternal; import android.os.Process; +import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; @@ -206,9 +208,13 @@ public class DeviceIdleController extends SystemService private boolean mSyncActive; private boolean mJobsActive; private boolean mAlarmsActive; + private boolean mReportedMaintenanceActivity; public final AtomicFile mConfigFile; + private final RemoteCallbackList<IMaintenanceActivityListener> mMaintenanceActivityListeners = + new RemoteCallbackList<IMaintenanceActivityListener>(); + /** * Package names the system has white-listed to opt out of power save restrictions, * except for device idle mode. @@ -813,6 +819,7 @@ public class DeviceIdleController extends SystemService static final int MSG_REPORT_IDLE_OFF = 4; static final int MSG_REPORT_ACTIVE = 5; static final int MSG_TEMP_APP_WHITELIST_TIMEOUT = 6; + static final int MSG_REPORT_MAINTENANCE_ACTIVITY = 7; final class MyHandler extends Handler { MyHandler(Looper looper) { @@ -902,6 +909,21 @@ public class DeviceIdleController extends SystemService int uid = msg.arg1; checkTempAppWhitelistTimeout(uid); } break; + case MSG_REPORT_MAINTENANCE_ACTIVITY: { + boolean active = (msg.arg1 == 1); + final int size = mMaintenanceActivityListeners.beginBroadcast(); + try { + for (int i = 0; i < size; i++) { + try { + mMaintenanceActivityListeners.getBroadcastItem(i) + .onMaintenanceActivityChanged(active); + } catch (RemoteException ignored) { + } + } + } finally { + mMaintenanceActivityListeners.finishBroadcast(); + } + } break; } } } @@ -996,6 +1018,16 @@ public class DeviceIdleController extends SystemService DeviceIdleController.this.downloadServiceInactive(); } + @Override public boolean registerMaintenanceActivityListener( + IMaintenanceActivityListener listener) { + return DeviceIdleController.this.registerMaintenanceActivityListener(listener); + } + + @Override public void unregisterMaintenanceActivityListener( + IMaintenanceActivityListener listener) { + DeviceIdleController.this.unregisterMaintenanceActivityListener(listener); + } + @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { DeviceIdleController.this.dump(fd, pw, args); } @@ -1704,6 +1736,7 @@ public class DeviceIdleController extends SystemService void downloadServiceActive(IBinder token) { synchronized (this) { mDownloadServiceActive = token; + reportMaintenanceActivityIfNeededLocked(); try { token.linkToDeath(new IBinder.DeathRecipient() { @Override public void binderDied() { @@ -1719,6 +1752,7 @@ public class DeviceIdleController extends SystemService void downloadServiceInactive() { synchronized (this) { mDownloadServiceActive = null; + reportMaintenanceActivityIfNeededLocked(); exitMaintenanceEarlyIfNeededLocked(); } } @@ -1726,6 +1760,7 @@ public class DeviceIdleController extends SystemService void setSyncActive(boolean active) { synchronized (this) { mSyncActive = active; + reportMaintenanceActivityIfNeededLocked(); if (!active) { exitMaintenanceEarlyIfNeededLocked(); } @@ -1735,6 +1770,7 @@ public class DeviceIdleController extends SystemService void setJobsActive(boolean active) { synchronized (this) { mJobsActive = active; + reportMaintenanceActivityIfNeededLocked(); if (!active) { exitMaintenanceEarlyIfNeededLocked(); } @@ -1750,6 +1786,30 @@ public class DeviceIdleController extends SystemService } } + boolean registerMaintenanceActivityListener(IMaintenanceActivityListener listener) { + synchronized (this) { + mMaintenanceActivityListeners.register(listener); + return mReportedMaintenanceActivity; + } + } + + void unregisterMaintenanceActivityListener(IMaintenanceActivityListener listener) { + synchronized (this) { + mMaintenanceActivityListeners.unregister(listener); + } + } + + void reportMaintenanceActivityIfNeededLocked() { + boolean active = mJobsActive | mSyncActive | (mDownloadServiceActive != null); + if (active == mReportedMaintenanceActivity) { + return; + } + mReportedMaintenanceActivity = active; + Message msg = mHandler.obtainMessage(MSG_REPORT_MAINTENANCE_ACTIVITY, + mReportedMaintenanceActivity ? 1 : 0, 0); + mHandler.sendMessage(msg); + } + void exitMaintenanceEarlyIfNeededLocked() { if (mState == STATE_IDLE_MAINTENANCE || mLightState == LIGHT_STATE_IDLE_MAINTENANCE) { if (mActiveIdleOpCount <= 0 && mDownloadServiceActive == null diff --git a/services/core/java/com/android/server/job/controllers/IdleController.java b/services/core/java/com/android/server/job/controllers/IdleController.java index 92df851bb687..fe5e8c94bc3e 100644 --- a/services/core/java/com/android/server/job/controllers/IdleController.java +++ b/services/core/java/com/android/server/job/controllers/IdleController.java @@ -34,14 +34,13 @@ import com.android.server.job.StateChangedListener; public class IdleController extends StateController { private static final String TAG = "IdleController"; - // Policy: we decide that we're "idle" if the device has been unused / - // screen off or dreaming for at least this long - private static final long INACTIVITY_IDLE_THRESHOLD = 71 * 60 * 1000; // millis; 71 min - private static final long IDLE_WINDOW_SLOP = 5 * 60 * 1000; // 5 minute window, to be nice - private static final String ACTION_TRIGGER_IDLE = "com.android.server.task.controllers.IdleController.ACTION_TRIGGER_IDLE"; + // Policy: we decide that we're "idle" if the device has been unused / + // screen off or dreaming for at least this long + private long mInactivityIdleThreshold; + private long mIdleWindowSlop; final ArrayList<JobStatus> mTrackedTasks = new ArrayList<JobStatus>(); IdlenessTracker mIdleTracker; @@ -100,6 +99,10 @@ public class IdleController extends StateController { * significant state changes occur */ private void initIdleStateTracking() { + mInactivityIdleThreshold = mContext.getResources().getInteger( + com.android.internal.R.integer.config_jobSchedulerInactivityIdleThreshold); + mIdleWindowSlop = mContext.getResources().getInteger( + com.android.internal.R.integer.config_jobSchedulerIdleWindowSlop); mIdleTracker = new IdlenessTracker(); mIdleTracker.startTracking(); } @@ -168,14 +171,14 @@ public class IdleController extends StateController { // alarm that will tell us when we have decided the device is // truly idle. final long nowElapsed = SystemClock.elapsedRealtime(); - final long when = nowElapsed + INACTIVITY_IDLE_THRESHOLD; + final long when = nowElapsed + mInactivityIdleThreshold; if (DEBUG) { Slog.v(TAG, "Scheduling idle : " + action + " now:" + nowElapsed + " when=" + when); } mScreenOn = false; mAlarm.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP, - when, IDLE_WINDOW_SLOP, mIdleTriggerIntent); + when, mIdleWindowSlop, mIdleTriggerIntent); } else if (action.equals(ACTION_TRIGGER_IDLE)) { // idle time starts now. Do not set mIdle if screen is on. if (!mIdle && !mScreenOn) { |