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.Service; 22 import android.app.admin.DeviceAdminReceiver; 23 import android.app.admin.DevicePolicyManager; 24 import android.content.ComponentName; 25 import android.content.Context; 26 import android.content.Intent; 27 import android.content.IntentFilter; 28 import android.content.ServiceConnection; 29 import android.os.IBinder; 30 import android.os.PersistableBundle; 31 import android.os.Process; 32 import android.os.RemoteException; 33 import android.os.UserHandle; 34 import androidx.localbroadcastmanager.content.LocalBroadcastManager; 35 import android.util.Log; 36 37 import com.android.cts.verifier.R; 38 import com.android.cts.verifier.location.LocationListenerActivity; 39 40 import java.util.Collections; 41 import java.util.function.Consumer; 42 43 /** 44 * Profile owner receiver for BYOD flow test. 45 * Setup cross-profile intent filter after successful provisioning. 46 */ 47 public class DeviceAdminTestReceiver extends DeviceAdminReceiver { 48 public static final String KEY_BUNDLE_WIPE_IMMEDIATELY = "wipe_immediately"; 49 private static final String TAG = "DeviceAdminTestReceiver"; 50 private static final String DEVICE_OWNER_PKG = 51 "com.android.cts.verifier"; 52 private static final String ADMIN_RECEIVER_TEST_CLASS = 53 DEVICE_OWNER_PKG + ".managedprovisioning.DeviceAdminTestReceiver"; 54 private static final ComponentName RECEIVER_COMPONENT_NAME = new ComponentName( 55 DEVICE_OWNER_PKG, ADMIN_RECEIVER_TEST_CLASS); 56 public static final String EXTRA_MANAGED_USER_TEST = 57 "com.android.cts.verifier.managedprovisioning.extra.MANAGED_USER_TEST"; 58 public static final String EXTRA_LOGOUT_ON_START = 59 "com.android.cts.verifier.managedprovisioning.extra.LOGOUT_ON_START"; 60 public static final String AFFILIATION_ID = "affiliationId"; 61 62 public static ComponentName getReceiverComponentName() { 63 return RECEIVER_COMPONENT_NAME; 64 } 65 66 @Override 67 public void onProfileProvisioningComplete(Context context, Intent intent) { 68 Log.d(TAG, "Provisioning complete intent received"); 69 setupProfile(context); 70 wipeIfNecessary(context, intent); 71 } 72 73 @Override 74 public void onBugreportSharingDeclined(Context context, Intent intent) { 75 Log.i(TAG, "Bugreport sharing declined"); 76 Utils.showBugreportNotification(context, context.getString( 77 R.string.bugreport_sharing_declined), Utils.BUGREPORT_NOTIFICATION_ID); 78 } 79 80 @Override 81 public void onBugreportShared(Context context, Intent intent, String bugreportFileHash) { 82 Log.i(TAG, "Bugreport shared"); 83 Utils.showBugreportNotification(context, context.getString( 84 R.string.bugreport_shared_successfully), Utils.BUGREPORT_NOTIFICATION_ID); 85 } 86 87 @Override 88 public void onBugreportFailed(Context context, Intent intent, int failureCode) { 89 Log.i(TAG, "Bugreport collection operation failed, code: " + failureCode); 90 Utils.showBugreportNotification(context, context.getString( 91 R.string.bugreport_failed_completing), Utils.BUGREPORT_NOTIFICATION_ID); 92 } 93 94 @Override 95 public void onLockTaskModeEntering(Context context, Intent intent, String pkg) { 96 Log.i(TAG, "Entering LockTask mode: " + pkg); 97 LocalBroadcastManager.getInstance(context) 98 .sendBroadcast(new Intent(LockTaskUiTestActivity.ACTION_LOCK_TASK_STARTED)); 99 } 100 101 @Override 102 public void onLockTaskModeExiting(Context context, Intent intent) { 103 Log.i(TAG, "Exiting LockTask mode"); 104 LocalBroadcastManager.getInstance(context) 105 .sendBroadcast(new Intent(LockTaskUiTestActivity.ACTION_LOCK_TASK_STOPPED)); 106 } 107 108 @Override 109 public void onEnabled(Context context, Intent intent) { 110 Log.i(TAG, "Device admin enabled"); 111 if (intent.getBooleanExtra(EXTRA_MANAGED_USER_TEST, false)) { 112 DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class); 113 ComponentName admin = getReceiverComponentName(); 114 dpm.setAffiliationIds(admin, 115 Collections.singleton(DeviceAdminTestReceiver.AFFILIATION_ID)); 116 context.startActivity( 117 new Intent(context, ManagedUserPositiveTestActivity.class).setFlags( 118 Intent.FLAG_ACTIVITY_NEW_TASK)); 119 120 bindPrimaryUserService(context, iCrossUserService -> { 121 try { 122 iCrossUserService.switchUser(Process.myUserHandle()); 123 } catch (RemoteException re) { 124 Log.e(TAG, "Error when calling primary user", re); 125 } 126 }); 127 } else if (intent.getBooleanExtra(EXTRA_LOGOUT_ON_START, false)) { 128 DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class); 129 ComponentName admin = getReceiverComponentName(); 130 dpm.setAffiliationIds(admin, 131 Collections.singleton(DeviceAdminTestReceiver.AFFILIATION_ID)); 132 dpm.logoutUser(admin); 133 } 134 } 135 136 private void setupProfile(Context context) { 137 DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); 138 dpm.setProfileEnabled(new ComponentName(context.getApplicationContext(), getClass())); 139 140 // Setup cross-profile intent filter to allow communications between the two versions of CtsVerifier 141 // Primary -> work direction 142 IntentFilter filter = new IntentFilter(); 143 filter.addAction(ByodHelperActivity.ACTION_QUERY_PROFILE_OWNER); 144 filter.addAction(ByodHelperActivity.ACTION_REMOVE_MANAGED_PROFILE); 145 filter.addAction(ByodHelperActivity.ACTION_CHECK_DISK_ENCRYPTION); 146 filter.addAction(ByodHelperActivity.ACTION_INSTALL_APK); 147 filter.addAction(ByodHelperActivity.ACTION_CHECK_INTENT_FILTERS); 148 filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_IMAGE); 149 filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_VIDEO_WITH_EXTRA_OUTPUT); 150 filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_VIDEO_WITHOUT_EXTRA_OUTPUT); 151 filter.addAction(ByodHelperActivity.ACTION_CAPTURE_AND_CHECK_AUDIO); 152 filter.addAction(ByodHelperActivity.ACTION_KEYGUARD_DISABLED_FEATURES); 153 filter.addAction(ByodHelperActivity.ACTION_LOCKNOW); 154 filter.addAction(ByodHelperActivity.ACTION_TEST_NFC_BEAM); 155 filter.addAction(ByodHelperActivity.ACTION_TEST_CROSS_PROFILE_INTENTS_DIALOG); 156 filter.addAction(ByodHelperActivity.ACTION_TEST_APP_LINKING_DIALOG); 157 filter.addAction(ByodHelperActivity.ACTION_NOTIFICATION); 158 filter.addAction(ByodHelperActivity.ACTION_NOTIFICATION_ON_LOCKSCREEN); 159 filter.addAction(ByodHelperActivity.ACTION_CLEAR_NOTIFICATION); 160 filter.addAction(ByodHelperActivity.ACTION_SET_USER_RESTRICTION); 161 filter.addAction(ByodHelperActivity.ACTION_CLEAR_USER_RESTRICTION); 162 filter.addAction(CrossProfileTestActivity.ACTION_CROSS_PROFILE_TO_WORK); 163 filter.addAction(WorkStatusTestActivity.ACTION_WORK_STATUS_TOAST); 164 filter.addAction(WorkStatusTestActivity.ACTION_WORK_STATUS_ICON); 165 filter.addAction( 166 PermissionLockdownTestActivity.ACTION_MANAGED_PROFILE_CHECK_PERMISSION_LOCKDOWN); 167 filter.addAction(AuthenticationBoundKeyTestActivity.ACTION_AUTH_BOUND_KEY_TEST); 168 filter.addAction(ByodHelperActivity.ACTION_BYOD_SET_LOCATION_AND_CHECK_UPDATES); 169 filter.addAction(VpnTestActivity.ACTION_VPN); 170 filter.addAction(AlwaysOnVpnSettingsTestActivity.ACTION_ALWAYS_ON_VPN_SETTINGS_TEST); 171 filter.addAction(RecentsRedactionActivity.ACTION_RECENTS); 172 filter.addAction(ByodHelperActivity.ACTION_TEST_SELECT_WORK_CHALLENGE); 173 filter.addAction(ByodHelperActivity.ACTION_LAUNCH_CONFIRM_WORK_CREDENTIALS); 174 filter.addAction(ByodHelperActivity.ACTION_SET_ORGANIZATION_INFO); 175 filter.addAction(ByodHelperActivity.ACTION_TEST_PARENT_PROFILE_PASSWORD); 176 filter.addAction(SetSupportMessageActivity.ACTION_SET_SUPPORT_MSG); 177 filter.addAction(KeyChainTestActivity.ACTION_KEYCHAIN); 178 filter.addAction(CommandReceiverActivity.ACTION_EXECUTE_COMMAND); 179 filter.addAction(WorkProfileWidgetActivity.ACTION_TEST_WORK_PROFILE_WIDGET); 180 dpm.addCrossProfileIntentFilter(getWho(context), filter, 181 DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT); 182 183 // Work -> primary direction 184 filter = new IntentFilter(); 185 filter.addAction(ByodHelperActivity.ACTION_PROFILE_OWNER_STATUS); 186 filter.addAction(ByodHelperActivity.ACTION_DISK_ENCRYPTION_STATUS); 187 filter.addAction(CrossProfileTestActivity.ACTION_CROSS_PROFILE_TO_PERSONAL); 188 filter.addAction(LocationListenerActivity.ACTION_SET_LOCATION_AND_CHECK_UPDATES); 189 dpm.addCrossProfileIntentFilter(getWho(context), filter, 190 DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED); 191 192 Intent intent = new Intent(context, ByodHelperActivity.class); 193 intent.setAction(ByodHelperActivity.ACTION_PROFILE_PROVISIONED); 194 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 195 context.startActivity(intent); 196 } 197 198 private void wipeIfNecessary(Context context, Intent intent) { 199 PersistableBundle bundle = intent.getParcelableExtra( 200 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE); 201 if (bundle != null && bundle.getBoolean(KEY_BUNDLE_WIPE_IMMEDIATELY, false)) { 202 getManager(context).wipeData(0); 203 } 204 } 205 206 private void bindPrimaryUserService(Context context, Consumer<ICrossUserService> consumer) { 207 DevicePolicyManager devicePolicyManager = context.getSystemService( 208 DevicePolicyManager.class); 209 UserHandle primaryUser = devicePolicyManager.getBindDeviceAdminTargetUsers( 210 getReceiverComponentName()).get(0); 211 212 Log.d(TAG, "Calling primary user: " + primaryUser); 213 final ServiceConnection serviceConnection = new ServiceConnection() { 214 @Override 215 public void onServiceConnected(ComponentName name, IBinder service) { 216 Log.d(TAG, "onServiceConnected is called"); 217 consumer.accept(ICrossUserService.Stub.asInterface(service)); 218 } 219 220 @Override 221 public void onServiceDisconnected(ComponentName name) { 222 Log.d(TAG, "onServiceDisconnected is called"); 223 } 224 }; 225 final Intent serviceIntent = new Intent(context, PrimaryUserService.class); 226 devicePolicyManager.bindDeviceAdminServiceAsUser(getReceiverComponentName(), serviceIntent, 227 serviceConnection, Context.BIND_AUTO_CREATE, primaryUser); 228 } 229 230 public static final class PrimaryUserService extends Service { 231 private final ICrossUserService.Stub mBinder = new ICrossUserService.Stub() { 232 public void switchUser(UserHandle userHandle) { 233 Log.d(TAG, "switchUser: " + userHandle); 234 getSystemService(DevicePolicyManager.class).switchUser(getReceiverComponentName(), 235 userHandle); 236 } 237 }; 238 239 @Override 240 public IBinder onBind(Intent intent) { 241 return mBinder; 242 } 243 } 244 } 245