Merge "Delay coming out of doze until keyguard dismissed"

This commit is contained in:
Amith Yamasani
2018-01-31 15:20:30 +00:00
committed by Android (Google) Code Review
3 changed files with 59 additions and 1 deletions

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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" />