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 static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
20 
21 import android.app.admin.DeviceAdminReceiver;
22 import android.app.admin.DevicePolicyManager;
23 import android.content.ComponentName;
24 import android.content.Context;
25 import android.content.Intent;
26 import android.content.IntentFilter;
27 import android.os.PersistableBundle;
28 import android.util.Log;
29 
30 import com.android.cts.verifier.R;
31 import com.android.cts.verifier.location.LocationListenerActivity;
32 
33 /**
34  * Profile owner receiver for BYOD flow test.
35  * Setup cross-profile intent filter after successful provisioning.
36  */
37 public class DeviceAdminTestReceiver extends DeviceAdminReceiver {
38     public static final String KEY_BUNDLE_WIPE_IMMEDIATELY = "wipe_immediately";
39     private static final String TAG = "DeviceAdminTestReceiver";
40     private static final String DEVICE_OWNER_PKG =
41             "com.android.cts.verifier";
42     private static final String ADMIN_RECEIVER_TEST_CLASS =
43             DEVICE_OWNER_PKG + ".managedprovisioning.DeviceAdminTestReceiver";
44     private static final ComponentName RECEIVER_COMPONENT_NAME = new ComponentName(
45             DEVICE_OWNER_PKG, ADMIN_RECEIVER_TEST_CLASS);
46 
getReceiverComponentName()47     public static ComponentName getReceiverComponentName() {
48         return RECEIVER_COMPONENT_NAME;
49     }
50 
51     @Override
onProfileProvisioningComplete(Context context, Intent intent)52     public void onProfileProvisioningComplete(Context context, Intent intent) {
53         Log.d(TAG, "Provisioning complete intent received");
54         setupProfile(context);
55         wipeIfNecessary(context, intent);
56     }
57 
58     @Override
onBugreportSharingDeclined(Context context, Intent intent)59     public void onBugreportSharingDeclined(Context context, Intent intent) {
60         Log.i(TAG, "Bugreport sharing declined");
61         Utils.showBugreportNotification(context, context.getString(
62                 R.string.bugreport_sharing_declined), Utils.BUGREPORT_NOTIFICATION_ID);
63     }
64 
65     @Override
onBugreportShared(Context context, Intent intent, String bugreportFileHash)66     public void onBugreportShared(Context context, Intent intent, String bugreportFileHash) {
67         Log.i(TAG, "Bugreport shared");
68         Utils.showBugreportNotification(context, context.getString(
69                 R.string.bugreport_shared_successfully), Utils.BUGREPORT_NOTIFICATION_ID);
70     }
71 
72     @Override
onBugreportFailed(Context context, Intent intent, int failureCode)73     public void onBugreportFailed(Context context, Intent intent, int failureCode) {
74         Log.i(TAG, "Bugreport collection operation failed, code: " + failureCode);
75         Utils.showBugreportNotification(context, context.getString(
76                 R.string.bugreport_failed_completing), Utils.BUGREPORT_NOTIFICATION_ID);
77     }
78 
setupProfile(Context context)79     private void setupProfile(Context context) {
80         DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
81         dpm.setProfileEnabled(new ComponentName(context.getApplicationContext(), getClass()));
82 
83         // Setup cross-profile intent filter to allow communications between the two versions of CtsVerifier
84         // Primary -> work direction
85         IntentFilter filter = new IntentFilter();
86         filter.addAction(ByodHelperActivity.ACTION_QUERY_PROFILE_OWNER);
87         filter.addAction(ByodHelperActivity.ACTION_REMOVE_MANAGED_PROFILE);
88         filter.addAction(ByodHelperActivity.ACTION_CHECK_DISK_ENCRYPTION);
89         filter.addAction(ByodHelperActivity.ACTION_INSTALL_APK);
90         filter.addAction(ByodHelperActivity.ACTION_CHECK_INTENT_FILTERS);
91         filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_IMAGE);
92         filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_VIDEO_WITH_EXTRA_OUTPUT);
93         filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_VIDEO_WITHOUT_EXTRA_OUTPUT);
94         filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_AUDIO);
95         filter.addAction(ByodHelperActivity.ACTION_KEYGUARD_DISABLED_FEATURES);
96         filter.addAction(ByodHelperActivity.ACTION_LOCKNOW);
97         filter.addAction(ByodHelperActivity.ACTION_TEST_NFC_BEAM);
98         filter.addAction(ByodHelperActivity.ACTION_TEST_CROSS_PROFILE_INTENTS_DIALOG);
99         filter.addAction(ByodHelperActivity.ACTION_TEST_APP_LINKING_DIALOG);
100         filter.addAction(ByodHelperActivity.ACTION_NOTIFICATION);
101         filter.addAction(ByodHelperActivity.ACTION_NOTIFICATION_ON_LOCKSCREEN);
102         filter.addAction(ByodHelperActivity.ACTION_CLEAR_NOTIFICATION);
103         filter.addAction(ByodHelperActivity.ACTION_SET_USER_RESTRICTION);
104         filter.addAction(ByodHelperActivity.ACTION_CLEAR_USER_RESTRICTION);
105         filter.addAction(CrossProfileTestActivity.ACTION_CROSS_PROFILE_TO_WORK);
106         filter.addAction(WorkStatusTestActivity.ACTION_WORK_STATUS_TOAST);
107         filter.addAction(WorkStatusTestActivity.ACTION_WORK_STATUS_ICON);
108         filter.addAction(
109                 PermissionLockdownTestActivity.ACTION_MANAGED_PROFILE_CHECK_PERMISSION_LOCKDOWN);
110         filter.addAction(AuthenticationBoundKeyTestActivity.ACTION_AUTH_BOUND_KEY_TEST);
111         filter.addAction(ByodHelperActivity.ACTION_BYOD_SET_LOCATION_AND_CHECK_UPDATES);
112         filter.addAction(VpnTestActivity.ACTION_VPN);
113         filter.addAction(RecentsRedactionActivity.ACTION_RECENTS);
114         filter.addAction(ByodHelperActivity.ACTION_TEST_SELECT_WORK_CHALLENGE);
115         filter.addAction(ByodHelperActivity.ACTION_LAUNCH_CONFIRM_WORK_CREDENTIALS);
116         filter.addAction(ByodHelperActivity.ACTION_SET_ORGANIZATION_INFO);
117         filter.addAction(ByodHelperActivity.ACTION_TEST_PARENT_PROFILE_PASSWORD);
118         filter.addAction(SetSupportMessageActivity.ACTION_SET_SUPPORT_MSG);
119         filter.addAction(CommandReceiverActivity.ACTION_EXECUTE_COMMAND);
120         dpm.addCrossProfileIntentFilter(getWho(context), filter,
121                 DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT);
122 
123         // Work -> primary direction
124         filter = new IntentFilter();
125         filter.addAction(ByodHelperActivity.ACTION_PROFILE_OWNER_STATUS);
126         filter.addAction(ByodHelperActivity.ACTION_DISK_ENCRYPTION_STATUS);
127         filter.addAction(CrossProfileTestActivity.ACTION_CROSS_PROFILE_TO_PERSONAL);
128         filter.addAction(LocationListenerActivity.ACTION_SET_LOCATION_AND_CHECK_UPDATES);
129         dpm.addCrossProfileIntentFilter(getWho(context), filter,
130                 DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED);
131 
132         Intent intent = new Intent(context, ByodHelperActivity.class);
133         intent.setAction(ByodHelperActivity.ACTION_PROFILE_PROVISIONED);
134         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
135         context.startActivity(intent);
136     }
137 
wipeIfNecessary(Context context, Intent intent)138     private void wipeIfNecessary(Context context, Intent intent) {
139         PersistableBundle bundle = intent.getParcelableExtra(
140                 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE);
141         if (bundle != null && bundle.getBoolean(KEY_BUNDLE_WIPE_IMMEDIATELY, false)) {
142             getManager(context).wipeData(0);
143         }
144     }
145 }
146