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.accessibilityservice.AccessibilityService; 20 import android.app.admin.DevicePolicyManager; 21 import android.content.Intent; 22 import android.inputmethodservice.InputMethodService; 23 import android.os.Bundle; 24 import android.os.UserManager; 25 import android.util.ArrayMap; 26 import android.view.accessibility.AccessibilityEvent; 27 import android.view.View; 28 import android.widget.AdapterView; 29 import android.widget.ArrayAdapter; 30 import android.widget.Button; 31 import android.widget.CompoundButton; 32 import android.widget.EditText; 33 import android.widget.Spinner; 34 import android.widget.Switch; 35 import android.widget.TextView; 36 37 import com.android.cts.verifier.PassFailButtons; 38 import com.android.cts.verifier.R; 39 40 import java.util.ArrayList; 41 import java.util.Map; 42 43 public class PolicyTransparencyTestActivity extends PassFailButtons.Activity implements 44 View.OnClickListener, CompoundButton.OnCheckedChangeListener, 45 AdapterView.OnItemSelectedListener { 46 public static final String ACTION_SHOW_POLICY_TRANSPARENCY_TEST = 47 "com.android.cts.verifier.managedprovisioning.action.SHOW_POLICY_TRANSPARENCY_TEST"; 48 public static final String EXTRA_TEST = 49 "com.android.cts.verifier.managedprovisioning.extra.TEST"; 50 51 public static final String TEST_CHECK_USER_RESTRICTION = "check-user-restriction"; 52 public static final String TEST_CHECK_AUTO_TIME_REQUIRED = "check-auto-time-required"; 53 public static final String TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION = 54 "check-keyguard-unredacted-notification"; 55 public static final String TEST_CHECK_LOCK_SCREEN_INFO = "check-lock-screen-info"; 56 public static final String TEST_CHECK_MAXIMUM_TIME_TO_LOCK = "check-maximum-time-to-lock"; 57 public static final String TEST_CHECK_PASSWORD_QUALITY = "check-password-quality"; 58 public static final String TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE = 59 "check-permitted-accessibility-service"; 60 public static final String TEST_CHECK_PERMITTED_INPUT_METHOD = "check-permitted-input-method"; 61 62 public static final String EXTRA_SETTINGS_INTENT_ACTION = 63 "com.android.cts.verifier.managedprovisioning.extra.SETTINGS_INTENT_ACTION"; 64 public static final String EXTRA_TITLE = 65 "com.android.cts.verifier.managedprovisioning.extra.TITLE"; 66 public static final String EXTRA_TEST_ID = 67 "com.android.cts.verifier.managedprovisioning.extra.TEST_ID"; 68 69 private static final Map<String, PolicyTestItem> POLICY_TEST_ITEMS = new ArrayMap<>(); 70 static { POLICY_TEST_ITEMS.put(TEST_CHECK_AUTO_TIME_REQUIRED, new PolicyTestItem( R.string.auto_time_required_set_step, R.string.set_auto_time_required_action, R.string.set_auto_time_required_widget_label, R.id.switch_widget, CommandReceiverActivity.COMMAND_SET_AUTO_TIME_REQUIRED))71 POLICY_TEST_ITEMS.put(TEST_CHECK_AUTO_TIME_REQUIRED, new PolicyTestItem( 72 R.string.auto_time_required_set_step, 73 R.string.set_auto_time_required_action, 74 R.string.set_auto_time_required_widget_label, 75 R.id.switch_widget, 76 CommandReceiverActivity.COMMAND_SET_AUTO_TIME_REQUIRED)); POLICY_TEST_ITEMS.put(TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION, new PolicyTestItem( R.string.disallow_keyguard_unredacted_notifications_set_step, R.string.disallow_keyguard_unredacted_notifications_action, R.string.disallow_keyguard_unredacted_notifications_widget_label, R.id.switch_widget, CommandReceiverActivity.COMMAND_DISALLOW_KEYGUARD_UNREDACTED_NOTIFICATIONS))77 POLICY_TEST_ITEMS.put(TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION, new PolicyTestItem( 78 R.string.disallow_keyguard_unredacted_notifications_set_step, 79 R.string.disallow_keyguard_unredacted_notifications_action, 80 R.string.disallow_keyguard_unredacted_notifications_widget_label, 81 R.id.switch_widget, 82 CommandReceiverActivity.COMMAND_DISALLOW_KEYGUARD_UNREDACTED_NOTIFICATIONS)); POLICY_TEST_ITEMS.put(TEST_CHECK_LOCK_SCREEN_INFO, new PolicyTestItem( R.string.lock_screen_info_set_step, R.string.set_lock_screen_info_action, R.string.set_lock_screen_info_widget_label, R.id.edit_text_widget, CommandReceiverActivity.COMMAND_SET_LOCK_SCREEN_INFO))83 POLICY_TEST_ITEMS.put(TEST_CHECK_LOCK_SCREEN_INFO, new PolicyTestItem( 84 R.string.lock_screen_info_set_step, 85 R.string.set_lock_screen_info_action, 86 R.string.set_lock_screen_info_widget_label, 87 R.id.edit_text_widget, 88 CommandReceiverActivity.COMMAND_SET_LOCK_SCREEN_INFO)); POLICY_TEST_ITEMS.put(TEST_CHECK_MAXIMUM_TIME_TO_LOCK, new PolicyTestItem( R.string.maximum_time_to_lock_set_step, R.string.set_maximum_time_to_lock_action, R.string.set_maximum_time_to_lock_widget_label, R.id.edit_text_widget, CommandReceiverActivity.COMMAND_SET_MAXIMUM_TO_LOCK))89 POLICY_TEST_ITEMS.put(TEST_CHECK_MAXIMUM_TIME_TO_LOCK, new PolicyTestItem( 90 R.string.maximum_time_to_lock_set_step, 91 R.string.set_maximum_time_to_lock_action, 92 R.string.set_maximum_time_to_lock_widget_label, 93 R.id.edit_text_widget, 94 CommandReceiverActivity.COMMAND_SET_MAXIMUM_TO_LOCK)); POLICY_TEST_ITEMS.put(TEST_CHECK_PASSWORD_QUALITY, new PolicyTestItem( R.string.password_quality_set_step, R.string.set_password_quality_action, R.string.set_password_quality_widget_label, R.id.spinner_widget, CommandReceiverActivity.COMMAND_SET_PASSWORD_QUALITY))95 POLICY_TEST_ITEMS.put(TEST_CHECK_PASSWORD_QUALITY, new PolicyTestItem( 96 R.string.password_quality_set_step, 97 R.string.set_password_quality_action, 98 R.string.set_password_quality_widget_label, 99 R.id.spinner_widget, 100 CommandReceiverActivity.COMMAND_SET_PASSWORD_QUALITY)); POLICY_TEST_ITEMS.put(TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE, new PolicyTestItem( R.string.permitted_accessibility_services_set_step, R.string.set_permitted_accessibility_services_action, R.string.set_permitted_accessibility_services_widget_label, R.id.switch_widget, CommandReceiverActivity.COMMAND_ALLOW_ONLY_SYSTEM_ACCESSIBILITY_SERVICES))101 POLICY_TEST_ITEMS.put(TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE, new PolicyTestItem( 102 R.string.permitted_accessibility_services_set_step, 103 R.string.set_permitted_accessibility_services_action, 104 R.string.set_permitted_accessibility_services_widget_label, 105 R.id.switch_widget, 106 CommandReceiverActivity.COMMAND_ALLOW_ONLY_SYSTEM_ACCESSIBILITY_SERVICES)); POLICY_TEST_ITEMS.put(TEST_CHECK_PERMITTED_INPUT_METHOD, new PolicyTestItem( R.string.permitted_input_methods_set_step, R.string.set_permitted_input_methods_action, R.string.set_permitted_input_methods_widget_label, R.id.switch_widget, CommandReceiverActivity.COMMAND_ALLOW_ONLY_SYSTEM_INPUT_METHODS))107 POLICY_TEST_ITEMS.put(TEST_CHECK_PERMITTED_INPUT_METHOD, new PolicyTestItem( 108 R.string.permitted_input_methods_set_step, 109 R.string.set_permitted_input_methods_action, 110 R.string.set_permitted_input_methods_widget_label, 111 R.id.switch_widget, 112 CommandReceiverActivity.COMMAND_ALLOW_ONLY_SYSTEM_INPUT_METHODS)); 113 } 114 115 // IDs of settings for {@link DevicePolicyManager#setPasswordQuality(ComponentName, int)}. 116 private final int[] passwordQualityIds = new int[] { 117 DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED, 118 DevicePolicyManager.PASSWORD_QUALITY_SOMETHING, 119 DevicePolicyManager.PASSWORD_QUALITY_NUMERIC, 120 DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX, 121 DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC, 122 DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC, 123 DevicePolicyManager.PASSWORD_QUALITY_COMPLEX 124 }; 125 // Strings to show for each password quality setting. 126 private final int[] passwordQualityLabelResIds = new int[] { 127 R.string.password_quality_unspecified, 128 R.string.password_quality_something, 129 R.string.password_quality_numeric, 130 R.string.password_quality_numeric_complex, 131 R.string.password_quality_alphabetic, 132 R.string.password_quality_alphanumeric, 133 R.string.password_quality_complex 134 }; 135 136 private String mSettingsIntentAction; 137 private String mTestId; 138 private String mTitle; 139 private String mTest; 140 141 @Override onCreate(Bundle savedInstanceState)142 public void onCreate(Bundle savedInstanceState) { 143 super.onCreate(savedInstanceState); 144 setContentView(R.layout.policy_transparency_test); 145 setPassFailButtonClickListeners(); 146 147 mTitle = getIntent().getStringExtra(EXTRA_TITLE); 148 mTestId = getIntent().getStringExtra(EXTRA_TEST_ID); 149 mSettingsIntentAction = getIntent().getStringExtra(EXTRA_SETTINGS_INTENT_ACTION); 150 mTest = getIntent().getStringExtra(EXTRA_TEST); 151 152 setTitle(mTitle); 153 findViewById(R.id.open_settings_button).setOnClickListener(this); 154 updateTestInstructions(); 155 } 156 updateTestInstructions()157 private void updateTestInstructions() { 158 String setStep = null; 159 String userAction = null; 160 String widgetLabel = null; 161 int widgetId = 0; 162 if (TEST_CHECK_USER_RESTRICTION.equals(mTest)) { 163 setStep = getString(R.string.user_restriction_set_step, mTitle); 164 final String userRestriction = getIntent().getStringExtra( 165 CommandReceiverActivity.EXTRA_USER_RESTRICTION); 166 userAction = UserRestrictions.getUserAction(this, userRestriction); 167 widgetLabel = mTitle; 168 widgetId = R.id.switch_widget; 169 } else { 170 final PolicyTestItem testItem = POLICY_TEST_ITEMS.get(mTest); 171 setStep = getString(testItem.setStep); 172 userAction = getString(testItem.userAction); 173 widgetLabel = getString(testItem.widgetLabel); 174 widgetId = testItem.widgetId; 175 } 176 ((TextView) findViewById(R.id.widget_label)).setText(widgetLabel); 177 ((TextView) findViewById(R.id.test_instructions)).setText( 178 getString(R.string.policy_transparency_test_instructions, setStep, userAction)); 179 updateWidget(widgetId); 180 } 181 updateWidget(int widgetId)182 private void updateWidget(int widgetId) { 183 switch (widgetId) { 184 case R.id.switch_widget: { 185 Switch switchWidget = (Switch) findViewById(R.id.switch_widget); 186 switchWidget.setOnCheckedChangeListener(this); 187 switchWidget.setVisibility(View.VISIBLE); 188 } break; 189 case R.id.edit_text_widget: { 190 findViewById(R.id.edit_text_widget).setVisibility(View.VISIBLE); 191 Button updateButton = (Button) findViewById(R.id.update_button); 192 updateButton.setOnClickListener(this); 193 updateButton.setVisibility(View.VISIBLE); 194 } break; 195 case R.id.spinner_widget: { 196 if (TEST_CHECK_PASSWORD_QUALITY.equals(mTest)) { 197 Spinner spinner = (Spinner) findViewById(R.id.spinner_widget); 198 spinner.setVisibility(View.VISIBLE); 199 spinner.setOnItemSelectedListener(this); 200 final ArrayList<String> passwordQualityLabels = new ArrayList<String>(); 201 for (int resId : passwordQualityLabelResIds) { 202 passwordQualityLabels.add(getString(resId)); 203 } 204 ArrayAdapter<String> adapter = new ArrayAdapter(this, 205 android.R.layout.simple_spinner_item, passwordQualityLabels); 206 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 207 spinner.setAdapter(adapter); 208 } 209 } break; 210 default: { 211 throw new IllegalArgumentException("Unknown widgetId: " + widgetId); 212 } 213 } 214 } 215 216 @Override onClick(View view)217 public void onClick(View view) { 218 if (view.getId() == R.id.open_settings_button) { 219 startActivity(new Intent(mSettingsIntentAction)); 220 } else if (view.getId() == R.id.update_button) { 221 final PolicyTestItem testItem = POLICY_TEST_ITEMS.get(mTest); 222 final Intent intent = new Intent(CommandReceiverActivity.ACTION_EXECUTE_COMMAND); 223 intent.putExtra(CommandReceiverActivity.EXTRA_COMMAND, testItem.command); 224 final EditText editText = (EditText) findViewById(R.id.edit_text_widget); 225 intent.putExtra(CommandReceiverActivity.EXTRA_VALUE, editText.getText().toString()); 226 startActivity(intent); 227 } 228 } 229 230 @Override onCheckedChanged(CompoundButton buttonView, boolean isChecked)231 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 232 final Intent intent = new Intent(CommandReceiverActivity.ACTION_EXECUTE_COMMAND); 233 if (TEST_CHECK_USER_RESTRICTION.equals(mTest)) { 234 final String userRestriction = getIntent().getStringExtra( 235 CommandReceiverActivity.EXTRA_USER_RESTRICTION); 236 intent.putExtra(CommandReceiverActivity.EXTRA_COMMAND, 237 CommandReceiverActivity.COMMAND_SET_USER_RESTRICTION); 238 intent.putExtra(CommandReceiverActivity.EXTRA_USER_RESTRICTION, userRestriction); 239 intent.putExtra(CommandReceiverActivity.EXTRA_ENFORCED, isChecked); 240 } else { 241 final PolicyTestItem testItem = POLICY_TEST_ITEMS.get(mTest); 242 intent.putExtra(CommandReceiverActivity.EXTRA_COMMAND, testItem.command); 243 intent.putExtra(CommandReceiverActivity.EXTRA_ENFORCED, isChecked); 244 } 245 startActivity(intent); 246 } 247 248 @Override onItemSelected(AdapterView<?> parent, View view, int pos, long id)249 public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 250 final PolicyTestItem testItem = POLICY_TEST_ITEMS.get(mTest); 251 final Intent intent = new Intent(CommandReceiverActivity.ACTION_EXECUTE_COMMAND); 252 intent.putExtra(CommandReceiverActivity.EXTRA_COMMAND, testItem.command); 253 if (TEST_CHECK_PASSWORD_QUALITY.equals(mTest)) { 254 intent.putExtra(CommandReceiverActivity.EXTRA_VALUE, passwordQualityIds[(int) id]); 255 } 256 startActivity(intent); 257 } 258 259 @Override onNothingSelected(AdapterView<?> parent)260 public void onNothingSelected(AdapterView<?> parent) { 261 // Do nothing. 262 } 263 264 @Override getTestId()265 public String getTestId() { 266 return mTestId; 267 } 268 269 public class DummyAccessibilityService extends AccessibilityService { 270 @Override onAccessibilityEvent(AccessibilityEvent event)271 public void onAccessibilityEvent(AccessibilityEvent event) { 272 // Do nothing 273 } 274 275 @Override onInterrupt()276 public void onInterrupt() { 277 // Do nothing 278 } 279 } 280 281 public class DummyInputMethod extends InputMethodService { 282 @Override onEvaluateFullscreenMode()283 public boolean onEvaluateFullscreenMode() { 284 return false; 285 } 286 287 @Override onEvaluateInputViewShown()288 public boolean onEvaluateInputViewShown() { 289 return false; 290 } 291 } 292 293 private static class PolicyTestItem { 294 public final int setStep; 295 public final int userAction; 296 public final int widgetLabel; 297 public final int widgetId; 298 public final String command; 299 PolicyTestItem(int setStep, int userAction, int widgetLabel, int widgetId, String command)300 public PolicyTestItem(int setStep, int userAction, int widgetLabel, int widgetId, 301 String command) { 302 this.setStep = setStep; 303 this.userAction = userAction; 304 this.widgetLabel = widgetLabel; 305 this.widgetId = widgetId; 306 this.command = command; 307 } 308 } 309 }