Home | History | Annotate | Download | only in managedprovisioning
      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
     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      */
    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      */
    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 
    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