• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 static com.android.managedprovisioning.provisioning.Constants.EXTRA_PROVISIONING_COLOR_PALETTE;
22 
23 import android.app.Activity;
24 import android.app.admin.DevicePolicyManager;
25 import android.content.Context;
26 import android.content.Intent;
27 import android.os.UserHandle;
28 
29 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker;
30 import com.android.managedprovisioning.model.ProvisioningParams;
31 
32 import com.google.android.setupcompat.util.WizardManagerHelper;
33 
34 import java.util.HashMap;
35 import java.util.function.BiConsumer;
36 
37 /**
38  * Class containing utility methods for starting up a DPC during Setup Wizard.
39  */
40 public class PolicyComplianceUtils {
41 
42     /**
43      * Returns whether the DPC handles the policy compliance activity on a given user.
44      */
isPolicyComplianceActivityResolvableForUser( Context context, ProvisioningParams params, Utils utils, UserHandle userHandle)45     public boolean isPolicyComplianceActivityResolvableForUser(
46             Context context, ProvisioningParams params, Utils utils, UserHandle userHandle) {
47         return getPolicyComplianceIntentIfResolvable(context, params, utils, userHandle) != null;
48     }
49 
50     /**
51      * Starts the policy compliance activity if it can be resolved, and returns whether the
52      * activity was started.
53      */
startPolicyComplianceActivityForResultIfResolved(Activity parentActivity, ProvisioningParams params, int requestCode, Utils utils, ProvisioningAnalyticsTracker provisioningAnalyticsTracker, TransitionHelper transitionHelper)54     public boolean startPolicyComplianceActivityForResultIfResolved(Activity parentActivity,
55             ProvisioningParams params, int requestCode, Utils utils,
56             ProvisioningAnalyticsTracker provisioningAnalyticsTracker,
57             TransitionHelper transitionHelper) {
58         return startPolicyComplianceActivityIfResolvedInternal(parentActivity, params, utils,
59                 provisioningAnalyticsTracker, (Intent intent, UserHandle userHandle) -> {
60                     if (parentActivity.getIntent() != null) {
61                         WizardManagerHelper.copyWizardManagerExtras(
62                                 parentActivity.getIntent(), intent);
63                     }
64                     transitionHelper.startActivityForResultAsUserWithTransition(
65                             parentActivity, intent, requestCode, userHandle);
66                 });
67     }
68 
69     /**
70      * Starts the policy compliance activity if it can be resolved, and returns whether the
71      * activity was started.
72      */
73     public boolean startPolicyComplianceActivityIfResolved(Context context,
74             ProvisioningParams params, Utils utils,
75             ProvisioningAnalyticsTracker provisioningAnalyticsTracker) {
76         return startPolicyComplianceActivityIfResolvedInternal(
77                 context,
78                 params,
79                 utils,
80                 provisioningAnalyticsTracker,
81                 context::startActivityAsUser);
82     }
83 
84     private boolean startPolicyComplianceActivityIfResolvedInternal(
85             Context context, ProvisioningParams params, Utils utils,
86             ProvisioningAnalyticsTracker provisioningAnalyticsTracker,
87             BiConsumer<Intent, UserHandle> startActivityFunc) {
88         final UserHandle userHandle = getPolicyComplianceUserHandle(context, params, utils);
89         final Intent policyComplianceIntent = getPolicyComplianceIntentIfResolvable(
90                 context, params, utils, userHandle);
91 
92         if (policyComplianceIntent != null) {
93             startActivityFunc.accept(policyComplianceIntent, userHandle);
94             ProvisionLogger.logd(
95                     "The DPC POLICY_COMPLIANCE handler was launched on user " + userHandle);
96             provisioningAnalyticsTracker.logDpcSetupStarted(
97                     context, policyComplianceIntent.getAction());
98             return true;
99         }
100 
101         return false;
102     }
103 
104     private Intent getPolicyComplianceIntentIfResolvable(Context context,
105             ProvisioningParams params, Utils utils, UserHandle userHandle) {
106         final Intent policyComplianceIntent = getPolicyComplianceIntent(params, context);
107         final boolean intentResolvable = utils.canResolveIntentAsUser(context,
108                 policyComplianceIntent, userHandle.getIdentifier());
109         // Calling startActivity() from outside of an Activity context requires
110         // the FLAG_ACTIVITY_NEW_TASK flag.
111         if (!(context instanceof Activity)) {
112             policyComplianceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
113         }
114         return intentResolvable ? policyComplianceIntent : null;
115     }
116 
117     private Intent getPolicyComplianceIntent(
118             ProvisioningParams params, Context context) {
119         final String adminPackage = params.inferDeviceAdminPackageName();
120         final Intent policyComplianceIntent =
121                 new Intent(DevicePolicyManager.ACTION_ADMIN_POLICY_COMPLIANCE);
122         policyComplianceIntent.putExtra(
123                 DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE,
124                 params.adminExtrasBundle);
125         // TODO(b/192254845): Remove EXTRA_PROVISIONING_COLOR_PALETTE when framework
126         //  fix available
127         HashMap<Integer, Integer> colorPaletteMap =
128                 new ColorPaletteHelper().createColorPaletteMap(
129                         context,
130                         new ManagedProvisioningSharedPreferences(context));
131         policyComplianceIntent.putExtra(EXTRA_PROVISIONING_COLOR_PALETTE, colorPaletteMap);
132         policyComplianceIntent.setPackage(adminPackage);
133         return policyComplianceIntent;
134     }
135 
136     private UserHandle getPolicyComplianceUserHandle(Context context,
137             ProvisioningParams params, Utils utils) {
138         return params.provisioningAction.equals(ACTION_PROVISION_MANAGED_PROFILE)
139                 ? utils.getManagedProfile(context)
140                 : UserHandle.of(UserHandle.myUserId());
141     }
142 }
143