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