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 {