1 /* 2 * Copyright 2016, 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.ota; 18 19 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE; 20 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; 21 import static com.android.internal.util.Preconditions.checkNotNull; 22 23 import android.app.admin.DevicePolicyManager; 24 import android.content.ComponentName; 25 import android.content.Context; 26 import android.content.pm.PackageManager; 27 import android.content.pm.UserInfo; 28 import android.os.UserHandle; 29 import android.os.UserManager; 30 31 import com.android.internal.annotations.VisibleForTesting; 32 import com.android.managedprovisioning.common.ProvisionLogger; 33 import com.android.managedprovisioning.model.ProvisioningParams; 34 import com.android.managedprovisioning.task.CrossProfileIntentFiltersSetter; 35 import com.android.managedprovisioning.task.DeleteNonRequiredAppsTask; 36 import com.android.managedprovisioning.task.DisableInstallShortcutListenersTask; 37 import com.android.managedprovisioning.task.DisallowAddUserTask; 38 import com.android.managedprovisioning.task.InstallExistingPackageTask; 39 40 /** 41 * After a system update, this class resets the cross-profile intent filters and performs any 42 * tasks necessary to bring the system up to date. 43 */ 44 public class OtaController { 45 46 private static final String TELECOM_PACKAGE = "com.android.server.telecom"; 47 48 private final Context mContext; 49 private final TaskExecutor mTaskExecutor; 50 private final CrossProfileIntentFiltersSetter mCrossProfileIntentFiltersSetter; 51 52 private final UserManager mUserManager; 53 private final DevicePolicyManager mDevicePolicyManager; 54 OtaController(Context context)55 public OtaController(Context context) { 56 this(context, new TaskExecutor(), new CrossProfileIntentFiltersSetter(context)); 57 } 58 59 @VisibleForTesting OtaController(Context context, TaskExecutor taskExecutor, CrossProfileIntentFiltersSetter crossProfileIntentFiltersSetter)60 OtaController(Context context, TaskExecutor taskExecutor, 61 CrossProfileIntentFiltersSetter crossProfileIntentFiltersSetter) { 62 mContext = checkNotNull(context); 63 mTaskExecutor = checkNotNull(taskExecutor); 64 mCrossProfileIntentFiltersSetter = checkNotNull(crossProfileIntentFiltersSetter); 65 66 mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 67 mDevicePolicyManager = (DevicePolicyManager) context.getSystemService( 68 Context.DEVICE_POLICY_SERVICE); 69 } 70 run()71 public void run() { 72 if (mContext.getUserId() != UserHandle.USER_SYSTEM) { 73 return; 74 } 75 76 // Check for device owner. 77 final int deviceOwnerUserId = mDevicePolicyManager.getDeviceOwnerUserId(); 78 if (deviceOwnerUserId != UserHandle.USER_NULL) { 79 addDeviceOwnerTasks(deviceOwnerUserId, mContext); 80 } 81 82 for (UserInfo userInfo : mUserManager.getUsers()) { 83 if (userInfo.isManagedProfile()) { 84 addManagedProfileTasks(userInfo.id, mContext); 85 } else { 86 // if this user has managed profiles, reset the cross-profile intent filters between 87 // this user and its managed profiles. 88 mCrossProfileIntentFiltersSetter.resetFilters(userInfo.id); 89 } 90 } 91 } 92 addDeviceOwnerTasks(final int userId, Context context)93 void addDeviceOwnerTasks(final int userId, Context context) { 94 ComponentName deviceOwner = mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser(); 95 if (deviceOwner == null) { 96 // Shouldn't happen 97 ProvisionLogger.loge("No device owner found."); 98 return; 99 } 100 101 // Build a set of fake params to be able to run the tasks 102 ProvisioningParams fakeParams = new ProvisioningParams.Builder() 103 .setDeviceAdminComponentName(deviceOwner) 104 .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE) 105 .build(); 106 107 mTaskExecutor.execute(userId, 108 new DeleteNonRequiredAppsTask(false, context, fakeParams, mTaskExecutor)); 109 mTaskExecutor.execute(userId, 110 new DisallowAddUserTask(context, fakeParams, mTaskExecutor)); 111 } 112 addManagedProfileTasks(final int userId, Context context)113 void addManagedProfileTasks(final int userId, Context context) { 114 mUserManager.setUserRestriction(UserManager.DISALLOW_WALLPAPER, true, 115 UserHandle.of(userId)); 116 // Enabling telecom package as it supports managed profiles from N. 117 mTaskExecutor.execute(userId, 118 new InstallExistingPackageTask(TELECOM_PACKAGE, context, null, mTaskExecutor)); 119 120 ComponentName profileOwner = mDevicePolicyManager.getProfileOwnerAsUser(userId); 121 if (profileOwner == null) { 122 // Shouldn't happen. 123 ProvisionLogger.loge("No profile owner on managed profile " + userId); 124 return; 125 } 126 127 // Build a set of fake params to be able to run the tasks 128 ProvisioningParams fakeParams = new ProvisioningParams.Builder() 129 .setDeviceAdminComponentName(profileOwner) 130 .setProvisioningAction(ACTION_PROVISION_MANAGED_PROFILE) 131 .build(); 132 mTaskExecutor.execute(userId, 133 new DisableInstallShortcutListenersTask(context, fakeParams, mTaskExecutor)); 134 mTaskExecutor.execute(userId, 135 new DeleteNonRequiredAppsTask(false, context, fakeParams, mTaskExecutor)); 136 } 137 } 138