Merge "Delay coming out of doze until keyguard dismissed"
This commit is contained in:
committed by
Android (Google) Code Review
commit
b97eb6b817
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user