Rename DPM.isDefaultInputMethodSetByOwner()

Settings.Secure.DEFAULT_INPUT_METHOD is a misnomer. It does not really
record a permanent default of any sort - it just indicates the currently
chosen IME. Thus, isDefaultInputMethodSetByOwner() should more
appropriately be called isCurrentInputMethodSetByOwner().

Furthermore, it turns out that setting a different IME for a user and
the user's work profile is unsupported. Thus, it is sufficient for the
intended use case to just retrieve the calling user's default IME.
There is no need for a |user| parameter.

Bug: 32692748
Test: unit tests (see DevicePolicyManagerTest.java for invocation)
Test: cts-tradefed run cts-dev --module CtsDevicePolicyManagerTestCases

Change-Id: Ia0846d38a1361042429dae7430a8b055575ef2e0
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 9c3ecd0..7ad0292 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -243,7 +243,7 @@
 
     private static final String TAG_ADMIN_BROADCAST_PENDING = "admin-broadcast-pending";
 
-    private static final String TAG_DEFAULT_INPUT_METHOD_SET = "default-ime-set";
+    private static final String TAG_CURRENT_INPUT_METHOD_SET = "current-ime-set";
 
     private static final String TAG_OWNER_INSTALLED_CA_CERT = "owner-installed-ca-cert";
 
@@ -509,7 +509,7 @@
 
         long mLastNetworkLogsRetrievalTime = -1;
 
-        boolean mDefaultInputMethodSet = false;
+        boolean mCurrentInputMethodSet = false;
 
         // TODO(b/35385311): Keep track of metadata in TrustedCertificateStore instead.
         Set<String> mOwnerInstalledCaCerts = new ArraySet<>();
@@ -2607,9 +2607,9 @@
                 out.endTag(null, TAG_PASSWORD_TOKEN_HANDLE);
             }
 
-            if (policy.mDefaultInputMethodSet) {
-                out.startTag(null, TAG_DEFAULT_INPUT_METHOD_SET);
-                out.endTag(null, TAG_DEFAULT_INPUT_METHOD_SET);
+            if (policy.mCurrentInputMethodSet) {
+                out.startTag(null, TAG_CURRENT_INPUT_METHOD_SET);
+                out.endTag(null, TAG_CURRENT_INPUT_METHOD_SET);
             }
 
             for (final String cert : policy.mOwnerInstalledCaCerts) {
@@ -2828,8 +2828,8 @@
                 } else if (TAG_PASSWORD_TOKEN_HANDLE.equals(tag)) {
                     policy.mPasswordTokenHandle = Long.parseLong(
                             parser.getAttributeValue(null, ATTR_VALUE));
-                } else if (TAG_DEFAULT_INPUT_METHOD_SET.equals(tag)) {
-                    policy.mDefaultInputMethodSet = true;
+                } else if (TAG_CURRENT_INPUT_METHOD_SET.equals(tag)) {
+                    policy.mCurrentInputMethodSet = true;
                 } else if (TAG_OWNER_INSTALLED_CA_CERT.equals(tag)) {
                     policy.mOwnerInstalledCaCerts.add(parser.getAttributeValue(null, ATTR_ALIAS));
                 } else {
@@ -6680,7 +6680,7 @@
             mUserManagerInternal.setForceEphemeralUsers(admin.forceEphemeralUsers);
         }
         final DevicePolicyData policyData = getUserData(userId);
-        policyData.mDefaultInputMethodSet = false;
+        policyData.mCurrentInputMethodSet = false;
         saveSettingsLocked(userId);
         final DevicePolicyData systemPolicyData = getUserData(UserHandle.USER_SYSTEM);
         systemPolicyData.mLastSecurityLogRetrievalTime = -1;
@@ -6785,7 +6785,7 @@
             admin.defaultEnabledRestrictionsAlreadySet.clear();
         }
         final DevicePolicyData policyData = getUserData(userId);
-        policyData.mDefaultInputMethodSet = false;
+        policyData.mCurrentInputMethodSet = false;
         policyData.mOwnerInstalledCaCerts.clear();
         saveSettingsLocked(userId);
         clearUserPoliciesLocked(userId);
