1 /* 2 * Copyright (C) 2019 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.managedprovisioning.common; 18 19 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; 20 21 import android.annotation.Nullable; 22 import android.app.Activity; 23 import android.app.admin.DevicePolicyManager; 24 import android.content.Intent; 25 import android.os.UserHandle; 26 27 import com.android.managedprovisioning.analytics.MetricsWriterFactory; 28 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker; 29 import com.android.managedprovisioning.model.ProvisioningParams; 30 31 /** 32 * Class containing utility methods for starting up a DPC during Setup Wizard. 33 */ 34 public class PolicyComplianceUtils { 35 36 /** 37 * Returns whether the DPC handles the policy compliance activity. 38 */ isPolicyComplianceActivityResolvable(Activity parentActivity, ProvisioningParams params, @Nullable String category, Utils utils)39 public boolean isPolicyComplianceActivityResolvable(Activity parentActivity, 40 ProvisioningParams params, @Nullable String category, Utils utils) { 41 return getPolicyComplianceIntentIfResolvable(parentActivity, params, category, utils) != 42 null; 43 } 44 45 /** 46 * Starts the policy compliance activity if it can be resolved, and returns whether the 47 * activity was started. 48 */ startPolicyComplianceActivityForResultIfResolved(Activity parentActivity, ProvisioningParams params, @Nullable String category, int requestCode, Utils utils, ProvisioningAnalyticsTracker provisioningAnalyticsTracker)49 public boolean startPolicyComplianceActivityForResultIfResolved(Activity parentActivity, 50 ProvisioningParams params, @Nullable String category, int requestCode, Utils utils, 51 ProvisioningAnalyticsTracker provisioningAnalyticsTracker) { 52 final UserHandle userHandle = getPolicyComplianceUserHandle(parentActivity, params, utils); 53 final Intent policyComplianceIntent = getPolicyComplianceIntentIfResolvable( 54 parentActivity, params, category, utils); 55 56 if (policyComplianceIntent != null) { 57 parentActivity.startActivityForResultAsUser( 58 policyComplianceIntent, requestCode, userHandle); 59 // Override the animation to avoid the transition jumping back and forth (b/149463287). 60 parentActivity.overridePendingTransition(/* enterAnim = */ 0, /* exitAnim= */ 0); 61 provisioningAnalyticsTracker.logDpcSetupStarted(parentActivity, 62 policyComplianceIntent.getAction()); 63 return true; 64 } 65 66 return false; 67 } 68 getPolicyComplianceIntentIfResolvable(Activity parentActivity, ProvisioningParams params, @Nullable String category, Utils utils)69 private Intent getPolicyComplianceIntentIfResolvable(Activity parentActivity, 70 ProvisioningParams params, @Nullable String category, Utils utils) { 71 final UserHandle userHandle = getPolicyComplianceUserHandle(parentActivity, params, utils); 72 final Intent policyComplianceIntent = getPolicyComplianceIntent(params, category); 73 74 final boolean intentResolvable = utils.canResolveIntentAsUser(parentActivity, 75 policyComplianceIntent, userHandle.getIdentifier()); 76 77 return intentResolvable ? policyComplianceIntent : null; 78 } 79 getPolicyComplianceIntent(ProvisioningParams params, @Nullable String category)80 private Intent getPolicyComplianceIntent(ProvisioningParams params, @Nullable String category) { 81 final String adminPackage = params.inferDeviceAdminPackageName(); 82 83 final Intent policyComplianceIntent = 84 new Intent(DevicePolicyManager.ACTION_ADMIN_POLICY_COMPLIANCE); 85 if (category != null) { 86 policyComplianceIntent.addCategory(category); 87 } 88 policyComplianceIntent.putExtra( 89 DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, 90 params.adminExtrasBundle); 91 policyComplianceIntent.setPackage(adminPackage); 92 93 return policyComplianceIntent; 94 } 95 getPolicyComplianceUserHandle(Activity parentActivity, ProvisioningParams params, Utils utils)96 private UserHandle getPolicyComplianceUserHandle(Activity parentActivity, 97 ProvisioningParams params, Utils utils) { 98 return params.provisioningAction.equals(ACTION_PROVISION_MANAGED_PROFILE) 99 ? utils.getManagedProfile(parentActivity) 100 : UserHandle.of(UserHandle.myUserId()); 101 } 102 } 103