diff --git a/api/current.txt b/api/current.txt index 418940918654b..cfb688f0198f8 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5793,6 +5793,7 @@ package android.app.admin { method public boolean getCameraDisabled(android.content.ComponentName); method public java.lang.String getCertInstallerPackage(android.content.ComponentName) throws java.lang.SecurityException; method public boolean getCrossProfileCallerIdDisabled(android.content.ComponentName); + method public boolean getCrossProfileContactsSearchDisabled(android.content.ComponentName); method public java.util.List getCrossProfileWidgetProviders(android.content.ComponentName); method public int getCurrentFailedPasswordAttempts(); method public java.lang.String getDeviceOwnerLockScreenInfo(); @@ -5857,6 +5858,7 @@ package android.app.admin { method public void setCameraDisabled(android.content.ComponentName, boolean); method public void setCertInstallerPackage(android.content.ComponentName, java.lang.String) throws java.lang.SecurityException; method public void setCrossProfileCallerIdDisabled(android.content.ComponentName, boolean); + method public void setCrossProfileContactsSearchDisabled(android.content.ComponentName, boolean); method public boolean setDeviceOwnerLockScreenInfo(android.content.ComponentName, java.lang.String); method public void setGlobalSetting(android.content.ComponentName, java.lang.String, java.lang.String); method public boolean setKeyguardDisabled(android.content.ComponentName, boolean); diff --git a/api/system-current.txt b/api/system-current.txt index a63a0731d7cfa..9da472e287abc 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5919,6 +5919,7 @@ package android.app.admin { method public boolean getCameraDisabled(android.content.ComponentName); method public java.lang.String getCertInstallerPackage(android.content.ComponentName) throws java.lang.SecurityException; method public boolean getCrossProfileCallerIdDisabled(android.content.ComponentName); + method public boolean getCrossProfileContactsSearchDisabled(android.content.ComponentName); method public java.util.List getCrossProfileWidgetProviders(android.content.ComponentName); method public int getCurrentFailedPasswordAttempts(); method public deprecated java.lang.String getDeviceInitializerApp(); @@ -5992,6 +5993,7 @@ package android.app.admin { method public void setCameraDisabled(android.content.ComponentName, boolean); method public void setCertInstallerPackage(android.content.ComponentName, java.lang.String) throws java.lang.SecurityException; method public void setCrossProfileCallerIdDisabled(android.content.ComponentName, boolean); + method public void setCrossProfileContactsSearchDisabled(android.content.ComponentName, boolean); method public boolean setDeviceOwnerLockScreenInfo(android.content.ComponentName, java.lang.String); method public void setGlobalSetting(android.content.ComponentName, java.lang.String, java.lang.String); method public boolean setKeyguardDisabled(android.content.ComponentName, boolean); diff --git a/api/test-current.txt b/api/test-current.txt index f15ab581877ba..9b9f83d82869c 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -5795,6 +5795,7 @@ package android.app.admin { method public boolean getCameraDisabled(android.content.ComponentName); method public java.lang.String getCertInstallerPackage(android.content.ComponentName) throws java.lang.SecurityException; method public boolean getCrossProfileCallerIdDisabled(android.content.ComponentName); + method public boolean getCrossProfileContactsSearchDisabled(android.content.ComponentName); method public java.util.List getCrossProfileWidgetProviders(android.content.ComponentName); method public int getCurrentFailedPasswordAttempts(); method public java.lang.String getDeviceOwnerLockScreenInfo(); @@ -5859,6 +5860,7 @@ package android.app.admin { method public void setCameraDisabled(android.content.ComponentName, boolean); method public void setCertInstallerPackage(android.content.ComponentName, java.lang.String) throws java.lang.SecurityException; method public void setCrossProfileCallerIdDisabled(android.content.ComponentName, boolean); + method public void setCrossProfileContactsSearchDisabled(android.content.ComponentName, boolean); method public boolean setDeviceOwnerLockScreenInfo(android.content.ComponentName, java.lang.String); method public void setGlobalSetting(android.content.ComponentName, java.lang.String, java.lang.String); method public boolean setKeyguardDisabled(android.content.ComponentName, boolean); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 08e9b1e897af9..4de3ceb4792e6 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -3539,6 +3539,66 @@ public class DevicePolicyManager { return false; } + /** + * Called by a profile owner of a managed profile to set whether contacts search from + * the managed profile will be shown in the parent profile, for incoming calls. + * + *

The calling device admin must be a profile owner. If it is not, a + * security exception will be thrown. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param disabled If true contacts search in the managed profile is not displayed. + */ + public void setCrossProfileContactsSearchDisabled(@NonNull ComponentName admin, + boolean disabled) { + if (mService != null) { + try { + mService.setCrossProfileContactsSearchDisabled(admin, disabled); + } catch (RemoteException e) { + Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + } + } + } + + /** + * Called by a profile owner of a managed profile to determine whether or not contacts search + * has been disabled. + * + *

The calling device admin must be a profile owner. If it is not, a + * security exception will be thrown. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + */ + public boolean getCrossProfileContactsSearchDisabled(@NonNull ComponentName admin) { + if (mService != null) { + try { + return mService.getCrossProfileContactsSearchDisabled(admin); + } catch (RemoteException e) { + Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + } + } + return false; + } + + + /** + * Determine whether or not contacts search has been disabled. + * + * @param userHandle The user for whom to check the contacts search permission + * @hide + */ + public boolean getCrossProfileContactsSearchDisabled(@NonNull UserHandle userHandle) { + if (mService != null) { + try { + return mService + .getCrossProfileContactsSearchDisabledForUser(userHandle.getIdentifier()); + } catch (RemoteException e) { + Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, e); + } + } + return false; + } + /** * Start Quick Contact on the managed profile for the user, if the policy allows. * @hide diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 754cb432bf7c3..d3c32c51798a6 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -202,6 +202,9 @@ interface IDevicePolicyManager { void setCrossProfileCallerIdDisabled(in ComponentName who, boolean disabled); boolean getCrossProfileCallerIdDisabled(in ComponentName who); boolean getCrossProfileCallerIdDisabledForUser(int userId); + void setCrossProfileContactsSearchDisabled(in ComponentName who, boolean disabled); + boolean getCrossProfileContactsSearchDisabled(in ComponentName who); + boolean getCrossProfileContactsSearchDisabledForUser(int userId); void startManagedQuickContact(String lookupKey, long contactId, long directoryId, in Intent originalIntent); void setBluetoothContactSharingDisabled(in ComponentName who, boolean disabled); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index dd58b3c4443e5..380763abf6e33 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -388,6 +388,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private static final String TAG_DISABLE_KEYGUARD_FEATURES = "disable-keyguard-features"; private static final String TAG_DISABLE_CAMERA = "disable-camera"; private static final String TAG_DISABLE_CALLER_ID = "disable-caller-id"; + private static final String TAG_DISABLE_CONTACTS_SEARCH = "disable-contacts-search"; private static final String TAG_DISABLE_BLUETOOTH_CONTACT_SHARING = "disable-bt-contacts-sharing"; private static final String TAG_DISABLE_SCREEN_CAPTURE = "disable-screen-capture"; @@ -476,6 +477,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { boolean encryptionRequested = false; boolean disableCamera = false; boolean disableCallerId = false; + boolean disableContactsSearch = false; boolean disableBluetoothContactSharing = true; boolean disableScreenCapture = false; // Can only be set by a device/profile owner. boolean requireAutoTime = false; // Can only be set by a device owner. @@ -638,6 +640,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { out.attribute(null, ATTR_VALUE, Boolean.toString(disableCallerId)); out.endTag(null, TAG_DISABLE_CALLER_ID); } + if (disableContactsSearch) { + out.startTag(null, TAG_DISABLE_CONTACTS_SEARCH); + out.attribute(null, ATTR_VALUE, Boolean.toString(disableContactsSearch)); + out.endTag(null, TAG_DISABLE_CONTACTS_SEARCH); + } if (disableBluetoothContactSharing) { out.startTag(null, TAG_DISABLE_BLUETOOTH_CONTACT_SHARING); out.attribute(null, ATTR_VALUE, @@ -809,6 +816,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } else if (TAG_DISABLE_CALLER_ID.equals(tag)) { disableCallerId = Boolean.parseBoolean( parser.getAttributeValue(null, ATTR_VALUE)); + } else if (TAG_DISABLE_CONTACTS_SEARCH.equals(tag)) { + disableContactsSearch = Boolean.parseBoolean( + parser.getAttributeValue(null, ATTR_VALUE)); } else if (TAG_DISABLE_BLUETOOTH_CONTACT_SHARING.equals(tag)) { disableBluetoothContactSharing = Boolean.parseBoolean(parser .getAttributeValue(null, ATTR_VALUE)); @@ -1034,6 +1044,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { pw.println(disableCamera); pw.print(prefix); pw.print("disableCallerId="); pw.println(disableCallerId); + pw.print(prefix); pw.print("disableContactsSearch="); + pw.println(disableContactsSearch); pw.print(prefix); pw.print("disableBluetoothContactSharing="); pw.println(disableBluetoothContactSharing); pw.print(prefix); pw.print("disableScreenCapture="); @@ -1808,7 +1820,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return null; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); Intent resolveIntent = new Intent(); resolveIntent.setComponent(adminName); List infos = mContext.getPackageManager().queryBroadcastReceiversAsUser( @@ -2411,7 +2423,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { Bundle onEnableData) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.MANAGE_DEVICE_ADMINS, null); - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); DevicePolicyData policy = getUserData(userHandle); DeviceAdminInfo info = findAdmin(adminReceiver, userHandle, @@ -2457,7 +2469,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return false; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { return getActiveAdminUncheckedLocked(adminReceiver, userHandle) != null; } @@ -2468,7 +2480,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return false; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { DevicePolicyData policyData = getUserData(userHandle); return policyData.mRemovingAdmins.contains(adminReceiver); @@ -2480,7 +2492,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return false; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { ActiveAdmin administrator = getActiveAdminUncheckedLocked(adminReceiver, userHandle); if (administrator == null) { @@ -2497,7 +2509,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return Collections.EMPTY_LIST; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { DevicePolicyData policy = getUserData(userHandle); final int N = policy.mAdminList.size(); @@ -2517,7 +2529,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return false; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { DevicePolicyData policy = getUserData(userHandle); final int N = policy.mAdminList.size(); @@ -2535,7 +2547,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver, userHandle); if (admin == null) { @@ -2594,7 +2606,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int mode = DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; @@ -2664,7 +2676,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int length = 0; @@ -2711,7 +2723,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int length = 0; @@ -2771,7 +2783,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0L; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { long timeout = 0L; @@ -2898,7 +2910,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0L; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { return getPasswordExpirationLocked(who, userHandle); } @@ -2926,7 +2938,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int length = 0; @@ -2970,7 +2982,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int length = 0; @@ -3017,7 +3029,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int length = 0; @@ -3067,7 +3079,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int length = 0; @@ -3117,7 +3129,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int length = 0; @@ -3167,7 +3179,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int length = 0; @@ -3200,7 +3212,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return true; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { int id = getCredentialOwner(userHandle); @@ -3272,7 +3284,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { ActiveAdmin admin = (who != null) ? getActiveAdminUncheckedLocked(who, userHandle) : getAdminWithMinimumFailedPasswordsForWipeLocked(userHandle); @@ -3285,7 +3297,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return UserHandle.USER_NULL; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { ActiveAdmin admin = getAdminWithMinimumFailedPasswordsForWipeLocked(userHandle); return admin != null ? admin.getUserHandle().getIdentifier() : UserHandle.USER_NULL; @@ -3584,7 +3596,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { long time = 0; @@ -3906,7 +3918,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return; } final int userHandle = mInjector.userHandleGetCallingUserId(); - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { // This API can only be called by an active device admin, // so try to retrieve it to check that the caller is one. @@ -3985,7 +3997,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); mContext.enforceCallingOrSelfPermission( android.Manifest.permission.BIND_DEVICE_ADMIN, null); @@ -4014,7 +4026,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); // Managed Profile password can only be changed when per user encryption is present. if (!LockPatternUtils.isSeparateWorkChallengeEnabled()) { enforceNotManagedProfile(userHandle, "set the active password"); @@ -4083,7 +4095,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public void reportFailedPasswordAttempt(int userHandle) { - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); enforceNotManagedProfile(userHandle, "report failed password attempt"); mContext.enforceCallingOrSelfPermission( android.Manifest.permission.BIND_DEVICE_ADMIN, null); @@ -4125,7 +4137,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public void reportSuccessfulPasswordAttempt(int userHandle) { - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); mContext.enforceCallingOrSelfPermission( android.Manifest.permission.BIND_DEVICE_ADMIN, null); @@ -4209,7 +4221,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return null; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized(this) { DevicePolicyData policy = getUserData(UserHandle.USER_SYSTEM); // Scan through active admins and find if anyone has already @@ -4346,7 +4358,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return false; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { // Check for permissions if a particular caller is specified if (who != null) { @@ -4376,7 +4388,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { // Ok to return current status. } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); return getEncryptionStatus(); } @@ -4624,7 +4636,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return 0; } - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); long ident = mInjector.binderClearCallingIdentity(); try { synchronized (this) { @@ -5185,17 +5197,28 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - private void enforceCrossUserPermission(int userHandle) { + private void enforceFullCrossUsersPermission(int userHandle) { + enforceSystemUserOrPermission(userHandle, + android.Manifest.permission.INTERACT_ACROSS_USERS_FULL); + } + + private void enforceCrossUsersPermission(int userHandle) { + enforceSystemUserOrPermission(userHandle, + android.Manifest.permission.INTERACT_ACROSS_USERS); + } + + private void enforceSystemUserOrPermission(int userHandle, String permission) { if (userHandle < 0) { throw new IllegalArgumentException("Invalid userId " + userHandle); } final int callingUid = mInjector.binderGetCallingUid(); - if (userHandle == UserHandle.getUserId(callingUid)) return; + if (userHandle == UserHandle.getUserId(callingUid)) { + return; + } if (!(UserHandle.isSameApp(callingUid, Process.SYSTEM_UID) || callingUid == Process.ROOT_UID)) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, "Must be system or have" - + " INTERACT_ACROSS_USERS_FULL permission"); + mContext.enforceCallingOrSelfPermission(permission, + "Must be system or have " + permission + " permission"); } } @@ -5405,7 +5428,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return null; } Preconditions.checkNotNull(agent, "agent null"); - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { final String componentName = agent.flattenToString(); @@ -6068,7 +6091,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public Bundle getUserRestrictions(ComponentName who, int userHandle) { Preconditions.checkNotNull(who, "ComponentName is null"); - enforceCrossUserPermission(userHandle); + enforceFullCrossUsersPermission(userHandle); synchronized (this) { ActiveAdmin activeAdmin = getActiveAdminUncheckedLocked(who, userHandle); if (activeAdmin == null) { @@ -6260,7 +6283,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public String[] getAccountTypesWithManagementDisabledAsUser(int userId) { - enforceCrossUserPermission(userId); + enforceFullCrossUsersPermission(userId); if (!mHasFeature) { return null; } @@ -6332,7 +6355,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); if (admin.disableCallerId != disabled) { admin.disableCallerId = disabled; - saveSettingsLocked(UserHandle.getCallingUserId()); + saveSettingsLocked(mInjector.userHandleGetCallingUserId()); } } } @@ -6352,14 +6375,51 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public boolean getCrossProfileCallerIdDisabledForUser(int userId) { - // TODO: Should there be a check to make sure this relationship is within a profile group? - //enforceSystemProcess("getCrossProfileCallerIdDisabled can only be called by system"); + enforceCrossUsersPermission(userId); synchronized (this) { ActiveAdmin admin = getProfileOwnerAdminLocked(userId); return (admin != null) ? admin.disableCallerId : false; } } + @Override + public void setCrossProfileContactsSearchDisabled(ComponentName who, boolean disabled) { + if (!mHasFeature) { + return; + } + Preconditions.checkNotNull(who, "ComponentName is null"); + synchronized (this) { + ActiveAdmin admin = getActiveAdminForCallerLocked(who, + DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); + if (admin.disableContactsSearch != disabled) { + admin.disableContactsSearch = disabled; + saveSettingsLocked(mInjector.userHandleGetCallingUserId()); + } + } + } + + @Override + public boolean getCrossProfileContactsSearchDisabled(ComponentName who) { + if (!mHasFeature) { + return false; + } + Preconditions.checkNotNull(who, "ComponentName is null"); + synchronized (this) { + ActiveAdmin admin = getActiveAdminForCallerLocked(who, + DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); + return admin.disableContactsSearch; + } + } + + @Override + public boolean getCrossProfileContactsSearchDisabledForUser(int userId) { + enforceCrossUsersPermission(userId); + synchronized (this) { + ActiveAdmin admin = getProfileOwnerAdminLocked(userId); + return (admin != null) ? admin.disableContactsSearch : false; + } + } + @Override public void startManagedQuickContact(String actualLookupKey, long actualContactId, long actualDirectoryId, Intent originalIntent) {