Home | History | Annotate | Download | only in managedprovisioning
      1 /*
      2  * Copyright (C) 2012 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.app.KeyguardManager;
     20 import android.app.admin.DevicePolicyManager;
     21 import android.content.ActivityNotFoundException;
     22 import android.content.ComponentName;
     23 import android.content.Context;
     24 import android.content.Intent;
     25 import android.content.pm.PackageManager;
     26 import android.net.ConnectivityManager;
     27 import android.os.Bundle;
     28 import android.provider.Settings;
     29 import android.util.Log;
     30 import android.widget.Toast;
     31 
     32 import com.android.cts.verifier.ArrayTestListAdapter;
     33 import com.android.cts.verifier.DialogTestListActivity;
     34 import com.android.cts.verifier.R;
     35 import com.android.cts.verifier.TestListActivity;
     36 import com.android.cts.verifier.TestListAdapter.TestListItem;
     37 import com.android.cts.verifier.TestResult;
     38 import com.android.cts.verifier.location.LocationListenerActivity;
     39 
     40 /**
     41  * CTS verifier test for BYOD managed provisioning flow
     42  *
     43  * This activity is responsible for starting the managed provisioning flow and verify the outcome of
     44  * provisioning. It performs the following verifications:
     45  *   Full disk encryption is enabled.
     46  *   Profile owner is correctly installed.
     47  *   Profile owner shows up in the Settings app.
     48  *   Badged work apps show up in launcher.
     49  * The first two verifications are performed automatically, by interacting with profile owner using
     50  * cross-profile intents, while the last two are carried out manually by the user.
     51  */
     52 public class ByodFlowTestActivity extends DialogTestListActivity {
     53 
     54     // Action for delivering sub-test result from the profile.
     55     public static final String ACTION_TEST_RESULT =
     56             "com.android.cts.verifier.managedprovisioning.BYOD_TEST_RESULT";
     57     // Extra for ACTION_TEST_RESULT containing test result.
     58     public static final String EXTRA_RESULT = "extra-result";
     59     protected static final String HELPER_APP_PATH = "/data/local/tmp/NotificationBot.apk";
     60 
     61     private static final String TAG = "ByodFlowTestActivity";
     62     private static ConnectivityManager mCm;
     63     private static final int REQUEST_MANAGED_PROVISIONING = 0;
     64     private static final int REQUEST_PROFILE_OWNER_STATUS = 1;
     65     private static final int REQUEST_INTENT_FILTERS_STATUS = 2;
     66     private static final int REQUEST_CHECK_DISK_ENCRYPTION = 3;
     67     private static final int REQUEST_SET_LOCK_FOR_ENCRYPTION = 4;
     68 
     69     private ComponentName mAdminReceiverComponent;
     70     private KeyguardManager mKeyguardManager;
     71     private ByodFlowTestHelper mByodFlowTestHelper;
     72 
     73     private DialogTestListItem mProfileOwnerInstalled;
     74     private DialogTestListItem mDiskEncryptionTest;
     75     private DialogTestListItem mProfileAccountVisibleTest;
     76     private DialogTestListItem mDeviceAdminVisibleTest;
     77     private DialogTestListItem mWorkAppVisibleTest;
     78     private DialogTestListItem mCrossProfileIntentFiltersTestFromPersonal;
     79     private DialogTestListItem mCrossProfileIntentFiltersTestFromWork;
     80     private DialogTestListItem mAppLinkingTest;
     81     private TestListItem mNonMarketAppsTest;
     82     private DialogTestListItem mWorkNotificationBadgedTest;
     83     private DialogTestListItem mWorkStatusBarIconTest;
     84     private DialogTestListItem mWorkStatusBarToastTest;
     85     private DialogTestListItem mUserSettingsVisibleTest;
     86     private DialogTestListItem mAppSettingsVisibleTest;
     87     private DialogTestListItem mLocationSettingsVisibleTest;
     88     private DialogTestListItem mWiFiDataUsageSettingsVisibleTest;
     89     private DialogTestListItem mCellularDataUsageSettingsVisibleTest;
     90     private DialogTestListItem mCredSettingsVisibleTest;
     91     private DialogTestListItem mPrintSettingsVisibleTest;
     92     private DialogTestListItem mIntentFiltersTest;
     93     private DialogTestListItem mPermissionLockdownTest;
     94     private DialogTestListItem mCrossProfileImageCaptureSupportTest;
     95     private DialogTestListItem mCrossProfileVideoCaptureWithExtraOutputSupportTest;
     96     private DialogTestListItem mCrossProfileVideoCaptureWithoutExtraOutputSupportTest;
     97     private DialogTestListItem mCrossProfileAudioCaptureSupportTest;
     98     private TestListItem mKeyguardDisabledFeaturesTest;
     99     private DialogTestListItem mDisableNfcBeamTest;
    100     private TestListItem mAuthenticationBoundKeyTest;
    101     private DialogTestListItem mEnableLocationModeTest;
    102     private DialogTestListItem mDisableLocationModeThroughMainSwitchTest;
    103     private DialogTestListItem mDisableLocationModeThroughWorkSwitchTest;
    104     private DialogTestListItem mPrimaryLocationWhenWorkDisabledTest;
    105     private DialogTestListItem mSelectWorkChallenge;
    106     private DialogTestListItem mConfirmWorkCredentials;
    107     private DialogTestListItem mPatternWorkChallenge;
    108     private DialogTestListItem mParentProfilePassword;
    109     private DialogTestListItem mPersonalRingtonesTest;
    110     private TestListItem mVpnTest;
    111     private TestListItem mKeyChainTest;
    112     private TestListItem mAlwaysOnVpnSettingsTest;
    113     private TestListItem mRecentsTest;
    114     private TestListItem mDisallowAppsControlTest;
    115     private TestListItem mOrganizationInfoTest;
    116     private TestListItem mPolicyTransparencyTest;
    117     private TestListItem mTurnOffWorkFeaturesTest;
    118     private TestListItem mWidgetTest;
    119 
    120     public ByodFlowTestActivity() {
    121         super(R.layout.provisioning_byod,
    122                 R.string.provisioning_byod, R.string.provisioning_byod_info,
    123                 R.string.provisioning_byod_instructions);
    124     }
    125 
    126     @Override
    127     protected void onCreate(Bundle savedInstanceState) {
    128         super.onCreate(savedInstanceState);
    129         mByodFlowTestHelper = new ByodFlowTestHelper(this);
    130         mAdminReceiverComponent = new ComponentName(this, DeviceAdminTestReceiver.class.getName());
    131         mKeyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
    132 
    133         mByodFlowTestHelper.setup();
    134 
    135         mPrepareTestButton.setText(R.string.provisioning_byod_start);
    136         mPrepareTestButton.setOnClickListener(v -> Utils.provisionManagedProfile(
    137                 ByodFlowTestActivity.this, mAdminReceiverComponent,
    138                 REQUEST_MANAGED_PROVISIONING));
    139 
    140         // If we are started by managed provisioning (fresh managed provisioning after encryption
    141         // reboot), redirect the user back to the main test list. This is because the test result
    142         // is only saved by the parent TestListActivity, and if we did allow the user to proceed
    143         // here, the test result would be lost when this activity finishes.
    144         if (ByodHelperActivity.ACTION_PROFILE_OWNER_STATUS.equals(getIntent().getAction())) {
    145             startActivity(new Intent(this, TestListActivity.class));
    146             // Calling super.finish() because we delete managed profile in our overridden of finish(),
    147             // which is not what we want to do here.
    148             super.finish();
    149         } else {
    150             queryProfileOwner(false);
    151         }
    152     }
    153 
    154     @Override
    155     protected void onNewIntent(Intent intent) {
    156         super.onNewIntent(intent);
    157         if (ByodHelperActivity.ACTION_PROFILE_OWNER_STATUS.equals(intent.getAction())) {
    158             // This is called when managed provisioning completes successfully without reboot.
    159             handleStatusUpdate(RESULT_OK, intent);
    160         } else if (ACTION_TEST_RESULT.equals(intent.getAction())) {
    161             // Called when subtest cannot communicate test result from the profile via setResult().
    162             handleLaunchTestResult(RESULT_OK, intent.getParcelableExtra(EXTRA_RESULT));
    163         }
    164     }
    165 
    166     @Override
    167     protected void handleActivityResult(int requestCode, int resultCode, Intent data) {
    168         switch (requestCode) {
    169             case REQUEST_MANAGED_PROVISIONING:
    170                 return;
    171             case REQUEST_PROFILE_OWNER_STATUS:
    172                 // Called after queryProfileOwner()
    173                 handleStatusUpdate(resultCode, data);
    174                 break;
    175             case REQUEST_CHECK_DISK_ENCRYPTION:
    176                 // Called after checkDiskEncryption()
    177                 handleDiskEncryptionStatus(resultCode, data);
    178                 break;
    179             case REQUEST_SET_LOCK_FOR_ENCRYPTION:
    180                 // Called after handleDiskEncryptionStatus() to set screen lock if necessary
    181                 handleSetLockForEncryption();
    182                 break;
    183             case REQUEST_INTENT_FILTERS_STATUS:
    184                 // Called after checkIntentFilters()
    185                 handleIntentFiltersStatus(resultCode);
    186                 break;
    187             default:
    188                 super.handleActivityResult(requestCode, resultCode, data);
    189         }
    190     }
    191 
    192     private void handleStatusUpdate(int resultCode, Intent data) {
    193         boolean provisioned = data != null &&
    194                 data.getBooleanExtra(ByodHelperActivity.EXTRA_PROVISIONED, false);
    195         setTestResult(mProfileOwnerInstalled, (provisioned && resultCode == RESULT_OK) ?
    196                 TestResult.TEST_RESULT_PASSED : TestResult.TEST_RESULT_FAILED);
    197     }
    198 
    199     @Override
    200     public void finish() {
    201         // Pass and fail buttons are known to call finish() when clicked, and this is when we want to
    202         // clean up the provisioned profile.
    203         mByodFlowTestHelper.tearDown();
    204         super.finish();
    205     }
    206 
    207     @Override
    208     protected void setupTests(ArrayTestListAdapter adapter) {
    209         mProfileOwnerInstalled = new DialogTestListItem(this,
    210                 R.string.provisioning_byod_profileowner,
    211                 "BYOD_ProfileOwnerInstalled") {
    212             @Override
    213             public void performTest(DialogTestListActivity activity) {
    214                 queryProfileOwner(true);
    215             }
    216         };
    217 
    218         mDiskEncryptionTest = new DialogTestListItem(this,
    219                 R.string.provisioning_byod_disk_encryption,
    220                 "BYOD_DiskEncryptionTest") {
    221             @Override
    222             public void performTest(DialogTestListActivity activity) {
    223                 checkDiskEncryption();
    224             }
    225         };
    226 
    227         /*
    228          * To keep the image in this test up to date, use the instructions in
    229          * {@link ByodIconSamplerActivity}.
    230          */
    231 
    232         if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
    233             mWorkAppVisibleTest = new DialogTestListItemWithIcon(this,
    234                     R.string.provisioning_byod_workapps_visible,
    235                     "BYOD_WorkAppVisibleTest",
    236                     R.string.provisioning_byod_workapps_visible_instruction,
    237                     new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME),
    238                     R.drawable.badged_icon);
    239 
    240             mConfirmWorkCredentials = new DialogTestListItem(this,
    241                     R.string.provisioning_byod_confirm_work_credentials,
    242                     "BYOD_ConfirmWorkCredentials",
    243                     R.string.provisioning_byod_confirm_work_credentials_description,
    244                     new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));
    245 
    246             mPatternWorkChallenge = new DialogTestListItem(this,
    247                     R.string.provisioning_byod_pattern_work_challenge,
    248                     "BYOD_PatternWorkChallenge",
    249                     R.string.provisioning_byod_pattern_work_challenge_description,
    250                     new Intent(ByodHelperActivity.ACTION_TEST_PATTERN_WORK_CHALLENGE));
    251 
    252             mWiFiDataUsageSettingsVisibleTest = new DialogTestListItem(this,
    253                     R.string.provisioning_byod_wifi_data_usage_settings,
    254                     "BYOD_WiFiDataUsageSettingsVisibleTest",
    255                     R.string.provisioning_byod_wifi_data_usage_settings_instruction,
    256                     new Intent(Settings.ACTION_SETTINGS));
    257         }
    258 
    259         mWorkNotificationBadgedTest = new DialogTestListItemWithIcon(this,
    260                 R.string.provisioning_byod_work_notification,
    261                 "BYOD_WorkNotificationBadgedTest",
    262                 R.string.provisioning_byod_work_notification_instruction,
    263                 new Intent(ByodHelperActivity.ACTION_NOTIFICATION),
    264                 R.drawable.ic_corp_icon);
    265 
    266         Intent workStatusIcon = new Intent(WorkStatusTestActivity.ACTION_WORK_STATUS_ICON);
    267         workStatusIcon.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    268         mWorkStatusBarIconTest = new DialogTestListItemWithIcon(this,
    269                 R.string.provisioning_byod_work_status_icon,
    270                 "BYOD_WorkStatusBarIconTest",
    271                 R.string.provisioning_byod_work_status_icon_instruction,
    272                 workStatusIcon,
    273                 R.drawable.stat_sys_managed_profile_status);
    274 
    275         /* Disable due to b/111734436.
    276         Intent workStatusToast = new Intent(WorkStatusTestActivity.ACTION_WORK_STATUS_TOAST);
    277         workStatusToast.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    278         mWorkStatusBarToastTest = new DialogTestListItem(this,
    279                 R.string.provisioning_byod_work_status_toast,
    280                 "BYOD_WorkStatusBarToastTest",
    281                 R.string.provisioning_byod_work_status_toast_instruction,
    282                 workStatusToast);
    283         */
    284 
    285         mNonMarketAppsTest = TestListItem.newTest(this,
    286                 R.string.provisioning_byod_non_market_apps,
    287                 NonMarketAppsActivity.class.getName(),
    288                 new Intent(this, NonMarketAppsActivity.class), null);
    289 
    290         mProfileAccountVisibleTest = new DialogTestListItem(this,
    291                 R.string.provisioning_byod_profile_visible,
    292                 "BYOD_ProfileAccountVisibleTest",
    293                 R.string.provisioning_byod_profile_visible_instruction,
    294                 new Intent(Settings.ACTION_SETTINGS));
    295 
    296         mUserSettingsVisibleTest = new DialogTestListItem(this,
    297             R.string.provisioning_byod_user_settings,
    298             "BYOD_UserSettingsVisibleTest",
    299             R.string.provisioning_byod_user_settings_instruction,
    300             new Intent(Settings.ACTION_SETTINGS));
    301 
    302         mAppSettingsVisibleTest = new DialogTestListItem(this,
    303                 R.string.provisioning_byod_app_settings,
    304                 "BYOD_AppSettingsVisibleTest",
    305                 R.string.provisioning_byod_app_settings_instruction,
    306                 new Intent(Settings.ACTION_APPLICATION_SETTINGS));
    307 
    308         mDeviceAdminVisibleTest = new DialogTestListItem(this,
    309                 R.string.provisioning_byod_admin_visible,
    310                 "BYOD_DeviceAdminVisibleTest",
    311                 R.string.provisioning_byod_admin_visible_instruction,
    312                 new Intent(Settings.ACTION_SECURITY_SETTINGS));
    313 
    314         mCredSettingsVisibleTest = new DialogTestListItem(this,
    315                 R.string.provisioning_byod_cred_settings,
    316                 "BYOD_CredSettingsVisibleTest",
    317                 R.string.provisioning_byod_cred_settings_instruction,
    318                 new Intent(Settings.ACTION_SECURITY_SETTINGS));
    319 
    320         mLocationSettingsVisibleTest = new DialogTestListItem(this,
    321                 R.string.provisioning_byod_location_settings,
    322                 "BYOD_LocationSettingsVisibleTest",
    323                 R.string.provisioning_byod_location_settings_instruction,
    324                 new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
    325 
    326         mCellularDataUsageSettingsVisibleTest = new DialogTestListItem(this,
    327                 R.string.provisioning_byod_cellular_data_usage_settings,
    328                 "BYOD_CellularDataUsageSettingsVisibleTest",
    329                 R.string.provisioning_byod_cellular_data_usage_settings_instruction,
    330                 new Intent(Settings.ACTION_SETTINGS));
    331 
    332         mPrintSettingsVisibleTest = new DialogTestListItem(this,
    333                 R.string.provisioning_byod_print_settings,
    334                 "BYOD_PrintSettingsVisibleTest",
    335                 R.string.provisioning_byod_print_settings_instruction,
    336                 new Intent(Settings.ACTION_PRINT_SETTINGS));
    337 
    338         Intent intent = new Intent(CrossProfileTestActivity.ACTION_CROSS_PROFILE_TO_WORK);
    339         intent.putExtra(CrossProfileTestActivity.EXTRA_STARTED_FROM_WORK, false);
    340         Intent chooser = Intent.createChooser(intent,
    341                 getResources().getString(R.string.provisioning_cross_profile_chooser));
    342         mCrossProfileIntentFiltersTestFromPersonal = new DialogTestListItem(this,
    343                 R.string.provisioning_byod_cross_profile_from_personal,
    344                 "BYOD_CrossProfileIntentFiltersTestFromPersonal",
    345                 R.string.provisioning_byod_cross_profile_from_personal_instruction,
    346                 chooser);
    347 
    348         mCrossProfileIntentFiltersTestFromWork = new DialogTestListItem(this,
    349                 R.string.provisioning_byod_cross_profile_from_work,
    350                 "BYOD_CrossProfileIntentFiltersTestFromWork",
    351                 R.string.provisioning_byod_cross_profile_from_work_instruction,
    352                 new Intent(ByodHelperActivity.ACTION_TEST_CROSS_PROFILE_INTENTS_DIALOG));
    353 
    354         /* Disable due to b/33571176
    355         mAppLinkingTest = new DialogTestListItem(this,
    356                 R.string.provisioning_app_linking,
    357                 "BYOD_AppLinking",
    358                 R.string.provisioning_byod_app_linking_instruction,
    359                 new Intent(ByodHelperActivity.ACTION_TEST_APP_LINKING_DIALOG));
    360         */
    361 
    362         mKeyguardDisabledFeaturesTest = TestListItem.newTest(this,
    363                 R.string.provisioning_byod_keyguard_disabled_features,
    364                 KeyguardDisabledFeaturesActivity.class.getName(),
    365                 new Intent(this, KeyguardDisabledFeaturesActivity.class), null);
    366 
    367         mAuthenticationBoundKeyTest = TestListItem.newTest(this,
    368                 R.string.provisioning_byod_auth_bound_key,
    369                 AuthenticationBoundKeyTestActivity.class.getName(),
    370                 new Intent(AuthenticationBoundKeyTestActivity.ACTION_AUTH_BOUND_KEY_TEST),
    371                 null);
    372 
    373         mVpnTest = TestListItem.newTest(this,
    374                 R.string.provisioning_byod_vpn,
    375                 VpnTestActivity.class.getName(),
    376                 new Intent(VpnTestActivity.ACTION_VPN),
    377                 null);
    378 
    379         mAlwaysOnVpnSettingsTest = TestListItem.newTest(this,
    380                 R.string.provisioning_byod_always_on_vpn,
    381                 AlwaysOnVpnSettingsTestActivity.class.getName(),
    382                 new Intent(AlwaysOnVpnSettingsTestActivity.ACTION_ALWAYS_ON_VPN_SETTINGS_TEST),
    383                 null);
    384 
    385         mDisallowAppsControlTest = TestListItem.newTest(this,
    386                 R.string.provisioning_byod_disallow_apps_control,
    387                 DisallowAppsControlActivity.class.getName(),
    388                 new Intent(this, DisallowAppsControlActivity.class), null);
    389 
    390         // Test for checking if the required intent filters are set during managed provisioning.
    391         mIntentFiltersTest = new DialogTestListItem(this,
    392                 R.string.provisioning_byod_cross_profile_intent_filters,
    393                 "BYOD_IntentFiltersTest") {
    394             @Override
    395             public void performTest(DialogTestListActivity activity) {
    396                 checkIntentFilters();
    397             }
    398         };
    399 
    400         mTurnOffWorkFeaturesTest = TestListItem.newTest(this,
    401                 R.string.provisioning_byod_turn_off_work,
    402                 TurnOffWorkActivity.class.getName(),
    403                 new Intent(this, TurnOffWorkActivity.class), null);
    404 
    405         Intent permissionCheckIntent = new Intent(
    406                 PermissionLockdownTestActivity.ACTION_MANAGED_PROFILE_CHECK_PERMISSION_LOCKDOWN);
    407         mPermissionLockdownTest = new DialogTestListItem(this,
    408                 R.string.device_profile_owner_permission_lockdown_test,
    409                 "BYOD_PermissionLockdownTest",
    410                 R.string.profile_owner_permission_lockdown_test_info,
    411                 permissionCheckIntent);
    412 
    413         mSelectWorkChallenge = new DialogTestListItem(this,
    414                 R.string.provisioning_byod_select_work_challenge,
    415                 "BYOD_SelectWorkChallenge",
    416                 R.string.provisioning_byod_select_work_challenge_description,
    417                 new Intent(ByodHelperActivity.ACTION_TEST_SELECT_WORK_CHALLENGE));
    418 
    419         mRecentsTest = TestListItem.newTest(this,
    420                 R.string.provisioning_byod_recents,
    421                 RecentsRedactionActivity.class.getName(),
    422                 new Intent(RecentsRedactionActivity.ACTION_RECENTS).setFlags(
    423                         Intent.FLAG_ACTIVITY_NEW_TASK),
    424                 null);
    425 
    426         mOrganizationInfoTest = TestListItem.newTest(this,
    427                 R.string.provisioning_byod_organization_info,
    428                 OrganizationInfoTestActivity.class.getName(),
    429                 new Intent(this, OrganizationInfoTestActivity.class),
    430                 null);
    431 
    432         mKeyChainTest = TestListItem.newTest(this,
    433                 R.string.provisioning_byod_keychain,
    434                 KeyChainTestActivity.class.getName(),
    435                 new Intent(KeyChainTestActivity.ACTION_KEYCHAIN),
    436                 null);
    437 
    438         mParentProfilePassword = new DialogTestListItem(this,
    439                 R.string.provisioning_byod_parent_profile_password,
    440                 "BYOD_ParentProfilePasswordTest",
    441                 R.string.provisioning_byod_parent_profile_password_description,
    442                 new Intent(ByodHelperActivity.ACTION_TEST_PARENT_PROFILE_PASSWORD));
    443 
    444         mPersonalRingtonesTest = new DialogTestListItem(this,
    445                 R.string.provisioning_byod_personal_ringtones,
    446                 "BYOD_PersonalRingtones",
    447                 R.string.provisioning_byod_personal_ringtones_instruction,
    448                 new Intent(Settings.ACTION_SOUND_SETTINGS));
    449 
    450         final Intent policyTransparencyTestIntent = new Intent(this,
    451                 PolicyTransparencyTestListActivity.class);
    452         policyTransparencyTestIntent.putExtra(
    453                 PolicyTransparencyTestListActivity.EXTRA_MODE,
    454                 PolicyTransparencyTestListActivity.MODE_MANAGED_PROFILE);
    455         policyTransparencyTestIntent.putExtra(
    456                 PolicyTransparencyTestActivity.EXTRA_TEST_ID, "BYOD_PolicyTransparency");
    457         mPolicyTransparencyTest = TestListItem.newTest(this,
    458                 R.string.device_profile_owner_policy_transparency_test,
    459                 "BYOD_PolicyTransparency",
    460                 policyTransparencyTestIntent, null);
    461 
    462         adapter.add(mProfileOwnerInstalled);
    463         adapter.add(mDiskEncryptionTest);
    464 
    465         // Badge related tests
    466         if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
    467             adapter.add(mWorkAppVisibleTest);
    468         }
    469 
    470         adapter.add(mWorkNotificationBadgedTest);
    471         adapter.add(mWorkStatusBarIconTest);
    472 
    473         /* Disable due to b/111734436.
    474         adapter.add(mWorkStatusBarToastTest);
    475         */
    476 
    477         // Settings related tests.
    478         adapter.add(mProfileAccountVisibleTest);
    479         adapter.add(mDeviceAdminVisibleTest);
    480         adapter.add(mCredSettingsVisibleTest);
    481         adapter.add(mUserSettingsVisibleTest);
    482         adapter.add(mAppSettingsVisibleTest);
    483         adapter.add(mLocationSettingsVisibleTest);
    484         adapter.add(mPrintSettingsVisibleTest);
    485         adapter.add(mPersonalRingtonesTest);
    486 
    487         adapter.add(mCrossProfileIntentFiltersTestFromPersonal);
    488         adapter.add(mCrossProfileIntentFiltersTestFromWork);
    489         /* Disable due to b/33571176
    490         adapter.add(mAppLinkingTest);
    491         */
    492         adapter.add(mIntentFiltersTest);
    493         adapter.add(mNonMarketAppsTest);
    494         adapter.add(mPermissionLockdownTest);
    495         adapter.add(mKeyguardDisabledFeaturesTest);
    496         adapter.add(mAuthenticationBoundKeyTest);
    497         adapter.add(mVpnTest);
    498         adapter.add(mAlwaysOnVpnSettingsTest);
    499         adapter.add(mTurnOffWorkFeaturesTest);
    500         adapter.add(mSelectWorkChallenge);
    501         if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
    502             adapter.add(mConfirmWorkCredentials);
    503             adapter.add(mPatternWorkChallenge);
    504         }
    505         adapter.add(mRecentsTest);
    506         adapter.add(mOrganizationInfoTest);
    507         adapter.add(mParentProfilePassword);
    508         adapter.add(mPolicyTransparencyTest);
    509 
    510         if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
    511             if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
    512                 adapter.add(mWiFiDataUsageSettingsVisibleTest);
    513             }
    514         }
    515 
    516         mCm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    517         if(mCm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null) {
    518             adapter.add(mCellularDataUsageSettingsVisibleTest);
    519         }
    520 
    521         if (canResolveIntent(new Intent(Settings.ACTION_APPLICATION_SETTINGS))) {
    522             adapter.add(mDisallowAppsControlTest);
    523         }
    524 
    525         /* If there is an application that handles ACTION_IMAGE_CAPTURE, test that it handles it
    526          * well.
    527          */
    528         if (canResolveIntent(ByodHelperActivity.getCaptureImageIntent())) {
    529             // Capture image intent can be resolved in primary profile, so test.
    530             mCrossProfileImageCaptureSupportTest = new DialogTestListItem(this,
    531                     R.string.provisioning_byod_capture_image_support,
    532                     "BYOD_CrossProfileImageCaptureSupportTest",
    533                     R.string.provisioning_byod_capture_image_support_info,
    534                     new Intent(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_IMAGE));
    535             adapter.add(mCrossProfileImageCaptureSupportTest);
    536         } else {
    537             // Capture image intent cannot be resolved in primary profile, so skip test.
    538             Toast.makeText(ByodFlowTestActivity.this,
    539                     R.string.provisioning_byod_no_image_capture_resolver, Toast.LENGTH_SHORT)
    540                     .show();
    541         }
    542 
    543         /* If there is an application that handles ACTION_VIDEO_CAPTURE, test that it handles it
    544          * well.
    545          */
    546         if (canResolveIntent(ByodHelperActivity.getCaptureVideoIntent())) {
    547             // Capture video intent can be resolved in primary profile, so test.
    548             mCrossProfileVideoCaptureWithExtraOutputSupportTest = new DialogTestListItem(this,
    549                     R.string.provisioning_byod_capture_video_support_with_extra_output,
    550                     "BYOD_CrossProfileVideoCaptureWithExtraOutputSupportTest",
    551                     R.string.provisioning_byod_capture_video_support_info,
    552                     new Intent(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_VIDEO_WITH_EXTRA_OUTPUT));
    553             adapter.add(mCrossProfileVideoCaptureWithExtraOutputSupportTest);
    554             mCrossProfileVideoCaptureWithoutExtraOutputSupportTest = new DialogTestListItem(this,
    555                     R.string.provisioning_byod_capture_video_support_without_extra_output,
    556                     "BYOD_CrossProfileVideoCaptureWithoutExtraOutputSupportTest",
    557                     R.string.provisioning_byod_capture_video_support_info,
    558                     new Intent(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_VIDEO_WITHOUT_EXTRA_OUTPUT));
    559             adapter.add(mCrossProfileVideoCaptureWithoutExtraOutputSupportTest);
    560         } else {
    561             // Capture video intent cannot be resolved in primary profile, so skip test.
    562             Toast.makeText(ByodFlowTestActivity.this,
    563                     R.string.provisioning_byod_no_video_capture_resolver, Toast.LENGTH_SHORT)
    564                     .show();
    565         }
    566 
    567         if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC)
    568                 && getPackageManager().hasSystemFeature(PackageManager.FEATURE_NFC_BEAM)) {
    569             mDisableNfcBeamTest = new DialogTestListItem(this, R.string.provisioning_byod_nfc_beam,
    570                     "BYOD_DisableNfcBeamTest",
    571                     R.string.provisioning_byod_nfc_beam_allowed_instruction,
    572                     new Intent(ByodHelperActivity.ACTION_TEST_NFC_BEAM)) {
    573                 @Override
    574                 public void performTest(final DialogTestListActivity activity) {
    575                     activity.showManualTestDialog(mDisableNfcBeamTest,
    576                             new DefaultTestCallback(mDisableNfcBeamTest) {
    577                         @Override
    578                         public void onPass() {
    579                             // Start a second test with beam disallowed by policy.
    580                             Intent testNfcBeamIntent = new Intent(
    581                                     ByodHelperActivity.ACTION_TEST_NFC_BEAM);
    582                             testNfcBeamIntent.putExtra(NfcTestActivity.EXTRA_DISALLOW_BY_POLICY,
    583                                     true);
    584                             DialogTestListItem disableNfcBeamTest2 =
    585                                     new DialogTestListItem(activity,
    586                                     R.string.provisioning_byod_nfc_beam,
    587                                     "BYOD_DisableNfcBeamTest",
    588                                     R.string.provisioning_byod_nfc_beam_disallowed_instruction,
    589                                     testNfcBeamIntent);
    590                             // The result should be reflected on the original test.
    591                             activity.showManualTestDialog(disableNfcBeamTest2,
    592                                     new DefaultTestCallback(mDisableNfcBeamTest));
    593                         }
    594                     });
    595                 }
    596             };
    597             adapter.add(mDisableNfcBeamTest);
    598         }
    599 
    600         adapter.add(mKeyChainTest);
    601 
    602         /* If there is an application that handles RECORD_SOUND_ACTION, test that it handles it
    603          * well.
    604          */
    605         if (canResolveIntent(ByodHelperActivity.getCaptureAudioIntent())) {
    606             // Capture audio intent can be resolved in primary profile, so test.
    607             mCrossProfileAudioCaptureSupportTest = new DialogTestListItem(this,
    608                     R.string.provisioning_byod_capture_audio_support,
    609                     "BYOD_CrossProfileAudioCaptureSupportTest",
    610                     R.string.provisioning_byod_capture_audio_support_info,
    611                     new Intent(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_AUDIO));
    612             adapter.add(mCrossProfileAudioCaptureSupportTest);
    613         } else {
    614             // Capture audio intent cannot be resolved in primary profile, so skip test.
    615             Toast.makeText(ByodFlowTestActivity.this,
    616                     R.string.provisioning_byod_no_audio_capture_resolver, Toast.LENGTH_SHORT)
    617                     .show();
    618         }
    619 
    620         if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)) {
    621             mEnableLocationModeTest = new DialogTestListItem(this,
    622                     R.string.provisioning_byod_location_mode_enable,
    623                     "BYOD_LocationModeEnableTest",
    624                     R.string.provisioning_byod_location_mode_enable_instruction,
    625                     new Intent(ByodHelperActivity.ACTION_BYOD_SET_LOCATION_AND_CHECK_UPDATES));
    626             mDisableLocationModeThroughMainSwitchTest = new DialogTestListItem(this,
    627                     R.string.provisioning_byod_location_mode_disable,
    628                     "BYOD_LocationModeDisableMainTest",
    629                     R.string.provisioning_byod_location_mode_disable_instruction,
    630                     new Intent(ByodHelperActivity.ACTION_BYOD_SET_LOCATION_AND_CHECK_UPDATES));
    631             mDisableLocationModeThroughWorkSwitchTest = new DialogTestListItem(this,
    632                     R.string.provisioning_byod_work_location_mode_disable,
    633                     "BYOD_LocationModeDisableWorkTest",
    634                     R.string.provisioning_byod_work_location_mode_disable_instruction,
    635                     new Intent(ByodHelperActivity.ACTION_BYOD_SET_LOCATION_AND_CHECK_UPDATES));
    636             mPrimaryLocationWhenWorkDisabledTest = new DialogTestListItem(this,
    637                     R.string.provisioning_byod_primary_location_when_work_disabled,
    638                     "BYOD_PrimaryLocationWhenWorkDisabled",
    639                     R.string.provisioning_byod_primary_location_when_work_disabled_instruction,
    640                     new Intent(LocationListenerActivity.ACTION_SET_LOCATION_AND_CHECK_UPDATES));
    641             adapter.add(mEnableLocationModeTest);
    642             adapter.add(mDisableLocationModeThroughMainSwitchTest);
    643             adapter.add(mDisableLocationModeThroughWorkSwitchTest);
    644             adapter.add(mPrimaryLocationWhenWorkDisabledTest);
    645         } else {
    646             // The system does not support GPS feature, so skip test.
    647             Toast.makeText(ByodFlowTestActivity.this,
    648                     R.string.provisioning_byod_no_gps_location_feature, Toast.LENGTH_SHORT)
    649                     .show();
    650         }
    651 
    652         if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_APP_WIDGETS)) {
    653             mWidgetTest = TestListItem.newTest(this,
    654                     R.string.provisioning_byod_work_profile_widget,
    655                     WorkProfileWidgetActivity.class.getName(),
    656                     new Intent(WorkProfileWidgetActivity.ACTION_TEST_WORK_PROFILE_WIDGET),
    657                     new String[]{PackageManager.FEATURE_APP_WIDGETS});
    658             adapter.add(mWidgetTest);
    659         }
    660 
    661         adapter.add(new DialogTestListItem(this,
    662                 R.string.provisioning_byod_uninstall_work_app,
    663                 "BYOD_UninstallWorkApp",
    664                 R.string.provisioning_byod_uninstall_work_app_instruction,
    665                 createInstallWorkProfileAppIntent()));
    666     }
    667 
    668     private Intent createInstallWorkProfileAppIntent() {
    669         // We place the APK file in /data/local/tmp to make it visible from the work profile.
    670         return new Intent(ByodHelperActivity.ACTION_INSTALL_APK)
    671                 .putExtra(ByodHelperActivity.EXTRA_ALLOW_NON_MARKET_APPS, true)
    672                 .putExtra(ByodHelperActivity.EXTRA_PARAMETER_1, HELPER_APP_PATH);
    673     }
    674 
    675     // Return whether the intent can be resolved in the current profile
    676     private boolean canResolveIntent(Intent intent) {
    677         return intent.resolveActivity(getPackageManager()) != null;
    678     }
    679 
    680     @Override
    681     protected void clearRemainingState(final DialogTestListItem test) {
    682         super.clearRemainingState(test);
    683         if (ByodHelperActivity.ACTION_NOTIFICATION.equals(
    684                 test.getManualTestIntent().getAction())) {
    685             try {
    686                 startActivity(new Intent(
    687                         ByodHelperActivity.ACTION_CLEAR_NOTIFICATION));
    688             } catch (ActivityNotFoundException e) {
    689                 // User shouldn't run this test before work profile is set up.
    690             }
    691         }
    692     }
    693 
    694     private void queryProfileOwner(boolean showToast) {
    695         try {
    696             Intent intent = new Intent(ByodHelperActivity.ACTION_QUERY_PROFILE_OWNER);
    697             startActivityForResult(intent, REQUEST_PROFILE_OWNER_STATUS);
    698         }
    699         catch (ActivityNotFoundException e) {
    700             Log.d(TAG, "queryProfileOwner: ActivityNotFoundException", e);
    701             setTestResult(mProfileOwnerInstalled, TestResult.TEST_RESULT_FAILED);
    702             if (showToast) {
    703                 Utils.showToast(this, R.string.provisioning_byod_no_activity);
    704             }
    705         }
    706     }
    707 
    708     private void checkDiskEncryption() {
    709         try {
    710             Intent intent = new Intent(ByodHelperActivity.ACTION_CHECK_DISK_ENCRYPTION);
    711             startActivityForResult(intent, REQUEST_CHECK_DISK_ENCRYPTION);
    712         } catch (ActivityNotFoundException e) {
    713             Log.d(TAG, "checkDiskEncryption: ActivityNotFoundException", e);
    714             setTestResult(mDiskEncryptionTest, TestResult.TEST_RESULT_FAILED);
    715             Utils.showToast(this, R.string.provisioning_byod_no_activity);
    716         }
    717     }
    718 
    719     private void handleDiskEncryptionStatus(int resultCode, Intent data) {
    720         if (resultCode != RESULT_OK || data == null) {
    721             Log.e(TAG, "Failed to get result for disk encryption, result code: " + resultCode);
    722             setTestResult(mDiskEncryptionTest, TestResult.TEST_RESULT_FAILED);
    723             return;
    724         }
    725 
    726         final int status = data.getIntExtra(ByodHelperActivity.EXTRA_ENCRYPTION_STATUS,
    727                 DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED);
    728         switch (status) {
    729             case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
    730             case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_PER_USER:
    731                 setTestResult(mDiskEncryptionTest, TestResult.TEST_RESULT_PASSED);
    732                 break;
    733             case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY:
    734                 if (!mKeyguardManager.isDeviceSecure()) {
    735                     Utils.setScreenLock(this, REQUEST_SET_LOCK_FOR_ENCRYPTION);
    736                     return;
    737                 }
    738                 Log.e(TAG, "Disk encryption key is not entangled with lock screen credentials");
    739                 Toast.makeText(this, R.string.provisioning_byod_disk_encryption_default_key_toast,
    740                         Toast.LENGTH_LONG).show();
    741                 // fall through
    742             default:
    743                 setTestResult(mDiskEncryptionTest, TestResult.TEST_RESULT_FAILED);
    744         }
    745 
    746         if (mKeyguardManager.isDeviceSecure()) {
    747             Utils.removeScreenLock(this);
    748         }
    749     }
    750 
    751     private void handleSetLockForEncryption() {
    752         if (mKeyguardManager.isDeviceSecure()) {
    753             checkDiskEncryption();
    754         } else {
    755             setTestResult(mDiskEncryptionTest, TestResult.TEST_RESULT_FAILED);
    756             Toast.makeText(this, R.string.provisioning_byod_disk_encryption_no_pin_toast,
    757                     Toast.LENGTH_LONG).show();
    758         }
    759     }
    760 
    761     private void checkIntentFilters() {
    762         try {
    763             // Enable component HandleIntentActivity before intent filters are checked.
    764             setHandleIntentActivityEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
    765             // We disable the ByodHelperActivity in the primary profile. So, this intent
    766             // will be handled by the ByodHelperActivity in the managed profile.
    767             Intent intent = new Intent(ByodHelperActivity.ACTION_CHECK_INTENT_FILTERS);
    768             startActivityForResult(intent, REQUEST_INTENT_FILTERS_STATUS);
    769         } catch (ActivityNotFoundException e) {
    770             // Disable component HandleIntentActivity if intent filters check fails.
    771             setHandleIntentActivityEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
    772             Log.d(TAG, "checkIntentFilters: ActivityNotFoundException", e);
    773             setTestResult(mIntentFiltersTest, TestResult.TEST_RESULT_FAILED);
    774             Utils.showToast(this, R.string.provisioning_byod_no_activity);
    775         }
    776     }
    777 
    778     private void handleIntentFiltersStatus(int resultCode) {
    779         // Disable component HandleIntentActivity after intent filters are checked.
    780         setHandleIntentActivityEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
    781         // we use the resultCode from ByodHelperActivity in the managed profile to know if certain
    782         // intents fired from the managed profile are forwarded.
    783         final boolean intentFiltersSetForManagedIntents = (resultCode == RESULT_OK);
    784         // Since the ByodFlowTestActivity is running in the primary profile, we directly use
    785         // the IntentFiltersTestHelper to know if certain intents fired from the primary profile
    786         // are forwarded.
    787         final boolean intentFiltersSetForPrimaryIntents =
    788                 new IntentFiltersTestHelper(this).checkCrossProfileIntentFilters(
    789                         IntentFiltersTestHelper.FLAG_INTENTS_FROM_PRIMARY);
    790         final boolean intentFiltersSet =
    791                 intentFiltersSetForPrimaryIntents & intentFiltersSetForManagedIntents;
    792         setTestResult(mIntentFiltersTest,
    793                 intentFiltersSet ? TestResult.TEST_RESULT_PASSED : TestResult.TEST_RESULT_FAILED);
    794     }
    795 
    796     private void setHandleIntentActivityEnabledSetting(final int enableState) {
    797         getPackageManager().setComponentEnabledSetting(
    798             new ComponentName(ByodFlowTestActivity.this, HandleIntentActivity.class.getName()),
    799             enableState, PackageManager.DONT_KILL_APP);
    800     }
    801 }
    802