blob: 11179885b6c78b5e1329ca7a70d4421d81f88451 [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
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -080023import android.content.pm.IntentFilterVerificationInfo;
24import android.content.pm.PackageManager;
Dianne Hackborn7767eac2012-08-23 18:25:40 -070025import android.content.pm.PackageUserState;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -070026import android.os.storage.VolumeInfo;
Jeff Sharkey9f837a92014-10-24 12:07:24 -070027import android.util.ArraySet;
Amith Yamasani483f3b02012-03-13 16:08:00 -070028import android.util.SparseArray;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070029
30import java.io.File;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070031
32/**
33 * Settings base class for pending and resolved classes.
34 */
Svetoslavc6d1c342015-02-26 14:44:43 -080035abstract class PackageSettingBase extends SettingBase {
Kenny Rootcf0b38c2011-03-22 14:17:59 -070036 /**
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;
Jeff Sharkey57dcf5b2014-06-18 17:46:05 -070051
52 /**
53 * Path where this package was found on disk. For monolithic packages
54 * this is path to single base APK file; for cluster packages this is
55 * path to the cluster directory.
56 */
Kenny Rootcf0b38c2011-03-22 14:17:59 -070057 File codePath;
58 String codePathString;
59 File resourcePath;
60 String resourcePathString;
Narayan Kamathff110bd2014-07-04 18:30:45 +010061
62 /**
Jeff Sharkey84f12942014-07-10 17:48:11 -070063 * The path under which native libraries have been unpacked. This path is
64 * always derived at runtime, and is only stored here for cleanup when a
65 * package is uninstalled.
Narayan Kamathff110bd2014-07-04 18:30:45 +010066 */
Jeff Sharkey84f12942014-07-10 17:48:11 -070067 @Deprecated
Narayan Kamathff110bd2014-07-04 18:30:45 +010068 String legacyNativeLibraryPathString;
69
Narayan Kamath4903f642014-08-11 13:33:45 +010070 /**
71 * The primary CPU abi for this package. This value is regenerated at every
72 * boot scan.
73 */
Narayan Kamathff110bd2014-07-04 18:30:45 +010074 String primaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +010075
76 /**
77 * The secondary CPU abi for this package. This value is regenerated at every
78 * boot scan.
79 */
Narayan Kamathff110bd2014-07-04 18:30:45 +010080 String secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +010081
82 /**
83 * The install time CPU override, if any. This value is written at install time
84 * and doesn't change during the life of an install. If non-null,
85 * {@code primaryCpuAbiString} will contain the same value.
86 */
87 String cpuAbiOverrideString;
88
Kenny Rootcf0b38c2011-03-22 14:17:59 -070089 long timeStamp;
90 long firstInstallTime;
91 long lastUpdateTime;
92 int versionCode;
93
94 boolean uidError;
95
96 PackageSignatures signatures = new PackageSignatures();
97
Svetoslavcf959f62015-03-26 20:53:34 -070098 boolean installPermissionsFixed;
Kenny Rootcf0b38c2011-03-22 14:17:59 -070099
Geremy Condraf1bcca82013-01-07 22:35:24 -0800100 PackageKeySetData keySetData = new PackageKeySetData();
101
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700102 private static final PackageUserState DEFAULT_USER_STATE = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700103
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700104 // Whether this package is currently stopped, thus can not be
105 // started until explicitly launched by the user.
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700106 private final SparseArray<PackageUserState> userState = new SparseArray<PackageUserState>();
Amith Yamasani483f3b02012-03-13 16:08:00 -0700107
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700108 int installStatus = PKG_INSTALL_COMPLETE;
109
Jeff Sharkeye31b8202015-04-29 21:44:57 -0700110 /**
111 * Non-persisted value indicating this package has been temporarily frozen,
112 * usually during a critical section of the package update pipeline. The
113 * platform will refuse to launch packages in a frozen state.
114 */
115 boolean frozen = false;
116
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700117 PackageSettingBase origPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700118
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700119 /** Package name of the app that installed this package */
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700120 String installerPackageName;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700121 /** UUID of {@link VolumeInfo} hosting this app */
122 String volumeUuid;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800123
124 IntentFilterVerificationInfo verificationInfo;
125
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700126 PackageSettingBase(String name, String realName, File codePath, File resourcePath,
Narayan Kamathff110bd2014-07-04 18:30:45 +0100127 String legacyNativeLibraryPathString, String primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100128 String secondaryCpuAbiString, String cpuAbiOverrideString,
Alex Klyubinb9f8a522015-02-03 11:12:59 -0800129 int pVersionCode, int pkgFlags, int pkgPrivateFlags) {
130 super(pkgFlags, pkgPrivateFlags);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700131 this.name = name;
132 this.realName = realName;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100133 init(codePath, resourcePath, legacyNativeLibraryPathString, primaryCpuAbiString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100134 secondaryCpuAbiString, cpuAbiOverrideString, pVersionCode);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700135 }
136
137 /**
138 * New instance of PackageSetting with one-level-deep cloning.
139 */
140 @SuppressWarnings("unchecked")
141 PackageSettingBase(PackageSettingBase base) {
142 super(base);
143
144 name = base.name;
145 realName = base.realName;
146 codePath = base.codePath;
147 codePathString = base.codePathString;
148 resourcePath = base.resourcePath;
149 resourcePathString = base.resourcePathString;
Narayan Kamathff110bd2014-07-04 18:30:45 +0100150 legacyNativeLibraryPathString = base.legacyNativeLibraryPathString;
151 primaryCpuAbiString = base.primaryCpuAbiString;
152 secondaryCpuAbiString = base.secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100153 cpuAbiOverrideString = base.cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700154 timeStamp = base.timeStamp;
155 firstInstallTime = base.firstInstallTime;
156 lastUpdateTime = base.lastUpdateTime;
157 versionCode = base.versionCode;
158
159 uidError = base.uidError;
160
161 signatures = new PackageSignatures(base.signatures);
162
Svetoslavcf959f62015-03-26 20:53:34 -0700163 installPermissionsFixed = base.installPermissionsFixed;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700164 userState.clear();
165 for (int i=0; i<base.userState.size(); i++) {
166 userState.put(base.userState.keyAt(i),
167 new PackageUserState(base.userState.valueAt(i)));
168 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700169 installStatus = base.installStatus;
170
171 origPackage = base.origPackage;
172
173 installerPackageName = base.installerPackageName;
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700174 volumeUuid = base.volumeUuid;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800175
176 keySetData = new PackageKeySetData(base.keySetData);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700177 }
178
Narayan Kamathff110bd2014-07-04 18:30:45 +0100179 void init(File codePath, File resourcePath, String legacyNativeLibraryPathString,
Narayan Kamath4903f642014-08-11 13:33:45 +0100180 String primaryCpuAbiString, String secondaryCpuAbiString,
181 String cpuAbiOverrideString, int pVersionCode) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700182 this.codePath = codePath;
183 this.codePathString = codePath.toString();
184 this.resourcePath = resourcePath;
185 this.resourcePathString = resourcePath.toString();
Narayan Kamathff110bd2014-07-04 18:30:45 +0100186 this.legacyNativeLibraryPathString = legacyNativeLibraryPathString;
187 this.primaryCpuAbiString = primaryCpuAbiString;
188 this.secondaryCpuAbiString = secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100189 this.cpuAbiOverrideString = cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700190 this.versionCode = pVersionCode;
191 }
192
193 public void setInstallerPackageName(String packageName) {
194 installerPackageName = packageName;
195 }
196
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700197 public String getInstallerPackageName() {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700198 return installerPackageName;
199 }
200
Jeff Sharkeyb2b9ab82015-04-05 21:10:42 -0700201 public void setVolumeUuid(String volumeUuid) {
202 this.volumeUuid = volumeUuid;
203 }
204
205 public String getVolumeUuid() {
206 return volumeUuid;
207 }
208
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700209 public void setInstallStatus(int newStatus) {
210 installStatus = newStatus;
211 }
212
213 public int getInstallStatus() {
214 return installStatus;
215 }
216
217 public void setTimeStamp(long newStamp) {
218 timeStamp = newStamp;
219 }
220
221 /**
222 * Make a shallow copy of this package settings.
223 */
224 public void copyFrom(PackageSettingBase base) {
Svet Ganov37f05182015-03-31 16:52:11 -0700225 mPermissionsState.copyFrom(base.mPermissionsState);
Narayan Kamathff110bd2014-07-04 18:30:45 +0100226 primaryCpuAbiString = base.primaryCpuAbiString;
227 secondaryCpuAbiString = base.secondaryCpuAbiString;
Narayan Kamath4903f642014-08-11 13:33:45 +0100228 cpuAbiOverrideString = base.cpuAbiOverrideString;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700229 timeStamp = base.timeStamp;
230 firstInstallTime = base.firstInstallTime;
231 lastUpdateTime = base.lastUpdateTime;
232 signatures = base.signatures;
Svetoslavcf959f62015-03-26 20:53:34 -0700233 installPermissionsFixed = base.installPermissionsFixed;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700234 userState.clear();
235 for (int i=0; i<base.userState.size(); i++) {
236 userState.put(base.userState.keyAt(i), base.userState.valueAt(i));
237 }
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700238 installStatus = base.installStatus;
Geremy Condraf1bcca82013-01-07 22:35:24 -0800239 keySetData = base.keySetData;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800240 verificationInfo = base.verificationInfo;
hyemin.hwangb4faf982015-07-09 09:16:12 +0900241 installerPackageName = base.installerPackageName;
Jeff Sharkey3b1c6e02015-10-31 13:58:54 -0700242 volumeUuid = base.volumeUuid;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700243 }
244
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700245 private PackageUserState modifyUserState(int userId) {
246 PackageUserState state = userState.get(userId);
247 if (state == null) {
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700248 state = new PackageUserState();
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700249 userState.put(userId, state);
250 }
251 return state;
252 }
253
254 public PackageUserState readUserState(int userId) {
255 PackageUserState state = userState.get(userId);
Dianne Hackbornd4ac8d72012-09-27 23:20:10 -0700256 if (state != null) {
257 return state;
258 }
Dianne Hackborn4a9f0712012-10-02 15:29:06 -0700259 return DEFAULT_USER_STATE;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700260 }
261
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700262 void setEnabled(int state, int userId, String callingPackage) {
263 PackageUserState st = modifyUserState(userId);
264 st.enabled = state;
265 st.lastDisableAppCaller = callingPackage;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700266 }
267
268 int getEnabled(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700269 return readUserState(userId).enabled;
270 }
271
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700272 String getLastDisabledAppCaller(int userId) {
273 return readUserState(userId).lastDisableAppCaller;
274 }
275
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700276 void setInstalled(boolean inst, int userId) {
277 modifyUserState(userId).installed = inst;
278 }
279
280 boolean getInstalled(int userId) {
281 return readUserState(userId).installed;
282 }
283
284 boolean isAnyInstalled(int[] users) {
285 for (int user: users) {
286 if (readUserState(user).installed) {
287 return true;
288 }
289 }
290 return false;
291 }
292
Dianne Hackborn786b4402012-08-27 15:14:02 -0700293 int[] queryInstalledUsers(int[] users, boolean installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700294 int num = 0;
295 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700296 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700297 num++;
298 }
299 }
300 int[] res = new int[num];
301 num = 0;
302 for (int user : users) {
Dianne Hackborn786b4402012-08-27 15:14:02 -0700303 if (getInstalled(user) == installed) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700304 res[num] = user;
305 num++;
306 }
307 }
308 return res;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700309 }
310
311 boolean getStopped(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700312 return readUserState(userId).stopped;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700313 }
314
315 void setStopped(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700316 modifyUserState(userId).stopped = stop;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700317 }
318
319 boolean getNotLaunched(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700320 return readUserState(userId).notLaunched;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700321 }
322
323 void setNotLaunched(boolean stop, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700324 modifyUserState(userId).notLaunched = stop;
325 }
326
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700327 boolean getHidden(int userId) {
328 return readUserState(userId).hidden;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700329 }
330
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700331 void setHidden(boolean hidden, int userId) {
332 modifyUserState(userId).hidden = hidden;
Amith Yamasani655d0e22013-06-12 14:19:10 -0700333 }
334
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000335 boolean getSuspended(int userId) {
336 return readUserState(userId).suspended;
337 }
338
339 void setSuspended(boolean suspended, int userId) {
340 modifyUserState(userId).suspended = suspended;
341 }
342
Kenny Guyc13053b2014-05-29 14:17:17 +0100343 boolean getBlockUninstall(int userId) {
344 return readUserState(userId).blockUninstall;
345 }
346
347 void setBlockUninstall(boolean blockUninstall, int userId) {
348 modifyUserState(userId).blockUninstall = blockUninstall;
349 }
350
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700351 void setUserState(int userId, int enabled, boolean installed, boolean stopped,
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000352 boolean notLaunched, boolean hidden, boolean suspended,
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700353 String lastDisableAppCaller, ArraySet<String> enabledComponents,
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700354 ArraySet<String> disabledComponents, boolean blockUninstall, int domainVerifState,
355 int linkGeneration) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700356 PackageUserState state = modifyUserState(userId);
357 state.enabled = enabled;
358 state.installed = installed;
359 state.stopped = stopped;
360 state.notLaunched = notLaunched;
Amith Yamasanie5bcff62014-07-19 15:44:09 -0700361 state.hidden = hidden;
Andrei Stingaceanu1e283912015-11-26 15:26:28 +0000362 state.suspended = suspended;
Dianne Hackborn3fa3c28a2013-03-26 16:15:41 -0700363 state.lastDisableAppCaller = lastDisableAppCaller;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700364 state.enabledComponents = enabledComponents;
365 state.disabledComponents = disabledComponents;
Kenny Guyc13053b2014-05-29 14:17:17 +0100366 state.blockUninstall = blockUninstall;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800367 state.domainVerificationStatus = domainVerifState;
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700368 state.appLinkGeneration = linkGeneration;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700369 }
370
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700371 ArraySet<String> getEnabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700372 return readUserState(userId).enabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700373 }
374
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700375 ArraySet<String> getDisabledComponents(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700376 return readUserState(userId).disabledComponents;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700377 }
378
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700379 void setEnabledComponents(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700380 modifyUserState(userId).enabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700381 }
382
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700383 void setDisabledComponents(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700384 modifyUserState(userId).disabledComponents = components;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700385 }
386
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700387 void setEnabledComponentsCopy(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700388 modifyUserState(userId).enabledComponents = components != null
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700389 ? new ArraySet<String>(components) : null;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700390 }
391
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700392 void setDisabledComponentsCopy(ArraySet<String> components, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700393 modifyUserState(userId).disabledComponents = components != null
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700394 ? new ArraySet<String>(components) : null;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700395 }
396
397 PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) {
398 PackageUserState state = modifyUserState(userId);
399 if (disabled && state.disabledComponents == null) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700400 state.disabledComponents = new ArraySet<String>(1);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700401 }
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700402 if (enabled && state.enabledComponents == null) {
Jeff Sharkey9f837a92014-10-24 12:07:24 -0700403 state.enabledComponents = new ArraySet<String>(1);
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700404 }
405 return state;
Amith Yamasani483f3b02012-03-13 16:08:00 -0700406 }
407
408 void addDisabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700409 modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700410 }
411
412 void addEnabledComponent(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700413 modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName);
Amith Yamasani483f3b02012-03-13 16:08:00 -0700414 }
415
416 boolean enableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700417 PackageUserState state = modifyUserStateComponents(userId, false, true);
418 boolean changed = state.disabledComponents != null
419 ? state.disabledComponents.remove(componentClassName) : false;
420 changed |= state.enabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700421 return changed;
422 }
423
Amith Yamasani483f3b02012-03-13 16:08:00 -0700424 boolean disableComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700425 PackageUserState state = modifyUserStateComponents(userId, true, false);
426 boolean changed = state.enabledComponents != null
427 ? state.enabledComponents.remove(componentClassName) : false;
428 changed |= state.disabledComponents.add(componentClassName);
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700429 return changed;
430 }
431
Amith Yamasani483f3b02012-03-13 16:08:00 -0700432 boolean restoreComponentLPw(String componentClassName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700433 PackageUserState state = modifyUserStateComponents(userId, true, true);
434 boolean changed = state.disabledComponents != null
435 ? state.disabledComponents.remove(componentClassName) : false;
436 changed |= state.enabledComponents != null
437 ? state.enabledComponents.remove(componentClassName) : false;
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700438 return changed;
439 }
440
Amith Yamasani483f3b02012-03-13 16:08:00 -0700441 int getCurrentEnabledStateLPr(String componentName, int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700442 PackageUserState state = readUserState(userId);
443 if (state.enabledComponents != null && state.enabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700444 return COMPONENT_ENABLED_STATE_ENABLED;
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700445 } else if (state.disabledComponents != null
446 && state.disabledComponents.contains(componentName)) {
Kenny Rootcf0b38c2011-03-22 14:17:59 -0700447 return COMPONENT_ENABLED_STATE_DISABLED;
448 } else {
449 return COMPONENT_ENABLED_STATE_DEFAULT;
450 }
451 }
Amith Yamasani13593602012-03-22 16:16:17 -0700452
453 void removeUser(int userId) {
Dianne Hackborn7767eac2012-08-23 18:25:40 -0700454 userState.delete(userId);
Amith Yamasani13593602012-03-22 16:16:17 -0700455 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800456
Fabrice Di Meglio62271722015-04-10 17:24:02 -0700457 IntentFilterVerificationInfo getIntentFilterVerificationInfo() {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800458 return verificationInfo;
459 }
460
Fabrice Di Meglio62271722015-04-10 17:24:02 -0700461 void setIntentFilterVerificationInfo(IntentFilterVerificationInfo info) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800462 verificationInfo = info;
463 }
464
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700465 // Returns a packed value as a long:
466 //
467 // high 'int'-sized word: link status: undefined/ask/never/always.
468 // low 'int'-sized word: relative priority among 'always' results.
469 long getDomainVerificationStatusForUser(int userId) {
470 PackageUserState state = readUserState(userId);
471 long result = (long) state.appLinkGeneration;
472 result |= ((long) state.domainVerificationStatus) << 32;
473 return result;
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800474 }
475
Christopher Tatef0d6cb32015-07-10 17:44:53 -0700476 void setDomainVerificationStatusForUser(final int status, int generation, int userId) {
477 PackageUserState state = modifyUserState(userId);
478 state.domainVerificationStatus = status;
479 if (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) {
480 state.appLinkGeneration = generation;
481 }
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800482 }
483
Fabrice Di Meglio62271722015-04-10 17:24:02 -0700484 void clearDomainVerificationStatusForUser(int userId) {
Fabrice Di Meglio1c1b4712014-11-19 17:12:32 -0800485 modifyUserState(userId).domainVerificationStatus =
486 PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
487 }
Amith Yamasani483f3b02012-03-13 16:08:00 -0700488}