Fix issue #6664140: Time to lock should work even Stay awake...

...in Developer options is on

Don't respect stay awake while on as long as a time to lock limit
is being enforced.  When we start enforcing one, make sure the
setting is off (since we won't be respecting it anyway).

Bug: 6664140
Change-Id: Id07cb528afa0c64c7766341841c51771f507121d
diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java
index eb33060..0f5ad66 100644
--- a/services/java/com/android/server/DevicePolicyManagerService.java
+++ b/services/java/com/android/server/DevicePolicyManagerService.java
@@ -112,6 +112,8 @@
     int mPasswordOwner = -1;
     Handler mHandler = new Handler();
 
+    long mLastMaximumTimeToLock = -1;
+
     final HashMap<ComponentName, ActiveAdmin> mAdminMap
             = new HashMap<ComponentName, ActiveAdmin>();
     final ArrayList<ActiveAdmin> mAdminList
@@ -595,7 +597,7 @@
                     new BroadcastReceiver() {
                         @Override
                         public void onReceive(Context context, Intent intent) {
-                            synchronized (this) {
+                            synchronized (DevicePolicyManagerService.this) {
                                 boolean doProxyCleanup = admin.info.usesPolicy(
                                         DeviceAdminInfo.USES_POLICY_SETS_GLOBAL_PROXY);
                                 mAdminList.remove(admin);
@@ -603,9 +605,10 @@
                                 validatePasswordOwnerLocked();
                                 syncDeviceCapabilitiesLocked();
                                 if (doProxyCleanup) {
-                                    resetGlobalProxy();
+                                    resetGlobalProxyLocked();
                                 }
                                 saveSettingsLocked();
+                                updateMaximumTimeToLockLocked();
                             }
                         }
             });
@@ -826,16 +829,7 @@
 
         validatePasswordOwnerLocked();
         syncDeviceCapabilitiesLocked();
-
-        long timeMs = getMaximumTimeToLock(null);
-        if (timeMs <= 0) {
-            timeMs = Integer.MAX_VALUE;
-        }
-        try {
-            getIPowerManager().setMaximumScreenOffTimeount((int)timeMs);
-        } catch (RemoteException e) {
-            Slog.w(TAG, "Failure talking with power manager", e);
-        }
+        updateMaximumTimeToLockLocked();
     }
 
     static void validateQualityConstant(int quality) {
@@ -1606,28 +1600,41 @@
                     DeviceAdminInfo.USES_POLICY_FORCE_LOCK);
             if (ap.maximumTimeToUnlock != timeMs) {
                 ap.maximumTimeToUnlock = timeMs;
-
-                long ident = Binder.clearCallingIdentity();
-                try {
-                    saveSettingsLocked();
-
-                    timeMs = getMaximumTimeToLock(null);
-                    if (timeMs <= 0) {
-                        timeMs = Integer.MAX_VALUE;
-                    }
-
-                    try {
-                        getIPowerManager().setMaximumScreenOffTimeount((int)timeMs);
-                    } catch (RemoteException e) {
-                        Slog.w(TAG, "Failure talking with power manager", e);
-                    }
-                } finally {
-                    Binder.restoreCallingIdentity(ident);
-                }
+                saveSettingsLocked();
+                updateMaximumTimeToLockLocked();
             }
         }
     }
 
+    void updateMaximumTimeToLockLocked() {
+        long timeMs = getMaximumTimeToLock(null);
+        if (mLastMaximumTimeToLock == timeMs) {
+            return;
+        }
+
+        long ident = Binder.clearCallingIdentity();
+        try {
+            if (timeMs <= 0) {
+                timeMs = Integer.MAX_VALUE;
+            } else {
+                // Make sure KEEP_SCREEN_ON is disabled, since that
+                // would allow bypassing of the maximum time to lock.
+                Settings.System.putInt(mContext.getContentResolver(),
+                        Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0);
+            }
+
+            mLastMaximumTimeToLock = timeMs;
+
+            try {
+                getIPowerManager().setMaximumScreenOffTimeount((int)timeMs);
+            } catch (RemoteException e) {
+                Slog.w(TAG, "Failure talking with power manager", e);
+            }
+        } finally {
+            Binder.restoreCallingIdentity(ident);
+        }
+    }
+
     public long getMaximumTimeToLock(ComponentName who) {
         synchronized (this) {
             long time = 0;
@@ -1868,7 +1875,7 @@
             // Reset the global proxy accordingly
             // Do this using system permissions, as apps cannot write to secure settings
             long origId = Binder.clearCallingIdentity();
-            resetGlobalProxy();
+            resetGlobalProxyLocked();
             Binder.restoreCallingIdentity(origId);
             return null;
         }
@@ -1892,20 +1899,20 @@
         return null;
     }
 
-    private void resetGlobalProxy() {
+    private void resetGlobalProxyLocked() {
         final int N = mAdminList.size();
         for (int i = 0; i < N; i++) {
             ActiveAdmin ap = mAdminList.get(i);
             if (ap.specifiesGlobalProxy) {
-                saveGlobalProxy(ap.globalProxySpec, ap.globalProxyExclusionList);
+                saveGlobalProxyLocked(ap.globalProxySpec, ap.globalProxyExclusionList);
                 return;
             }
         }
         // No device admins defining global proxies - reset global proxy settings to none
-        saveGlobalProxy(null, null);
+        saveGlobalProxyLocked(null, null);
     }
 
-    private void saveGlobalProxy(String proxySpec, String exclusionList) {
+    private void saveGlobalProxyLocked(String proxySpec, String exclusionList) {
         if (exclusionList == null) {
             exclusionList = "";
         }