12484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse/* 22484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * Copyright 2014, The Android Open Source Project 32484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * 42484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * Licensed under the Apache License, Version 2.0 (the "License"); 52484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * you may not use this file except in compliance with the License. 62484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * You may obtain a copy of the License at 72484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * 82484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * http://www.apache.org/licenses/LICENSE-2.0 92484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * 102484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * Unless required by applicable law or agreed to in writing, software 112484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * distributed under the License is distributed on an "AS IS" BASIS, 122484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * See the License for the specific language governing permissions and 142484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse * limitations under the License. 152484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse */ 162484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse 172484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnsepackage com.android.managedprovisioning.task; 182484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse 199df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franzimport static com.android.internal.util.Preconditions.checkNotNull; 209df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz 212484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnseimport android.app.admin.DevicePolicyManager; 222484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnseimport android.content.ComponentName; 232484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnseimport android.content.Context; 242484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnseimport android.content.pm.PackageManager; 252484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse 26bff80c5ff285b85b1c551a2a4ebd05e945cd6c0dBenjamin Franzimport com.android.internal.annotations.VisibleForTesting; 27f7a9eea8fe577f2f5edbbe6e73891a54351286c6Benjamin Franzimport com.android.managedprovisioning.common.ProvisionLogger; 289df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franzimport com.android.managedprovisioning.R; 299df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franzimport com.android.managedprovisioning.common.Utils; 309df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franzimport com.android.managedprovisioning.model.ProvisioningParams; 312484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse 323f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds/** 331271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz * This tasks sets a given component as the device or profile owner. It also enables the management 341271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz * app if it's not currently enabled and sets the component as active admin. 353f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds */ 369df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franzpublic class SetDevicePolicyTask extends AbstractProvisioningTask { 3728bffd6424a3d9f2dbefe6c7d6144f3a4edee3bcSander Alewijnse 389df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz private final PackageManager mPackageManager; 399df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz private final DevicePolicyManager mDevicePolicyManager; 409df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz private final Utils mUtils; 412484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse 429df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz public SetDevicePolicyTask( 439df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz Context context, 449df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz ProvisioningParams params, 459df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz Callback callback) { 469df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz this(new Utils(), context, params, callback); 47bff80c5ff285b85b1c551a2a4ebd05e945cd6c0dBenjamin Franz } 48bff80c5ff285b85b1c551a2a4ebd05e945cd6c0dBenjamin Franz 49bff80c5ff285b85b1c551a2a4ebd05e945cd6c0dBenjamin Franz @VisibleForTesting 509df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz SetDevicePolicyTask(Utils utils, 519df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz Context context, 529df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz ProvisioningParams params, 539df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz Callback callback) { 549df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz super(context, params, callback); 553f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds 569df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz mUtils = checkNotNull(utils); 572484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse mPackageManager = mContext.getPackageManager(); 589df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz mDevicePolicyManager = (DevicePolicyManager) context.getSystemService( 599df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz Context.DEVICE_POLICY_SERVICE); 609df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz } 619df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz 629df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz @Override 639df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz public int getStatusMsgId() { 649df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz return R.string.progress_set_owner; 652484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse } 662484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse 679df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz @Override 689df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz public void run(int userId) { 699df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz boolean success; 703f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds try { 719df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz ComponentName adminComponent = mUtils.findDeviceAdmin( 729df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz mProvisioningParams.deviceAdminPackageName, 739df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz mProvisioningParams.deviceAdminComponentName, mContext); 749df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz String adminPackage = adminComponent.getPackageName(); 753f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds 769df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz enableDevicePolicyApp(adminPackage); 779df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz setActiveAdmin(adminComponent, userId); 781271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz if (mUtils.isProfileOwnerAction(mProvisioningParams.provisioningAction)) { 791271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz success = setProfileOwner(adminComponent, userId); 801271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz } else { 811271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz success = setDeviceOwner(adminComponent, 821271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz mContext.getResources().getString(R.string.default_owned_device_username), 831271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz userId); 841271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz } 853f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds } catch (Exception e) { 86bff80c5ff285b85b1c551a2a4ebd05e945cd6c0dBenjamin Franz ProvisionLogger.loge("Failure setting device or profile owner", e); 879df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz error(0); 883f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds return; 893f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds } 909df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz 91bff80c5ff285b85b1c551a2a4ebd05e945cd6c0dBenjamin Franz if (success) { 929df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz success(); 93bff80c5ff285b85b1c551a2a4ebd05e945cd6c0dBenjamin Franz } else { 94bff80c5ff285b85b1c551a2a4ebd05e945cd6c0dBenjamin Franz ProvisionLogger.loge("Error when setting device or profile owner."); 959df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz error(0); 96bff80c5ff285b85b1c551a2a4ebd05e945cd6c0dBenjamin Franz } 972484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse } 982484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse 993f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds private void enableDevicePolicyApp(String packageName) { 1003f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds int enabledSetting = mPackageManager.getApplicationEnabledSetting(packageName); 1012ea6ddc836fc53b2561ca7b67f8df440ef9867c3Christine Franks if (enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT 1022ea6ddc836fc53b2561ca7b67f8df440ef9867c3Christine Franks && enabledSetting != PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { 1033f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds mPackageManager.setApplicationEnabledSetting(packageName, 104110de818cd792cd2cb9e79aca05b84be57bb9251Alan Treadway PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 105110de818cd792cd2cb9e79aca05b84be57bb9251Alan Treadway // Device policy app may have launched ManagedProvisioning, play nice and don't 106110de818cd792cd2cb9e79aca05b84be57bb9251Alan Treadway // kill it as a side-effect of this call. 107110de818cd792cd2cb9e79aca05b84be57bb9251Alan Treadway PackageManager.DONT_KILL_APP); 1082484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse } 1092484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse } 1102484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse 1119df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz private void setActiveAdmin(ComponentName component, int userId) { 1123f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds ProvisionLogger.logd("Setting " + component + " as active admin."); 1139df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz mDevicePolicyManager.setActiveAdmin(component, true, userId); 1143f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds } 1153f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds 1169df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz private boolean setDeviceOwner(ComponentName component, String owner, int userId) { 1171271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz ProvisionLogger.logd("Setting " + component + " as device owner of user " + userId); 118981e55496221c55a77c0fe01031624cfecf75a54Makoto Onuki if (!component.equals(mDevicePolicyManager.getDeviceOwnerComponentOnCallingUser())) { 1199df4bac8ee77da37b1633e9f04ab9464697f6d41Benjamin Franz return mDevicePolicyManager.setDeviceOwner(component, owner, userId); 1203f4eb372a5faaa319c47df55cc880bee5ea759c9Julia Reynolds } 121bf793102707971d77950ad1a20dd082ae9ec18bcNicolas Prevot return true; 122bf793102707971d77950ad1a20dd082ae9ec18bcNicolas Prevot } 1231271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz 1241271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz private boolean setProfileOwner(ComponentName component, int userId) { 1251271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz ProvisionLogger.logd("Setting " + component + " as profile owner of user " + userId); 1261271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz if (!component.equals(mDevicePolicyManager.getProfileOwnerAsUser(userId))) { 1271271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz return mDevicePolicyManager.setProfileOwner(component, component.getPackageName(), 1281271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz userId); 1291271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz } 1301271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz return true; 1311271a28bc8016a7b92f4fd9cb9970499cf0382b7Benjamin Franz } 1322484cb4c03724ad1a70e2034ac22f8ffaf4c8377Sander Alewijnse} 133