blob: bf13fd97f5c6ce9964210d04842efe5121c4b788 [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 Hackborn7767eac2012-08-23 18:25:40 -070023import android.content.pm.PackageUserState;
Amith Yamasani483f3b02012-03-13 16:08:00 -070024import android.util.SparseArray;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070025
26import java.io.File;
27import java.util.HashSet;
28
29/**
30 * Settings base class for pending and resolved classes.
31 */
32class PackageSettingBase extends GrantedPermissions {
33 /**
34 * Indicates the state of installation. Used by PackageManager to figure out
35 * incomplete installations. Say a package is being installed (the state is
36 * set to PKG_INSTALL_INCOMPLETE) and remains so till the package
37 * installation is successful or unsuccessful in which case the
38 * PackageManager will no longer maintain state information associated with
39 * the package. If some exception(like device freeze or battery being pulled
40 * out) occurs during installation of a package, the PackageManager needs
41 * this information to clean up the previously failed installation.
42 */
43 static final int PKG_INSTALL_COMPLETE = 1;
44 static final int PKG_INSTALL_INCOMPLETE = 0;
45
46 final String name;
47 final String realName;
Jeff Sharkey57dcf5b2014-06-18 17:46:05 -070048
49 /**
50 * Path where this package was found on disk. For monolithic packages
51 * this is path to single base APK file; for cluster packages this is
52 * path to the cluster directory.
53 */
Kenny Rootcf0b38c2011-03-22 14:17:59 -070054 File codePath;
55 String codePathString;
56 File resourcePath;
57 String resourcePathString;
Narayan Kamathff110bd2014-07-04 18:30:45 +010058
59 /**
Jeff Sharkey84f12942014-07-10 17:48:11 -070060 * The path under which native libraries have been unpacked. This path is
61 * always derived at runtime, and is only stored here for cleanup when a
62 * package is uninstalled.
Narayan Kamathff110bd2014-07-04 18:30:45 +010063 */
Jeff Sharkey84f12942014-07-10 17:48:11 -070064 @Deprecated
Narayan Kamathff110bd2014-07-04 18:30:45 +010065 String legacyNativeLibraryPathString;
66
Narayan Kamath4903f642014-08-11 13:33:45 +010067 /**
68 * The primary CPU abi for this package. This value is regenerated at every
69 * boot scan.
70 */
Narayan Kamathff110bd2014-07-04 18:30:45 +010071 String primaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +010072
73 /**
74 * The secondary CPU abi for this package. This value is regenerated at every
75 * boot scan.
76 */
Narayan Kamathff110bd2014-07-04 18:30:45 +010077 String secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +010078
79 /**
80 * The install time CPU override, if any. This value is written at install time
81 * and doesn't change during the life of an install. If non-null,
82 * {@code primaryCpuAbiString} will contain the same value.
83 */
84 String cpuAbiOverrideString;
85
Kenny Rootcf0b38c2011-03-22 14:17:59 -070086 long timeStamp;
87 long firstInstallTime;
88 long lastUpdateTime;
89 int versionCode;
90
91 boolean uidError;
92
93 PackageSignatures signatures = new PackageSignatures();
94
95 boolean permissionsFixed;
96 boolean haveGids;
97
Geremy Condraf1bcca82013-01-07 22:35:24 -080098 PackageKeySetData keySetData = new PackageKeySetData();
99
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700100 private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700101
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700102 // Whether this package is currently stopped, thus can not be
103 // started until explicitly launched by the user.
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700104 private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>();
Amith Yamasani483f3b02012-03-13 16:08:00 -0700105
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700106 int installStatus = PKG_INSTALL_COMPLETE;
107
108 PackageSettingBase origPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700109
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700110 /* package name of the app that installed this package */
111 String installerPackageName;
112 PackageSettingBase(String name, String realName, File codePath, File resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100113 String legacyNativeLibraryPathString, String primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100114 String secondaryCpuAbiString, String cpuAbiOverrideString,
115 int pVersionCode, int pkgFlags) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700116 super(pkgFlags);
117 this.name = name;
118 this.realName = realName;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100119 init(codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100120 secondaryCpuAbiString, cpuAbiOverrideString, pVersionCode);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700121 }
122
123 /**
124 * New instance of PackageSetting with one-level-deep cloning.
125 */
126 @SuppressWarnings("unchecked")
127 PackageSettingBase(PackageSettingBase base) {
128 super(base);
129
130 name = base.name;
131 realName = base.realName;
132 codePath = base.codePath;
133 codePathString = base.codePathString;
134 resourcePath = base.resourcePath;
135 resourcePathString = base.resourcePathString;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100136 legacyNativeLibraryPathString = base.legacyNativeLibraryPathString;
137 primaryCpuAbiString = base.primaryCpuAbiString;
138 secondaryCpuAbiString = base.secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100139 cpuAbiOverrideString = base.cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700140 timeStamp = base.timeStamp;
141 firstInstallTime = base.firstInstallTime;
142 lastUpdateTime = base.lastUpdateTime;
143 versionCode = base.versionCode;
144
145 uidError = base.uidError;
146
147 signatures = new PackageSignatures(base.signatures);
148
149 permissionsFixed = base.permissionsFixed;
150 haveGids = base.haveGids;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700151 userState.clear();
152 for (int i=0; i<base.userState.size(); i++) {
153 userState.put(base.userState.keyAt(i),
154 new PackageUserState(base.userState.valueAt(i)));
155 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700156 installStatus = base.installStatus;
157
158 origPackage = base.origPackage;
159
160 installerPackageName = base.installerPackageName;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800161
162 keySetData = new PackageKeySetData(base.keySetData);
163
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700164 }
165
Narayan Kamathff110bd2014-07-04 18:30:45 +0100166 void init(File codePath, File resourcePath, String legacyNativeLibraryPathString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100167 String primaryCpuAbiString, String secondaryCpuAbiString,
168 String cpuAbiOverrideString, int pVersionCode) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700169 this.codePath = codePath;
170 this.codePathString = codePath.toString();
171 this.resourcePath = resourcePath;
172 this.resourcePathString = resourcePath.toString();
Narayan Kamathff110bd2014-07-04 18:30:45 +0100173 this.legacyNativeLibraryPathString = legacyNativeLibraryPathString;
174 this.primaryCpuAbiString = primaryCpuAbiString;
175 this.secondaryCpuAbiString = secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100176 this.cpuAbiOverrideString = cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700177 this.versionCode = pVersionCode;
178 }
179
180 public void setInstallerPackageName(String packageName) {
181 installerPackageName = packageName;
182 }
183
184 String getInstallerPackageName() {
185 return installerPackageName;
186 }
187
188 public void setInstallStatus(int newStatus) {
189 installStatus = newStatus;
190 }
191
192 public int getInstallStatus() {
193 return installStatus;
194 }
195
196 public void setTimeStamp(long newStamp) {
197 timeStamp = newStamp;
198 }
199
200 /**
201 * Make a shallow copy of this package settings.
202 */
203 public void copyFrom(PackageSettingBase base) {
204 grantedPermissions = base.grantedPermissions;
205 gids = base.gids;
206
Narayan Kamathff110bd2014-07-04 18:30:45 +0100207 primaryCpuAbiString = base.primaryCpuAbiString;
208 secondaryCpuAbiString = base.secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100209 cpuAbiOverrideString = base.cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700210 timeStamp = base.timeStamp;
211 firstInstallTime = base.firstInstallTime;
212 lastUpdateTime = base.lastUpdateTime;
213 signatures = base.signatures;
214 permissionsFixed = base.permissionsFixed;
215 haveGids = base.haveGids;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700216 userState.clear();
217 for (int i=0; i<base.userState.size(); i++) {
218 userState.put(base.userState.keyAt(i), base.userState.valueAt(i));
219 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700220 installStatus = base.installStatus;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800221 keySetData = base.keySetData;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700222 }
223
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700224 private PackageUserState modifyUserState(int userId) {
225 PackageUserState state = userState.get(userId);
226 if (state == null) {
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700227 state = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700228 userState.put(userId, state);
229 }
230 return state;
231 }
232
233 public PackageUserState readUserState(int userId) {
234 PackageUserState state = userState.get(userId);
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -0700235 if (state != null) {
236 return state;
237 }
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700238 return DEFAULT_USER_STATE;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700239 }
240
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700241 void setEnabled(int state, int userId, String callingPackage) {
242 PackageUserState st = modifyUserState(userId);
243 st.enabled = state;
244 st.lastDisableAppCaller = callingPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700245 }
246
247 int getEnabled(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700248 return readUserState(userId).enabled;
249 }
250
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700251 String getLastDisabledAppCaller(int userId) {
252 return readUserState(userId).lastDisableAppCaller;
253 }
254
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700255 void setInstalled(boolean inst, int userId) {
256 modifyUserState(userId).installed = inst;
257 }
258
259 boolean getInstalled(int userId) {
260 return readUserState(userId).installed;
261 }
262
263 boolean isAnyInstalled(int[] users) {
264 for (int user: users) {
265 if (readUserState(user).installed) {
266 return true;
267 }
268 }
269 return false;
270 }
271
Dianne Hackborn786b4402012-08-27 15:14:02 -0700272 int[] queryInstalledUsers(int[] users, boolean installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700273 int num = 0;
274 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700275 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700276 num++;
277 }
278 }
279 int[] res = new int[num];
280 num = 0;
281 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700282 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700283 res[num] = user;
284 num++;
285 }
286 }
287 return res;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700288 }
289
290 boolean getStopped(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700291 return readUserState(userId).stopped;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700292 }
293
294 void setStopped(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700295 modifyUserState(userId).stopped = stop;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700296 }
297
298 boolean getNotLaunched(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700299 return readUserState(userId).notLaunched;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700300 }
301
302 void setNotLaunched(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700303 modifyUserState(userId).notLaunched = stop;
304 }
305
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700306 boolean getHidden(int userId) {
307 return readUserState(userId).hidden;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700308 }
309
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700310 void setHidden(boolean hidden, int userId) {
311 modifyUserState(userId).hidden = hidden;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700312 }
313
Kenny Guyc13053b2014-05-29 14:17:17 +0100314 boolean getBlockUninstall(int userId) {
315 return readUserState(userId).blockUninstall;
316 }
317
318 void setBlockUninstall(boolean blockUninstall, int userId) {
319 modifyUserState(userId).blockUninstall = blockUninstall;
320 }
321
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700322 void setUserState(int userId, int enabled, boolean installed, boolean stopped,
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700323 boolean notLaunched, boolean hidden,
Amith Yamasani655d0e22013-06-12 14:19:10 -0700324 String lastDisableAppCaller, HashSet<String> enabledComponents,
Kenny Guyc13053b2014-05-29 14:17:17 +0100325 HashSet<String> disabledComponents, boolean blockUninstall) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700326 PackageUserState state = modifyUserState(userId);
327 state.enabled = enabled;
328 state.installed = installed;
329 state.stopped = stopped;
330 state.notLaunched = notLaunched;
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700331 state.hidden = hidden;
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700332 state.lastDisableAppCaller = lastDisableAppCaller;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700333 state.enabledComponents = enabledComponents;
334 state.disabledComponents = disabledComponents;
Kenny Guyc13053b2014-05-29 14:17:17 +0100335 state.blockUninstall = blockUninstall;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700336 }
337
338 HashSet<String> getEnabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700339 return readUserState(userId).enabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700340 }
341
342 HashSet<String> getDisabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700343 return readUserState(userId).disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700344 }
345
346 void setEnabledComponents(HashSet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700347 modifyUserState(userId).enabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700348 }
349
350 void setDisabledComponents(HashSet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700351 modifyUserState(userId).disabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700352 }
353
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700354 void setEnabledComponentsCopy(HashSet<String> components, int userId) {
355 modifyUserState(userId).enabledComponents = components != null
356 ? new HashSet<String>(components) : null;
357 }
358
359 void setDisabledComponentsCopy(HashSet<String> components, int userId) {
360 modifyUserState(userId).disabledComponents = components != null
361 ? new HashSet<String>(components) : null;
362 }
363
364 PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) {
365 PackageUserState state = modifyUserState(userId);
366 if (disabled && state.disabledComponents == null) {
367 state.disabledComponents = new HashSet<String>(1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700368 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700369 if (enabled && state.enabledComponents == null) {
370 state.enabledComponents = new HashSet<String>(1);
371 }
372 return state;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700373 }
374
375 void addDisabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700376 modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700377 }
378
379 void addEnabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700380 modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700381 }
382
383 boolean enableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700384 PackageUserState state = modifyUserStateComponents(userId, false, true);
385 boolean changed = state.disabledComponents != null
386 ? state.disabledComponents.remove(componentClassName) : false;
387 changed |= state.enabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700388 return changed;
389 }
390
Amith Yamasani483f3b02012-03-13 16:08:00 -0700391 boolean disableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700392 PackageUserState state = modifyUserStateComponents(userId, true, false);
393 boolean changed = state.enabledComponents != null
394 ? state.enabledComponents.remove(componentClassName) : false;
395 changed |= state.disabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700396 return changed;
397 }
398
Amith Yamasani483f3b02012-03-13 16:08:00 -0700399 boolean restoreComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700400 PackageUserState state = modifyUserStateComponents(userId, true, true);
401 boolean changed = state.disabledComponents != null
402 ? state.disabledComponents.remove(componentClassName) : false;
403 changed |= state.enabledComponents != null
404 ? state.enabledComponents.remove(componentClassName) : false;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700405 return changed;
406 }
407
Amith Yamasani483f3b02012-03-13 16:08:00 -0700408 int getCurrentEnabledStateLPr(String componentName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700409 PackageUserState state = readUserState(userId);
410 if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700411 return COMPONENT_ENABLED_STATE_ENABLED;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700412 } else if (state.disabledComponents != null
413 && state.disabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700414 return COMPONENT_ENABLED_STATE_DISABLED;
415 } else {
416 return COMPONENT_ENABLED_STATE_DEFAULT;
417 }
418 }
Amith Yamasani13593602012-03-22 16:16:17 -0700419
420 void removeUser(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700421 userState.delete(userId);
Amith Yamasani13593602012-03-22 16:16:17 -0700422 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700423}