blob: 138594ccb4d6149d6c5cbeaceccb6b9f68a3f87a [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
Jeff Sharkey9bc89af2017-01-11 11:25:50 -070023import android.content.pm.ApplicationInfo;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080024import android.content.pm.IntentFilterVerificationInfo;
25import android.content.pm.PackageManager;
Dan Cashman1dbe6d02018-01-23 11:18:28 -080026import android.content.pm.PackageParser;
Dianne Hackborn7767eac2012-08-23 18:25:40 -070027import android.content.pm.PackageUserState;
Todd Kennedyc29b11a2017-10-23 15:55:59 -070028import android.content.pm.Signature;
Suprabh Shukla021b57a2018-03-08 18:21:50 -080029import android.os.BaseBundle;
30import android.os.PersistableBundle;
Netta P426cbef2017-02-10 14:38:39 -080031import android.service.pm.PackageProto;
Jeff Sharkey9f837a92014-10-24 12:07:24 -070032import android.util.ArraySet;
Amith Yamasani483f3b02012-03-13 16:08:00 -070033import android.util.SparseArray;
Netta P426cbef2017-02-10 14:38:39 -080034import android.util.proto.ProtoOutputStream;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070035
Todd Kennedy3cd658e2016-08-16 15:00:31 -070036import com.android.internal.annotations.VisibleForTesting;
37
Kenny Rootcf0b38c2011-03-22 14:17:59 -070038import java.io.File;
Svet Ganov354cd3c2015-12-17 11:35:04 -080039import java.util.ArrayList;
Svet Ganov67882122016-12-11 16:36:34 -080040import java.util.Arrays;
Svet Ganov354cd3c2015-12-17 11:35:04 -080041import java.util.List;
Todd Kennedy39bfee52016-02-24 10:28:21 -080042import java.util.Set;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070043
44/**
45 * Settings base class for pending and resolved classes.
46 */
Todd Kennedy91a39d12017-09-27 12:37:04 -070047public abstract class PackageSettingBase extends SettingBase {
Amith Yamasani23ab7f52017-01-22 17:43:24 -080048
49 private static final int[] EMPTY_INT_ARRAY = new int[0];
50
Todd Kennedyc29b11a2017-10-23 15:55:59 -070051 public final String name;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070052 final String realName;
Jeff Sharkey57dcf5b2014-06-18 17:46:05 -070053
Svet Ganov354cd3c2015-12-17 11:35:04 -080054 String parentPackageName;
55 List<String> childPackageNames;
56
Jeff Sharkey57dcf5b2014-06-18 17:46:05 -070057 /**
58 * Path where this package was found on disk. For monolithic packages
59 * this is path to single base APK file; for cluster packages this is
60 * path to the cluster directory.
61 */
Kenny Rootcf0b38c2011-03-22 14:17:59 -070062 File codePath;
63 String codePathString;
64 File resourcePath;
65 String resourcePathString;
Narayan Kamathff110bd2014-07-04 18:30:45 +010066
Svet Ganov67882122016-12-11 16:36:34 -080067 String[] usesStaticLibraries;
Dianne Hackborn3accca02013-09-20 09:32:11 -070068 long[] usesStaticLibrariesVersions;
Svet Ganov67882122016-12-11 16:36:34 -080069
Narayan Kamathff110bd2014-07-04 18:30:45 +010070 /**
Jeff Sharkey84f12942014-07-10 17:48:11 -070071 * The path under which native libraries have been unpacked. This path is
72 * always derived at runtime, and is only stored here for cleanup when a
73 * package is uninstalled.
Narayan Kamathff110bd2014-07-04 18:30:45 +010074 */
Jeff Sharkey84f12942014-07-10 17:48:11 -070075 @Deprecated
Narayan Kamathff110bd2014-07-04 18:30:45 +010076 String legacyNativeLibraryPathString;
77
Narayan Kamath4903f642014-08-11 13:33:45 +010078 /**
Narayan Kamathbdcdeb42016-11-22 15:49:07 +000079 * The primary CPU abi for this package.
Narayan Kamath4903f642014-08-11 13:33:45 +010080 */
Narayan Kamathff110bd2014-07-04 18:30:45 +010081 String primaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +010082
83 /**
Narayan Kamathbdcdeb42016-11-22 15:49:07 +000084 * The secondary CPU abi for this package.
Narayan Kamath4903f642014-08-11 13:33:45 +010085 */
Narayan Kamathff110bd2014-07-04 18:30:45 +010086 String secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +010087
88 /**
89 * The install time CPU override, if any. This value is written at install time
90 * and doesn't change during the life of an install. If non-null,
91 * {@code primaryCpuAbiString} will contain the same value.
92 */
93 String cpuAbiOverrideString;
94
Kenny Rootcf0b38c2011-03-22 14:17:59 -070095 long timeStamp;
96 long firstInstallTime;
97 long lastUpdateTime;
Dianne Hackborn3accca02013-09-20 09:32:11 -070098 long versionCode;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070099
100 boolean uidError;
101
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700102 PackageSignatures signatures;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700103
Svetoslavcf959f62015-03-26 20:53:34 -0700104 boolean installPermissionsFixed;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700105
Geremy Condraf1bcca82013-01-07 22:35:24 -0800106 PackageKeySetData keySetData = new PackageKeySetData();
107
Todd Kennedy13715d52016-08-01 13:38:57 -0700108 static final PackageUserState DEFAULT_USER_STATE = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700109
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700110 // Whether this package is currently stopped, thus can not be
111 // started until explicitly launched by the user.
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700112 private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>();
Amith Yamasani483f3b02012-03-13 16:08:00 -0700113
Jeff Sharkeye31b8202015-04-29 21:44:57 -0700114 /**
Todd Kennedy39bfee52016-02-24 10:28:21 -0800115 * Non-persisted value. During an "upgrade without restart", we need the set
116 * of all previous code paths so we can surgically add the new APKs to the
117 * active classloader. If at any point an application is upgraded with a
118 * restart, this field will be cleared since the classloader would be created
119 * using the full set of code paths when the package's process is started.
120 */
121 Set<String> oldCodePaths;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700122
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700123 /** Package name of the app that installed this package */
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700124 String installerPackageName;
Sudheer Shanka8c57aea2016-04-20 16:47:50 -0700125 /** Indicates if the package that installed this app has been uninstalled */
126 boolean isOrphaned;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700127 /** UUID of {@link VolumeInfo} hosting this app */
128 String volumeUuid;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700129 /** The category of this app, as hinted by the installer */
130 int categoryHint = ApplicationInfo.CATEGORY_UNDEFINED;
Todd Kennedyab532892017-03-08 14:19:49 -0800131 /** Whether or not an update is available. Ostensibly only for instant apps. */
132 boolean updateAvailable;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800133
134 IntentFilterVerificationInfo verificationInfo;
135
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700136 PackageSettingBase(String name, String realName, File codePath, File resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100137 String legacyNativeLibraryPathString, String primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100138 String secondaryCpuAbiString, String cpuAbiOverrideString,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700139 long pVersionCode, int pkgFlags, int pkgPrivateFlags,
Svet Ganov67882122016-12-11 16:36:34 -0800140 String parentPackageName, List<String> childPackageNames,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700141 String[] usesStaticLibraries, long[] usesStaticLibrariesVersions) {
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800142 super(pkgFlags, pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700143 this.name = name;
144 this.realName = realName;
Svet Ganov354cd3c2015-12-17 11:35:04 -0800145 this.parentPackageName = parentPackageName;
146 this.childPackageNames = (childPackageNames != null)
147 ? new ArrayList<>(childPackageNames) : null;
Svet Ganov67882122016-12-11 16:36:34 -0800148 this.usesStaticLibraries = usesStaticLibraries;
149 this.usesStaticLibrariesVersions = usesStaticLibrariesVersions;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100150 init(codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100151 secondaryCpuAbiString, cpuAbiOverrideString, pVersionCode);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700152 }
153
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700154 /**
155 * New instance of PackageSetting with one-level-deep cloning.
156 * <p>
157 * IMPORTANT: With a shallow copy, we do NOT create new contained objects.
158 * This means, for example, changes to the user state of the original PackageSetting
159 * will also change the user state in its copy.
160 */
161 PackageSettingBase(PackageSettingBase base, String realName) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700162 super(base);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700163 name = base.name;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700164 this.realName = realName;
Todd Kennedy788c8422016-08-10 10:52:34 -0700165 doCopy(base);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700166 }
167
Narayan Kamathff110bd2014-07-04 18:30:45 +0100168 void init(File codePath, File resourcePath, String legacyNativeLibraryPathString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100169 String primaryCpuAbiString, String secondaryCpuAbiString,
Dianne Hackborn3accca02013-09-20 09:32:11 -0700170 String cpuAbiOverrideString, long pVersionCode) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700171 this.codePath = codePath;
172 this.codePathString = codePath.toString();
173 this.resourcePath = resourcePath;
174 this.resourcePathString = resourcePath.toString();
Narayan Kamathff110bd2014-07-04 18:30:45 +0100175 this.legacyNativeLibraryPathString = legacyNativeLibraryPathString;
176 this.primaryCpuAbiString = primaryCpuAbiString;
177 this.secondaryCpuAbiString = secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100178 this.cpuAbiOverrideString = cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700179 this.versionCode = pVersionCode;
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700180 this.signatures = new PackageSignatures();
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700181 }
182
183 public void setInstallerPackageName(String packageName) {
184 installerPackageName = packageName;
185 }
186
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700187 public String getInstallerPackageName() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700188 return installerPackageName;
189 }
190
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700191 public void setVolumeUuid(String volumeUuid) {
192 this.volumeUuid = volumeUuid;
193 }
194
195 public String getVolumeUuid() {
196 return volumeUuid;
197 }
198
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700199 public void setTimeStamp(long newStamp) {
200 timeStamp = newStamp;
201 }
202
Todd Kennedyab532892017-03-08 14:19:49 -0800203 public void setUpdateAvailable(boolean updateAvailable) {
204 this.updateAvailable = updateAvailable;
205 }
206
207 public boolean isUpdateAvailable() {
208 return updateAvailable;
209 }
210
Todd Kennedy91a39d12017-09-27 12:37:04 -0700211 public boolean isSharedUser() {
212 return false;
213 }
Todd Kennedyc29b11a2017-10-23 15:55:59 -0700214
215 public Signature[] getSignatures() {
Daniel Cashman77029c52018-01-18 16:19:29 -0800216 return signatures.mSigningDetails.signatures;
Todd Kennedyc29b11a2017-10-23 15:55:59 -0700217 }
218
Dan Cashman1dbe6d02018-01-23 11:18:28 -0800219 public PackageParser.SigningDetails getSigningDetails() {
220 return signatures.mSigningDetails;
221 }
222
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700223 /**
Todd Kennedy788c8422016-08-10 10:52:34 -0700224 * Makes a shallow copy of the given package settings.
225 *
226 * NOTE: For some fields [such as keySetData, signatures, userState, verificationInfo, etc...],
227 * the original object is copied and a new one is not created.
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700228 */
Todd Kennedy788c8422016-08-10 10:52:34 -0700229 public void copyFrom(PackageSettingBase orig) {
230 super.copyFrom(orig);
231 doCopy(orig);
232 }
233
234 private void doCopy(PackageSettingBase orig) {
235 childPackageNames = (orig.childPackageNames != null)
236 ? new ArrayList<>(orig.childPackageNames) : null;
237 codePath = orig.codePath;
238 codePathString = orig.codePathString;
239 cpuAbiOverrideString = orig.cpuAbiOverrideString;
240 firstInstallTime = orig.firstInstallTime;
241 installPermissionsFixed = orig.installPermissionsFixed;
Todd Kennedy788c8422016-08-10 10:52:34 -0700242 installerPackageName = orig.installerPackageName;
243 isOrphaned = orig.isOrphaned;
244 keySetData = orig.keySetData;
245 lastUpdateTime = orig.lastUpdateTime;
246 legacyNativeLibraryPathString = orig.legacyNativeLibraryPathString;
247 // Intentionally skip oldCodePaths; it's not relevant for copies
Todd Kennedy788c8422016-08-10 10:52:34 -0700248 parentPackageName = orig.parentPackageName;
249 primaryCpuAbiString = orig.primaryCpuAbiString;
250 resourcePath = orig.resourcePath;
251 resourcePathString = orig.resourcePathString;
252 secondaryCpuAbiString = orig.secondaryCpuAbiString;
253 signatures = orig.signatures;
254 timeStamp = orig.timeStamp;
255 uidError = orig.uidError;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700256 userState.clear();
Todd Kennedy788c8422016-08-10 10:52:34 -0700257 for (int i=0; i<orig.userState.size(); i++) {
258 userState.put(orig.userState.keyAt(i), orig.userState.valueAt(i));
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700259 }
Todd Kennedy788c8422016-08-10 10:52:34 -0700260 verificationInfo = orig.verificationInfo;
261 versionCode = orig.versionCode;
262 volumeUuid = orig.volumeUuid;
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700263 categoryHint = orig.categoryHint;
Svet Ganov67882122016-12-11 16:36:34 -0800264 usesStaticLibraries = orig.usesStaticLibraries != null
265 ? Arrays.copyOf(orig.usesStaticLibraries,
266 orig.usesStaticLibraries.length) : null;
267 usesStaticLibrariesVersions = orig.usesStaticLibrariesVersions != null
268 ? Arrays.copyOf(orig.usesStaticLibrariesVersions,
269 orig.usesStaticLibrariesVersions.length) : null;
Todd Kennedyab532892017-03-08 14:19:49 -0800270 updateAvailable = orig.updateAvailable;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700271 }
272
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700273 private PackageUserState modifyUserState(int userId) {
274 PackageUserState state = userState.get(userId);
275 if (state == null) {
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700276 state = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700277 userState.put(userId, state);
278 }
279 return state;
280 }
281
282 public PackageUserState readUserState(int userId) {
283 PackageUserState state = userState.get(userId);
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700284 if (state == null) {
285 return DEFAULT_USER_STATE;
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -0700286 }
Jeff Sharkey9bc89af2017-01-11 11:25:50 -0700287 state.categoryHint = categoryHint;
288 return state;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700289 }
290
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700291 void setEnabled(int state, int userId, String callingPackage) {
292 PackageUserState st = modifyUserState(userId);
293 st.enabled = state;
294 st.lastDisableAppCaller = callingPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700295 }
296
297 int getEnabled(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700298 return readUserState(userId).enabled;
299 }
300
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700301 String getLastDisabledAppCaller(int userId) {
302 return readUserState(userId).lastDisableAppCaller;
303 }
304
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700305 void setInstalled(boolean inst, int userId) {
306 modifyUserState(userId).installed = inst;
307 }
308
309 boolean getInstalled(int userId) {
310 return readUserState(userId).installed;
311 }
312
Bartosz Fabianowskia34f53f2017-01-11 18:08:47 +0100313 int getInstallReason(int userId) {
314 return readUserState(userId).installReason;
315 }
316
317 void setInstallReason(int installReason, int userId) {
318 modifyUserState(userId).installReason = installReason;
319 }
320
Todd Kennedy560830c2017-06-16 13:55:13 -0700321 void setOverlayPaths(List<String> overlayPaths, int userId) {
322 modifyUserState(userId).overlayPaths = overlayPaths == null ? null :
323 overlayPaths.toArray(new String[overlayPaths.size()]);
Todd Kennedyb2749472017-06-13 08:24:32 -0700324 }
325
326 String[] getOverlayPaths(int userId) {
327 return readUserState(userId).overlayPaths;
328 }
329
Todd Kennedy3cd658e2016-08-16 15:00:31 -0700330 /** Only use for testing. Do NOT use in production code. */
331 @VisibleForTesting
332 SparseArray<PackageUserState> getUserState() {
333 return userState;
334 }
335
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700336 boolean isAnyInstalled(int[] users) {
337 for (int user: users) {
338 if (readUserState(user).installed) {
339 return true;
340 }
341 }
342 return false;
343 }
344
Dianne Hackborn786b4402012-08-27 15:14:02 -0700345 int[] queryInstalledUsers(int[] users, boolean installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700346 int num = 0;
347 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700348 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700349 num++;
350 }
351 }
352 int[] res = new int[num];
353 num = 0;
354 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700355 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700356 res[num] = user;
357 num++;
358 }
359 }
360 return res;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700361 }
362
Jeff Sharkey42884192016-04-09 16:12:01 -0600363 long getCeDataInode(int userId) {
364 return readUserState(userId).ceDataInode;
365 }
366
367 void setCeDataInode(long ceDataInode, int userId) {
368 modifyUserState(userId).ceDataInode = ceDataInode;
369 }
370
Amith Yamasani483f3b02012-03-13 16:08:00 -0700371 boolean getStopped(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700372 return readUserState(userId).stopped;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700373 }
374
375 void setStopped(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700376 modifyUserState(userId).stopped = stop;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700377 }
378
379 boolean getNotLaunched(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700380 return readUserState(userId).notLaunched;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700381 }
382
383 void setNotLaunched(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700384 modifyUserState(userId).notLaunched = stop;
385 }
386
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700387 boolean getHidden(int userId) {
388 return readUserState(userId).hidden;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700389 }
390
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700391 void setHidden(boolean hidden, int userId) {
392 modifyUserState(userId).hidden = hidden;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700393 }
394
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000395 boolean getSuspended(int userId) {
396 return readUserState(userId).suspended;
397 }
398
Suprabh Shukla3c3af142018-03-30 00:28:37 -0700399 void setSuspended(boolean suspended, String suspendingPackage, String dialogMessage,
400 PersistableBundle appExtras, PersistableBundle launcherExtras, int userId) {
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800401 final PackageUserState existingUserState = modifyUserState(userId);
402 existingUserState.suspended = suspended;
403 existingUserState.suspendingPackage = suspended ? suspendingPackage : null;
Suprabh Shukla3c3af142018-03-30 00:28:37 -0700404 existingUserState.dialogMessage = suspended ? dialogMessage : null;
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800405 existingUserState.suspendedAppExtras = suspended ? appExtras : null;
406 existingUserState.suspendedLauncherExtras = suspended ? launcherExtras : null;
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000407 }
408
Todd Kennedy0eb97382017-10-03 16:57:22 -0700409 public boolean getInstantApp(int userId) {
Todd Kennedybe0b8892017-02-15 14:13:52 -0800410 return readUserState(userId).instantApp;
411 }
412
413 void setInstantApp(boolean instantApp, int userId) {
414 modifyUserState(userId).instantApp = instantApp;
415 }
416
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700417 boolean getVirtulalPreload(int userId) {
418 return readUserState(userId).virtualPreload;
419 }
420
421 void setVirtualPreload(boolean virtualPreload, int userId) {
422 modifyUserState(userId).virtualPreload = virtualPreload;
423 }
424
Jeff Sharkey42884192016-04-09 16:12:01 -0600425 void setUserState(int userId, long ceDataInode, int enabled, boolean installed, boolean stopped,
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800426 boolean notLaunched, boolean hidden, boolean suspended, String suspendingPackage,
Suprabh Shukla3c3af142018-03-30 00:28:37 -0700427 String dialogMessage, PersistableBundle suspendedAppExtras,
428 PersistableBundle suspendedLauncherExtras, boolean instantApp,
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700429 boolean virtualPreload, String lastDisableAppCaller,
430 ArraySet<String> enabledComponents, ArraySet<String> disabledComponents,
Ben Gruver1ab3d6e2017-12-07 13:45:08 -0800431 int domainVerifState, int linkGeneration, int installReason,
432 String harmfulAppWarning) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700433 PackageUserState state = modifyUserState(userId);
Jeff Sharkey42884192016-04-09 16:12:01 -0600434 state.ceDataInode = ceDataInode;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700435 state.enabled = enabled;
436 state.installed = installed;
437 state.stopped = stopped;
438 state.notLaunched = notLaunched;
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700439 state.hidden = hidden;
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000440 state.suspended = suspended;
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800441 state.suspendingPackage = suspendingPackage;
Suprabh Shukla3c3af142018-03-30 00:28:37 -0700442 state.dialogMessage = dialogMessage;
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800443 state.suspendedAppExtras = suspendedAppExtras;
444 state.suspendedLauncherExtras = suspendedLauncherExtras;
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700445 state.lastDisableAppCaller = lastDisableAppCaller;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700446 state.enabledComponents = enabledComponents;
447 state.disabledComponents = disabledComponents;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800448 state.domainVerificationStatus = domainVerifState;
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700449 state.appLinkGeneration = linkGeneration;
Bartosz Fabianowskia34f53f2017-01-11 18:08:47 +0100450 state.installReason = installReason;
Todd Kennedybe0b8892017-02-15 14:13:52 -0800451 state.instantApp = instantApp;
Todd Kennedy5eb5a7d2017-08-01 07:42:47 -0700452 state.virtualPreload = virtualPreload;
Ben Gruver1ab3d6e2017-12-07 13:45:08 -0800453 state.harmfulAppWarning = harmfulAppWarning;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700454 }
455
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700456 ArraySet<String> getEnabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700457 return readUserState(userId).enabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700458 }
459
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700460 ArraySet<String> getDisabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700461 return readUserState(userId).disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700462 }
463
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700464 void setEnabledComponents(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700465 modifyUserState(userId).enabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700466 }
467
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700468 void setDisabledComponents(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700469 modifyUserState(userId).disabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700470 }
471
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700472 void setEnabledComponentsCopy(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700473 modifyUserState(userId).enabledComponents = components != null
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700474 ? new ArraySet<String>(components) : null;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700475 }
476
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700477 void setDisabledComponentsCopy(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700478 modifyUserState(userId).disabledComponents = components != null
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700479 ? new ArraySet<String>(components) : null;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700480 }
481
482 PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) {
483 PackageUserState state = modifyUserState(userId);
484 if (disabled && state.disabledComponents == null) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700485 state.disabledComponents = new ArraySet<String>(1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700486 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700487 if (enabled && state.enabledComponents == null) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700488 state.enabledComponents = new ArraySet<String>(1);
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700489 }
490 return state;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700491 }
492
493 void addDisabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700494 modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700495 }
496
497 void addEnabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700498 modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700499 }
500
501 boolean enableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700502 PackageUserState state = modifyUserStateComponents(userId, false, true);
503 boolean changed = state.disabledComponents != null
504 ? state.disabledComponents.remove(componentClassName) : false;
505 changed |= state.enabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700506 return changed;
507 }
508
Amith Yamasani483f3b02012-03-13 16:08:00 -0700509 boolean disableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700510 PackageUserState state = modifyUserStateComponents(userId, true, false);
511 boolean changed = state.enabledComponents != null
512 ? state.enabledComponents.remove(componentClassName) : false;
513 changed |= state.disabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700514 return changed;
515 }
516
Amith Yamasani483f3b02012-03-13 16:08:00 -0700517 boolean restoreComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700518 PackageUserState state = modifyUserStateComponents(userId, true, true);
519 boolean changed = state.disabledComponents != null
520 ? state.disabledComponents.remove(componentClassName) : false;
521 changed |= state.enabledComponents != null
522 ? state.enabledComponents.remove(componentClassName) : false;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700523 return changed;
524 }
525
Amith Yamasani483f3b02012-03-13 16:08:00 -0700526 int getCurrentEnabledStateLPr(String componentName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700527 PackageUserState state = readUserState(userId);
528 if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700529 return COMPONENT_ENABLED_STATE_ENABLED;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700530 } else if (state.disabledComponents != null
531 && state.disabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700532 return COMPONENT_ENABLED_STATE_DISABLED;
533 } else {
534 return COMPONENT_ENABLED_STATE_DEFAULT;
535 }
536 }
Amith Yamasani13593602012-03-22 16:16:17 -0700537
538 void removeUser(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700539 userState.delete(userId);
Amith Yamasani13593602012-03-22 16:16:17 -0700540 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800541
Amith Yamasani23ab7f52017-01-22 17:43:24 -0800542 public int[] getNotInstalledUserIds() {
543 int count = 0;
544 int userStateCount = userState.size();
545 for (int i = 0; i < userStateCount; i++) {
546 if (userState.valueAt(i).installed == false) {
547 count++;
548 }
549 }
550 if (count == 0) return EMPTY_INT_ARRAY;
551 int[] excludedUserIds = new int[count];
552 int idx = 0;
553 for (int i = 0; i < userStateCount; i++) {
554 if (userState.valueAt(i).installed == false) {
555 excludedUserIds[idx++] = userState.keyAt(i);
556 }
557 }
558 return excludedUserIds;
559 }
560
Fabrice Di Meglio62271722015-04-10 17:24:02 -0700561 IntentFilterVerificationInfo getIntentFilterVerificationInfo() {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800562 return verificationInfo;
563 }
564
Fabrice Di Meglio62271722015-04-10 17:24:02 -0700565 void setIntentFilterVerificationInfo(IntentFilterVerificationInfo info) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800566 verificationInfo = info;
567 }
568
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700569 // Returns a packed value as a long:
570 //
571 // high 'int'-sized word: link status: undefined/ask/never/always.
572 // low 'int'-sized word: relative priority among 'always' results.
573 long getDomainVerificationStatusForUser(int userId) {
574 PackageUserState state = readUserState(userId);
575 long result = (long) state.appLinkGeneration;
576 result |= ((long) state.domainVerificationStatus) << 32;
577 return result;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800578 }
579
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700580 void setDomainVerificationStatusForUser(final int status, int generation, int userId) {
581 PackageUserState state = modifyUserState(userId);
582 state.domainVerificationStatus = status;
583 if (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) {
584 state.appLinkGeneration = generation;
585 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800586 }
587
Fabrice Di Meglio62271722015-04-10 17:24:02 -0700588 void clearDomainVerificationStatusForUser(int userId) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800589 modifyUserState(userId).domainVerificationStatus =
590 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
591 }
Netta P426cbef2017-02-10 14:38:39 -0800592
593 protected void writeUsersInfoToProto(ProtoOutputStream proto, long fieldId) {
594 int count = userState.size();
595 for (int i = 0; i < count; i++) {
596 final long userToken = proto.start(fieldId);
597 final int userId = userState.keyAt(i);
598 final PackageUserState state = userState.valueAt(i);
599 proto.write(PackageProto.UserInfoProto.ID, userId);
600 final int installType;
601 if (state.instantApp) {
602 installType = PackageProto.UserInfoProto.INSTANT_APP_INSTALL;
603 } else if (state.installed) {
604 installType = PackageProto.UserInfoProto.FULL_APP_INSTALL;
605 } else {
606 installType = PackageProto.UserInfoProto.NOT_INSTALLED_FOR_USER;
607 }
608 proto.write(PackageProto.UserInfoProto.INSTALL_TYPE, installType);
609 proto.write(PackageProto.UserInfoProto.IS_HIDDEN, state.hidden);
610 proto.write(PackageProto.UserInfoProto.IS_SUSPENDED, state.suspended);
Suprabh Shukla021b57a2018-03-08 18:21:50 -0800611 if (state.suspended) {
612 proto.write(PackageProto.UserInfoProto.SUSPENDING_PACKAGE, state.suspendingPackage);
613 }
Netta P426cbef2017-02-10 14:38:39 -0800614 proto.write(PackageProto.UserInfoProto.IS_STOPPED, state.stopped);
615 proto.write(PackageProto.UserInfoProto.IS_LAUNCHED, !state.notLaunched);
616 proto.write(PackageProto.UserInfoProto.ENABLED_STATE, state.enabled);
617 proto.write(
618 PackageProto.UserInfoProto.LAST_DISABLED_APP_CALLER,
619 state.lastDisableAppCaller);
620 proto.end(userToken);
621 }
622 }
Ben Gruver1ab3d6e2017-12-07 13:45:08 -0800623
624 void setHarmfulAppWarning(int userId, String harmfulAppWarning) {
625 PackageUserState userState = modifyUserState(userId);
626 userState.harmfulAppWarning = harmfulAppWarning;
627 }
628
629 String getHarmfulAppWarning(int userId) {
630 PackageUserState userState = readUserState(userId);
631 return userState.harmfulAppWarning;
632 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700633}