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