1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.cts.verifier.managedprovisioning; 18 19 import android.content.Context; 20 import android.content.Intent; 21 import android.content.pm.PackageManager; 22 import android.os.UserManager; 23 import android.provider.Settings; 24 import android.util.ArrayMap; 25 26 import com.android.cts.verifier.R; 27 28 import java.util.ArrayList; 29 import java.util.Arrays; 30 import java.util.List; 31 32 public class UserRestrictions { 33 private static final String[] RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY = new String[] { 34 UserManager.DISALLOW_ADD_USER, 35 UserManager.DISALLOW_ADJUST_VOLUME, 36 UserManager.DISALLOW_APPS_CONTROL, 37 UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, 38 UserManager.DISALLOW_CONFIG_CREDENTIALS, 39 UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS, 40 UserManager.DISALLOW_CONFIG_TETHERING, 41 UserManager.DISALLOW_CONFIG_WIFI, 42 UserManager.DISALLOW_DEBUGGING_FEATURES, 43 UserManager.DISALLOW_FACTORY_RESET, 44 UserManager.DISALLOW_FUN, 45 UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, 46 UserManager.DISALLOW_MODIFY_ACCOUNTS, 47 UserManager.DISALLOW_NETWORK_RESET, 48 UserManager.DISALLOW_OUTGOING_BEAM, 49 UserManager.DISALLOW_REMOVE_MANAGED_PROFILE, 50 UserManager.DISALLOW_REMOVE_USER, 51 UserManager.DISALLOW_SHARE_LOCATION, 52 UserManager.DISALLOW_UNINSTALL_APPS 53 }; 54 55 private static final ArrayMap<String, UserRestrictionItem> USER_RESTRICTION_ITEMS; 56 static { 57 final int[] restrictionLabels = new int[] { 58 R.string.disallow_add_user, 59 R.string.disallow_adjust_volume, 60 R.string.disallow_apps_control, 61 R.string.disallow_config_cell_broadcasts, 62 R.string.disallow_config_credentials, 63 R.string.disallow_config_mobile_networks, 64 R.string.disallow_config_tethering, 65 R.string.disallow_config_wifi, 66 R.string.disallow_debugging_features, 67 R.string.disallow_factory_reset, 68 R.string.disallow_fun, 69 R.string.disallow_install_unknown_sources, 70 R.string.disallow_modify_accounts, 71 R.string.disallow_network_reset, 72 R.string.disallow_outgoing_beam, 73 R.string.disallow_remove_managed_profile, 74 R.string.disallow_remove_user, 75 R.string.disallow_share_location, 76 R.string.disallow_uninstall_apps 77 }; 78 79 final int[] restrictionActions = new int[] { 80 R.string.disallow_add_user_action, 81 R.string.disallow_adjust_volume_action, 82 R.string.disallow_apps_control_action, 83 R.string.disallow_config_cell_broadcasts_action, 84 R.string.disallow_config_credentials_action, 85 R.string.disallow_config_mobile_networks_action, 86 R.string.disallow_config_tethering_action, 87 R.string.disallow_config_wifi_action, 88 R.string.disallow_debugging_features_action, 89 R.string.disallow_factory_reset_action, 90 R.string.disallow_fun_action, 91 R.string.disallow_install_unknown_sources_action, 92 R.string.disallow_modify_accounts_action, 93 R.string.disallow_network_reset_action, 94 R.string.disallow_outgoing_beam_action, 95 R.string.disallow_remove_managed_profile_action, 96 R.string.disallow_remove_user_action, 97 R.string.disallow_share_location_action, 98 R.string.disallow_uninstall_apps_action 99 }; 100 101 final String[] settingsIntentActions = new String[] { 102 Settings.ACTION_SETTINGS, 103 Settings.ACTION_SOUND_SETTINGS, 104 Settings.ACTION_APPLICATION_SETTINGS, 105 Settings.ACTION_SOUND_SETTINGS, 106 Settings.ACTION_SECURITY_SETTINGS, 107 Settings.ACTION_WIRELESS_SETTINGS, 108 Settings.ACTION_WIRELESS_SETTINGS, 109 Settings.ACTION_WIFI_SETTINGS, 110 Settings.ACTION_DEVICE_INFO_SETTINGS, 111 Settings.ACTION_PRIVACY_SETTINGS, 112 Settings.ACTION_DEVICE_INFO_SETTINGS, 113 Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, 114 Settings.ACTION_SYNC_SETTINGS, 115 Settings.ACTION_WIRELESS_SETTINGS, 116 Settings.ACTION_WIRELESS_SETTINGS, 117 Settings.ACTION_SETTINGS, 118 Settings.ACTION_SETTINGS, 119 Settings.ACTION_LOCATION_SOURCE_SETTINGS, 120 Settings.ACTION_APPLICATION_SETTINGS, 121 }; 122 123 if (RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY.length != restrictionLabels.length 124 || RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY.length != restrictionActions.length 125 || RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY.length != settingsIntentActions.length) { 126 throw new AssertionError("Number of items in restrictionIds, restrictionLabels, " 127 + "restrictionActions, and settingsIntentActions do not match"); 128 } 129 USER_RESTRICTION_ITEMS = new ArrayMap<>(RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY.length); 130 for (int i = 0; i < RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY.length; ++i) { USER_RESTRICTION_ITEMS.put(RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY[i], new UserRestrictionItem( restrictionLabels[i], restrictionActions[i], settingsIntentActions[i]))131 USER_RESTRICTION_ITEMS.put(RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY[i], 132 new UserRestrictionItem( 133 restrictionLabels[i], 134 restrictionActions[i], 135 settingsIntentActions[i])); 136 } 137 } 138 139 private static final ArrayList<String> ALSO_VALID_FOR_PO_POLICY_TRANSPARENCY = 140 new ArrayList<String>(); 141 static { 142 ALSO_VALID_FOR_PO_POLICY_TRANSPARENCY.add(UserManager.DISALLOW_APPS_CONTROL); 143 ALSO_VALID_FOR_PO_POLICY_TRANSPARENCY.add(UserManager.DISALLOW_UNINSTALL_APPS); 144 ALSO_VALID_FOR_PO_POLICY_TRANSPARENCY.add(UserManager.DISALLOW_MODIFY_ACCOUNTS); 145 ALSO_VALID_FOR_PO_POLICY_TRANSPARENCY.add(UserManager.DISALLOW_SHARE_LOCATION); 146 } 147 getRestrictionLabel(Context context, String restriction)148 public static String getRestrictionLabel(Context context, String restriction) { 149 final UserRestrictionItem item = findRestrictionItem(restriction); 150 return context.getString(item.label); 151 } 152 getUserAction(Context context, String restriction)153 public static String getUserAction(Context context, String restriction) { 154 final UserRestrictionItem item = findRestrictionItem(restriction); 155 return context.getString(item.userAction); 156 } 157 findRestrictionItem(String restriction)158 private static UserRestrictionItem findRestrictionItem(String restriction) { 159 final UserRestrictionItem item = USER_RESTRICTION_ITEMS.get(restriction); 160 if (item == null) { 161 throw new IllegalArgumentException("Unknown restriction: " + restriction); 162 } 163 return item; 164 } 165 getUserRestrictionsForPolicyTransparency(int mode)166 public static List<String> getUserRestrictionsForPolicyTransparency(int mode) { 167 if (mode == PolicyTransparencyTestListActivity.MODE_DEVICE_OWNER) { 168 ArrayList<String> result = new ArrayList<String>(); 169 // They are all valid except for DISALLOW_REMOVE_MANAGED_PROFILE 170 for (String st : RESTRICTION_IDS_FOR_POLICY_TRANSPARENCY) { 171 if (!st.equals(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE)) { 172 result.add(st); 173 } 174 } 175 return result; 176 } else if (mode == PolicyTransparencyTestListActivity.MODE_COMP) { 177 return Arrays.asList(UserManager.DISALLOW_REMOVE_MANAGED_PROFILE); 178 } else if (mode == PolicyTransparencyTestListActivity.MODE_PROFILE_OWNER) { 179 return ALSO_VALID_FOR_PO_POLICY_TRANSPARENCY; 180 } 181 throw new RuntimeException("Invalid mode " + mode); 182 } 183 getUserRestrictionTestIntent(Context context, String restriction)184 public static Intent getUserRestrictionTestIntent(Context context, String restriction) { 185 final UserRestrictionItem item = USER_RESTRICTION_ITEMS.get(restriction); 186 return new Intent(PolicyTransparencyTestActivity.ACTION_SHOW_POLICY_TRANSPARENCY_TEST) 187 .putExtra(PolicyTransparencyTestActivity.EXTRA_TEST, 188 PolicyTransparencyTestActivity.TEST_CHECK_USER_RESTRICTION) 189 .putExtra(CommandReceiverActivity.EXTRA_USER_RESTRICTION, restriction) 190 .putExtra(PolicyTransparencyTestActivity.EXTRA_TITLE, context.getString(item.label)) 191 .putExtra(PolicyTransparencyTestActivity.EXTRA_SETTINGS_INTENT_ACTION, 192 item.intentAction); 193 } 194 isRestrictionValid(Context context, String restriction)195 public static boolean isRestrictionValid(Context context, String restriction) { 196 final PackageManager pm = context.getPackageManager(); 197 switch (restriction) { 198 case UserManager.DISALLOW_ADD_USER: 199 case UserManager.DISALLOW_REMOVE_USER: 200 return UserManager.supportsMultipleUsers(); 201 case UserManager.DISALLOW_ADJUST_VOLUME: 202 return pm.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT); 203 case UserManager.DISALLOW_CONFIG_CELL_BROADCASTS: 204 // Get com.android.internal.R.bool.config_cellBroadcastAppLinks 205 final int resId = context.getResources().getIdentifier( 206 "config_cellBroadcastAppLinks", "bool", "android"); 207 boolean isCellBroadcastAppLinkEnabled = context.getResources().getBoolean(resId); 208 try { 209 if (isCellBroadcastAppLinkEnabled) { 210 if (pm.getApplicationEnabledSetting("com.android.cellbroadcastreceiver") 211 == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { 212 isCellBroadcastAppLinkEnabled = false; // CMAS app disabled 213 } 214 } 215 } catch (IllegalArgumentException ignored) { 216 isCellBroadcastAppLinkEnabled = false; // CMAS app not installed 217 } 218 return isCellBroadcastAppLinkEnabled; 219 case UserManager.DISALLOW_FUN: 220 // Easter egg is not available on watch 221 return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH); 222 case UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS: 223 return pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); 224 case UserManager.DISALLOW_CONFIG_WIFI: 225 return pm.hasSystemFeature(PackageManager.FEATURE_WIFI); 226 case UserManager.DISALLOW_OUTGOING_BEAM: 227 return pm.hasSystemFeature(PackageManager.FEATURE_NFC); 228 case UserManager.DISALLOW_SHARE_LOCATION: 229 return pm.hasSystemFeature(PackageManager.FEATURE_LOCATION); 230 case UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES: 231 return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH); 232 case UserManager.DISALLOW_CONFIG_CREDENTIALS: 233 return !pm.hasSystemFeature(PackageManager.FEATURE_WATCH); 234 default: 235 return true; 236 } 237 } 238 239 private static class UserRestrictionItem { 240 final int label; 241 final int userAction; 242 final String intentAction; UserRestrictionItem(int label, int userAction, String intentAction)243 public UserRestrictionItem(int label, int userAction, String intentAction) { 244 this.label = label; 245 this.userAction = userAction; 246 this.intentAction = intentAction; 247 } 248 } 249 }