Clean up on UserManagerService and DPMS

- Avoid the ART warning about 4.1 compatibility
- Avoid integer overflow in DPMS

Bug 27243525
Bug 27242859

Change-Id: I92af323287e348fbd0eff31e6cf9823be8e41024
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 6d168b0..212b37c 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -32,6 +32,7 @@
 import android.os.Process;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.provider.Settings;
 import android.test.MoreAsserts;
 import android.test.suitebuilder.annotation.SmallTest;
 import android.util.ArraySet;
@@ -60,6 +61,7 @@
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.validateMockitoUsage;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -208,7 +210,7 @@
     /**
      * Test for:
      * {@link DevicePolicyManager#setActiveAdmin}
-     *   with replace=false and replace=true
+     * with replace=false and replace=true
      * {@link DevicePolicyManager#isAdminActive}
      * {@link DevicePolicyManager#isAdminActiveAsUser}
      * {@link DevicePolicyManager#getActiveAdmins}
@@ -336,7 +338,7 @@
     /**
      * Test for:
      * {@link DevicePolicyManager#setActiveAdmin}
-     *   with replace=false
+     * with replace=false
      */
     public void testSetActiveAdmin_twiceWithoutReplace() throws Exception {
         // 1. Make sure the caller has proper permissions.
@@ -999,7 +1001,8 @@
 
     /**
      * This essentially tests
-     * {@code DevicePolicyManagerService.findOwnerComponentIfNecessaryLocked()}. (which is private.)
+     * {@code DevicePolicyManagerService.findOwnerComponentIfNecessaryLocked()}. (which is
+     * private.)
      *
      * We didn't use to persist the DO component class name, but now we do, and the above method
      * finds the right component from a package name upon migration.
@@ -1196,7 +1199,7 @@
                 eq(UserHandle.USER_SYSTEM),
                 MockUtils.checkUserRestrictions(),
                 MockUtils.checkUserRestrictions(UserManager.DISALLOW_ADD_USER)
-                );
+        );
         reset(mContext.userManagerInternal);
 
         dpm.addUserRestriction(admin1, UserManager.DISALLOW_OUTGOING_CALLS);
@@ -1833,4 +1836,76 @@
 
         mContext.callerPermissions.removeAll(OWNER_SETUP_PERMISSIONS);
     }
+
+    public void testSetMaximumTimeToLock() {
+        mContext.callerPermissions.add(android.Manifest.permission.MANAGE_DEVICE_ADMINS);
+
+        dpm.setActiveAdmin(admin1, /* replace =*/ false);
+        dpm.setActiveAdmin(admin2, /* replace =*/ false);
+
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        dpm.setMaximumTimeToLock(admin1, 0);
+        verifyScreenTimeoutCall(null, false);
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        dpm.setMaximumTimeToLock(admin1, 1);
+        verifyScreenTimeoutCall(1, true);
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        dpm.setMaximumTimeToLock(admin2, 10);
+        verifyScreenTimeoutCall(null, false);
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        dpm.setMaximumTimeToLock(admin1, 5);
+        verifyScreenTimeoutCall(5, true);
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        dpm.setMaximumTimeToLock(admin2, 4);
+        verifyScreenTimeoutCall(4, true);
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        dpm.setMaximumTimeToLock(admin1, 0);
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        dpm.setMaximumTimeToLock(admin2, Integer.MAX_VALUE);
+        verifyScreenTimeoutCall(Integer.MAX_VALUE, true);
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        dpm.setMaximumTimeToLock(admin2, Integer.MAX_VALUE + 1);
+        verifyScreenTimeoutCall(Integer.MAX_VALUE, true);
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        dpm.setMaximumTimeToLock(admin2, 10);
+        verifyScreenTimeoutCall(10, true);
+        reset(mMockContext.powerManagerInternal);
+        reset(mMockContext.settings);
+
+        // There's no restriction; shold be set to MAX.
+        dpm.setMaximumTimeToLock(admin2, 0);
+        verifyScreenTimeoutCall(Integer.MAX_VALUE, false);
+    }
+
+    private void verifyScreenTimeoutCall(Integer expectedTimeout,
+            boolean shouldStayOnWhilePluggedInBeCleared) {
+        if (expectedTimeout == null) {
+            verify(mMockContext.powerManagerInternal, times(0))
+                    .setMaximumScreenOffTimeoutFromDeviceAdmin(anyInt());
+        } else {
+            verify(mMockContext.powerManagerInternal, times(1))
+                    .setMaximumScreenOffTimeoutFromDeviceAdmin(eq(expectedTimeout));
+        }
+        // TODO Verify calls to settingsGlobalPutInt.  Tried but somehow mockito threw
+        // UnfinishedVerificationException.
+    }
 }
+