@@ -7231,9 +7231,9 @@
         enforceManageUsers();
     }
 
-    private void enforceProfileOwnerOrSystemUser(ComponentName admin) {
+    private void enforceProfileOwnerOrSystemUser() {
         synchronized (this) {
-            if (getActiveAdminWithPolicyForUidLocked(admin,
+            if (getActiveAdminWithPolicyForUidLocked(null,
                     DeviceAdminInfo.USES_POLICY_PROFILE_OWNER, mInjector.binderGetCallingUid())
                             != null) {
                 return;
@@ -8887,7 +8887,7 @@
                         // to trigger. This is a corner case that will have no impact in practice.
                         mSetupContentObserver.addPendingChangeByOwnerLocked(callingUserId);
                     }
-                    getUserData(callingUserId).mDefaultInputMethodSet = true;
+                    getUserData(callingUserId).mCurrentInputMethodSet = true;
                     saveSettingsLocked(callingUserId);
                 }
                 mInjector.settingsSecurePutStringForUser(setting, value, callingUserId);
@@ -9071,13 +9071,13 @@
             } else if (mDefaultImeChanged.equals(uri)) {
                 synchronized (DevicePolicyManagerService.this) {
                     if (mUserIdsWithPendingChangesByOwner.contains(userId)) {
-                        // This change notification was triggered by the owner changing the default
+                        // This change notification was triggered by the owner changing the current
                         // IME. Ignore it.
                         mUserIdsWithPendingChangesByOwner.remove(userId);
                     } else {
                         // This change notification was triggered by the user manually changing the
-                        // default IME.
-                        getUserData(userId).mDefaultInputMethodSet = false;
+                        // current IME.
+                        getUserData(userId).mCurrentInputMethodSet = false;
                         saveSettingsLocked(userId);
                     }
                 }
@@ -10962,14 +10962,9 @@
     }
 
     @Override
-    public boolean isDefaultInputMethodSetByOwner(@NonNull UserHandle user) {
-        final int userId = user.getIdentifier();
-        enforceProfileOwnerOrSystemUser(null);
-        if (!isCallerWithSystemUid() && mInjector.userHandleGetCallingUserId() != userId) {
-            throw new SecurityException(
-                    "Only the system can use this method to query information about another user");
-        }
-        return getUserData(userId).mDefaultInputMethodSet;
+    public boolean isCurrentInputMethodSetByOwner() {
+        enforceProfileOwnerOrSystemUser();
+        return getUserData(mInjector.userHandleGetCallingUserId()).mCurrentInputMethodSet;
     }
 
     @Override
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 f797f31..f969e80 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -3806,144 +3806,163 @@
                 .thenReturn(true);
         assertTrue(dpm.clearResetPasswordToken(admin1));
     }
-  
-    public void testIsDefaultInputMethodSetByOwnerForDeviceOwner() throws Exception {
-        final String defaultIme = Settings.Secure.DEFAULT_INPUT_METHOD;
-        final Uri defaultImeUri = Settings.Secure.getUriFor(defaultIme);
-        final UserHandle firstUser = UserHandle.SYSTEM;
-        final UserHandle secondUser = UserHandle.of(DpmMockContext.CALLER_USER_HANDLE);
 
-        // Set up a Device Owner.
-        mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+    public void testIsCurrentInputMethodSetByOwnerForDeviceOwner() throws Exception {
+        final String currentIme = Settings.Secure.DEFAULT_INPUT_METHOD;
+        final Uri currentImeUri = Settings.Secure.getUriFor(currentIme);
+        final int deviceOwnerUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+        final int firstUserSystemUid = UserHandle.getUid(UserHandle.USER_SYSTEM,
+                DpmMockContext.SYSTEM_UID);
+        final int secondUserSystemUid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE,
+                DpmMockContext.SYSTEM_UID);
+
+        // Set up a device owner.
+        mContext.binder.callingUid = deviceOwnerUid;
         setupDeviceOwner();
 
-        // First and second user set default IMEs manually.
-        final long ident = mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        // First and second user set IMEs manually.
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
 
-        // Device Owner changes default IME for first user.
-        when(mContext.settings.settingsSecureGetStringForUser(defaultIme, UserHandle.USER_SYSTEM))
+        // Device owner changes IME for first user.
+        mContext.binder.callingUid = deviceOwnerUid;
+        when(mContext.settings.settingsSecureGetStringForUser(currentIme, UserHandle.USER_SYSTEM))
                 .thenReturn("ime1");
-        dpm.setSecureSetting(admin1, defaultIme, "ime2");
-        verify(mContext.settings).settingsSecurePutStringForUser(defaultIme, "ime2",
+        dpm.setSecureSetting(admin1, currentIme, "ime2");
+        verify(mContext.settings).settingsSecurePutStringForUser(currentIme, "ime2",
                 UserHandle.USER_SYSTEM);
         reset(mContext.settings);
-        dpms.notifyChangeToContentObserver(defaultImeUri, UserHandle.USER_SYSTEM);
-        mContext.binder.clearCallingIdentity();
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
 
-        // Second user changes default IME manually.
-        dpms.notifyChangeToContentObserver(defaultImeUri, DpmMockContext.CALLER_USER_HANDLE);
-        mContext.binder.clearCallingIdentity();
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        // Second user changes IME manually.
+        dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
 
-        // First user changes default IME manually.
-        dpms.notifyChangeToContentObserver(defaultImeUri, UserHandle.USER_SYSTEM);
-        mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        // First user changes IME manually.
+        dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
 
-        // Device Owner changes default IME for first user again.
-        when(mContext.settings.settingsSecureGetStringForUser(defaultIme, UserHandle.USER_SYSTEM))
+        // Device owner changes IME for first user again.
+        mContext.binder.callingUid = deviceOwnerUid;
+        when(mContext.settings.settingsSecureGetStringForUser(currentIme, UserHandle.USER_SYSTEM))
                 .thenReturn("ime2");
-        dpm.setSecureSetting(admin1, defaultIme, "ime3");
-        verify(mContext.settings).settingsSecurePutStringForUser(defaultIme, "ime3",
+        dpm.setSecureSetting(admin1, currentIme, "ime3");
+        verify(mContext.settings).settingsSecurePutStringForUser(currentIme, "ime3",
                 UserHandle.USER_SYSTEM);
-        dpms.notifyChangeToContentObserver(defaultImeUri, UserHandle.USER_SYSTEM);
-        mContext.binder.clearCallingIdentity();
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+        dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
 
         // Restarting the DPMS should not lose information.
         initializeDpms();
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
 
-        // Device Owner can find out whether it set the default IME itself.
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(firstUser));
+        // Device owner can find out whether it set the current IME itself.
+        mContext.binder.callingUid = deviceOwnerUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
 
-        // Removing the Device Owner should clear the information that it set the default IME.
+        // Removing the device owner should clear the information that it set the current IME.
         clearDeviceOwner();
-        mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
     }
 
-    public void testIsDefaultInputMethodSetByOwnerForProfileOwner() throws Exception {
-        final String defaultIme = Settings.Secure.DEFAULT_INPUT_METHOD;
-        final Uri defaultImeUri = Settings.Secure.getUriFor(defaultIme);
-        final UserHandle firstUser = UserHandle.SYSTEM;
-        final UserHandle secondUser = UserHandle.of(DpmMockContext.CALLER_USER_HANDLE);
+    public void testIsCurrentInputMethodSetByOwnerForProfileOwner() throws Exception {
+        final String currentIme = Settings.Secure.DEFAULT_INPUT_METHOD;
+        final Uri currentImeUri = Settings.Secure.getUriFor(currentIme);
+        final int profileOwnerUid = DpmMockContext.CALLER_UID;
+        final int firstUserSystemUid = UserHandle.getUid(UserHandle.USER_SYSTEM,
+                DpmMockContext.SYSTEM_UID);
+        final int secondUserSystemUid = UserHandle.getUid(DpmMockContext.CALLER_USER_HANDLE,
+                DpmMockContext.SYSTEM_UID);
 
         // Set up a profile owner.
+        mContext.binder.callingUid = profileOwnerUid;
         setupProfileOwner();
 
-        // First and second user set default IMEs manually.
-        final long ident = mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        // First and second user set IMEs manually.
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
 
-        // Profile Owner changes default IME for second user.
-        when(mContext.settings.settingsSecureGetStringForUser(defaultIme,
+        // Profile owner changes IME for second user.
+        mContext.binder.callingUid = profileOwnerUid;
+        when(mContext.settings.settingsSecureGetStringForUser(currentIme,
                 DpmMockContext.CALLER_USER_HANDLE)).thenReturn("ime1");
-        dpm.setSecureSetting(admin1, defaultIme, "ime2");
-        verify(mContext.settings).settingsSecurePutStringForUser(defaultIme, "ime2",
+        dpm.setSecureSetting(admin1, currentIme, "ime2");
+        verify(mContext.settings).settingsSecurePutStringForUser(currentIme, "ime2",
                 DpmMockContext.CALLER_USER_HANDLE);
         reset(mContext.settings);
-        dpms.notifyChangeToContentObserver(defaultImeUri, DpmMockContext.CALLER_USER_HANDLE);
-        mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
 
-        // First user changes default IME manually.
-        dpms.notifyChangeToContentObserver(defaultImeUri, UserHandle.USER_SYSTEM);
-        mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        // First user changes IME manually.
+        dpms.notifyChangeToContentObserver(currentImeUri, UserHandle.USER_SYSTEM);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
 
-        // Second user changes default IME manually.
-        dpms.notifyChangeToContentObserver(defaultImeUri, DpmMockContext.CALLER_USER_HANDLE);
-        mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        // Second user changes IME manually.
+        dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
 
-        // Profile Owner changes default IME for second user again.
-        when(mContext.settings.settingsSecureGetStringForUser(defaultIme,
+        // Profile owner changes IME for second user again.
+        mContext.binder.callingUid = profileOwnerUid;
+        when(mContext.settings.settingsSecureGetStringForUser(currentIme,
                 DpmMockContext.CALLER_USER_HANDLE)).thenReturn("ime2");
-        dpm.setSecureSetting(admin1, defaultIme, "ime3");
-        verify(mContext.settings).settingsSecurePutStringForUser(defaultIme, "ime3",
+        dpm.setSecureSetting(admin1, currentIme, "ime3");
+        verify(mContext.settings).settingsSecurePutStringForUser(currentIme, "ime3",
                 DpmMockContext.CALLER_USER_HANDLE);
-        dpms.notifyChangeToContentObserver(defaultImeUri, DpmMockContext.CALLER_USER_HANDLE);
-        mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
+        dpms.notifyChangeToContentObserver(currentImeUri, DpmMockContext.CALLER_USER_HANDLE);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
 
         // Restarting the DPMS should not lose information.
         initializeDpms();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
-        mContext.binder.restoreCallingIdentity(ident);
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
 
-        // Profile Owner can find out whether it set the default IME itself.
-        assertTrue(dpm.isDefaultInputMethodSetByOwner(secondUser));
+        // Profile owner can find out whether it set the current IME itself.
+        mContext.binder.callingUid = profileOwnerUid;
+        assertTrue(dpm.isCurrentInputMethodSetByOwner());
 
-        // Removing the Profile Owner should clear the information that it set the default IME.
+        // Removing the profile owner should clear the information that it set the current IME.
         dpm.clearProfileOwner(admin1);
-        mContext.binder.clearCallingIdentity();
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(firstUser));
-        assertFalse(dpm.isDefaultInputMethodSetByOwner(secondUser));
+        mContext.binder.callingUid = firstUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
+        mContext.binder.callingUid = secondUserSystemUid;
+        assertFalse(dpm.isCurrentInputMethodSetByOwner());
     }
 
     public void testGetOwnerInstalledCaCertsForDeviceOwner() throws Exception {