summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/DeviceIdleController.java43
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java16
-rw-r--r--services/tests/uiservicestests/AndroidManifest.xml1
3 files changed, 59 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index a12c85aef85e..44974ffd3509 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -141,6 +141,8 @@ public class DeviceIdleController extends SystemService
private boolean mHasNetworkLocation;
private Location mLastGenericLocation;
private Location mLastGpsLocation;
+ // Current locked state of the screen
+ private boolean mScreenLocked;
/** Device is currently active. */
private static final int STATE_ACTIVE = 0;
@@ -156,6 +158,7 @@ public class DeviceIdleController extends SystemService
private static final int STATE_IDLE = 5;
/** Device is in the idle state, but temporarily out of idle to do regular maintenance. */
private static final int STATE_IDLE_MAINTENANCE = 6;
+
private static String stateToString(int state) {
switch (state) {
case STATE_ACTIVE: return "ACTIVE";
@@ -547,6 +550,11 @@ public class DeviceIdleController extends SystemService
"sms_temp_app_whitelist_duration";
private static final String KEY_NOTIFICATION_WHITELIST_DURATION =
"notification_whitelist_duration";
+ /**
+ * Whether to wait for the user to unlock the device before causing screen-on to
+ * exit doze. Default = true
+ */
+ private static final String KEY_WAIT_FOR_UNLOCK = "wait_for_unlock";
/**
* This is the time, after becoming inactive, that we go in to the first
@@ -765,6 +773,8 @@ public class DeviceIdleController extends SystemService
*/
public long NOTIFICATION_WHITELIST_DURATION;
+ public boolean WAIT_FOR_UNLOCK;
+
private final ContentResolver mResolver;
private final boolean mSmallBatteryDevice;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -855,6 +865,7 @@ public class DeviceIdleController extends SystemService
KEY_SMS_TEMP_APP_WHITELIST_DURATION, 20 * 1000L);
NOTIFICATION_WHITELIST_DURATION = mParser.getDurationMillis(
KEY_NOTIFICATION_WHITELIST_DURATION, 30 * 1000L);
+ WAIT_FOR_UNLOCK = mParser.getBoolean(KEY_WAIT_FOR_UNLOCK, false);
}
}
@@ -962,6 +973,9 @@ public class DeviceIdleController extends SystemService
pw.print(" "); pw.print(KEY_NOTIFICATION_WHITELIST_DURATION); pw.print("=");
TimeUtils.formatDuration(NOTIFICATION_WHITELIST_DURATION, pw);
pw.println();
+
+ pw.print(" "); pw.print(KEY_WAIT_FOR_UNLOCK); pw.print("=");
+ pw.println(WAIT_FOR_UNLOCK);
}
}
@@ -1340,6 +1354,19 @@ public class DeviceIdleController extends SystemService
}
}
+ private ActivityManagerInternal.ScreenObserver mScreenObserver =
+ new ActivityManagerInternal.ScreenObserver() {
+ @Override
+ public void onAwakeStateChanged(boolean isAwake) { }
+
+ @Override
+ public void onKeyguardStateChanged(boolean isShowing) {
+ synchronized (DeviceIdleController.this) {
+ DeviceIdleController.this.keyguardShowingLocked(isShowing);
+ }
+ }
+ };
+
public DeviceIdleController(Context context) {
super(context);
mConfigFile = new AtomicFile(new File(getSystemDir(), "deviceidle.xml"));
@@ -1406,6 +1433,7 @@ public class DeviceIdleController extends SystemService
mNetworkConnected = true;
mScreenOn = true;
+ mScreenLocked = false;
// Start out assuming we are charging. If we aren't, we will at least get
// a battery update the next time the level drops.
mCharging = true;
@@ -1501,6 +1529,8 @@ public class DeviceIdleController extends SystemService
mLocalActivityManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray);
mLocalPowerManager.setDeviceIdleWhitelist(mPowerSaveWhitelistAllAppIdArray);
+ mLocalActivityManager.registerScreenObserver(mScreenObserver);
+
passWhiteListToForceAppStandbyTrackerLocked();
updateInteractivityLocked();
}
@@ -1976,7 +2006,7 @@ public class DeviceIdleController extends SystemService
}
} else if (screenOn) {
mScreenOn = true;
- if (!mForceIdle) {
+ if (!mForceIdle && (!mScreenLocked || !mConstants.WAIT_FOR_UNLOCK)) {
becomeActiveLocked("screen", Process.myUid());
}
}
@@ -1997,6 +2027,16 @@ public class DeviceIdleController extends SystemService
}
}
+ void keyguardShowingLocked(boolean showing) {
+ if (DEBUG) Slog.i(TAG, "keyguardShowing=" + showing);
+ if (mScreenLocked != showing) {
+ mScreenLocked = showing;
+ if (mScreenOn && !mForceIdle && !mScreenLocked) {
+ becomeActiveLocked("unlocked", Process.myUid());
+ }
+ }
+ }
+
void scheduleReportActiveLocked(String activeReason, int activeUid) {
Message msg = mHandler.obtainMessage(MSG_REPORT_ACTIVE, activeUid, 0, activeReason);
mHandler.sendMessage(msg);
@@ -3308,6 +3348,7 @@ public class DeviceIdleController extends SystemService
pw.print(" mForceIdle="); pw.println(mForceIdle);
pw.print(" mMotionSensor="); pw.println(mMotionSensor);
pw.print(" mScreenOn="); pw.println(mScreenOn);
+ pw.print(" mScreenLocked="); pw.println(mScreenLocked);
pw.print(" mNetworkConnected="); pw.println(mNetworkConnected);
pw.print(" mCharging="); pw.println(mCharging);
pw.print(" mMotionActive="); pw.println(mMotionListener.active);
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 9865e3563285..727e7ee2ac18 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -111,6 +111,7 @@ import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
+import android.os.IDeviceIdleController;
import android.os.IInterface;
import android.os.Looper;
import android.os.Message;
@@ -286,6 +287,7 @@ public class NotificationManagerService extends SystemService {
private AlarmManager mAlarmManager;
private ICompanionDeviceManager mCompanionManager;
private AccessibilityManager mAccessibilityManager;
+ private IDeviceIdleController mDeviceIdleController;
final IBinder mForegroundToken = new Binder();
private WorkerHandler mHandler;
@@ -659,6 +661,7 @@ public class NotificationManagerService extends SystemService {
@Override
public void onNotificationClick(int callingUid, int callingPid, String key) {
+ exitIdle();
synchronized (mNotificationLock) {
NotificationRecord r = mNotificationsByKey.get(key);
if (r == null) {
@@ -683,6 +686,7 @@ public class NotificationManagerService extends SystemService {
@Override
public void onNotificationActionClick(int callingUid, int callingPid, String key,
int actionIndex) {
+ exitIdle();
synchronized (mNotificationLock) {
NotificationRecord r = mNotificationsByKey.get(key);
if (r == null) {
@@ -812,6 +816,7 @@ public class NotificationManagerService extends SystemService {
@Override
public void onNotificationDirectReplied(String key) {
+ exitIdle();
synchronized (mNotificationLock) {
NotificationRecord r = mNotificationsByKey.get(key);
if (r != null) {
@@ -1280,6 +1285,8 @@ public class NotificationManagerService extends SystemService {
mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);
mCompanionManager = companionManager;
mActivityManager = activityManager;
+ mDeviceIdleController = IDeviceIdleController.Stub.asInterface(
+ ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
mHandler = new WorkerHandler(looper);
mRankingThread.start();
@@ -1533,6 +1540,15 @@ public class NotificationManagerService extends SystemService {
sendRegisteredOnlyBroadcast(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED);
}
+ private void exitIdle() {
+ try {
+ if (mDeviceIdleController != null) {
+ mDeviceIdleController.exitIdle("notification interaction");
+ }
+ } catch (RemoteException e) {
+ }
+ }
+
private void updateNotificationChannelInt(String pkg, int uid, NotificationChannel channel,
boolean fromListener) {
if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
diff --git a/services/tests/uiservicestests/AndroidManifest.xml b/services/tests/uiservicestests/AndroidManifest.xml
index 347557291427..aabf9eab3c1f 100644
--- a/services/tests/uiservicestests/AndroidManifest.xml
+++ b/services/tests/uiservicestests/AndroidManifest.xml
@@ -26,6 +26,7 @@
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
<uses-permission android:name="android.permission.ACCESS_VOICE_INTERACTION_SERVICE" />
+ <uses-permission android:name="android.permission.DEVICE_POWER" />
<application>
<uses-library android:name="android.test.runner" />