UserRestrictionsUtils.java revision c48b20f8f1d3e07e8a931b195669b0ab8895006c
1a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki/* 2a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * Copyright (C) 2015 The Android Open Source Project 3a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * 4a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 5a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * you may not use this file except in compliance with the License. 6a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * You may obtain a copy of the License at 7a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * 8a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 9a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * 10a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * Unless required by applicable law or agreed to in writing, software 11a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 12a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * See the License for the specific language governing permissions and 14a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * limitations under the License. 15a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki */ 16a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 17a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukipackage com.android.server.pm; 18a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 19a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukiimport com.google.android.collect.Sets; 20a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 211a2cd74526113b45d9108b6997609122c4311fb1Makoto Onukiimport com.android.internal.util.Preconditions; 221a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 231a2cd74526113b45d9108b6997609122c4311fb1Makoto Onukiimport android.annotation.NonNull; 241a2cd74526113b45d9108b6997609122c4311fb1Makoto Onukiimport android.annotation.Nullable; 259cbfc9e212151e84910a22387365644916dde446Fyodor Kupolovimport android.app.ActivityManager; 269cbfc9e212151e84910a22387365644916dde446Fyodor Kupolovimport android.app.ActivityManagerNative; 274f16073556f7978708fb71c87628cfe1692412d5Makoto Onukiimport android.content.ContentResolver; 284f16073556f7978708fb71c87628cfe1692412d5Makoto Onukiimport android.content.Context; 294f16073556f7978708fb71c87628cfe1692412d5Makoto Onukiimport android.os.Binder; 30a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukiimport android.os.Bundle; 319cbfc9e212151e84910a22387365644916dde446Fyodor Kupolovimport android.os.RemoteException; 324f16073556f7978708fb71c87628cfe1692412d5Makoto Onukiimport android.os.UserHandle; 33a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukiimport android.os.UserManager; 34830e32cdccdeeeadc5f07ba006b2b5779f8be65dMahaver Chopraimport android.service.persistentdata.PersistentDataBlockManager; 35dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopraimport android.telephony.SubscriptionInfo; 36dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopraimport android.telephony.SubscriptionManager; 371a2cd74526113b45d9108b6997609122c4311fb1Makoto Onukiimport android.util.Log; 381f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onukiimport android.util.Slog; 39a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 40a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukiimport org.xmlpull.v1.XmlPullParser; 41a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukiimport org.xmlpull.v1.XmlSerializer; 42a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 43a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukiimport java.io.IOException; 44a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukiimport java.io.PrintWriter; 45dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopraimport java.util.List; 46a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukiimport java.util.Set; 47a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 48d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki/** 49dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra * Utility methods for user restrictions. 50d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki * 51d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki * <p>See {@link UserManagerService} for the method suffixes. 52d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki */ 53a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onukipublic class UserRestrictionsUtils { 544f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki private static final String TAG = "UserRestrictionsUtils"; 554f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki 56a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki private UserRestrictionsUtils() { 57a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 58a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 591f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki private static Set<String> newSetWithUniqueCheck(String[] strings) { 601f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki final Set<String> ret = Sets.newArraySet(strings); 611f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki 621f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki // Make sure there's no overlap. 631f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki Preconditions.checkState(ret.size() == strings.length); 641f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki return ret; 651f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki } 661f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki 671f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki public static final Set<String> USER_RESTRICTIONS = newSetWithUniqueCheck(new String[] { 68a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_CONFIG_WIFI, 69a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_MODIFY_ACCOUNTS, 70a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_INSTALL_APPS, 71a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_UNINSTALL_APPS, 72a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_SHARE_LOCATION, 73a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, 74a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_CONFIG_BLUETOOTH, 75a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_USB_FILE_TRANSFER, 76a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_CONFIG_CREDENTIALS, 77a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_REMOVE_USER, 78a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_DEBUGGING_FEATURES, 79a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_CONFIG_VPN, 80a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_CONFIG_TETHERING, 81a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_NETWORK_RESET, 82a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_FACTORY_RESET, 83a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_ADD_USER, 84a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.ENSURE_VERIFY_APPS, 85a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, 86a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, 87a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_APPS_CONTROL, 88a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, 89a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_UNMUTE_MICROPHONE, 90a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_ADJUST_VOLUME, 91a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_OUTGOING_CALLS, 92a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_SMS, 93a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_FUN, 94a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_CREATE_WINDOWS, 95a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_CROSS_PROFILE_COPY_PASTE, 96a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_OUTGOING_BEAM, 97a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_WALLPAPER, 98a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_SAFE_BOOT, 99a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.ALLOW_PARENT_PROFILE_APP_LINKING, 100a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki UserManager.DISALLOW_RECORD_AUDIO, 1019cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov UserManager.DISALLOW_CAMERA, 102dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra UserManager.DISALLOW_RUN_IN_BACKGROUND, 1037f1f1dfc8713fbecbab60cfbe14ab4d97d27deeeOleksandr Peletskyi UserManager.DISALLOW_DATA_ROAMING, 104f2519814cc7136773a115b770d20cf4c92945952Oleksandr Peletskyi UserManager.DISALLOW_SET_USER_ICON, 1053d9805d50281882b4420ee2d4ede8a8bdd94d455Mahaver Chopra UserManager.DISALLOW_SET_WALLPAPER, 106c1205111a92b52283078f1a2e86c8d32c5928b92Tony Mak UserManager.DISALLOW_OEM_UNLOCK, 107c1205111a92b52283078f1a2e86c8d32c5928b92Tony Mak UserManager.DISALLLOW_UNMUTE_DEVICE, 1081f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki }); 109a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 110a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki /** 111a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki * Set of user restriction which we don't want to persist. 112a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki */ 1131a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki private static final Set<String> NON_PERSIST_USER_RESTRICTIONS = Sets.newArraySet( 1141a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_RECORD_AUDIO 1151a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki ); 1161a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 1171a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki /** 1181a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * User restrictions that can not be set by profile owners. 1191a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki */ 1201a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki private static final Set<String> DEVICE_OWNER_ONLY_RESTRICTIONS = Sets.newArraySet( 1211a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_USB_FILE_TRANSFER, 1221a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_CONFIG_TETHERING, 1231a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_NETWORK_RESET, 1241a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_FACTORY_RESET, 1251a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_ADD_USER, 1261a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, 1271a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, 1281a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA, 1291a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_SMS, 1301a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_FUN, 1311a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_SAFE_BOOT, 132dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra UserManager.DISALLOW_CREATE_WINDOWS, 133dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra UserManager.DISALLOW_DATA_ROAMING 1341a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki ); 1351a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 1361a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki /** 1371a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * User restrictions that can't be changed by device owner or profile owner. 1381a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki */ 1391a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki private static final Set<String> IMMUTABLE_BY_OWNERS = Sets.newArraySet( 1401a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_RECORD_AUDIO, 1413d9805d50281882b4420ee2d4ede8a8bdd94d455Mahaver Chopra UserManager.DISALLOW_WALLPAPER, 1423d9805d50281882b4420ee2d4ede8a8bdd94d455Mahaver Chopra UserManager.DISALLOW_OEM_UNLOCK 1431a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki ); 1441a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 1451a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki /** 1461a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * Special user restrictions that can be applied to a user as well as to all users globally, 1471a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * depending on callers. When device owner sets them, they'll be applied to all users. 1481a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki */ 1491a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki private static final Set<String> GLOBAL_RESTRICTIONS = Sets.newArraySet( 1501a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki UserManager.DISALLOW_ADJUST_VOLUME, 1519cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov UserManager.DISALLOW_RUN_IN_BACKGROUND, 152c1205111a92b52283078f1a2e86c8d32c5928b92Tony Mak UserManager.DISALLOW_UNMUTE_MICROPHONE, 153c1205111a92b52283078f1a2e86c8d32c5928b92Tony Mak UserManager.DISALLLOW_UNMUTE_DEVICE 1541a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki ); 1551a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 1561f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki /** 1571f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki * Throws {@link IllegalArgumentException} if the given restriction name is invalid. 1581f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki */ 1591f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki public static boolean isValidRestriction(@NonNull String restriction) { 1601f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki if (!USER_RESTRICTIONS.contains(restriction)) { 161ad5619d44701ef488e8d4bd41cb7a98f362097c7Makoto Onuki Slog.e(TAG, "Unknown restriction: " + restriction); 1621f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki return false; 1631f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki } 1641f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki return true; 1651f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki } 1661f1ceef0f88a8c2758d1ec0ed6c1366bac7c9de4Makoto Onuki 1671a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki public static void writeRestrictions(@NonNull XmlSerializer serializer, 1681a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki @Nullable Bundle restrictions, @NonNull String tag) throws IOException { 1691a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (restrictions == null) { 1701a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return; 1711a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 172a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 173a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki serializer.startTag(null, tag); 174ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki for (String key : restrictions.keySet()) { 175ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki if (NON_PERSIST_USER_RESTRICTIONS.contains(key)) { 176ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki continue; // Don't persist. 177a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 178ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki if (USER_RESTRICTIONS.contains(key)) { 179ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki if (restrictions.getBoolean(key)) { 180ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki serializer.attribute(null, key, "true"); 181ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki } 182ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki continue; 183ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki } 184ac65e1e1dba1cf0ea237a389220ec818ade07a16Makoto Onuki Log.w(TAG, "Unknown user restriction detected: " + key); 185a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 186a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki serializer.endTag(null, tag); 187a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 188a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 189c48b20f8f1d3e07e8a931b195669b0ab8895006cEsteban Talavera public static void readRestrictions(XmlPullParser parser, Bundle restrictions) { 190a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki for (String key : USER_RESTRICTIONS) { 191a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki final String value = parser.getAttributeValue(null, key); 192a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki if (value != null) { 193a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki restrictions.putBoolean(key, Boolean.parseBoolean(value)); 194a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 195a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 196a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 197a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki 1981a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki /** 1991a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * @return {@code in} itself when it's not null, or an empty bundle (which can writable). 2001a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki */ 2011a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki public static Bundle nonNull(@Nullable Bundle in) { 2021a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return in != null ? in : new Bundle(); 2031a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2041a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 2051a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki public static boolean isEmpty(@Nullable Bundle in) { 2061a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return (in == null) || (in.size() == 0); 2071a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2081a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 2091a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki /** 2101a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * Creates a copy of the {@code in} Bundle. If {@code in} is null, it'll return an empty 2111a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * bundle. 2121a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * 2131a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * <p>The resulting {@link Bundle} is always writable. (i.e. it won't return 2141a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * {@link Bundle#EMPTY}) 2151a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki */ 2161a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki public static @NonNull Bundle clone(@Nullable Bundle in) { 2171a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return (in != null) ? new Bundle(in) : new Bundle(); 2181a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2191a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 2201a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki public static void merge(@NonNull Bundle dest, @Nullable Bundle in) { 2211a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki Preconditions.checkNotNull(dest); 2221a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki Preconditions.checkArgument(dest != in); 223068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki if (in == null) { 224068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki return; 225068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 226068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki for (String key : in.keySet()) { 227068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki if (in.getBoolean(key, false)) { 228068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki dest.putBoolean(key, true); 229068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 230068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 231068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 232068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 2334f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki /** 2341a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * @return true if a restriction is settable by device owner. 2351a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki */ 2361a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki public static boolean canDeviceOwnerChange(String restriction) { 2371a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return !IMMUTABLE_BY_OWNERS.contains(restriction); 2381a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2391a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 2401a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki /** 2415485ed46ff337769589c6e06b3469246e60b9e3bMakoto Onuki * @return true if a restriction is settable by profile owner. Note it takes a user ID because 2425485ed46ff337769589c6e06b3469246e60b9e3bMakoto Onuki * some restrictions can be changed by PO only when it's running on the system user. 2431a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki */ 2445485ed46ff337769589c6e06b3469246e60b9e3bMakoto Onuki public static boolean canProfileOwnerChange(String restriction, int userId) { 2455485ed46ff337769589c6e06b3469246e60b9e3bMakoto Onuki return !IMMUTABLE_BY_OWNERS.contains(restriction) 2465485ed46ff337769589c6e06b3469246e60b9e3bMakoto Onuki && !(userId != UserHandle.USER_SYSTEM 2475485ed46ff337769589c6e06b3469246e60b9e3bMakoto Onuki && DEVICE_OWNER_ONLY_RESTRICTIONS.contains(restriction)); 2481a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2491a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 2501a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki /** 2511a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * Takes restrictions that can be set by device owner, and sort them into what should be applied 2521a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * globally and what should be applied only on the current user. 2531a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki */ 2541a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki public static void sortToGlobalAndLocal(@Nullable Bundle in, @NonNull Bundle global, 2551a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki @NonNull Bundle local) { 2561a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (in == null || in.size() == 0) { 2571a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return; 2581a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2591a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki for (String key : in.keySet()) { 2601a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (!in.getBoolean(key)) { 2611a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki continue; 2621a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2631a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (DEVICE_OWNER_ONLY_RESTRICTIONS.contains(key) || GLOBAL_RESTRICTIONS.contains(key)) { 2641a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki global.putBoolean(key, true); 2651a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } else { 2661a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki local.putBoolean(key, true); 2671a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2681a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2691a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2701a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 2711a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki /** 2721a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * @return true if two Bundles contain the same user restriction. 2731a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki * A null bundle and an empty bundle are considered to be equal. 2741a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki */ 2751a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki public static boolean areEqual(@Nullable Bundle a, @Nullable Bundle b) { 2761a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (a == b) { 2771a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return true; 2781a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2791a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (isEmpty(a)) { 2801a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return isEmpty(b); 2811a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2821a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (isEmpty(b)) { 2831a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return false; 2841a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2851a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki for (String key : a.keySet()) { 2861a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (a.getBoolean(key) != b.getBoolean(key)) { 2871a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return false; 2881a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2891a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2901a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki for (String key : b.keySet()) { 2911a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (a.getBoolean(key) != b.getBoolean(key)) { 2921a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return false; 2931a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2941a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2951a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki return true; 2961a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 2971a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki 2981a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki /** 2994f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki * Takes a new use restriction set and the previous set, and apply the restrictions that have 3004f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki * changed. 301d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki * 3029cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov * <p>Note this method is called by {@link UserManagerService} without holding any locks. 3034f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki */ 3049cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov public static void applyUserRestrictions(Context context, int userId, 305d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki Bundle newRestrictions, Bundle prevRestrictions) { 3064f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki for (String key : USER_RESTRICTIONS) { 3074f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki final boolean newValue = newRestrictions.getBoolean(key); 3084f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki final boolean prevValue = prevRestrictions.getBoolean(key); 3094f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki 3104f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki if (newValue != prevValue) { 3119cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov applyUserRestriction(context, userId, key, newValue); 3124f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 3134f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 3144f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 3159cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov 316d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki /** 317d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki * Apply each user restriction. 318d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki * 31928da2e3490cff619157578c85d32a73ff979d554Makoto Onuki * <p>See also {@link 32028da2e3490cff619157578c85d32a73ff979d554Makoto Onuki * com.android.providers.settings.SettingsProvider#isGlobalOrSecureSettingRestrictedForUser}, 32128da2e3490cff619157578c85d32a73ff979d554Makoto Onuki * which should be in sync with this method. 322d45a4a2ecb18701b4cfadcb4a26663f2eab642feMakoto Onuki */ 3239cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov private static void applyUserRestriction(Context context, int userId, String key, 3244f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki boolean newValue) { 3251a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki if (UserManagerService.DBG) { 3261a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki Log.d(TAG, "Applying user restriction: userId=" + userId 3271a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki + " key=" + key + " value=" + newValue); 3281a2cd74526113b45d9108b6997609122c4311fb1Makoto Onuki } 3294f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki // When certain restrictions are cleared, we don't update the system settings, 3304f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki // because these settings are changeable on the Settings UI and we don't know the original 3314f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki // value -- for example LOCATION_MODE might have been off already when the restriction was 3324f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki // set, and in that case even if the restriction is lifted, changing it to ON would be 3334f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki // wrong. So just don't do anything in such a case. If the user hopes to enable location 3344f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki // later, they can do it on the Settings UI. 3350ff13fce6fa4caa0cc61dae555881c4568020327Benjamin Franz // WARNING: Remember that Settings.Global and Settings.Secure are changeable via adb. 3360ff13fce6fa4caa0cc61dae555881c4568020327Benjamin Franz // To prevent this from happening for a given user restriction, you have to add a check to 3370ff13fce6fa4caa0cc61dae555881c4568020327Benjamin Franz // SettingsProvider.isGlobalOrSecureSettingRestrictedForUser. 3384f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki 3394f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki final ContentResolver cr = context.getContentResolver(); 3404f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki final long id = Binder.clearCallingIdentity(); 3414f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki try { 3424f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki switch (key) { 3434f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki case UserManager.DISALLOW_CONFIG_WIFI: 3444f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki if (newValue) { 3454f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Secure.putIntForUser(cr, 34628da2e3490cff619157578c85d32a73ff979d554Makoto Onuki android.provider.Settings.Global 3474f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki .WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0, userId); 3484f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 3494f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki break; 350dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra case UserManager.DISALLOW_DATA_ROAMING: 351dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra if (newValue) { 352dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra // DISALLOW_DATA_ROAMING user restriction is set. 353dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra 354dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra // Multi sim device. 355dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra SubscriptionManager subscriptionManager = new SubscriptionManager(context); 356dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra final List<SubscriptionInfo> subscriptionInfoList = 357dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra subscriptionManager.getActiveSubscriptionInfoList(); 358dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra if (subscriptionInfoList != null) { 359dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra for (SubscriptionInfo subInfo : subscriptionInfoList) { 360dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra android.provider.Settings.Global.putStringForUser(cr, 361dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra android.provider.Settings.Global.DATA_ROAMING 362dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra + subInfo.getSubscriptionId(), "0", userId); 363dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra } 364dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra } 365dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra 366dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra // Single sim device. 367dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra android.provider.Settings.Global.putStringForUser(cr, 368dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra android.provider.Settings.Global.DATA_ROAMING, "0", userId); 369dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra } 370dea471ef548f09e04e178c5ec2d71a4b79bdb8f8Mahaver Chopra break; 3714f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki case UserManager.DISALLOW_SHARE_LOCATION: 3724f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki if (newValue) { 3734f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Secure.putIntForUser(cr, 3744f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Secure.LOCATION_MODE, 3754f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Secure.LOCATION_MODE_OFF, 3764f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki userId); 3774f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 3784f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki break; 3794f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki case UserManager.DISALLOW_DEBUGGING_FEATURES: 3804f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki if (newValue) { 3814f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki // Only disable adb if changing for system user, since it is global 3824f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki // TODO: should this be admin user? 3834f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki if (userId == UserHandle.USER_SYSTEM) { 3844f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Global.putStringForUser(cr, 3854f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Global.ADB_ENABLED, "0", 3864f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki userId); 3874f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 3884f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 3894f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki break; 3904f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki case UserManager.ENSURE_VERIFY_APPS: 3914f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki if (newValue) { 3924f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Global.putStringForUser( 3934f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki context.getContentResolver(), 3944f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Global.PACKAGE_VERIFIER_ENABLE, "1", 3954f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki userId); 3964f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Global.putStringForUser( 3974f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki context.getContentResolver(), 3984f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, "1", 3994f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki userId); 4004f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 4014f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki break; 4024f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki case UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES: 4034f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki if (newValue) { 4044f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Secure.putIntForUser(cr, 4054f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki android.provider.Settings.Secure.INSTALL_NON_MARKET_APPS, 0, 4064f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki userId); 4074f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 4084f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki break; 4099cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov case UserManager.DISALLOW_RUN_IN_BACKGROUND: 4109cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov if (newValue) { 4119cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov int currentUser = ActivityManager.getCurrentUser(); 4129cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov if (currentUser != userId && userId != UserHandle.USER_SYSTEM) { 4139cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov try { 4149cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov ActivityManagerNative.getDefault().stopUser(userId, false, null); 4159cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov } catch (RemoteException e) { 4169cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov throw e.rethrowAsRuntimeException(); 4179cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov } 4189cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov } 4199cbfc9e212151e84910a22387365644916dde446Fyodor Kupolov } 4206474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova break; 4216474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova case UserManager.DISALLOW_SAFE_BOOT: 4226474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova // Unlike with the other restrictions, we want to propagate the new value to 4236474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova // the system settings even if it is false. The other restrictions modify 4246474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova // settings which could be manually changed by the user from the Settings app 4256474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova // after the policies enforcing these restrictions have been revoked, so we 4266474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova // leave re-setting of those settings to the user. 4276474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova android.provider.Settings.Global.putInt( 4286474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova context.getContentResolver(), 4296474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova android.provider.Settings.Global.SAFE_BOOT_DISALLOWED, 4306474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova newValue ? 1 : 0); 4316474f0e02b9a00c1f69f985c0d73cf7f8c0fb073Lenka Trochtova break; 432830e32cdccdeeeadc5f07ba006b2b5779f8be65dMahaver Chopra case UserManager.DISALLOW_FACTORY_RESET: 4333d9805d50281882b4420ee2d4ede8a8bdd94d455Mahaver Chopra case UserManager.DISALLOW_OEM_UNLOCK: 434830e32cdccdeeeadc5f07ba006b2b5779f8be65dMahaver Chopra if (newValue) { 435830e32cdccdeeeadc5f07ba006b2b5779f8be65dMahaver Chopra PersistentDataBlockManager manager = (PersistentDataBlockManager) context 436830e32cdccdeeeadc5f07ba006b2b5779f8be65dMahaver Chopra .getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); 437c48b20f8f1d3e07e8a931b195669b0ab8895006cEsteban Talavera if (manager != null 438c48b20f8f1d3e07e8a931b195669b0ab8895006cEsteban Talavera && manager.getOemUnlockEnabled() 439c48b20f8f1d3e07e8a931b195669b0ab8895006cEsteban Talavera && manager.getFlashLockState() 440c48b20f8f1d3e07e8a931b195669b0ab8895006cEsteban Talavera != PersistentDataBlockManager.FLASH_LOCK_UNLOCKED) { 441c48b20f8f1d3e07e8a931b195669b0ab8895006cEsteban Talavera // Only disable OEM unlock if the bootloader is locked. If it's already 442c48b20f8f1d3e07e8a931b195669b0ab8895006cEsteban Talavera // unlocked, setting the OEM unlock enabled flag to false has no effect 443c48b20f8f1d3e07e8a931b195669b0ab8895006cEsteban Talavera // (the bootloader would remain unlocked). 444830e32cdccdeeeadc5f07ba006b2b5779f8be65dMahaver Chopra manager.setOemUnlockEnabled(false); 445830e32cdccdeeeadc5f07ba006b2b5779f8be65dMahaver Chopra } 446830e32cdccdeeeadc5f07ba006b2b5779f8be65dMahaver Chopra } 447c1205111a92b52283078f1a2e86c8d32c5928b92Tony Mak break; 4484f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 4494f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } finally { 4504f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki Binder.restoreCallingIdentity(id); 4514f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 4524f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki } 4534f16073556f7978708fb71c87628cfe1692412d5Makoto Onuki 454a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki public static void dumpRestrictions(PrintWriter pw, String prefix, Bundle restrictions) { 455a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki boolean noneSet = true; 456a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki if (restrictions != null) { 457a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki for (String key : restrictions.keySet()) { 458a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki if (restrictions.getBoolean(key, false)) { 459a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki pw.println(prefix + key); 460a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki noneSet = false; 461a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 462a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 463068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki if (noneSet) { 464068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki pw.println(prefix + "none"); 465068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 466068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } else { 467068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki pw.println(prefix + "null"); 468a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 469a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki } 470a4f119790e32fcce56586e7324d508e35cb30a2aMakoto Onuki} 471