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 package com.android.managedprovisioning; 17 18 import android.app.admin.DevicePolicyManager; 19 import android.content.pm.PackageManager; 20 import android.content.pm.PackageManager.NameNotFoundException; 21 import android.content.pm.UserInfo; 22 import android.content.BroadcastReceiver; 23 import android.content.ComponentName; 24 import android.content.Context; 25 import android.content.Intent; 26 import android.os.UserHandle; 27 import android.os.UserManager; 28 29 import com.android.managedprovisioning.task.DeleteNonRequiredAppsTask; 30 import com.android.managedprovisioning.task.DisableInstallShortcutListenersTask; 31 import com.android.managedprovisioning.task.DisallowAddUserTask; 32 33 import java.util.List; 34 35 /** 36 * After a system update, this class resets the cross-profile intent filters and checks 37 * if apps that have been added to the system image need to be deleted. 38 */ 39 public class PreBootListener extends BroadcastReceiver { 40 41 private UserManager mUserManager; 42 private PackageManager mPackageManager; 43 private DevicePolicyManager mDevicePolicyManager; 44 45 private static final String TELECOM_PACKAGE = "com.android.server.telecom"; 46 47 @Override onReceive(Context context, Intent intent)48 public void onReceive(Context context, Intent intent) { 49 if (context.getUserId() != UserHandle.USER_SYSTEM) { 50 return; 51 } 52 mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 53 54 mDevicePolicyManager = (DevicePolicyManager) context.getSystemService( 55 Context.DEVICE_POLICY_SERVICE); 56 mPackageManager = context.getPackageManager(); 57 58 // Check for device owner. 59 final ComponentName deviceOwnerComponent = 60 mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser(); 61 if (deviceOwnerComponent != null) { 62 int deviceOwnerUserId = mDevicePolicyManager.getDeviceOwnerUserId(); 63 64 if(DeleteNonRequiredAppsTask.shouldDeleteNonRequiredApps(context, deviceOwnerUserId)) { 65 66 // Delete new apps. 67 new DeleteNonRequiredAppsTask(context, deviceOwnerComponent.getPackageName(), 68 DeleteNonRequiredAppsTask.DEVICE_OWNER, 69 false /* not creating new profile */, 70 deviceOwnerUserId, 71 false /* delete non-required system apps */, 72 new DeleteNonRequiredAppsTask.Callback() { 73 74 @Override 75 public void onSuccess() { 76 } 77 78 @Override 79 public void onError() { 80 ProvisionLogger.loge("Error while checking if there are new system " 81 + "apps that need to be deleted"); 82 } 83 }).run(); 84 } 85 86 // Ensure additional users cannot be created if we're in the state necessary to require 87 // that. 88 boolean splitSystemUser = UserManager.isSplitSystemUser(); 89 new DisallowAddUserTask(mUserManager, deviceOwnerUserId, splitSystemUser) 90 .maybeDisallowAddUsers(); 91 } 92 93 for (UserInfo userInfo : mUserManager.getUsers()) { 94 if (userInfo.isManagedProfile()) { 95 mUserManager.setUserRestriction(UserManager.DISALLOW_WALLPAPER, true, 96 userInfo.getUserHandle()); 97 // Enabling telecom package as it supports managed profiles from N. 98 installTelecomAsUser(userInfo.id); 99 runManagedProfileDisablingTasks(userInfo.id, context); 100 } else { 101 // if this user has managed profiles, reset the cross-profile intent filters between 102 // this user and its managed profiles. 103 resetCrossProfileIntentFilters(userInfo.id); 104 } 105 } 106 } 107 108 /** 109 * Enable telecom package in a particular user. 110 * 111 * @param userId user id of user that going to have telecom installed. 112 */ installTelecomAsUser(int userId)113 private void installTelecomAsUser(int userId) { 114 try { 115 mPackageManager.installExistingPackageAsUser(TELECOM_PACKAGE, userId); 116 } catch (NameNotFoundException ex) { 117 // should not happen 118 ProvisionLogger.loge(ex); 119 } 120 } 121 122 /** 123 * Reset the cross profile intent filters between userId and all of its managed profiles if any. 124 */ resetCrossProfileIntentFilters(int userId)125 private void resetCrossProfileIntentFilters(int userId) { 126 List<UserInfo> profiles = mUserManager.getProfiles(userId); 127 if (profiles.size() <= 1) { 128 return; 129 } 130 131 // Removes cross profile intent filters from the parent to all the managed profiles. 132 mPackageManager.clearCrossProfileIntentFilters(userId); 133 134 // For each managed profile reset cross profile intent filters 135 for (UserInfo profile : profiles) { 136 if (!profile.isManagedProfile()) { 137 continue; 138 } 139 mPackageManager.clearCrossProfileIntentFilters(profile.id); 140 CrossProfileIntentFiltersHelper.setFilters( 141 mPackageManager, userId, profile.id); 142 } 143 } 144 runManagedProfileDisablingTasks(int userId, Context context)145 void runManagedProfileDisablingTasks(int userId, Context context) { 146 ComponentName profileOwner = mDevicePolicyManager.getProfileOwnerAsUser(userId); 147 if (profileOwner == null) { 148 // Shouldn't happen. 149 ProvisionLogger.loge("No profile owner on managed profile " + userId); 150 return; 151 } 152 final DisableInstallShortcutListenersTask disableInstallShortcutListenersTask 153 = new DisableInstallShortcutListenersTask(context, userId); 154 155 final DeleteNonRequiredAppsTask deleteNonRequiredAppsTask 156 = new DeleteNonRequiredAppsTask(context, 157 profileOwner.getPackageName(), 158 DeleteNonRequiredAppsTask.PROFILE_OWNER, 159 false /* not creating new profile */, 160 userId, 161 false /* delete non-required system apps */, 162 new DeleteNonRequiredAppsTask.Callback() { 163 164 @Override 165 public void onSuccess() { 166 disableInstallShortcutListenersTask.run(); 167 } 168 169 @Override 170 public void onError() { 171 ProvisionLogger.loge("Error while checking if there are new system " 172 + "apps that need to be deleted"); 173 } 174 }); 175 176 deleteNonRequiredAppsTask.run(); 177 } 178 } 179