blob: ae1b2134907e0dd25f59820d468941dd34feb8de [file] [log] [blame]
Kenny Rootcf0b38c2011-03-22 14:17:59 -07001/*
2 * Copyright (C) 2011 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
17package com.android.server.pm;
18
19import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
20import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
21import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
22
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -070023import android.content.pm.ApplicationInfo;
Dianne Hackborn7767eac2012-08-23 18:25:40 -070024import android.content.pm.PackageUserState;
25import android.content.pm.UserInfo;
Amith Yamasani483f3b02012-03-13 16:08:00 -070026import android.util.SparseArray;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070027
28import java.io.File;
29import java.util.HashSet;
Dianne Hackborn7767eac2012-08-23 18:25:40 -070030import java.util.List;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070031
32/**
33 * Settings base class for pending and resolved classes.
34 */
35class PackageSettingBase extends GrantedPermissions {
36 /**
37 * Indicates the state of installation. Used by PackageManager to figure out
38 * incomplete installations. Say a package is being installed (the state is
39 * set to PKG_INSTALL_INCOMPLETE) and remains so till the package
40 * installation is successful or unsuccessful in which case the
41 * PackageManager will no longer maintain state information associated with
42 * the package. If some exception(like device freeze or battery being pulled
43 * out) occurs during installation of a package, the PackageManager needs
44 * this information to clean up the previously failed installation.
45 */
46 static final int PKG_INSTALL_COMPLETE = 1;
47 static final int PKG_INSTALL_INCOMPLETE = 0;
48
49 final String name;
50 final String realName;
51 File codePath;
52 String codePathString;
53 File resourcePath;
54 String resourcePathString;
55 String nativeLibraryPathString;
56 long timeStamp;
57 long firstInstallTime;
58 long lastUpdateTime;
59 int versionCode;
60
61 boolean uidError;
62
63 PackageSignatures signatures = new PackageSignatures();
64
65 boolean permissionsFixed;
66 boolean haveGids;
67
Dianne Hackborn4a9f0712012-10-02 15:29:06 -070068 private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -070069
Kenny Rootcf0b38c2011-03-22 14:17:59 -070070 // Whether this package is currently stopped, thus can not be
71 // started until explicitly launched by the user.
Dianne Hackborn7767eac2012-08-23 18:25:40 -070072 private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>();
Amith Yamasani483f3b02012-03-13 16:08:00 -070073
Kenny Rootcf0b38c2011-03-22 14:17:59 -070074 int installStatus = PKG_INSTALL_COMPLETE;
75
76 PackageSettingBase origPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -070077
Kenny Rootcf0b38c2011-03-22 14:17:59 -070078 /* package name of the app that installed this package */
79 String installerPackageName;
80 PackageSettingBase(String name, String realName, File codePath, File resourcePath,
81 String nativeLibraryPathString, int pVersionCode, int pkgFlags) {
82 super(pkgFlags);
83 this.name = name;
84 this.realName = realName;
85 init(codePath, resourcePath, nativeLibraryPathString, pVersionCode);
86 }
87
88 /**
89 * New instance of PackageSetting with one-level-deep cloning.
90 */
91 @SuppressWarnings("unchecked")
92 PackageSettingBase(PackageSettingBase base) {
93 super(base);
94
95 name = base.name;
96 realName = base.realName;
97 codePath = base.codePath;
98 codePathString = base.codePathString;
99 resourcePath = base.resourcePath;
100 resourcePathString = base.resourcePathString;
101 nativeLibraryPathString = base.nativeLibraryPathString;
102 timeStamp = base.timeStamp;
103 firstInstallTime = base.firstInstallTime;
104 lastUpdateTime = base.lastUpdateTime;
105 versionCode = base.versionCode;
106
107 uidError = base.uidError;
108
109 signatures = new PackageSignatures(base.signatures);
110
111 permissionsFixed = base.permissionsFixed;
112 haveGids = base.haveGids;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700113 userState.clear();
114 for (int i=0; i<base.userState.size(); i++) {
115 userState.put(base.userState.keyAt(i),
116 new PackageUserState(base.userState.valueAt(i)));
117 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700118 installStatus = base.installStatus;
119
120 origPackage = base.origPackage;
121
122 installerPackageName = base.installerPackageName;
123 }
124
125 void init(File codePath, File resourcePath, String nativeLibraryPathString,
126 int pVersionCode) {
127 this.codePath = codePath;
128 this.codePathString = codePath.toString();
129 this.resourcePath = resourcePath;
130 this.resourcePathString = resourcePath.toString();
131 this.nativeLibraryPathString = nativeLibraryPathString;
132 this.versionCode = pVersionCode;
133 }
134
135 public void setInstallerPackageName(String packageName) {
136 installerPackageName = packageName;
137 }
138
139 String getInstallerPackageName() {
140 return installerPackageName;
141 }
142
143 public void setInstallStatus(int newStatus) {
144 installStatus = newStatus;
145 }
146
147 public int getInstallStatus() {
148 return installStatus;
149 }
150
151 public void setTimeStamp(long newStamp) {
152 timeStamp = newStamp;
153 }
154
155 /**
156 * Make a shallow copy of this package settings.
157 */
158 public void copyFrom(PackageSettingBase base) {
159 grantedPermissions = base.grantedPermissions;
160 gids = base.gids;
161
162 timeStamp = base.timeStamp;
163 firstInstallTime = base.firstInstallTime;
164 lastUpdateTime = base.lastUpdateTime;
165 signatures = base.signatures;
166 permissionsFixed = base.permissionsFixed;
167 haveGids = base.haveGids;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700168 userState.clear();
169 for (int i=0; i<base.userState.size(); i++) {
170 userState.put(base.userState.keyAt(i), base.userState.valueAt(i));
171 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700172 installStatus = base.installStatus;
173 }
174
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700175 private PackageUserState modifyUserState(int userId) {
176 PackageUserState state = userState.get(userId);
177 if (state == null) {
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700178 state = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700179 userState.put(userId, state);
180 }
181 return state;
182 }
183
184 public PackageUserState readUserState(int userId) {
185 PackageUserState state = userState.get(userId);
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -0700186 if (state != null) {
187 return state;
188 }
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700189 return DEFAULT_USER_STATE;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700190 }
191
Amith Yamasani483f3b02012-03-13 16:08:00 -0700192 void setEnabled(int state, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700193 modifyUserState(userId).enabled = state;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700194 }
195
196 int getEnabled(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700197 return readUserState(userId).enabled;
198 }
199
200 void setInstalled(boolean inst, int userId) {
201 modifyUserState(userId).installed = inst;
202 }
203
204 boolean getInstalled(int userId) {
205 return readUserState(userId).installed;
206 }
207
208 boolean isAnyInstalled(int[] users) {
209 for (int user: users) {
210 if (readUserState(user).installed) {
211 return true;
212 }
213 }
214 return false;
215 }
216
Dianne Hackborn786b4402012-08-27 15:14:02 -0700217 int[] queryInstalledUsers(int[] users, boolean installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700218 int num = 0;
219 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700220 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700221 num++;
222 }
223 }
224 int[] res = new int[num];
225 num = 0;
226 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700227 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700228 res[num] = user;
229 num++;
230 }
231 }
232 return res;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700233 }
234
235 boolean getStopped(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700236 return readUserState(userId).stopped;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700237 }
238
239 void setStopped(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700240 modifyUserState(userId).stopped = stop;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700241 }
242
243 boolean getNotLaunched(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700244 return readUserState(userId).notLaunched;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700245 }
246
247 void setNotLaunched(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700248 modifyUserState(userId).notLaunched = stop;
249 }
250
251 void setUserState(int userId, int enabled, boolean installed, boolean stopped,
252 boolean notLaunched, HashSet<String> enabledComponents,
253 HashSet<String> disabledComponents) {
254 PackageUserState state = modifyUserState(userId);
255 state.enabled = enabled;
256 state.installed = installed;
257 state.stopped = stopped;
258 state.notLaunched = notLaunched;
259 state.enabledComponents = enabledComponents;
260 state.disabledComponents = disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700261 }
262
263 HashSet<String> getEnabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700264 return readUserState(userId).enabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700265 }
266
267 HashSet<String> getDisabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700268 return readUserState(userId).disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700269 }
270
271 void setEnabledComponents(HashSet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700272 modifyUserState(userId).enabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700273 }
274
275 void setDisabledComponents(HashSet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700276 modifyUserState(userId).disabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700277 }
278
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700279 void setEnabledComponentsCopy(HashSet<String> components, int userId) {
280 modifyUserState(userId).enabledComponents = components != null
281 ? new HashSet<String>(components) : null;
282 }
283
284 void setDisabledComponentsCopy(HashSet<String> components, int userId) {
285 modifyUserState(userId).disabledComponents = components != null
286 ? new HashSet<String>(components) : null;
287 }
288
289 PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) {
290 PackageUserState state = modifyUserState(userId);
291 if (disabled && state.disabledComponents == null) {
292 state.disabledComponents = new HashSet<String>(1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700293 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700294 if (enabled && state.enabledComponents == null) {
295 state.enabledComponents = new HashSet<String>(1);
296 }
297 return state;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700298 }
299
300 void addDisabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700301 modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700302 }
303
304 void addEnabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700305 modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700306 }
307
308 boolean enableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700309 PackageUserState state = modifyUserStateComponents(userId, false, true);
310 boolean changed = state.disabledComponents != null
311 ? state.disabledComponents.remove(componentClassName) : false;
312 changed |= state.enabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700313 return changed;
314 }
315
Amith Yamasani483f3b02012-03-13 16:08:00 -0700316 boolean disableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700317 PackageUserState state = modifyUserStateComponents(userId, true, false);
318 boolean changed = state.enabledComponents != null
319 ? state.enabledComponents.remove(componentClassName) : false;
320 changed |= state.disabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700321 return changed;
322 }
323
Amith Yamasani483f3b02012-03-13 16:08:00 -0700324 boolean restoreComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700325 PackageUserState state = modifyUserStateComponents(userId, true, true);
326 boolean changed = state.disabledComponents != null
327 ? state.disabledComponents.remove(componentClassName) : false;
328 changed |= state.enabledComponents != null
329 ? state.enabledComponents.remove(componentClassName) : false;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700330 return changed;
331 }
332
Amith Yamasani483f3b02012-03-13 16:08:00 -0700333 int getCurrentEnabledStateLPr(String componentName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700334 PackageUserState state = readUserState(userId);
335 if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700336 return COMPONENT_ENABLED_STATE_ENABLED;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700337 } else if (state.disabledComponents != null
338 && state.disabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700339 return COMPONENT_ENABLED_STATE_DISABLED;
340 } else {
341 return COMPONENT_ENABLED_STATE_DEFAULT;
342 }
343 }
Amith Yamasani13593602012-03-22 16:16:17 -0700344
345 void removeUser(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700346 userState.delete(userId);
Amith Yamasani13593602012-03-22 16:16:17 -0700347 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700348}