Merge "Consolidate UserID+Package classes."
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/Package.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/Package.java
deleted file mode 100644
index 78a77fe..0000000
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/Package.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.job.controllers;
-
-import java.util.Objects;
-
-/** Wrapper class to represent a userId-pkgName combo. */
-final class Package {
- public final String packageName;
- public final int userId;
-
- Package(int userId, String packageName) {
- this.userId = userId;
- this.packageName = packageName;
- }
-
- @Override
- public String toString() {
- return packageToString(userId, packageName);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
- if (!(obj instanceof Package)) {
- return false;
- }
- Package other = (Package) obj;
- return userId == other.userId && Objects.equals(packageName, other.packageName);
- }
-
- @Override
- public int hashCode() {
- return packageName.hashCode() + userId;
- }
-
- /**
- * Standardize the output of userId-packageName combo.
- */
- static String packageToString(int userId, String packageName) {
- return "<" + userId + ">" + packageName;
- }
-}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java
index d69b9e0..c46ffd7 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java
@@ -21,7 +21,6 @@
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
import static com.android.server.job.JobSchedulerService.sSystemClock;
-import static com.android.server.job.controllers.Package.packageToString;
import android.annotation.CurrentTimeMillisLong;
import android.annotation.ElapsedRealtimeLong;
@@ -31,6 +30,7 @@
import android.app.usage.UsageStatsManagerInternal.EstimatedLaunchTimeChangedListener;
import android.appwidget.AppWidgetManager;
import android.content.Context;
+import android.content.pm.UserPackage;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -172,7 +172,7 @@
final String pkgName = jobStatus.getSourcePackageName();
final ArraySet<JobStatus> jobs = mTrackedJobs.get(userId, pkgName);
if (jobs != null && jobs.remove(jobStatus) && jobs.size() == 0) {
- mThresholdAlarmListener.removeAlarmForKey(new Package(userId, pkgName));
+ mThresholdAlarmListener.removeAlarmForKey(UserPackage.of(userId, pkgName));
}
}
@@ -186,7 +186,7 @@
final int userId = UserHandle.getUserId(uid);
mTrackedJobs.delete(userId, packageName);
mEstimatedLaunchTimes.delete(userId, packageName);
- mThresholdAlarmListener.removeAlarmForKey(new Package(userId, packageName));
+ mThresholdAlarmListener.removeAlarmForKey(UserPackage.of(userId, packageName));
}
@Override
@@ -354,7 +354,7 @@
@CurrentTimeMillisLong long now, @ElapsedRealtimeLong long nowElapsed) {
final ArraySet<JobStatus> jobs = mTrackedJobs.get(userId, pkgName);
if (jobs == null || jobs.size() == 0) {
- mThresholdAlarmListener.removeAlarmForKey(new Package(userId, pkgName));
+ mThresholdAlarmListener.removeAlarmForKey(UserPackage.of(userId, pkgName));
return;
}
@@ -365,10 +365,10 @@
// Set alarm to be notified when this crosses the threshold.
final long timeToCrossThresholdMs =
nextEstimatedLaunchTime - (now + mLaunchTimeThresholdMs);
- mThresholdAlarmListener.addAlarm(new Package(userId, pkgName),
+ mThresholdAlarmListener.addAlarm(UserPackage.of(userId, pkgName),
nowElapsed + timeToCrossThresholdMs);
} else {
- mThresholdAlarmListener.removeAlarmForKey(new Package(userId, pkgName));
+ mThresholdAlarmListener.removeAlarmForKey(UserPackage.of(userId, pkgName));
}
}
@@ -427,25 +427,25 @@
}
/** Track when apps will cross the "will run soon" threshold. */
- private class ThresholdAlarmListener extends AlarmQueue<Package> {
+ private class ThresholdAlarmListener extends AlarmQueue<UserPackage> {
private ThresholdAlarmListener(Context context, Looper looper) {
super(context, looper, "*job.prefetch*", "Prefetch threshold", false,
PcConstants.DEFAULT_LAUNCH_TIME_THRESHOLD_MS / 10);
}
@Override
- protected boolean isForUser(@NonNull Package key, int userId) {
+ protected boolean isForUser(@NonNull UserPackage key, int userId) {
return key.userId == userId;
}
@Override
- protected void processExpiredAlarms(@NonNull ArraySet<Package> expired) {
+ protected void processExpiredAlarms(@NonNull ArraySet<UserPackage> expired) {
final ArraySet<JobStatus> changedJobs = new ArraySet<>();
synchronized (mLock) {
final long now = sSystemClock.millis();
final long nowElapsed = sElapsedRealtimeClock.millis();
for (int i = 0; i < expired.size(); ++i) {
- Package p = expired.valueAt(i);
+ UserPackage p = expired.valueAt(i);
if (!willBeLaunchedSoonLocked(p.userId, p.packageName, now)) {
Slog.e(TAG, "Alarm expired for "
+ packageToString(p.userId, p.packageName) + " at the wrong time");
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
index 659e7c0..d8206ad 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java
@@ -28,7 +28,6 @@
import static com.android.server.job.JobSchedulerService.RESTRICTED_INDEX;
import static com.android.server.job.JobSchedulerService.WORKING_INDEX;
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
-import static com.android.server.job.controllers.Package.packageToString;
import android.Manifest;
import android.annotation.NonNull;
@@ -44,6 +43,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.UserPackage;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.Looper;
@@ -532,7 +532,7 @@
*/
private final SparseSetArray<String> mSystemInstallers = new SparseSetArray<>();
- /** An app has reached its quota. The message should contain a {@link Package} object. */
+ /** An app has reached its quota. The message should contain a {@link UserPackage} object. */
@VisibleForTesting
static final int MSG_REACHED_QUOTA = 0;
/** Drop any old timing sessions. */
@@ -542,7 +542,7 @@
/** Process state for a UID has changed. */
private static final int MSG_UID_PROCESS_STATE_CHANGED = 3;
/**
- * An app has reached its expedited job quota. The message should contain a {@link Package}
+ * An app has reached its expedited job quota. The message should contain a {@link UserPackage}
* object.
*/
@VisibleForTesting
@@ -680,7 +680,7 @@
final String pkgName = jobStatus.getSourcePackageName();
ArraySet<JobStatus> jobs = mTrackedJobs.get(userId, pkgName);
if (jobs != null && jobs.remove(jobStatus) && jobs.size() == 0) {
- mInQuotaAlarmQueue.removeAlarmForKey(new Package(userId, pkgName));
+ mInQuotaAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
}
}
}
@@ -746,7 +746,7 @@
}
mTimingEvents.delete(userId, packageName);
mEJTimingSessions.delete(userId, packageName);
- mInQuotaAlarmQueue.removeAlarmForKey(new Package(userId, packageName));
+ mInQuotaAlarmQueue.removeAlarmForKey(UserPackage.of(userId, packageName));
mExecutionStatsCache.delete(userId, packageName);
mEJStats.delete(userId, packageName);
mTopAppTrackers.delete(userId, packageName);
@@ -1725,7 +1725,7 @@
// exempted.
maybeScheduleStartAlarmLocked(userId, packageName, realStandbyBucket);
} else {
- mInQuotaAlarmQueue.removeAlarmForKey(new Package(userId, packageName));
+ mInQuotaAlarmQueue.removeAlarmForKey(UserPackage.of(userId, packageName));
}
return changedJobs;
}
@@ -1764,7 +1764,7 @@
&& isWithinQuotaLocked(userId, packageName, realStandbyBucket)) {
// TODO(141645789): we probably shouldn't cancel the alarm until we've verified
// that all jobs for the userId-package are within quota.
- mInQuotaAlarmQueue.removeAlarmForKey(new Package(userId, packageName));
+ mInQuotaAlarmQueue.removeAlarmForKey(UserPackage.of(userId, packageName));
} else {
mToScheduleStartAlarms.add(userId, packageName, realStandbyBucket);
}
@@ -1814,7 +1814,7 @@
if (jobs == null || jobs.size() == 0) {
Slog.e(TAG, "maybeScheduleStartAlarmLocked called for "
+ packageToString(userId, packageName) + " that has no jobs");
- mInQuotaAlarmQueue.removeAlarmForKey(new Package(userId, packageName));
+ mInQuotaAlarmQueue.removeAlarmForKey(UserPackage.of(userId, packageName));
return;
}
@@ -1838,7 +1838,7 @@
+ getRemainingExecutionTimeLocked(userId, packageName, standbyBucket)
+ "ms in its quota.");
}
- mInQuotaAlarmQueue.removeAlarmForKey(new Package(userId, packageName));
+ mInQuotaAlarmQueue.removeAlarmForKey(UserPackage.of(userId, packageName));
mHandler.obtainMessage(MSG_CHECK_PACKAGE, userId, 0, packageName).sendToTarget();
return;
}
@@ -1903,7 +1903,7 @@
+ nowElapsed + ", inQuotaTime=" + inQuotaTimeElapsed + ": " + stats);
inQuotaTimeElapsed = nowElapsed + 5 * MINUTE_IN_MILLIS;
}
- mInQuotaAlarmQueue.addAlarm(new Package(userId, packageName), inQuotaTimeElapsed);
+ mInQuotaAlarmQueue.addAlarm(UserPackage.of(userId, packageName), inQuotaTimeElapsed);
}
private boolean setConstraintSatisfied(@NonNull JobStatus jobStatus, long nowElapsed,
@@ -2098,7 +2098,7 @@
}
private final class Timer {
- private final Package mPkg;
+ private final UserPackage mPkg;
private final int mUid;
private final boolean mRegularJobTimer;
@@ -2110,7 +2110,7 @@
private long mDebitAdjustment;
Timer(int uid, int userId, String packageName, boolean regularJobTimer) {
- mPkg = new Package(userId, packageName);
+ mPkg = UserPackage.of(userId, packageName);
mUid = uid;
mRegularJobTimer = regularJobTimer;
}
@@ -2365,7 +2365,7 @@
}
private final class TopAppTimer {
- private final Package mPkg;
+ private final UserPackage mPkg;
// List of jobs currently running for this app that started when the app wasn't in the
// foreground.
@@ -2373,7 +2373,7 @@
private long mStartTimeElapsed;
TopAppTimer(int userId, String packageName) {
- mPkg = new Package(userId, packageName);
+ mPkg = UserPackage.of(userId, packageName);
}
private int calculateTimeChunks(final long nowElapsed) {
@@ -2656,7 +2656,7 @@
synchronized (mLock) {
switch (msg.what) {
case MSG_REACHED_QUOTA: {
- Package pkg = (Package) msg.obj;
+ UserPackage pkg = (UserPackage) msg.obj;
if (DEBUG) {
Slog.d(TAG, "Checking if " + pkg + " has reached its quota.");
}
@@ -2685,7 +2685,7 @@
break;
}
case MSG_REACHED_EJ_QUOTA: {
- Package pkg = (Package) msg.obj;
+ UserPackage pkg = (UserPackage) msg.obj;
if (DEBUG) {
Slog.d(TAG, "Checking if " + pkg + " has reached its EJ quota.");
}
@@ -2887,21 +2887,21 @@
}
/** Track when UPTCs are expected to come back into quota. */
- private class InQuotaAlarmQueue extends AlarmQueue<Package> {
+ private class InQuotaAlarmQueue extends AlarmQueue<UserPackage> {
private InQuotaAlarmQueue(Context context, Looper looper) {
super(context, looper, ALARM_TAG_QUOTA_CHECK, "In quota", false,
QcConstants.DEFAULT_MIN_QUOTA_CHECK_DELAY_MS);
}
@Override
- protected boolean isForUser(@NonNull Package key, int userId) {
+ protected boolean isForUser(@NonNull UserPackage key, int userId) {
return key.userId == userId;
}
@Override
- protected void processExpiredAlarms(@NonNull ArraySet<Package> expired) {
+ protected void processExpiredAlarms(@NonNull ArraySet<UserPackage> expired) {
for (int i = 0; i < expired.size(); ++i) {
- Package p = expired.valueAt(i);
+ UserPackage p = expired.valueAt(i);
mHandler.obtainMessage(MSG_CHECK_PACKAGE, p.userId, 0, p.packageName)
.sendToTarget();
}
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java
index 0eedcf0..44ac798 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java
@@ -186,4 +186,11 @@
/** Dump any internal constants the Controller may have. */
public void dumpConstants(ProtoOutputStream proto) {
}
+
+ /**
+ * Standardize the output of userId-packageName combo.
+ */
+ static String packageToString(int userId, String packageName) {
+ return "<" + userId + ">" + packageName;
+ }
}
diff --git a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
index 7a13e3f..abc196f 100644
--- a/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
+++ b/apex/jobscheduler/service/java/com/android/server/tare/Agent.java
@@ -36,6 +36,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
+import android.content.pm.UserPackage;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
@@ -824,7 +825,7 @@
void onPackageRemovedLocked(final int userId, @NonNull final String pkgName) {
mScribe.discardLedgerLocked(userId, pkgName);
mCurrentOngoingEvents.delete(userId, pkgName);
- mBalanceThresholdAlarmQueue.removeAlarmForKey(new Package(userId, pkgName));
+ mBalanceThresholdAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
}
@GuardedBy("mLock")
@@ -959,7 +960,7 @@
mCurrentOngoingEvents.get(userId, pkgName);
if (ongoingEvents == null || mIrs.isVip(userId, pkgName)) {
// No ongoing transactions. No reason to schedule
- mBalanceThresholdAlarmQueue.removeAlarmForKey(new Package(userId, pkgName));
+ mBalanceThresholdAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
return;
}
mTrendCalculator.reset(getBalanceLocked(userId, pkgName),
@@ -972,7 +973,7 @@
if (lowerTimeMs == TrendCalculator.WILL_NOT_CROSS_THRESHOLD) {
if (upperTimeMs == TrendCalculator.WILL_NOT_CROSS_THRESHOLD) {
// Will never cross a threshold based on current events.
- mBalanceThresholdAlarmQueue.removeAlarmForKey(new Package(userId, pkgName));
+ mBalanceThresholdAlarmQueue.removeAlarmForKey(UserPackage.of(userId, pkgName));
return;
}
timeToThresholdMs = upperTimeMs;
@@ -980,7 +981,7 @@
timeToThresholdMs = (upperTimeMs == TrendCalculator.WILL_NOT_CROSS_THRESHOLD)
? lowerTimeMs : Math.min(lowerTimeMs, upperTimeMs);
}
- mBalanceThresholdAlarmQueue.addAlarm(new Package(userId, pkgName),
+ mBalanceThresholdAlarmQueue.addAlarm(UserPackage.of(userId, pkgName),
SystemClock.elapsedRealtime() + timeToThresholdMs);
}
@@ -1071,57 +1072,22 @@
private final OngoingEventUpdater mOngoingEventUpdater = new OngoingEventUpdater();
- private static final class Package {
- public final String packageName;
- public final int userId;
-
- Package(int userId, String packageName) {
- this.userId = userId;
- this.packageName = packageName;
- }
-
- @Override
- public String toString() {
- return appToString(userId, packageName);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (obj == null) {
- return false;
- }
- if (this == obj) {
- return true;
- }
- if (obj instanceof Package) {
- Package other = (Package) obj;
- return userId == other.userId && Objects.equals(packageName, other.packageName);
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return packageName.hashCode() + userId;
- }
- }
-
/** Track when apps will cross the closest affordability threshold (in both directions). */
- private class BalanceThresholdAlarmQueue extends AlarmQueue<Package> {
+ private class BalanceThresholdAlarmQueue extends AlarmQueue<UserPackage> {
private BalanceThresholdAlarmQueue(Context context, Looper looper) {
super(context, looper, ALARM_TAG_AFFORDABILITY_CHECK, "Affordability check", true,
15_000L);
}
@Override
- protected boolean isForUser(@NonNull Package key, int userId) {
+ protected boolean isForUser(@NonNull UserPackage key, int userId) {
return key.userId == userId;
}
@Override
- protected void processExpiredAlarms(@NonNull ArraySet<Package> expired) {
+ protected void processExpiredAlarms(@NonNull ArraySet<UserPackage> expired) {
for (int i = 0; i < expired.size(); ++i) {
- Package p = expired.valueAt(i);
+ UserPackage p = expired.valueAt(i);
mHandler.obtainMessage(
MSG_CHECK_INDIVIDUAL_AFFORDABILITY, p.userId, 0, p.packageName)
.sendToTarget();
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index a573776..b3db38d 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -27,7 +27,6 @@
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.UserHandleAware;
-import android.annotation.UserIdInt;
import android.app.Activity;
import android.app.PropertyInvalidatedCache;
import android.compat.annotation.UnsupportedAppUsage;
@@ -37,6 +36,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
+import android.content.pm.UserPackage;
import android.content.res.Resources;
import android.database.SQLException;
import android.os.Build;
@@ -348,43 +348,11 @@
*/
public static final int CACHE_ACCOUNTS_DATA_SIZE = 4;
- private static final class UserIdPackage
- {
- @UserIdInt
- public int userId;
- public String packageName;
-
- public UserIdPackage(int UserId, String PackageName) {
- this.userId = UserId;
- this.packageName = PackageName;
- }
-
- @Override
- public boolean equals(@Nullable Object o) {
- if (o == null) {
- return false;
- }
- if (o == this) {
- return true;
- }
- if (o.getClass() != getClass()) {
- return false;
- }
- UserIdPackage e = (UserIdPackage) o;
- return e.userId == userId && e.packageName.equals(packageName);
- }
-
- @Override
- public int hashCode() {
- return userId ^ packageName.hashCode();
- }
- }
-
- PropertyInvalidatedCache<UserIdPackage, Account[]> mAccountsForUserCache =
- new PropertyInvalidatedCache<UserIdPackage, Account[]>(
+ PropertyInvalidatedCache<UserPackage, Account[]> mAccountsForUserCache =
+ new PropertyInvalidatedCache<UserPackage, Account[]>(
CACHE_ACCOUNTS_DATA_SIZE, CACHE_KEY_ACCOUNTS_DATA_PROPERTY) {
@Override
- public Account[] recompute(UserIdPackage userAndPackage) {
+ public Account[] recompute(UserPackage userAndPackage) {
try {
return mService.getAccountsAsUser(null, userAndPackage.userId, userAndPackage.packageName);
} catch (RemoteException e) {
@@ -392,7 +360,7 @@
}
}
@Override
- public boolean bypass(UserIdPackage query) {
+ public boolean bypass(UserPackage query) {
return query.userId < 0;
}
@Override
@@ -731,7 +699,7 @@
*/
@NonNull
public Account[] getAccountsAsUser(int userId) {
- UserIdPackage userAndPackage = new UserIdPackage(userId, mContext.getOpPackageName());
+ UserPackage userAndPackage = UserPackage.of(userId, mContext.getOpPackageName());
return mAccountsForUserCache.query(userAndPackage);
}
diff --git a/core/java/android/content/pm/UserPackage.java b/core/java/android/content/pm/UserPackage.java
new file mode 100644
index 0000000..e75f551
--- /dev/null
+++ b/core/java/android/content/pm/UserPackage.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm;
+
+import android.annotation.NonNull;
+import android.annotation.UserIdInt;
+import android.os.Process;
+import android.os.UserHandle;
+import android.util.SparseArrayMap;
+
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.ArrayUtils;
+
+import java.util.Objects;
+
+/**
+ * POJO to represent a package for a specific user ID.
+ *
+ * @hide
+ */
+public final class UserPackage {
+ @UserIdInt
+ public final int userId;
+ public final String packageName;
+
+ @GuardedBy("sCache")
+ private static final SparseArrayMap<String, UserPackage> sCache = new SparseArrayMap<>();
+
+ private static final Object sUserIdLock = new Object();
+ private static final class NoPreloadHolder {
+ /** Set of userIDs to cache objects for. */
+ @GuardedBy("sUserIdLock")
+ private static int[] sUserIds = new int[]{UserHandle.getUserId(Process.myUid())};
+ }
+
+ private UserPackage(int userId, String packageName) {
+ this.userId = userId;
+ this.packageName = packageName;
+ }
+
+ @Override
+ public String toString() {
+ return "<" + userId + ">" + packageName;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof UserPackage) {
+ UserPackage other = (UserPackage) obj;
+ return userId == other.userId && Objects.equals(packageName, other.packageName);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 0;
+ result = 31 * result + userId;
+ result = 31 * result + packageName.hashCode();
+ return result;
+ }
+
+ /** Return an instance of this class representing the given userId + packageName combination. */
+ @NonNull
+ public static UserPackage of(@UserIdInt int userId, @NonNull String packageName) {
+ synchronized (sUserIdLock) {
+ if (!ArrayUtils.contains(NoPreloadHolder.sUserIds, userId)) {
+ // Don't cache objects for invalid userIds.
+ return new UserPackage(userId, packageName);
+ }
+ }
+ synchronized (sCache) {
+ UserPackage up = sCache.get(userId, packageName);
+ if (up == null) {
+ packageName = packageName.intern();
+ up = new UserPackage(userId, packageName);
+ sCache.add(userId, packageName, up);
+ }
+ return up;
+ }
+ }
+
+ /** Remove the specified app from the cache. */
+ public static void removeFromCache(@UserIdInt int userId, @NonNull String packageName) {
+ synchronized (sCache) {
+ sCache.delete(userId, packageName);
+ }
+ }
+
+ /** Indicate the list of valid user IDs on the device. */
+ public static void setValidUserIds(@NonNull int[] userIds) {
+ userIds = userIds.clone();
+ synchronized (sUserIdLock) {
+ NoPreloadHolder.sUserIds = userIds;
+ }
+ synchronized (sCache) {
+ for (int u = sCache.numMaps() - 1; u >= 0; --u) {
+ final int userId = sCache.keyAt(u);
+ // Not holding sUserIdLock is intentional here. We don't modify the elements within
+ // the array and so even if this method is called multiple times with different sets
+ // of user IDs, we want to adjust the cache based on each new array.
+ if (!ArrayUtils.contains(userIds, userId)) {
+ sCache.deleteAt(u);
+ }
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java
index baa471c..bb37e0e 100644
--- a/services/core/java/com/android/server/om/OverlayManagerService.java
+++ b/services/core/java/com/android/server/om/OverlayManagerService.java
@@ -55,6 +55,7 @@
import android.content.pm.IPackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.UserInfo;
+import android.content.pm.UserPackage;
import android.content.pm.overlay.OverlayPaths;
import android.content.res.ApkAssets;
import android.net.Uri;
@@ -887,7 +888,7 @@
}
}
- private Set<PackageAndUser> executeRequest(
+ private Set<UserPackage> executeRequest(
@NonNull final OverlayManagerTransaction.Request request)
throws OperationFailedException {
Objects.requireNonNull(request, "Transaction contains a null request");
@@ -932,7 +933,7 @@
try {
switch (request.type) {
case TYPE_SET_ENABLED:
- Set<PackageAndUser> result = null;
+ Set<UserPackage> result = null;
result = CollectionUtils.addAll(result,
mImpl.setEnabled(request.overlay, true, realUserId));
result = CollectionUtils.addAll(result,
@@ -973,7 +974,7 @@
synchronized (mLock) {
// execute the requests (as calling user)
- Set<PackageAndUser> affectedPackagesToUpdate = null;
+ Set<UserPackage> affectedPackagesToUpdate = null;
for (final OverlayManagerTransaction.Request request : transaction) {
affectedPackagesToUpdate = CollectionUtils.addAll(affectedPackagesToUpdate,
executeRequest(request));
@@ -1370,13 +1371,13 @@
}
}
- private void updateTargetPackagesLocked(@Nullable PackageAndUser updatedTarget) {
+ private void updateTargetPackagesLocked(@Nullable UserPackage updatedTarget) {
if (updatedTarget != null) {
updateTargetPackagesLocked(Set.of(updatedTarget));
}
}
- private void updateTargetPackagesLocked(@Nullable Set<PackageAndUser> updatedTargets) {
+ private void updateTargetPackagesLocked(@Nullable Set<UserPackage> updatedTargets) {
if (CollectionUtils.isEmpty(updatedTargets)) {
return;
}
@@ -1405,7 +1406,7 @@
@Nullable
private static SparseArray<ArraySet<String>> groupTargetsByUserId(
- @Nullable final Set<PackageAndUser> targetsAndUsers) {
+ @Nullable final Set<UserPackage> targetsAndUsers) {
final SparseArray<ArraySet<String>> userTargets = new SparseArray<>();
CollectionUtils.forEach(targetsAndUsers, target -> {
ArraySet<String> targets = userTargets.get(target.userId);
@@ -1472,7 +1473,7 @@
@NonNull
private SparseArray<List<String>> updatePackageManagerLocked(
- @Nullable Set<PackageAndUser> targets) {
+ @Nullable Set<UserPackage> targets) {
if (CollectionUtils.isEmpty(targets)) {
return new SparseArray<>();
}
diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
index 17bb39c..6ffe60d 100644
--- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
+++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
@@ -35,6 +35,7 @@
import android.content.om.CriticalOverlayInfo;
import android.content.om.OverlayIdentifier;
import android.content.om.OverlayInfo;
+import android.content.pm.UserPackage;
import android.content.pm.overlay.OverlayPaths;
import android.content.pm.parsing.FrameworkParsingPackageUtils;
import android.os.FabricatedOverlayInfo;
@@ -154,13 +155,13 @@
* set of targets that had, but no longer have, active overlays.
*/
@NonNull
- ArraySet<PackageAndUser> updateOverlaysForUser(final int newUserId) {
+ ArraySet<UserPackage> updateOverlaysForUser(final int newUserId) {
if (DEBUG) {
Slog.d(TAG, "updateOverlaysForUser newUserId=" + newUserId);
}
// Remove the settings of all overlays that are no longer installed for this user.
- final ArraySet<PackageAndUser> updatedTargets = new ArraySet<>();
+ final ArraySet<UserPackage> updatedTargets = new ArraySet<>();
final ArrayMap<String, AndroidPackage> userPackages = mPackageManager.initializeForUser(
newUserId);
CollectionUtils.addAll(updatedTargets, removeOverlaysForUser(
@@ -185,7 +186,7 @@
// When a new user is switched to for the first time, package manager must be
// informed of the overlay paths for all overlaid packages installed in the user.
if (overlaidByOthers.contains(pkg.getPackageName())) {
- updatedTargets.add(new PackageAndUser(pkg.getPackageName(), newUserId));
+ updatedTargets.add(UserPackage.of(newUserId, pkg.getPackageName()));
}
} catch (OperationFailedException e) {
Slog.e(TAG, "failed to initialize overlays of '" + pkg.getPackageName()
@@ -237,7 +238,7 @@
mSettings.setEnabled(overlay, newUserId, true);
if (updateState(oi, newUserId, 0)) {
CollectionUtils.add(updatedTargets,
- new PackageAndUser(oi.targetPackageName, oi.userId));
+ UserPackage.of(oi.userId, oi.targetPackageName));
}
}
} catch (OverlayManagerSettings.BadKeyException e) {
@@ -258,40 +259,40 @@
}
@NonNull
- Set<PackageAndUser> onPackageAdded(@NonNull final String pkgName,
+ Set<UserPackage> onPackageAdded(@NonNull final String pkgName,
final int userId) throws OperationFailedException {
- final Set<PackageAndUser> updatedTargets = new ArraySet<>();
+ final Set<UserPackage> updatedTargets = new ArraySet<>();
// Always update the overlays of newly added packages.
- updatedTargets.add(new PackageAndUser(pkgName, userId));
+ updatedTargets.add(UserPackage.of(userId, pkgName));
updatedTargets.addAll(reconcileSettingsForPackage(pkgName, userId, 0 /* flags */));
return updatedTargets;
}
@NonNull
- Set<PackageAndUser> onPackageChanged(@NonNull final String pkgName,
+ Set<UserPackage> onPackageChanged(@NonNull final String pkgName,
final int userId) throws OperationFailedException {
return reconcileSettingsForPackage(pkgName, userId, 0 /* flags */);
}
@NonNull
- Set<PackageAndUser> onPackageReplacing(@NonNull final String pkgName, final int userId)
+ Set<UserPackage> onPackageReplacing(@NonNull final String pkgName, final int userId)
throws OperationFailedException {
return reconcileSettingsForPackage(pkgName, userId, FLAG_OVERLAY_IS_BEING_REPLACED);
}
@NonNull
- Set<PackageAndUser> onPackageReplaced(@NonNull final String pkgName, final int userId)
+ Set<UserPackage> onPackageReplaced(@NonNull final String pkgName, final int userId)
throws OperationFailedException {
return reconcileSettingsForPackage(pkgName, userId, 0 /* flags */);
}
@NonNull
- Set<PackageAndUser> onPackageRemoved(@NonNull final String pkgName, final int userId) {
+ Set<UserPackage> onPackageRemoved(@NonNull final String pkgName, final int userId) {
if (DEBUG) {
Slog.d(TAG, "onPackageRemoved pkgName=" + pkgName + " userId=" + userId);
}
// Update the state of all overlays that target this package.
- final Set<PackageAndUser> targets = updateOverlaysForTarget(pkgName, userId, 0 /* flags */);
+ final Set<UserPackage> targets = updateOverlaysForTarget(pkgName, userId, 0 /* flags */);
// Remove all the overlays this package declares.
return CollectionUtils.addAll(targets,
@@ -299,15 +300,15 @@
}
@NonNull
- private Set<PackageAndUser> removeOverlaysForUser(
+ private Set<UserPackage> removeOverlaysForUser(
@NonNull final Predicate<OverlayInfo> condition, final int userId) {
final List<OverlayInfo> overlays = mSettings.removeIf(
io -> userId == io.userId && condition.test(io));
- Set<PackageAndUser> targets = Collections.emptySet();
+ Set<UserPackage> targets = Collections.emptySet();
for (int i = 0, n = overlays.size(); i < n; i++) {
final OverlayInfo info = overlays.get(i);
targets = CollectionUtils.add(targets,
- new PackageAndUser(info.targetPackageName, userId));
+ UserPackage.of(userId, info.targetPackageName));
// Remove the idmap if the overlay is no longer installed for any user.
removeIdmapIfPossible(info);
@@ -316,7 +317,7 @@
}
@NonNull
- private Set<PackageAndUser> updateOverlaysForTarget(@NonNull final String targetPackage,
+ private Set<UserPackage> updateOverlaysForTarget(@NonNull final String targetPackage,
final int userId, final int flags) {
boolean modified = false;
final List<OverlayInfo> overlays = mSettings.getOverlaysForTarget(targetPackage, userId);
@@ -332,18 +333,18 @@
if (!modified) {
return Collections.emptySet();
}
- return Set.of(new PackageAndUser(targetPackage, userId));
+ return Set.of(UserPackage.of(userId, targetPackage));
}
@NonNull
- private Set<PackageAndUser> updatePackageOverlays(@NonNull AndroidPackage pkg,
+ private Set<UserPackage> updatePackageOverlays(@NonNull AndroidPackage pkg,
final int userId, final int flags) throws OperationFailedException {
if (pkg.getOverlayTarget() == null) {
// This package does not have overlays declared in its manifest.
return Collections.emptySet();
}
- Set<PackageAndUser> updatedTargets = Collections.emptySet();
+ Set<UserPackage> updatedTargets = Collections.emptySet();
final OverlayIdentifier overlay = new OverlayIdentifier(pkg.getPackageName());
final int priority = getPackageConfiguredPriority(pkg);
try {
@@ -353,7 +354,7 @@
// If the targetPackageName has changed, the package that *used* to
// be the target must also update its assets.
updatedTargets = CollectionUtils.add(updatedTargets,
- new PackageAndUser(currentInfo.targetPackageName, userId));
+ UserPackage.of(userId, currentInfo.targetPackageName));
}
currentInfo = mSettings.init(overlay, userId, pkg.getOverlayTarget(),
@@ -367,13 +368,13 @@
// reinitialized. Reorder the overlay and update its target package.
mSettings.setPriority(overlay, userId, priority);
updatedTargets = CollectionUtils.add(updatedTargets,
- new PackageAndUser(currentInfo.targetPackageName, userId));
+ UserPackage.of(userId, currentInfo.targetPackageName));
}
// Update the enabled state of the overlay.
if (updateState(currentInfo, userId, flags)) {
updatedTargets = CollectionUtils.add(updatedTargets,
- new PackageAndUser(currentInfo.targetPackageName, userId));
+ UserPackage.of(userId, currentInfo.targetPackageName));
}
} catch (OverlayManagerSettings.BadKeyException e) {
throw new OperationFailedException("failed to update settings", e);
@@ -382,14 +383,14 @@
}
@NonNull
- private Set<PackageAndUser> reconcileSettingsForPackage(@NonNull final String pkgName,
+ private Set<UserPackage> reconcileSettingsForPackage(@NonNull final String pkgName,
final int userId, final int flags) throws OperationFailedException {
if (DEBUG) {
Slog.d(TAG, "reconcileSettingsForPackage pkgName=" + pkgName + " userId=" + userId);
}
// Update the state of overlays that target this package.
- Set<PackageAndUser> updatedTargets = Collections.emptySet();
+ Set<UserPackage> updatedTargets = Collections.emptySet();
updatedTargets = CollectionUtils.addAll(updatedTargets,
updateOverlaysForTarget(pkgName, userId, flags));
@@ -423,7 +424,7 @@
}
@NonNull
- Set<PackageAndUser> setEnabled(@NonNull final OverlayIdentifier overlay,
+ Set<UserPackage> setEnabled(@NonNull final OverlayIdentifier overlay,
final boolean enable, final int userId) throws OperationFailedException {
if (DEBUG) {
Slog.d(TAG, String.format("setEnabled overlay=%s enable=%s userId=%d",
@@ -442,7 +443,7 @@
modified |= updateState(oi, userId, 0);
if (modified) {
- return Set.of(new PackageAndUser(oi.targetPackageName, userId));
+ return Set.of(UserPackage.of(userId, oi.targetPackageName));
}
return Set.of();
} catch (OverlayManagerSettings.BadKeyException e) {
@@ -450,7 +451,7 @@
}
}
- Optional<PackageAndUser> setEnabledExclusive(@NonNull final OverlayIdentifier overlay,
+ Optional<UserPackage> setEnabledExclusive(@NonNull final OverlayIdentifier overlay,
boolean withinCategory, final int userId) throws OperationFailedException {
if (DEBUG) {
Slog.d(TAG, String.format("setEnabledExclusive overlay=%s"
@@ -493,7 +494,7 @@
modified |= updateState(enabledInfo, userId, 0);
if (modified) {
- return Optional.of(new PackageAndUser(enabledInfo.targetPackageName, userId));
+ return Optional.of(UserPackage.of(userId, enabledInfo.targetPackageName));
}
return Optional.empty();
} catch (OverlayManagerSettings.BadKeyException e) {
@@ -502,7 +503,7 @@
}
@NonNull
- Set<PackageAndUser> registerFabricatedOverlay(
+ Set<UserPackage> registerFabricatedOverlay(
@NonNull final FabricatedOverlayInternal overlay)
throws OperationFailedException {
if (FrameworkParsingPackageUtils.validateName(overlay.overlayName,
@@ -516,7 +517,7 @@
throw new OperationFailedException("failed to create fabricated overlay");
}
- final Set<PackageAndUser> updatedTargets = new ArraySet<>();
+ final Set<UserPackage> updatedTargets = new ArraySet<>();
for (int userId : mSettings.getUsers()) {
updatedTargets.addAll(registerFabricatedOverlay(info, userId));
}
@@ -524,13 +525,13 @@
}
@NonNull
- private Set<PackageAndUser> registerFabricatedOverlay(
+ private Set<UserPackage> registerFabricatedOverlay(
@NonNull final FabricatedOverlayInfo info, int userId)
throws OperationFailedException {
final OverlayIdentifier overlayIdentifier = new OverlayIdentifier(
info.packageName, info.overlayName);
- final Set<PackageAndUser> updatedTargets = new ArraySet<>();
+ final Set<UserPackage> updatedTargets = new ArraySet<>();
OverlayInfo oi = mSettings.getNullableOverlayInfo(overlayIdentifier, userId);
if (oi != null) {
if (!oi.isFabricated) {
@@ -543,7 +544,7 @@
if (oi != null) {
// If the fabricated overlay changes its target package, update the previous
// target package so it no longer is overlaid.
- updatedTargets.add(new PackageAndUser(oi.targetPackageName, userId));
+ updatedTargets.add(UserPackage.of(userId, oi.targetPackageName));
}
oi = mSettings.init(overlayIdentifier, userId, info.targetPackageName,
info.targetOverlayable, info.path, true, false,
@@ -554,7 +555,7 @@
mSettings.setBaseCodePath(overlayIdentifier, userId, info.path);
}
if (updateState(oi, userId, 0)) {
- updatedTargets.add(new PackageAndUser(oi.targetPackageName, userId));
+ updatedTargets.add(UserPackage.of(userId, oi.targetPackageName));
}
} catch (OverlayManagerSettings.BadKeyException e) {
throw new OperationFailedException("failed to update settings", e);
@@ -564,8 +565,8 @@
}
@NonNull
- Set<PackageAndUser> unregisterFabricatedOverlay(@NonNull final OverlayIdentifier overlay) {
- final Set<PackageAndUser> updatedTargets = new ArraySet<>();
+ Set<UserPackage> unregisterFabricatedOverlay(@NonNull final OverlayIdentifier overlay) {
+ final Set<UserPackage> updatedTargets = new ArraySet<>();
for (int userId : mSettings.getUsers()) {
updatedTargets.addAll(unregisterFabricatedOverlay(overlay, userId));
}
@@ -573,7 +574,7 @@
}
@NonNull
- private Set<PackageAndUser> unregisterFabricatedOverlay(
+ private Set<UserPackage> unregisterFabricatedOverlay(
@NonNull final OverlayIdentifier overlay, int userId) {
final OverlayInfo oi = mSettings.getNullableOverlayInfo(overlay, userId);
if (oi != null) {
@@ -581,7 +582,7 @@
if (oi.isEnabled()) {
// Removing a fabricated overlay only changes the overlay path of a package if it is
// currently enabled.
- return Set.of(new PackageAndUser(oi.targetPackageName, userId));
+ return Set.of(UserPackage.of(userId, oi.targetPackageName));
}
}
return Set.of();
@@ -627,7 +628,7 @@
return mOverlayConfig.isEnabled(overlay.getPackageName());
}
- Optional<PackageAndUser> setPriority(@NonNull final OverlayIdentifier overlay,
+ Optional<UserPackage> setPriority(@NonNull final OverlayIdentifier overlay,
@NonNull final OverlayIdentifier newParentOverlay, final int userId)
throws OperationFailedException {
try {
@@ -644,7 +645,7 @@
}
if (mSettings.setPriority(overlay, newParentOverlay, userId)) {
- return Optional.of(new PackageAndUser(overlayInfo.targetPackageName, userId));
+ return Optional.of(UserPackage.of(userId, overlayInfo.targetPackageName));
}
return Optional.empty();
} catch (OverlayManagerSettings.BadKeyException e) {
@@ -652,7 +653,7 @@
}
}
- Set<PackageAndUser> setHighestPriority(@NonNull final OverlayIdentifier overlay,
+ Set<UserPackage> setHighestPriority(@NonNull final OverlayIdentifier overlay,
final int userId) throws OperationFailedException {
try{
if (DEBUG) {
@@ -667,7 +668,7 @@
}
if (mSettings.setHighestPriority(overlay, userId)) {
- return Set.of(new PackageAndUser(overlayInfo.targetPackageName, userId));
+ return Set.of(UserPackage.of(userId, overlayInfo.targetPackageName));
}
return Set.of();
} catch (OverlayManagerSettings.BadKeyException e) {
@@ -675,7 +676,7 @@
}
}
- Optional<PackageAndUser> setLowestPriority(@NonNull final OverlayIdentifier overlay,
+ Optional<UserPackage> setLowestPriority(@NonNull final OverlayIdentifier overlay,
final int userId) throws OperationFailedException {
try{
if (DEBUG) {
@@ -690,7 +691,7 @@
}
if (mSettings.setLowestPriority(overlay, userId)) {
- return Optional.of(new PackageAndUser(overlayInfo.targetPackageName, userId));
+ return Optional.of(UserPackage.of(userId, overlayInfo.targetPackageName));
}
return Optional.empty();
} catch (OverlayManagerSettings.BadKeyException e) {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index b979e7a..b302d4a 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -107,6 +107,7 @@
import android.content.pm.SuspendDialogInfo;
import android.content.pm.TestUtilityService;
import android.content.pm.UserInfo;
+import android.content.pm.UserPackage;
import android.content.pm.VerifierDeviceIdentity;
import android.content.pm.VersionedPackage;
import android.content.pm.overlay.OverlayPaths;
@@ -2986,6 +2987,7 @@
@Override
public void notifyPackageRemoved(String packageName, int uid) {
mPackageObserverHelper.notifyRemoved(packageName, uid);
+ UserPackage.removeFromCache(UserHandle.getUserId(uid), packageName);
}
void sendPackageAddedForUser(@NonNull Computer snapshot, String packageName,
diff --git a/services/core/java/com/android/server/pm/ShortcutLauncher.java b/services/core/java/com/android/server/pm/ShortcutLauncher.java
index 0d99075..00f7dc4 100644
--- a/services/core/java/com/android/server/pm/ShortcutLauncher.java
+++ b/services/core/java/com/android/server/pm/ShortcutLauncher.java
@@ -20,6 +20,7 @@
import android.annotation.UserIdInt;
import android.content.pm.PackageInfo;
import android.content.pm.ShortcutInfo;
+import android.content.pm.UserPackage;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
@@ -30,7 +31,6 @@
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.pm.ShortcutService.DumpFilter;
-import com.android.server.pm.ShortcutUser.PackageWithUser;
import libcore.io.IoUtils;
@@ -70,7 +70,7 @@
/**
* Package name -> IDs.
*/
- final private ArrayMap<PackageWithUser, ArraySet<String>> mPinnedShortcuts = new ArrayMap<>();
+ private final ArrayMap<UserPackage, ArraySet<String>> mPinnedShortcuts = new ArrayMap<>();
private ShortcutLauncher(@NonNull ShortcutUser shortcutUser,
@UserIdInt int ownerUserId, @NonNull String packageName,
@@ -101,12 +101,12 @@
* Called when the new package can't receive the backup, due to signature or version mismatch.
*/
private void onRestoreBlocked() {
- final ArrayList<PackageWithUser> pinnedPackages =
+ final ArrayList<UserPackage> pinnedPackages =
new ArrayList<>(mPinnedShortcuts.keySet());
mPinnedShortcuts.clear();
for (int i = pinnedPackages.size() - 1; i >= 0; i--) {
- final PackageWithUser pu = pinnedPackages.get(i);
- final ShortcutPackage p = mShortcutUser.getPackageShortcutsIfExists(pu.packageName);
+ final UserPackage up = pinnedPackages.get(i);
+ final ShortcutPackage p = mShortcutUser.getPackageShortcutsIfExists(up.packageName);
if (p != null) {
p.refreshPinnedFlags();
}
@@ -135,13 +135,13 @@
return; // No need to instantiate.
}
- final PackageWithUser pu = PackageWithUser.of(packageUserId, packageName);
+ final UserPackage up = UserPackage.of(packageUserId, packageName);
final int idSize = ids.size();
if (idSize == 0) {
- mPinnedShortcuts.remove(pu);
+ mPinnedShortcuts.remove(up);
} else {
- final ArraySet<String> prevSet = mPinnedShortcuts.get(pu);
+ final ArraySet<String> prevSet = mPinnedShortcuts.get(up);
// Actually pin shortcuts.
// This logic here is to make sure a launcher cannot pin a shortcut that is not dynamic
@@ -165,7 +165,7 @@
newSet.add(id);
}
}
- mPinnedShortcuts.put(pu, newSet);
+ mPinnedShortcuts.put(up, newSet);
}
packageShortcuts.refreshPinnedFlags();
}
@@ -176,7 +176,7 @@
@Nullable
public ArraySet<String> getPinnedShortcutIds(@NonNull String packageName,
@UserIdInt int packageUserId) {
- return mPinnedShortcuts.get(PackageWithUser.of(packageUserId, packageName));
+ return mPinnedShortcuts.get(UserPackage.of(packageUserId, packageName));
}
/**
@@ -207,7 +207,7 @@
}
boolean cleanUpPackage(String packageName, @UserIdInt int packageUserId) {
- return mPinnedShortcuts.remove(PackageWithUser.of(packageUserId, packageName)) != null;
+ return mPinnedShortcuts.remove(UserPackage.of(packageUserId, packageName)) != null;
}
public void ensurePackageInfo() {
@@ -241,15 +241,15 @@
getPackageInfo().saveToXml(mShortcutUser.mService, out, forBackup);
for (int i = 0; i < size; i++) {
- final PackageWithUser pu = mPinnedShortcuts.keyAt(i);
+ final UserPackage up = mPinnedShortcuts.keyAt(i);
- if (forBackup && (pu.userId != getOwnerUserId())) {
+ if (forBackup && (up.userId != getOwnerUserId())) {
continue; // Target package on a different user, skip. (i.e. work profile)
}
out.startTag(null, TAG_PACKAGE);
- ShortcutService.writeAttr(out, ATTR_PACKAGE_NAME, pu.packageName);
- ShortcutService.writeAttr(out, ATTR_PACKAGE_USER_ID, pu.userId);
+ ShortcutService.writeAttr(out, ATTR_PACKAGE_NAME, up.packageName);
+ ShortcutService.writeAttr(out, ATTR_PACKAGE_USER_ID, up.userId);
final ArraySet<String> ids = mPinnedShortcuts.valueAt(i);
final int idSize = ids.size();
@@ -345,7 +345,7 @@
ATTR_PACKAGE_USER_ID, ownerUserId);
ids = new ArraySet<>();
ret.mPinnedShortcuts.put(
- PackageWithUser.of(packageUserId, packageName), ids);
+ UserPackage.of(packageUserId, packageName), ids);
continue;
}
}
@@ -386,14 +386,14 @@
for (int i = 0; i < size; i++) {
pw.println();
- final PackageWithUser pu = mPinnedShortcuts.keyAt(i);
+ final UserPackage up = mPinnedShortcuts.keyAt(i);
pw.print(prefix);
pw.print(" ");
pw.print("Package: ");
- pw.print(pu.packageName);
+ pw.print(up.packageName);
pw.print(" User: ");
- pw.println(pu.userId);
+ pw.println(up.userId);
final ArraySet<String> ids = mPinnedShortcuts.valueAt(i);
final int idSize = ids.size();
@@ -418,7 +418,7 @@
@VisibleForTesting
ArraySet<String> getAllPinnedShortcutsForTest(String packageName, int packageUserId) {
- return new ArraySet<>(mPinnedShortcuts.get(PackageWithUser.of(packageUserId, packageName)));
+ return new ArraySet<>(mPinnedShortcuts.get(UserPackage.of(packageUserId, packageName)));
}
@Override
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index b6f09ff..83720f1 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -57,6 +57,7 @@
import android.content.pm.ShortcutManager;
import android.content.pm.ShortcutServiceInternal;
import android.content.pm.ShortcutServiceInternal.ShortcutChangeListener;
+import android.content.pm.UserPackage;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.Bitmap;
@@ -118,7 +119,6 @@
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.LocalServices;
import com.android.server.SystemService;
-import com.android.server.pm.ShortcutUser.PackageWithUser;
import com.android.server.uri.UriGrantsManagerInternal;
import libcore.io.IoUtils;
@@ -3774,7 +3774,7 @@
final long start = getStatStartTime();
try {
- final ArrayList<PackageWithUser> gonePackages = new ArrayList<>();
+ final ArrayList<UserPackage> gonePackages = new ArrayList<>();
synchronized (mLock) {
final ShortcutUser user = getUserShortcutsLocked(ownerUserId);
@@ -3789,13 +3789,14 @@
Slog.d(TAG, "Uninstalled: " + spi.getPackageName()
+ " user " + spi.getPackageUserId());
}
- gonePackages.add(PackageWithUser.of(spi));
+ gonePackages.add(
+ UserPackage.of(spi.getPackageUserId(), spi.getPackageName()));
}
});
if (gonePackages.size() > 0) {
for (int i = gonePackages.size() - 1; i >= 0; i--) {
- final PackageWithUser pu = gonePackages.get(i);
- cleanUpPackageLocked(pu.packageName, ownerUserId, pu.userId,
+ final UserPackage up = gonePackages.get(i);
+ cleanUpPackageLocked(up.packageName, ownerUserId, up.userId,
/* appStillExists = */ false);
}
}
@@ -5274,7 +5275,7 @@
final ShortcutUser user = mUsers.get(userId);
if (user == null) return null;
- return user.getAllLaunchersForTest().get(PackageWithUser.of(userId, packageName));
+ return user.getAllLaunchersForTest().get(UserPackage.of(userId, packageName));
}
}
diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java
index 20bbf46..94eb6bb 100644
--- a/services/core/java/com/android/server/pm/ShortcutUser.java
+++ b/services/core/java/com/android/server/pm/ShortcutUser.java
@@ -21,6 +21,7 @@
import android.app.appsearch.AppSearchManager;
import android.app.appsearch.AppSearchSession;
import android.content.pm.ShortcutManager;
+import android.content.pm.UserPackage;
import android.metrics.LogMaker;
import android.os.Binder;
import android.os.FileUtils;
@@ -52,7 +53,6 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.function.Consumer;
@@ -82,44 +82,6 @@
private static final String KEY_LAUNCHERS = "launchers";
private static final String KEY_PACKAGES = "packages";
- static final class PackageWithUser {
- final int userId;
- final String packageName;
-
- private PackageWithUser(int userId, String packageName) {
- this.userId = userId;
- this.packageName = Objects.requireNonNull(packageName);
- }
-
- public static PackageWithUser of(int userId, String packageName) {
- return new PackageWithUser(userId, packageName);
- }
-
- public static PackageWithUser of(ShortcutPackageItem spi) {
- return new PackageWithUser(spi.getPackageUserId(), spi.getPackageName());
- }
-
- @Override
- public int hashCode() {
- return packageName.hashCode() ^ userId;
- }
-
- @Override
- public boolean equals(Object obj) {
- if (!(obj instanceof PackageWithUser)) {
- return false;
- }
- final PackageWithUser that = (PackageWithUser) obj;
-
- return userId == that.userId && packageName.equals(that.packageName);
- }
-
- @Override
- public String toString() {
- return String.format("[Package: %d, %s]", userId, packageName);
- }
- }
-
final ShortcutService mService;
final AppSearchManager mAppSearchManager;
final Executor mExecutor;
@@ -129,7 +91,7 @@
private final ArrayMap<String, ShortcutPackage> mPackages = new ArrayMap<>();
- private final ArrayMap<PackageWithUser, ShortcutLauncher> mLaunchers = new ArrayMap<>();
+ private final ArrayMap<UserPackage, ShortcutLauncher> mLaunchers = new ArrayMap<>();
/** In-memory-cached default launcher. */
private String mCachedLauncher;
@@ -204,20 +166,20 @@
// We don't expose this directly to non-test code because only ShortcutUser should add to/
// remove from it.
@VisibleForTesting
- ArrayMap<PackageWithUser, ShortcutLauncher> getAllLaunchersForTest() {
+ ArrayMap<UserPackage, ShortcutLauncher> getAllLaunchersForTest() {
return mLaunchers;
}
private void addLauncher(ShortcutLauncher launcher) {
launcher.replaceUser(this);
- mLaunchers.put(PackageWithUser.of(launcher.getPackageUserId(),
+ mLaunchers.put(UserPackage.of(launcher.getPackageUserId(),
launcher.getPackageName()), launcher);
}
@Nullable
public ShortcutLauncher removeLauncher(
@UserIdInt int packageUserId, @NonNull String packageName) {
- return mLaunchers.remove(PackageWithUser.of(packageUserId, packageName));
+ return mLaunchers.remove(UserPackage.of(packageUserId, packageName));
}
@Nullable
@@ -242,7 +204,7 @@
@NonNull
public ShortcutLauncher getLauncherShortcuts(@NonNull String packageName,
@UserIdInt int launcherUserId) {
- final PackageWithUser key = PackageWithUser.of(launcherUserId, packageName);
+ final UserPackage key = UserPackage.of(launcherUserId, packageName);
ShortcutLauncher ret = mLaunchers.get(key);
if (ret == null) {
ret = new ShortcutLauncher(this, mUserId, packageName, launcherUserId);
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index cf0ea43..d2af78b 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -52,6 +52,7 @@
import android.content.pm.ShortcutServiceInternal;
import android.content.pm.UserInfo;
import android.content.pm.UserInfo.UserInfoFlag;
+import android.content.pm.UserPackage;
import android.content.pm.UserProperties;
import android.content.pm.parsing.FrameworkParsingPackageUtils;
import android.content.res.Configuration;
@@ -5848,6 +5849,7 @@
Slog.d(LOG_TAG, "updateUserIds(): userIds= " + Arrays.toString(mUserIds)
+ " includingPreCreated=" + Arrays.toString(mUserIdsIncludingPreCreated));
}
+ UserPackage.setValidUserIds(mUserIds);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java
index 3f55f1b..ec61b87 100644
--- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java
+++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplRebootTests.java
@@ -20,6 +20,7 @@
import android.content.om.OverlayIdentifier;
import android.content.om.OverlayInfo;
+import android.content.pm.UserPackage;
import androidx.test.runner.AndroidJUnit4;
@@ -54,7 +55,7 @@
addPackage(target(otherTarget), USER);
addPackage(overlay(OVERLAY, TARGET), USER);
- final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
+ final Set<UserPackage> allPackages = Set.of(UserPackage.of(USER, TARGET));
// The result should be the same for every time
assertThat(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
@@ -67,7 +68,7 @@
addPackage(target(TARGET), USER);
addPackage(overlay(OVERLAY, TARGET), USER);
- final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
+ final Set<UserPackage> allPackages = Set.of(UserPackage.of(USER, TARGET));
configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_DISABLED, 0 /* priority */);
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
@@ -101,7 +102,7 @@
addPackage(overlay(OVERLAY, TARGET), USER);
configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 0 /* priority */);
- final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
+ final Set<UserPackage> allPackages = Set.of(UserPackage.of(USER, TARGET));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER);
@@ -133,7 +134,7 @@
addPackage(target(TARGET), USER);
addPackage(overlay(OVERLAY, TARGET), USER);
- final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
+ final Set<UserPackage> allPackages = Set.of(UserPackage.of(USER, TARGET));
final Consumer<ConfigState> setOverlay = (state -> {
configureSystemOverlay(OVERLAY, state, 0 /* priority */);
@@ -185,7 +186,7 @@
configureSystemOverlay(OVERLAY, ConfigState.MUTABLE_DISABLED, 0 /* priority */);
configureSystemOverlay(OVERLAY2, ConfigState.MUTABLE_DISABLED, 1 /* priority */);
- final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
+ final Set<UserPackage> allPackages = Set.of(UserPackage.of(USER, TARGET));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER);
@@ -230,7 +231,7 @@
configureSystemOverlay(OVERLAY, ConfigState.IMMUTABLE_ENABLED, 0 /* priority */);
configureSystemOverlay(OVERLAY2, ConfigState.IMMUTABLE_ENABLED, 1 /* priority */);
- final Set<PackageAndUser> allPackages = Set.of(new PackageAndUser(TARGET, USER));
+ final Set<UserPackage> allPackages = Set.of(UserPackage.of(USER, TARGET));
expect.that(impl.updateOverlaysForUser(USER)).isEqualTo(allPackages);
final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER);
diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java
index f69141d..ab52928 100644
--- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java
+++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTests.java
@@ -22,7 +22,6 @@
import static android.os.OverlayablePolicy.CONFIG_SIGNATURE;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -30,7 +29,7 @@
import android.content.om.OverlayIdentifier;
import android.content.om.OverlayInfo;
-import android.util.Pair;
+import android.content.pm.UserPackage;
import androidx.test.runner.AndroidJUnit4;
@@ -66,7 +65,7 @@
@Test
public void testGetOverlayInfo() throws Exception {
installAndAssert(overlay(OVERLAY, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
final OverlayManagerServiceImpl impl = getImpl();
final OverlayInfo oi = impl.getOverlayInfo(IDENTIFIER, USER);
@@ -79,11 +78,11 @@
@Test
public void testGetOverlayInfosForTarget() throws Exception {
installAndAssert(overlay(OVERLAY, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY2, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY2, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY2), UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY3, TARGET), USER2,
- Set.of(new PackageAndUser(OVERLAY3, USER2), new PackageAndUser(TARGET, USER2)));
+ Set.of(UserPackage.of(USER2, OVERLAY3), UserPackage.of(USER2, TARGET)));
final OverlayManagerServiceImpl impl = getImpl();
final List<OverlayInfo> ois = impl.getOverlayInfosForTarget(TARGET, USER);
@@ -107,13 +106,13 @@
@Test
public void testGetOverlayInfosForUser() throws Exception {
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY2, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY2, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY2), UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY3, TARGET2), USER,
- Set.of(new PackageAndUser(OVERLAY3, USER), new PackageAndUser(TARGET2, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY3), UserPackage.of(USER, TARGET2)));
final OverlayManagerServiceImpl impl = getImpl();
final Map<String, List<OverlayInfo>> everything = impl.getOverlaysForUser(USER);
@@ -138,11 +137,11 @@
@Test
public void testPriority() throws Exception {
installAndAssert(overlay(OVERLAY, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY2, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY2, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY2), UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY3, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY3, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY3), UserPackage.of(USER, TARGET)));
final OverlayManagerServiceImpl impl = getImpl();
final OverlayInfo o1 = impl.getOverlayInfo(IDENTIFIER, USER);
@@ -152,15 +151,15 @@
assertOverlayInfoForTarget(TARGET, USER, o1, o2, o3);
assertEquals(impl.setLowestPriority(IDENTIFIER3, USER),
- Optional.of(new PackageAndUser(TARGET, USER)));
+ Optional.of(UserPackage.of(USER, TARGET)));
assertOverlayInfoForTarget(TARGET, USER, o3, o1, o2);
assertEquals(impl.setHighestPriority(IDENTIFIER3, USER),
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
assertOverlayInfoForTarget(TARGET, USER, o1, o2, o3);
assertEquals(impl.setPriority(IDENTIFIER, IDENTIFIER2, USER),
- Optional.of(new PackageAndUser(TARGET, USER)));
+ Optional.of(UserPackage.of(USER, TARGET)));
assertOverlayInfoForTarget(TARGET, USER, o2, o1, o3);
}
@@ -170,47 +169,47 @@
assertNull(impl.getOverlayInfo(IDENTIFIER, USER));
installAndAssert(overlay(OVERLAY, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
assertState(STATE_MISSING_TARGET, IDENTIFIER, USER);
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
assertState(STATE_DISABLED, IDENTIFIER, USER);
assertEquals(impl.setEnabled(IDENTIFIER, true, USER),
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
assertState(STATE_ENABLED, IDENTIFIER, USER);
// target upgrades do not change the state of the overlay
upgradeAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)),
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)),
+ Set.of(UserPackage.of(USER, TARGET)));
assertState(STATE_ENABLED, IDENTIFIER, USER);
uninstallAndAssert(TARGET, USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
assertState(STATE_MISSING_TARGET, IDENTIFIER, USER);
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
assertState(STATE_ENABLED, IDENTIFIER, USER);
}
@Test
public void testOnOverlayPackageUpgraded() throws Exception {
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
upgradeAndAssert(overlay(OVERLAY, TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)),
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)),
+ Set.of(UserPackage.of(USER, TARGET)));
// upgrade to a version where the overlay has changed its target
upgradeAndAssert(overlay(OVERLAY, TARGET2), USER,
- Set.of(new PackageAndUser(TARGET, USER)),
- Set.of(new PackageAndUser(TARGET, USER),
- new PackageAndUser(TARGET2, USER)));
+ Set.of(UserPackage.of(USER, TARGET)),
+ Set.of(UserPackage.of(USER, TARGET),
+ UserPackage.of(USER, TARGET2)));
}
@Test
@@ -222,10 +221,10 @@
// request succeeded, and there was a change that needs to be
// propagated to the rest of the system
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY, TARGET), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
- assertEquals(Set.of(new PackageAndUser(TARGET, USER)),
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
+ assertEquals(Set.of(UserPackage.of(USER, TARGET)),
impl.setEnabled(IDENTIFIER, true, USER));
// request succeeded, but nothing changed
@@ -239,9 +238,9 @@
addPackage(target(CONFIG_SIGNATURE_REFERENCE_PKG).setCertificate(CERT_CONFIG_OK), USER);
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_OK), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
final FakeIdmapDaemon idmapd = getIdmapd();
final FakeDeviceState state = getState();
@@ -259,9 +258,9 @@
addPackage(target(CONFIG_SIGNATURE_REFERENCE_PKG).setCertificate(CERT_CONFIG_OK), USER);
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
final FakeIdmapDaemon idmapd = getIdmapd();
final FakeDeviceState state = getState();
@@ -276,9 +275,9 @@
public void testConfigSignaturePolicyNoConfig() throws Exception {
addPackage(target(CONFIG_SIGNATURE_REFERENCE_PKG).setCertificate(CERT_CONFIG_OK), USER);
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
final FakeIdmapDaemon idmapd = getIdmapd();
final FakeDeviceState state = getState();
@@ -292,9 +291,9 @@
@Test
public void testConfigSignaturePolicyNoRefPkg() throws Exception {
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
final FakeIdmapDaemon idmapd = getIdmapd();
final FakeDeviceState state = getState();
@@ -312,9 +311,9 @@
addPackage(app(CONFIG_SIGNATURE_REFERENCE_PKG).setCertificate(CERT_CONFIG_OK), USER);
installAndAssert(target(TARGET), USER,
- Set.of(new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, TARGET)));
installAndAssert(overlay(OVERLAY, TARGET).setCertificate(CERT_CONFIG_NOK), USER,
- Set.of(new PackageAndUser(OVERLAY, USER), new PackageAndUser(TARGET, USER)));
+ Set.of(UserPackage.of(USER, OVERLAY), UserPackage.of(USER, TARGET)));
final FakeIdmapDaemon idmapd = getIdmapd();
final FakeDeviceState state = getState();
diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java
index 301697d..bba7669 100644
--- a/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/om/OverlayManagerServiceImplTestsBase.java
@@ -28,6 +28,7 @@
import android.content.om.OverlayInfo;
import android.content.om.OverlayInfo.State;
import android.content.om.OverlayableInfo;
+import android.content.pm.UserPackage;
import android.os.FabricatedOverlayInfo;
import android.os.FabricatedOverlayInternal;
import android.text.TextUtils;
@@ -164,7 +165,7 @@
* @throws IllegalStateException if the package is currently installed
*/
void installAndAssert(@NonNull FakeDeviceState.PackageBuilder pkg, int userId,
- @NonNull Set<PackageAndUser> onAddedUpdatedPackages)
+ @NonNull Set<UserPackage> onAddedUpdatedPackages)
throws OperationFailedException {
if (mState.select(pkg.packageName, userId) != null) {
throw new IllegalStateException("package " + pkg.packageName + " already installed");
@@ -185,8 +186,8 @@
* @throws IllegalStateException if the package is not currently installed
*/
void upgradeAndAssert(FakeDeviceState.PackageBuilder pkg, int userId,
- @NonNull Set<PackageAndUser> onReplacingUpdatedPackages,
- @NonNull Set<PackageAndUser> onReplacedUpdatedPackages)
+ @NonNull Set<UserPackage> onReplacingUpdatedPackages,
+ @NonNull Set<UserPackage> onReplacedUpdatedPackages)
throws OperationFailedException {
final FakeDeviceState.Package replacedPackage = mState.select(pkg.packageName, userId);
if (replacedPackage == null) {
@@ -207,7 +208,7 @@
* @throws IllegalStateException if the package is not currently installed
*/
void uninstallAndAssert(@NonNull String packageName, int userId,
- @NonNull Set<PackageAndUser> onRemovedUpdatedPackages) {
+ @NonNull Set<UserPackage> onRemovedUpdatedPackages) {
final FakeDeviceState.Package pkg = mState.select(packageName, userId);
if (pkg == null) {
throw new IllegalStateException("package " + packageName + " not installed");
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index fdf9354..0805485 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -74,6 +74,7 @@
import android.content.pm.SigningDetails;
import android.content.pm.SigningInfo;
import android.content.pm.UserInfo;
+import android.content.pm.UserPackage;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Icon;
@@ -97,7 +98,6 @@
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.pm.LauncherAppsService.LauncherAppsImpl;
-import com.android.server.pm.ShortcutUser.PackageWithUser;
import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.uri.UriPermissionOwner;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -692,9 +692,9 @@
protected Map<String, PackageInfo> mInjectedPackages;
- protected Set<PackageWithUser> mUninstalledPackages;
- protected Set<PackageWithUser> mDisabledPackages;
- protected Set<PackageWithUser> mEphemeralPackages;
+ protected Set<UserPackage> mUninstalledPackages;
+ protected Set<UserPackage> mDisabledPackages;
+ protected Set<UserPackage> mEphemeralPackages;
protected Set<String> mSystemPackages;
protected PackageManager mMockPackageManager;
@@ -1200,28 +1200,28 @@
if (ENABLE_DUMP) {
Log.v(TAG, "Uninstall package " + packageName + " / " + userId);
}
- mUninstalledPackages.add(PackageWithUser.of(userId, packageName));
+ mUninstalledPackages.add(UserPackage.of(userId, packageName));
}
protected void installPackage(int userId, String packageName) {
if (ENABLE_DUMP) {
Log.v(TAG, "Install package " + packageName + " / " + userId);
}
- mUninstalledPackages.remove(PackageWithUser.of(userId, packageName));
+ mUninstalledPackages.remove(UserPackage.of(userId, packageName));
}
protected void disablePackage(int userId, String packageName) {
if (ENABLE_DUMP) {
Log.v(TAG, "Disable package " + packageName + " / " + userId);
}
- mDisabledPackages.add(PackageWithUser.of(userId, packageName));
+ mDisabledPackages.add(UserPackage.of(userId, packageName));
}
protected void enablePackage(int userId, String packageName) {
if (ENABLE_DUMP) {
Log.v(TAG, "Enable package " + packageName + " / " + userId);
}
- mDisabledPackages.remove(PackageWithUser.of(userId, packageName));
+ mDisabledPackages.remove(UserPackage.of(userId, packageName));
}
PackageInfo getInjectedPackageInfo(String packageName, @UserIdInt int userId,
@@ -1239,17 +1239,17 @@
ret.applicationInfo.uid = UserHandle.getUid(userId, pi.applicationInfo.uid);
ret.applicationInfo.packageName = pi.packageName;
- if (mUninstalledPackages.contains(PackageWithUser.of(userId, packageName))) {
+ if (mUninstalledPackages.contains(UserPackage.of(userId, packageName))) {
ret.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED;
}
- if (mEphemeralPackages.contains(PackageWithUser.of(userId, packageName))) {
+ if (mEphemeralPackages.contains(UserPackage.of(userId, packageName))) {
ret.applicationInfo.privateFlags |= ApplicationInfo.PRIVATE_FLAG_INSTANT;
}
if (mSystemPackages.contains(packageName)) {
ret.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
}
ret.applicationInfo.enabled =
- !mDisabledPackages.contains(PackageWithUser.of(userId, packageName));
+ !mDisabledPackages.contains(UserPackage.of(userId, packageName));
if (getSignatures) {
ret.signatures = null;
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index 96c0d0a..b20c63c 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -83,6 +83,7 @@
import android.content.pm.PackageInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
+import android.content.pm.UserPackage;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
@@ -107,7 +108,6 @@
import com.android.modules.utils.TypedXmlSerializer;
import com.android.server.pm.ShortcutService.ConfigConstants;
import com.android.server.pm.ShortcutService.FileOutputStreamWithPath;
-import com.android.server.pm.ShortcutUser.PackageWithUser;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
@@ -4081,12 +4081,12 @@
assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
hashSet(user10.getAllPackagesForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
+ set(UserPackage.of(USER_0, LAUNCHER_1),
+ UserPackage.of(USER_0, LAUNCHER_2)),
hashSet(user0.getAllLaunchersForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_1),
- PackageWithUser.of(USER_10, LAUNCHER_2)),
+ set(UserPackage.of(USER_10, LAUNCHER_1),
+ UserPackage.of(USER_10, LAUNCHER_2)),
hashSet(user10.getAllLaunchersForTest().keySet()));
assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
"s0_1", "s0_2");
@@ -4113,12 +4113,12 @@
assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
hashSet(user10.getAllPackagesForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
+ set(UserPackage.of(USER_0, LAUNCHER_1),
+ UserPackage.of(USER_0, LAUNCHER_2)),
hashSet(user0.getAllLaunchersForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_1),
- PackageWithUser.of(USER_10, LAUNCHER_2)),
+ set(UserPackage.of(USER_10, LAUNCHER_1),
+ UserPackage.of(USER_10, LAUNCHER_2)),
hashSet(user10.getAllLaunchersForTest().keySet()));
assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
"s0_1", "s0_2");
@@ -4145,12 +4145,12 @@
assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
hashSet(user10.getAllPackagesForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
+ set(UserPackage.of(USER_0, LAUNCHER_1),
+ UserPackage.of(USER_0, LAUNCHER_2)),
hashSet(user0.getAllLaunchersForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_1),
- PackageWithUser.of(USER_10, LAUNCHER_2)),
+ set(UserPackage.of(USER_10, LAUNCHER_1),
+ UserPackage.of(USER_10, LAUNCHER_2)),
hashSet(user10.getAllLaunchersForTest().keySet()));
assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
"s0_2");
@@ -4176,11 +4176,11 @@
assertEquals(set(CALLING_PACKAGE_1, CALLING_PACKAGE_2),
hashSet(user10.getAllPackagesForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
+ set(UserPackage.of(USER_0, LAUNCHER_1),
+ UserPackage.of(USER_0, LAUNCHER_2)),
hashSet(user0.getAllLaunchersForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_2)),
+ set(UserPackage.of(USER_10, LAUNCHER_2)),
hashSet(user10.getAllLaunchersForTest().keySet()));
assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
"s0_2");
@@ -4205,11 +4205,11 @@
assertEquals(set(CALLING_PACKAGE_1),
hashSet(user10.getAllPackagesForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
+ set(UserPackage.of(USER_0, LAUNCHER_1),
+ UserPackage.of(USER_0, LAUNCHER_2)),
hashSet(user0.getAllLaunchersForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_10, LAUNCHER_2)),
+ set(UserPackage.of(USER_10, LAUNCHER_2)),
hashSet(user10.getAllLaunchersForTest().keySet()));
assertShortcutIds(getLauncherPinnedShortcuts(LAUNCHER_1, USER_0),
"s0_2");
@@ -4234,8 +4234,8 @@
assertEquals(set(CALLING_PACKAGE_1),
hashSet(user10.getAllPackagesForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
+ set(UserPackage.of(USER_0, LAUNCHER_1),
+ UserPackage.of(USER_0, LAUNCHER_2)),
hashSet(user0.getAllLaunchersForTest().keySet()));
assertEquals(
set(),
@@ -4263,8 +4263,8 @@
assertEquals(set(),
hashSet(user10.getAllPackagesForTest().keySet()));
assertEquals(
- set(PackageWithUser.of(USER_0, LAUNCHER_1),
- PackageWithUser.of(USER_0, LAUNCHER_2)),
+ set(UserPackage.of(USER_0, LAUNCHER_1),
+ UserPackage.of(USER_0, LAUNCHER_2)),
hashSet(user0.getAllLaunchersForTest().keySet()));
assertEquals(set(),
hashSet(user10.getAllLaunchersForTest().keySet()));
@@ -5584,12 +5584,12 @@
assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_3));
assertExistsAndShadow(user0.getAllLaunchersForTest().get(
- PackageWithUser.of(USER_0, LAUNCHER_1)));
+ UserPackage.of(USER_0, LAUNCHER_1)));
assertExistsAndShadow(user0.getAllLaunchersForTest().get(
- PackageWithUser.of(USER_0, LAUNCHER_2)));
+ UserPackage.of(USER_0, LAUNCHER_2)));
- assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_0, LAUNCHER_3)));
- assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_P0, LAUNCHER_1)));
+ assertNull(user0.getAllLaunchersForTest().get(UserPackage.of(USER_0, LAUNCHER_3)));
+ assertNull(user0.getAllLaunchersForTest().get(UserPackage.of(USER_P0, LAUNCHER_1)));
doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(any(byte[].class),
anyString());
@@ -6146,12 +6146,12 @@
assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_2));
assertExistsAndShadow(user0.getAllPackagesForTest().get(CALLING_PACKAGE_3));
assertExistsAndShadow(user0.getAllLaunchersForTest().get(
- PackageWithUser.of(USER_0, LAUNCHER_1)));
+ UserPackage.of(USER_0, LAUNCHER_1)));
assertExistsAndShadow(user0.getAllLaunchersForTest().get(
- PackageWithUser.of(USER_0, LAUNCHER_2)));
+ UserPackage.of(USER_0, LAUNCHER_2)));
- assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_0, LAUNCHER_3)));
- assertNull(user0.getAllLaunchersForTest().get(PackageWithUser.of(USER_P0, LAUNCHER_1)));
+ assertNull(user0.getAllLaunchersForTest().get(UserPackage.of(USER_0, LAUNCHER_3)));
+ assertNull(user0.getAllLaunchersForTest().get(UserPackage.of(USER_P0, LAUNCHER_1)));
doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(any(byte[].class),
anyString());
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
index c786784..15fd73c 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java
@@ -39,6 +39,7 @@
import android.content.pm.Capability;
import android.content.pm.CapabilityParams;
import android.content.pm.ShortcutInfo;
+import android.content.pm.UserPackage;
import android.content.res.Resources;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Icon;
@@ -51,7 +52,6 @@
import androidx.test.filters.SmallTest;
import com.android.frameworks.servicestests.R;
-import com.android.server.pm.ShortcutUser.PackageWithUser;
import java.io.File;
import java.io.FileWriter;
@@ -2413,7 +2413,7 @@
assertWith(mManager.getDynamicShortcuts()).isEmpty();
});
// Make package 1 ephemeral.
- mEphemeralPackages.add(PackageWithUser.of(USER_0, CALLING_PACKAGE_1));
+ mEphemeralPackages.add(UserPackage.of(USER_0, CALLING_PACKAGE_1));
runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
assertExpectException(IllegalStateException.class, "Ephemeral apps", () -> {