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