blob: 2a5698b971159465a4b05976ef3a8d38adbeac74 [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;
48 File codePath;
49 String codePathString;
50 File resourcePath;
51 String resourcePathString;
52 String nativeLibraryPathString;
53 long timeStamp;
54 long firstInstallTime;
55 long lastUpdateTime;
56 int versionCode;
57
58 boolean uidError;
59
60 PackageSignatures signatures = new PackageSignatures();
61
62 boolean permissionsFixed;
63 boolean haveGids;
64
Geremy Condraf1bcca82013-01-07 22:35:24 -080065 PackageKeySetData keySetData = new PackageKeySetData();
66
Dianne Hackborn4a9f0712012-10-02 15:29:06 -070067 private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -070068
Kenny Rootcf0b38c2011-03-22 14:17:59 -070069 // Whether this package is currently stopped, thus can not be
70 // started until explicitly launched by the user.
Dianne Hackborn7767eac2012-08-23 18:25:40 -070071 private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>();
Amith Yamasani483f3b02012-03-13 16:08:00 -070072
Kenny Rootcf0b38c2011-03-22 14:17:59 -070073 int installStatus = PKG_INSTALL_COMPLETE;
74
75 PackageSettingBase origPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -070076
Kenny Rootcf0b38c2011-03-22 14:17:59 -070077 /* package name of the app that installed this package */
78 String installerPackageName;
79 PackageSettingBase(String name, String realName, File codePath, File resourcePath,
80 String nativeLibraryPathString, int pVersionCode, int pkgFlags) {
81 super(pkgFlags);
82 this.name = name;
83 this.realName = realName;
84 init(codePath, resourcePath, nativeLibraryPathString, pVersionCode);
85 }
86
87 /**
88 * New instance of PackageSetting with one-level-deep cloning.
89 */
90 @SuppressWarnings("unchecked")
91 PackageSettingBase(PackageSettingBase base) {
92 super(base);
93
94 name = base.name;
95 realName = base.realName;
96 codePath = base.codePath;
97 codePathString = base.codePathString;
98 resourcePath = base.resourcePath;
99 resourcePathString = base.resourcePathString;
100 nativeLibraryPathString = base.nativeLibraryPathString;
101 timeStamp = base.timeStamp;
102 firstInstallTime = base.firstInstallTime;
103 lastUpdateTime = base.lastUpdateTime;
104 versionCode = base.versionCode;
105
106 uidError = base.uidError;
107
108 signatures = new PackageSignatures(base.signatures);
109
110 permissionsFixed = base.permissionsFixed;
111 haveGids = base.haveGids;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700112 userState.clear();
113 for (int i=0; i<base.userState.size(); i++) {
114 userState.put(base.userState.keyAt(i),
115 new PackageUserState(base.userState.valueAt(i)));
116 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700117 installStatus = base.installStatus;
118
119 origPackage = base.origPackage;
120
121 installerPackageName = base.installerPackageName;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800122
123 keySetData = new PackageKeySetData(base.keySetData);
124
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700125 }
126
127 void init(File codePath, File resourcePath, String nativeLibraryPathString,
128 int pVersionCode) {
129 this.codePath = codePath;
130 this.codePathString = codePath.toString();
131 this.resourcePath = resourcePath;
132 this.resourcePathString = resourcePath.toString();
133 this.nativeLibraryPathString = nativeLibraryPathString;
134 this.versionCode = pVersionCode;
135 }
136
137 public void setInstallerPackageName(String packageName) {
138 installerPackageName = packageName;
139 }
140
141 String getInstallerPackageName() {
142 return installerPackageName;
143 }
144
145 public void setInstallStatus(int newStatus) {
146 installStatus = newStatus;
147 }
148
149 public int getInstallStatus() {
150 return installStatus;
151 }
152
153 public void setTimeStamp(long newStamp) {
154 timeStamp = newStamp;
155 }
156
157 /**
158 * Make a shallow copy of this package settings.
159 */
160 public void copyFrom(PackageSettingBase base) {
161 grantedPermissions = base.grantedPermissions;
162 gids = base.gids;
163
164 timeStamp = base.timeStamp;
165 firstInstallTime = base.firstInstallTime;
166 lastUpdateTime = base.lastUpdateTime;
167 signatures = base.signatures;
168 permissionsFixed = base.permissionsFixed;
169 haveGids = base.haveGids;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700170 userState.clear();
171 for (int i=0; i<base.userState.size(); i++) {
172 userState.put(base.userState.keyAt(i), base.userState.valueAt(i));
173 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700174 installStatus = base.installStatus;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800175 keySetData = base.keySetData;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700176 }
177
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700178 private PackageUserState modifyUserState(int userId) {
179 PackageUserState state = userState.get(userId);
180 if (state == null) {
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700181 state = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700182 userState.put(userId, state);
183 }
184 return state;
185 }
186
187 public PackageUserState readUserState(int userId) {
188 PackageUserState state = userState.get(userId);
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -0700189 if (state != null) {
190 return state;
191 }
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700192 return DEFAULT_USER_STATE;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700193 }
194
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700195 void setEnabled(int state, int userId, String callingPackage) {
196 PackageUserState st = modifyUserState(userId);
197 st.enabled = state;
198 st.lastDisableAppCaller = callingPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700199 }
200
201 int getEnabled(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700202 return readUserState(userId).enabled;
203 }
204
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700205 String getLastDisabledAppCaller(int userId) {
206 return readUserState(userId).lastDisableAppCaller;
207 }
208
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700209 void setInstalled(boolean inst, int userId) {
210 modifyUserState(userId).installed = inst;
211 }
212
213 boolean getInstalled(int userId) {
214 return readUserState(userId).installed;
215 }
216
217 boolean isAnyInstalled(int[] users) {
218 for (int user: users) {
219 if (readUserState(user).installed) {
220 return true;
221 }
222 }
223 return false;
224 }
225
Dianne Hackborn786b4402012-08-27 15:14:02 -0700226 int[] queryInstalledUsers(int[] users, boolean installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700227 int num = 0;
228 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700229 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700230 num++;
231 }
232 }
233 int[] res = new int[num];
234 num = 0;
235 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700236 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700237 res[num] = user;
238 num++;
239 }
240 }
241 return res;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700242 }
243
244 boolean getStopped(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700245 return readUserState(userId).stopped;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700246 }
247
248 void setStopped(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700249 modifyUserState(userId).stopped = stop;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700250 }
251
252 boolean getNotLaunched(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700253 return readUserState(userId).notLaunched;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700254 }
255
256 void setNotLaunched(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700257 modifyUserState(userId).notLaunched = stop;
258 }
259
Amith Yamasani655d0e22013-06-12 14:19:10 -0700260 boolean getBlocked(int userId) {
261 return readUserState(userId).blocked;
262 }
263
264 void setBlocked(boolean blocked, int userId) {
265 modifyUserState(userId).blocked = blocked;
266 }
267
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700268 void setUserState(int userId, int enabled, boolean installed, boolean stopped,
Amith Yamasani655d0e22013-06-12 14:19:10 -0700269 boolean notLaunched, boolean blocked,
270 String lastDisableAppCaller, HashSet<String> enabledComponents,
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700271 HashSet<String> disabledComponents) {
272 PackageUserState state = modifyUserState(userId);
273 state.enabled = enabled;
274 state.installed = installed;
275 state.stopped = stopped;
276 state.notLaunched = notLaunched;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700277 state.blocked = blocked;
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700278 state.lastDisableAppCaller = lastDisableAppCaller;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700279 state.enabledComponents = enabledComponents;
280 state.disabledComponents = disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700281 }
282
283 HashSet<String> getEnabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700284 return readUserState(userId).enabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700285 }
286
287 HashSet<String> getDisabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700288 return readUserState(userId).disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700289 }
290
291 void setEnabledComponents(HashSet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700292 modifyUserState(userId).enabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700293 }
294
295 void setDisabledComponents(HashSet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700296 modifyUserState(userId).disabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700297 }
298
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700299 void setEnabledComponentsCopy(HashSet<String> components, int userId) {
300 modifyUserState(userId).enabledComponents = components != null
301 ? new HashSet<String>(components) : null;
302 }
303
304 void setDisabledComponentsCopy(HashSet<String> components, int userId) {
305 modifyUserState(userId).disabledComponents = components != null
306 ? new HashSet<String>(components) : null;
307 }
308
309 PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) {
310 PackageUserState state = modifyUserState(userId);
311 if (disabled && state.disabledComponents == null) {
312 state.disabledComponents = new HashSet<String>(1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700313 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700314 if (enabled && state.enabledComponents == null) {
315 state.enabledComponents = new HashSet<String>(1);
316 }
317 return state;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700318 }
319
320 void addDisabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700321 modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700322 }
323
324 void addEnabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700325 modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700326 }
327
328 boolean enableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700329 PackageUserState state = modifyUserStateComponents(userId, false, true);
330 boolean changed = state.disabledComponents != null
331 ? state.disabledComponents.remove(componentClassName) : false;
332 changed |= state.enabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700333 return changed;
334 }
335
Amith Yamasani483f3b02012-03-13 16:08:00 -0700336 boolean disableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700337 PackageUserState state = modifyUserStateComponents(userId, true, false);
338 boolean changed = state.enabledComponents != null
339 ? state.enabledComponents.remove(componentClassName) : false;
340 changed |= state.disabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700341 return changed;
342 }
343
Amith Yamasani483f3b02012-03-13 16:08:00 -0700344 boolean restoreComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700345 PackageUserState state = modifyUserStateComponents(userId, true, true);
346 boolean changed = state.disabledComponents != null
347 ? state.disabledComponents.remove(componentClassName) : false;
348 changed |= state.enabledComponents != null
349 ? state.enabledComponents.remove(componentClassName) : false;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700350 return changed;
351 }
352
Amith Yamasani483f3b02012-03-13 16:08:00 -0700353 int getCurrentEnabledStateLPr(String componentName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700354 PackageUserState state = readUserState(userId);
355 if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700356 return COMPONENT_ENABLED_STATE_ENABLED;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700357 } else if (state.disabledComponents != null
358 && state.disabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700359 return COMPONENT_ENABLED_STATE_DISABLED;
360 } else {
361 return COMPONENT_ENABLED_STATE_DEFAULT;
362 }
363 }
Amith Yamasani13593602012-03-22 16:16:17 -0700364
365 void removeUser(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700366 userState.delete(userId);
Amith Yamasani13593602012-03-22 16:16:17 -0700367 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700368}