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 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