blob: 2a723b4b234ed2cd8a013889fbf61c08abba13cd [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
Geremy Condraf1bcca82013-01-07 22:35:24 -080068 PackageKeySetData keySetData = new PackageKeySetData();
69
Dianne Hackborn4a9f0712012-10-02 15:29:06 -070070 private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -070071
Kenny Rootcf0b38c2011-03-22 14:17:59 -070072 // Whether this package is currently stopped, thus can not be
73 // started until explicitly launched by the user.
Dianne Hackborn7767eac2012-08-23 18:25:40 -070074 private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>();
Amith Yamasani483f3b02012-03-13 16:08:00 -070075
Kenny Rootcf0b38c2011-03-22 14:17:59 -070076 int installStatus = PKG_INSTALL_COMPLETE;
77
78 PackageSettingBase origPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -070079
Kenny Rootcf0b38c2011-03-22 14:17:59 -070080 /* package name of the app that installed this package */
81 String installerPackageName;
82 PackageSettingBase(String name, String realName, File codePath, File resourcePath,
83 String nativeLibraryPathString, int pVersionCode, int pkgFlags) {
84 super(pkgFlags);
85 this.name = name;
86 this.realName = realName;
87 init(codePath, resourcePath, nativeLibraryPathString, pVersionCode);
88 }
89
90 /**
91 * New instance of PackageSetting with one-level-deep cloning.
92 */
93 @SuppressWarnings("unchecked")
94 PackageSettingBase(PackageSettingBase base) {
95 super(base);
96
97 name = base.name;
98 realName = base.realName;
99 codePath = base.codePath;
100 codePathString = base.codePathString;
101 resourcePath = base.resourcePath;
102 resourcePathString = base.resourcePathString;
103 nativeLibraryPathString = base.nativeLibraryPathString;
104 timeStamp = base.timeStamp;
105 firstInstallTime = base.firstInstallTime;
106 lastUpdateTime = base.lastUpdateTime;
107 versionCode = base.versionCode;
108
109 uidError = base.uidError;
110
111 signatures = new PackageSignatures(base.signatures);
112
113 permissionsFixed = base.permissionsFixed;
114 haveGids = base.haveGids;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700115 userState.clear();
116 for (int i=0; i<base.userState.size(); i++) {
117 userState.put(base.userState.keyAt(i),
118 new PackageUserState(base.userState.valueAt(i)));
119 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700120 installStatus = base.installStatus;
121
122 origPackage = base.origPackage;
123
124 installerPackageName = base.installerPackageName;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800125
126 keySetData = new PackageKeySetData(base.keySetData);
127
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700128 }
129
130 void init(File codePath, File resourcePath, String nativeLibraryPathString,
131 int pVersionCode) {
132 this.codePath = codePath;
133 this.codePathString = codePath.toString();
134 this.resourcePath = resourcePath;
135 this.resourcePathString = resourcePath.toString();
136 this.nativeLibraryPathString = nativeLibraryPathString;
137 this.versionCode = pVersionCode;
138 }
139
140 public void setInstallerPackageName(String packageName) {
141 installerPackageName = packageName;
142 }
143
144 String getInstallerPackageName() {
145 return installerPackageName;
146 }
147
148 public void setInstallStatus(int newStatus) {
149 installStatus = newStatus;
150 }
151
152 public int getInstallStatus() {
153 return installStatus;
154 }
155
156 public void setTimeStamp(long newStamp) {
157 timeStamp = newStamp;
158 }
159
160 /**
161 * Make a shallow copy of this package settings.
162 */
163 public void copyFrom(PackageSettingBase base) {
164 grantedPermissions = base.grantedPermissions;
165 gids = base.gids;
166
167 timeStamp = base.timeStamp;
168 firstInstallTime = base.firstInstallTime;
169 lastUpdateTime = base.lastUpdateTime;
170 signatures = base.signatures;
171 permissionsFixed = base.permissionsFixed;
172 haveGids = base.haveGids;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700173 userState.clear();
174 for (int i=0; i<base.userState.size(); i++) {
175 userState.put(base.userState.keyAt(i), base.userState.valueAt(i));
176 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700177 installStatus = base.installStatus;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800178 keySetData = base.keySetData;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700179 }
180
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700181 private PackageUserState modifyUserState(int userId) {
182 PackageUserState state = userState.get(userId);
183 if (state == null) {
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700184 state = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700185 userState.put(userId, state);
186 }
187 return state;
188 }
189
190 public PackageUserState readUserState(int userId) {
191 PackageUserState state = userState.get(userId);
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -0700192 if (state != null) {
193 return state;
194 }
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700195 return DEFAULT_USER_STATE;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700196 }
197
Amith Yamasani483f3b02012-03-13 16:08:00 -0700198 void setEnabled(int state, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700199 modifyUserState(userId).enabled = state;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700200 }
201
202 int getEnabled(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700203 return readUserState(userId).enabled;
204 }
205
206 void setInstalled(boolean inst, int userId) {
207 modifyUserState(userId).installed = inst;
208 }
209
210 boolean getInstalled(int userId) {
211 return readUserState(userId).installed;
212 }
213
214 boolean isAnyInstalled(int[] users) {
215 for (int user: users) {
216 if (readUserState(user).installed) {
217 return true;
218 }
219 }
220 return false;
221 }
222
Dianne Hackborn786b4402012-08-27 15:14:02 -0700223 int[] queryInstalledUsers(int[] users, boolean installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700224 int num = 0;
225 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700226 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700227 num++;
228 }
229 }
230 int[] res = new int[num];
231 num = 0;
232 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700233 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700234 res[num] = user;
235 num++;
236 }
237 }
238 return res;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700239 }
240
241 boolean getStopped(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700242 return readUserState(userId).stopped;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700243 }
244
245 void setStopped(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700246 modifyUserState(userId).stopped = stop;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700247 }
248
249 boolean getNotLaunched(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700250 return readUserState(userId).notLaunched;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700251 }
252
253 void setNotLaunched(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700254 modifyUserState(userId).notLaunched = stop;
255 }
256
257 void setUserState(int userId, int enabled, boolean installed, boolean stopped,
258 boolean notLaunched, HashSet<String> enabledComponents,
259 HashSet<String> disabledComponents) {
260 PackageUserState state = modifyUserState(userId);
261 state.enabled = enabled;
262 state.installed = installed;
263 state.stopped = stopped;
264 state.notLaunched = notLaunched;
265 state.enabledComponents = enabledComponents;
266 state.disabledComponents = disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700267 }
268
269 HashSet<String> getEnabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700270 return readUserState(userId).enabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700271 }
272
273 HashSet<String> getDisabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700274 return readUserState(userId).disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700275 }
276
277 void setEnabledComponents(HashSet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700278 modifyUserState(userId).enabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700279 }
280
281 void setDisabledComponents(HashSet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700282 modifyUserState(userId).disabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700283 }
284
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700285 void setEnabledComponentsCopy(HashSet<String> components, int userId) {
286 modifyUserState(userId).enabledComponents = components != null
287 ? new HashSet<String>(components) : null;
288 }
289
290 void setDisabledComponentsCopy(HashSet<String> components, int userId) {
291 modifyUserState(userId).disabledComponents = components != null
292 ? new HashSet<String>(components) : null;
293 }
294
295 PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) {
296 PackageUserState state = modifyUserState(userId);
297 if (disabled && state.disabledComponents == null) {
298 state.disabledComponents = new HashSet<String>(1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700299 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700300 if (enabled && state.enabledComponents == null) {
301 state.enabledComponents = new HashSet<String>(1);
302 }
303 return state;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700304 }
305
306 void addDisabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700307 modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700308 }
309
310 void addEnabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700311 modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700312 }
313
314 boolean enableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700315 PackageUserState state = modifyUserStateComponents(userId, false, true);
316 boolean changed = state.disabledComponents != null
317 ? state.disabledComponents.remove(componentClassName) : false;
318 changed |= state.enabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700319 return changed;
320 }
321
Amith Yamasani483f3b02012-03-13 16:08:00 -0700322 boolean disableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700323 PackageUserState state = modifyUserStateComponents(userId, true, false);
324 boolean changed = state.enabledComponents != null
325 ? state.enabledComponents.remove(componentClassName) : false;
326 changed |= state.disabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700327 return changed;
328 }
329
Amith Yamasani483f3b02012-03-13 16:08:00 -0700330 boolean restoreComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700331 PackageUserState state = modifyUserStateComponents(userId, true, true);
332 boolean changed = state.disabledComponents != null
333 ? state.disabledComponents.remove(componentClassName) : false;
334 changed |= state.enabledComponents != null
335 ? state.enabledComponents.remove(componentClassName) : false;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700336 return changed;
337 }
338
Amith Yamasani483f3b02012-03-13 16:08:00 -0700339 int getCurrentEnabledStateLPr(String componentName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700340 PackageUserState state = readUserState(userId);
341 if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700342 return COMPONENT_ENABLED_STATE_ENABLED;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700343 } else if (state.disabledComponents != null
344 && state.disabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700345 return COMPONENT_ENABLED_STATE_DISABLED;
346 } else {
347 return COMPONENT_ENABLED_STATE_DEFAULT;
348 }
349 }
Amith Yamasani13593602012-03-22 16:16:17 -0700350
351 void removeUser(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700352 userState.delete(userId);
Amith Yamasani13593602012-03-22 16:16:17 -0700353 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700354}