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