• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }