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.Intent; 20 import android.content.pm.PackageManager; 21 import android.database.DataSetObserver; 22 import android.os.Bundle; 23 import android.provider.Settings; 24 import android.util.Pair; 25 import android.view.View; 26 27 import com.android.cts.verifier.ArrayTestListAdapter; 28 import com.android.cts.verifier.PassFailButtons; 29 import com.android.cts.verifier.R; 30 import com.android.cts.verifier.TestListAdapter.TestListItem; 31 import com.android.cts.verifier.features.FeatureUtil; 32 33 import java.util.Arrays; 34 import java.util.List; 35 36 /** 37 * Test class to verify transparency for policies enforced by device/profile owner. 38 */ 39 public class PolicyTransparencyTestListActivity extends PassFailButtons.TestListActivity 40 implements View.OnClickListener { 41 public static final String ACTION_CHECK_POLICY_TRANSPARENCY = 42 "com.android.cts.verifier.managedprovisioning.action.CHECK_POLICY_TRANSPARENCY"; 43 44 public static final String EXTRA_MODE = 45 "com.android.cts.verifier.managedprovisioning.extra.mode"; 46 47 public static final int MODE_DEVICE_OWNER = 1; 48 public static final int MODE_MANAGED_PROFILE = 2; 49 public static final int MODE_MANAGED_USER = 4; 50 51 /** 52 * Pairs of: 53 * <ul> 54 * <li>An intent to start {@link PolicyTransparencyTestActivity} 55 * <li>a label to show the user. 56 * </ul> 57 * These contain all the policies except for the user restriction ones. 58 */ 59 private static final Pair<Intent, Integer>[] POLICIES; 60 static { 61 final String[] policyTests = new String[] { 62 PolicyTransparencyTestActivity.TEST_CHECK_AUTO_TIME_REQUIRED, 63 PolicyTransparencyTestActivity.TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION, 64 PolicyTransparencyTestActivity.TEST_CHECK_LOCK_SCREEN_INFO, 65 PolicyTransparencyTestActivity.TEST_CHECK_MAXIMUM_TIME_TO_LOCK, 66 PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE, 67 PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_INPUT_METHOD 68 }; 69 final String[] settingsIntentActions = new String[] { 70 Settings.ACTION_DATE_SETTINGS, 71 Settings.ACTION_SETTINGS, 72 Settings.ACTION_DISPLAY_SETTINGS, 73 Settings.ACTION_DISPLAY_SETTINGS, 74 Settings.ACTION_ACCESSIBILITY_SETTINGS, 75 Settings.ACTION_SETTINGS 76 }; 77 final int[] policyLabels = new int[] { 78 R.string.set_auto_time_required, 79 R.string.disallow_keyguard_unredacted_notifications, 80 R.string.set_lock_screen_info, 81 R.string.set_maximum_time_to_lock, 82 R.string.set_permitted_accessibility_services, 83 R.string.set_permitted_input_methods 84 }; 85 if (policyTests.length != settingsIntentActions.length || 86 policyTests.length != policyLabels.length) { 87 throw new AssertionError("Number of items in policyTests, " 88 + " settingsIntentActions and policyLabels do not match"); 89 } 90 POLICIES = new Pair[policyTests.length]; 91 for (int i = 0; i < policyTests.length; ++i) { 92 final Intent intent = 93 new Intent(PolicyTransparencyTestActivity.ACTION_SHOW_POLICY_TRANSPARENCY_TEST) 94 .putExtra(PolicyTransparencyTestActivity.EXTRA_TEST, policyTests[i]) 95 .putExtra(PolicyTransparencyTestActivity.EXTRA_SETTINGS_INTENT_ACTION, 96 settingsIntentActions[i]); 97 POLICIES[i] = Pair.create(intent, policyLabels[i]); 98 } 99 } 100 101 private static final List<String> ALSO_VALID_FOR_MANAGED_PROFILE = Arrays.asList( 102 PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE, 103 PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_INPUT_METHOD); 104 private static final List<String> ALSO_VALID_FOR_MANAGED_USER = Arrays.asList( 105 PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE, 106 PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_INPUT_METHOD); 107 108 private int mMode; 109 110 @Override onCreate(Bundle savedInstanceState)111 protected void onCreate(Bundle savedInstanceState) { 112 super.onCreate(savedInstanceState); 113 setContentView(R.layout.policy_transparency_test_list); 114 setInfoResources(R.string.device_profile_owner_policy_transparency_test, 115 R.string.device_profile_owner_policy_transparency_test_info, 0); 116 setPassFailButtonClickListeners(); 117 setSupportMsgButtonClickListeners(); 118 119 if (!getIntent().hasExtra(EXTRA_MODE)) { 120 throw new RuntimeException("PolicyTransparencyTestListActivity started without extra " 121 + EXTRA_MODE); 122 } 123 mMode = getIntent().getIntExtra(EXTRA_MODE, MODE_DEVICE_OWNER); 124 if (mMode != MODE_DEVICE_OWNER && mMode != MODE_MANAGED_PROFILE 125 && mMode != MODE_MANAGED_USER) { 126 throw new RuntimeException("Unknown mode " + mMode); 127 } 128 129 final ArrayTestListAdapter adapter = new ArrayTestListAdapter(this); 130 addTestsToAdapter(adapter); 131 adapter.registerDataSetObserver(new DataSetObserver() { 132 @Override 133 public void onChanged() { 134 updatePassButton(); 135 } 136 }); 137 138 setTestListAdapter(adapter); 139 } 140 addTestsToAdapter(final ArrayTestListAdapter adapter)141 private void addTestsToAdapter(final ArrayTestListAdapter adapter) { 142 for (String restriction : 143 UserRestrictions.getUserRestrictionsForPolicyTransparency(mMode)) { 144 Intent intent = 145 UserRestrictions.getUserRestrictionTestIntent(this, restriction, mMode); 146 if (!UserRestrictions.isRestrictionValid(this, restriction)) { 147 continue; 148 } 149 String title = UserRestrictions.getRestrictionLabel(this, restriction); 150 String testId = getTestId(title); 151 intent.putExtra(PolicyTransparencyTestActivity.EXTRA_TEST_ID, testId); 152 adapter.add(TestListItem.newTest(title, testId, intent, null)); 153 } 154 for (Pair<Intent, Integer> policy : POLICIES) { 155 Intent intent = policy.first; 156 String test = intent.getStringExtra(PolicyTransparencyTestActivity.EXTRA_TEST); 157 if (!isPolicyValid(test)) { 158 continue; 159 } 160 161 if (mMode == MODE_MANAGED_PROFILE && !ALSO_VALID_FOR_MANAGED_PROFILE.contains(test)) { 162 continue; 163 } 164 if (mMode == MODE_MANAGED_USER && !ALSO_VALID_FOR_MANAGED_USER.contains(test)) { 165 continue; 166 } 167 String title = getString(policy.second); 168 String testId = getTestId(title); 169 intent.putExtra(PolicyTransparencyTestActivity.EXTRA_TITLE, title); 170 intent.putExtra(PolicyTransparencyTestActivity.EXTRA_TEST_ID, testId); 171 // This restriction is set per user so current user's DPM should be used instead of 172 // device owner's DPM. 173 if (mMode == MODE_DEVICE_OWNER && ALSO_VALID_FOR_MANAGED_USER.contains(test)) { 174 intent.putExtra(CommandReceiverActivity.EXTRA_USE_CURRENT_USER_DPM, true); 175 } 176 adapter.add(TestListItem.newTest(title, testId, intent, null)); 177 } 178 } 179 getTestId(String title)180 private String getTestId(String title) { 181 if (mMode == MODE_DEVICE_OWNER) { 182 return "DO_" + title; 183 } else if (mMode == MODE_MANAGED_PROFILE) { 184 return "MP_" + title; 185 } else if (mMode == MODE_MANAGED_USER) { 186 return "MU_" + title; 187 } 188 throw new RuntimeException("Unknown mode " + mMode); 189 } 190 isPolicyValid(String test)191 private boolean isPolicyValid(String test) { 192 final PackageManager pm = getPackageManager(); 193 switch (test) { 194 case PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_INPUT_METHOD: 195 return pm.hasSystemFeature(PackageManager.FEATURE_INPUT_METHODS); 196 case PolicyTransparencyTestActivity.TEST_CHECK_PERMITTED_ACCESSIBILITY_SERVICE: 197 return (pm.hasSystemFeature(PackageManager.FEATURE_AUDIO_OUTPUT) 198 && FeatureUtil.isThirdPartyAccessibilityServiceSupported(this)); 199 case PolicyTransparencyTestActivity.TEST_CHECK_KEYGURAD_UNREDACTED_NOTIFICATION: 200 case PolicyTransparencyTestActivity.TEST_CHECK_LOCK_SCREEN_INFO: 201 case PolicyTransparencyTestActivity.TEST_CHECK_MAXIMUM_TIME_TO_LOCK: 202 return (pm.hasSystemFeature(PackageManager.FEATURE_SECURE_LOCK_SCREEN) 203 && FeatureUtil.isConfigLockScreenSupported(this)); 204 default: 205 return true; 206 } 207 } 208 setSupportMsgButtonClickListeners()209 private void setSupportMsgButtonClickListeners() { 210 findViewById(R.id.short_msg_button).setOnClickListener(this); 211 findViewById(R.id.long_msg_button).setOnClickListener(this); 212 } 213 214 @Override onClick(View view)215 public void onClick(View view) { 216 if (view.getId() == R.id.short_msg_button) { 217 final Intent intent = new Intent(SetSupportMessageActivity.ACTION_SET_SUPPORT_MSG); 218 intent.putExtra(SetSupportMessageActivity.EXTRA_SUPPORT_MSG_TYPE, 219 SetSupportMessageActivity.TYPE_SHORT_MSG); 220 startActivity(intent); 221 } else if (view.getId() == R.id.long_msg_button) { 222 final Intent intent = new Intent(SetSupportMessageActivity.ACTION_SET_SUPPORT_MSG); 223 intent.putExtra(SetSupportMessageActivity.EXTRA_SUPPORT_MSG_TYPE, 224 SetSupportMessageActivity.TYPE_LONG_MSG); 225 startActivity(intent); 226 } 227 } 228 229 @Override getTestId()230 public String getTestId() { 231 return getIntent().getStringExtra(PolicyTransparencyTestActivity.EXTRA_TEST_ID); 232 } 233 234 @Override finish()235 public void finish() { 236 super.finish(); 237 final Intent intent = new Intent(CommandReceiverActivity.ACTION_EXECUTE_COMMAND); 238 intent.putExtra(CommandReceiverActivity.EXTRA_COMMAND, 239 CommandReceiverActivity.COMMAND_CLEAR_POLICIES); 240 intent.putExtra(PolicyTransparencyTestListActivity.EXTRA_MODE, mMode); 241 startActivity(intent); 242 } 243 } 244