• Home
  • History
  • Annotate
  • 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.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