1 /*
2  * Copyright 2014, 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.task;
18 
19 
20 import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED;
21 
22 import static com.android.internal.util.Preconditions.checkNotNull;
23 
24 import android.app.admin.DevicePolicyManager;
25 import android.content.ComponentName;
26 import android.content.Context;
27 import android.content.pm.PackageManager;
28 
29 import com.android.internal.annotations.VisibleForTesting;
30 import com.android.managedprovisioning.R;
31 import com.android.managedprovisioning.analytics.MetricsWriterFactory;
32 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker;
33 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences;
34 import com.android.managedprovisioning.common.ProvisionLogger;
35 import com.android.managedprovisioning.common.SettingsFacade;
36 import com.android.managedprovisioning.common.Utils;
37 import com.android.managedprovisioning.model.ProvisioningParams;
38 
39 /**
40  * This tasks sets a given component as the device owner. It also enables the management
41  * app if it's not currently enabled and sets the component as active admin.
42  */
43 public class SetDeviceOwnerPolicyTask extends AbstractProvisioningTask {
44 
45     private final PackageManager mPackageManager;
46     private final DevicePolicyManager mDevicePolicyManager;
47     private final Utils mUtils;
48 
SetDeviceOwnerPolicyTask( Context context, ProvisioningParams params, Callback callback)49     public SetDeviceOwnerPolicyTask(
50             Context context,
51             ProvisioningParams params,
52             Callback callback) {
53         this(new Utils(), context, params, callback,
54                 new ProvisioningAnalyticsTracker(
55                         MetricsWriterFactory.getMetricsWriter(context, new SettingsFacade()),
56                         new ManagedProvisioningSharedPreferences(context)));
57     }
58 
59     @VisibleForTesting
SetDeviceOwnerPolicyTask(Utils utils, Context context, ProvisioningParams params, Callback callback, ProvisioningAnalyticsTracker provisioningAnalyticsTracker)60     SetDeviceOwnerPolicyTask(Utils utils,
61                         Context context,
62                         ProvisioningParams params,
63                         Callback callback,
64                         ProvisioningAnalyticsTracker provisioningAnalyticsTracker) {
65         super(context, params, callback, provisioningAnalyticsTracker);
66 
67         mUtils = checkNotNull(utils);
68         mPackageManager = mContext.getPackageManager();
69         mDevicePolicyManager = (DevicePolicyManager) context.getSystemService(
70                 Context.DEVICE_POLICY_SERVICE);
71     }
72 
73     @Override
run(int userId)74     public void run(int userId) {
75         boolean success;
76         try {
77             ComponentName adminComponent =
78                     mProvisioningParams.inferDeviceAdminComponentName(mUtils, mContext, userId);
79             String adminPackage = adminComponent.getPackageName();
80 
81             enableDevicePolicyApp(adminPackage);
82             setActiveAdmin(adminComponent, userId);
83             success = setDeviceOwner(adminComponent,
84                     mContext.getResources().getString(R.string.default_owned_device_username),
85                     userId);
86 
87             if (success && mUtils.isFinancedDeviceAction(mProvisioningParams.provisioningAction)) {
88                 mDevicePolicyManager.setDeviceOwnerType(adminComponent, DEVICE_OWNER_TYPE_FINANCED);
89             }
90         } catch (Exception e) {
91             ProvisionLogger.loge("Failure setting device owner", e);
92             error(0);
93             return;
94         }
95 
96         if (success) {
97             success();
98         } else {
99             ProvisionLogger.loge("Error when setting device owner.");
100             error(0);
101         }
102     }
103 
enableDevicePolicyApp(String packageName)104     private void enableDevicePolicyApp(String packageName) {
105         int enabledSetting = mPackageManager.getApplicationEnabledSetting(packageName);
106         if (enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
107                 && enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) {
108             mPackageManager.setApplicationEnabledSetting(packageName,
109                     PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
110                     // Device policy app may have launched ManagedProvisioning, play nice and don't
111                     // kill it as a side-effect of this call.
112                     PackageManager.DONT_KILL_APP);
113         }
114     }
115 
setActiveAdmin(ComponentName component, int userId)116     private void setActiveAdmin(ComponentName component, int userId) {
117         ProvisionLogger.logd("Setting " + component + " as active admin for user: " + userId);
118         mDevicePolicyManager.setActiveAdmin(component, true, userId);
119     }
120 
setDeviceOwner(ComponentName component, String owner, int userId)121     private boolean setDeviceOwner(ComponentName component, String owner, int userId) {
122         ProvisionLogger.logd("Setting " + component + " as device owner of user " + userId);
123         if (!component.equals(mUtils.getCurrentDeviceOwnerComponentName(mDevicePolicyManager))) {
124             return mDevicePolicyManager.setDeviceOwner(component, owner, userId);
125         }
126         return true;
127     }
128 }
129