diff options
143 files changed, 6460 insertions, 3499 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java index a8dd75248dd8..dfa1442a3192 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobStore.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobStore.java @@ -548,7 +548,7 @@ public final class JobStore { out.attribute(null, "sourceUserId", String.valueOf(jobStatus.getSourceUserId())); out.attribute(null, "uid", Integer.toString(jobStatus.getUid())); out.attribute(null, "bias", String.valueOf(jobStatus.getBias())); - out.attribute(null, "priority", String.valueOf(jobStatus.getEffectivePriority())); + out.attribute(null, "priority", String.valueOf(jobStatus.getJob().getPriority())); out.attribute(null, "flags", String.valueOf(jobStatus.getFlags())); if (jobStatus.getInternalFlags() != 0) { out.attribute(null, "internalFlags", String.valueOf(jobStatus.getInternalFlags())); diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java index 849354bd1d97..04f96de08acd 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java @@ -78,6 +78,7 @@ import android.content.pm.CrossProfileAppsInternal; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; +import android.content.pm.ResolveInfo; import android.database.ContentObserver; import android.hardware.display.DisplayManager; import android.net.NetworkScoreManager; @@ -219,7 +220,8 @@ public class AppStandbyController private static final int HEADLESS_APP_CHECK_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE - | PackageManager.GET_ACTIVITIES | PackageManager.MATCH_DISABLED_COMPONENTS; + | PackageManager.MATCH_DISABLED_COMPONENTS + | PackageManager.MATCH_SYSTEM_ONLY; // To name the lock for stack traces static class Lock {} @@ -253,7 +255,7 @@ public class AppStandbyController private final SparseArray<Set<String>> mActiveAdminApps = new SparseArray<>(); /** - * Set of system apps that are headless (don't have any declared activities, enabled or + * Set of system apps that are headless (don't have any "front door" activities, enabled or * disabled). Presence in this map indicates that the app is a headless system app. */ @GuardedBy("mHeadlessSystemApps") @@ -1942,7 +1944,7 @@ public class AppStandbyController try { PackageInfo pi = mPackageManager.getPackageInfoAsUser( packageName, HEADLESS_APP_CHECK_FLAGS, userId); - evaluateSystemAppException(pi); + maybeUpdateHeadlessSystemAppCache(pi); } catch (PackageManager.NameNotFoundException e) { synchronized (mHeadlessSystemApps) { mHeadlessSystemApps.remove(packageName); @@ -1950,19 +1952,31 @@ public class AppStandbyController } } - /** Returns true if the exception status changed. */ - private boolean evaluateSystemAppException(@Nullable PackageInfo pkgInfo) { + /** + * Update the "headless system app" cache. + * + * @return true if the cache is updated. + */ + private boolean maybeUpdateHeadlessSystemAppCache(@Nullable PackageInfo pkgInfo) { if (pkgInfo == null || pkgInfo.applicationInfo == null || (!pkgInfo.applicationInfo.isSystemApp() && !pkgInfo.applicationInfo.isUpdatedSystemApp())) { return false; } + final Intent frontDoorActivityIntent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER) + .setPackage(pkgInfo.packageName); + List<ResolveInfo> res = mPackageManager.queryIntentActivitiesAsUser(frontDoorActivityIntent, + HEADLESS_APP_CHECK_FLAGS, UserHandle.USER_SYSTEM); + return updateHeadlessSystemAppCache(pkgInfo.packageName, ArrayUtils.isEmpty(res)); + } + + private boolean updateHeadlessSystemAppCache(String packageName, boolean add) { synchronized (mHeadlessSystemApps) { - if (pkgInfo.activities == null || pkgInfo.activities.length == 0) { - // Headless system app. - return mHeadlessSystemApps.add(pkgInfo.packageName); + if (add) { + return mHeadlessSystemApps.add(packageName); } else { - return mHeadlessSystemApps.remove(pkgInfo.packageName); + return mHeadlessSystemApps.remove(packageName); } } } @@ -1999,20 +2013,45 @@ public class AppStandbyController } } + /** Returns the packages that have launcher icons. */ + private Set<String> getSystemPackagesWithLauncherActivities() { + final Intent intent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_LAUNCHER); + List<ResolveInfo> activities = mPackageManager.queryIntentActivitiesAsUser(intent, + HEADLESS_APP_CHECK_FLAGS, UserHandle.USER_SYSTEM); + final ArraySet<String> ret = new ArraySet<>(); + for (ResolveInfo ri : activities) { + ret.add(ri.activityInfo.packageName); + } + return ret; + } + /** Call on system boot to get the initial set of headless system apps. */ private void loadHeadlessSystemAppCache() { - Slog.d(TAG, "Loading headless system app cache. appIdleEnabled=" + mAppIdleEnabled); + final long start = SystemClock.uptimeMillis(); final List<PackageInfo> packages = mPackageManager.getInstalledPackagesAsUser( HEADLESS_APP_CHECK_FLAGS, UserHandle.USER_SYSTEM); + + final Set<String> systemLauncherActivities = getSystemPackagesWithLauncherActivities(); + final int packageCount = packages.size(); for (int i = 0; i < packageCount; i++) { - PackageInfo pkgInfo = packages.get(i); - if (pkgInfo != null && evaluateSystemAppException(pkgInfo)) { + final PackageInfo pkgInfo = packages.get(i); + if (pkgInfo == null) { + continue; + } + final String pkg = pkgInfo.packageName; + final boolean isHeadLess = !systemLauncherActivities.contains(pkg); + + if (updateHeadlessSystemAppCache(pkg, isHeadLess)) { mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE, - UserHandle.USER_SYSTEM, -1, pkgInfo.packageName) + UserHandle.USER_SYSTEM, -1, pkg) .sendToTarget(); } } + final long end = SystemClock.uptimeMillis(); + Slog.d(TAG, "Loaded headless system app cache in " + (end - start) + " ms:" + + " appIdleEnabled=" + mAppIdleEnabled); } @Override diff --git a/core/api/current.txt b/core/api/current.txt index 0cadde1073d2..9edc2dfdb4e3 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -142,7 +142,7 @@ package android { field @Deprecated public static final String READ_INPUT_STATE = "android.permission.READ_INPUT_STATE"; field public static final String READ_LOGS = "android.permission.READ_LOGS"; field public static final String READ_MEDIA_AUDIO = "android.permission.READ_MEDIA_AUDIO"; - field public static final String READ_MEDIA_IMAGE = "android.permission.READ_MEDIA_IMAGE"; + field public static final String READ_MEDIA_IMAGES = "android.permission.READ_MEDIA_IMAGES"; field public static final String READ_MEDIA_VIDEO = "android.permission.READ_MEDIA_VIDEO"; field public static final String READ_NEARBY_STREAMING_POLICY = "android.permission.READ_NEARBY_STREAMING_POLICY"; field public static final String READ_PHONE_NUMBERS = "android.permission.READ_PHONE_NUMBERS"; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index b1bed63d6d0d..0b5e7279f38c 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -1700,20 +1700,22 @@ package android.app.cloudsearch { method @NonNull public String getTitle(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator<android.app.cloudsearch.SearchResult> CREATOR; + field public static final String EXTRAINFO_ACTION_APP_CARD = "android.app.cloudsearch.ACTION_APP_CARD"; field public static final String EXTRAINFO_ACTION_BUTTON_IMAGE_PREREGISTERING = "android.app.cloudsearch.ACTION_BUTTON_IMAGE"; field public static final String EXTRAINFO_ACTION_BUTTON_TEXT_PREREGISTERING = "android.app.cloudsearch.ACTION_BUTTON_TEXT"; + field public static final String EXTRAINFO_ACTION_INSTALL_BUTTON = "android.app.cloudsearch.ACTION_INSTALL_BUTTON"; field public static final String EXTRAINFO_APP_BADGES = "android.app.cloudsearch.APP_BADGES"; - field public static final String EXTRAINFO_APP_CARD_ACTION = "android.app.cloudsearch.APP_CARD_ACTION"; field public static final String EXTRAINFO_APP_CONTAINS_ADS_DISCLAIMER = "android.app.cloudsearch.APP_CONTAINS_ADS_DISCLAIMER"; field public static final String EXTRAINFO_APP_CONTAINS_IAP_DISCLAIMER = "android.app.cloudsearch.APP_CONTAINS_IAP_DISCLAIMER"; field public static final String EXTRAINFO_APP_DEVELOPER_NAME = "android.app.cloudsearch.APP_DEVELOPER_NAME"; field public static final String EXTRAINFO_APP_DOMAIN_URL = "android.app.cloudsearch.APP_DOMAIN_URL"; field public static final String EXTRAINFO_APP_IARC = "android.app.cloudsearch.APP_IARC"; field public static final String EXTRAINFO_APP_ICON = "android.app.cloudsearch.APP_ICON"; + field public static final String EXTRAINFO_APP_INSTALL_COUNT = "android.app.cloudsearch.APP_INSTALL_COUNT"; + field public static final String EXTRAINFO_APP_PACKAGE_NAME = "android.app.cloudsearch.APP_PACKAGE_NAME"; field public static final String EXTRAINFO_APP_REVIEW_COUNT = "android.app.cloudsearch.APP_REVIEW_COUNT"; field public static final String EXTRAINFO_APP_SIZE_BYTES = "android.app.cloudsearch.APP_SIZE_BYTES"; field public static final String EXTRAINFO_APP_STAR_RATING = "android.app.cloudsearch.APP_STAR_RATING"; - field public static final String EXTRAINFO_INSTALL_BUTTON_ACTION = "android.app.cloudsearch.INSTALL_BUTTON_ACTION"; field public static final String EXTRAINFO_LONG_DESCRIPTION = "android.app.cloudsearch.LONG_DESCRIPTION"; field public static final String EXTRAINFO_SCREENSHOTS = "android.app.cloudsearch.SCREENSHOTS"; field public static final String EXTRAINFO_SHORT_DESCRIPTION = "android.app.cloudsearch.SHORT_DESCRIPTION"; @@ -10295,6 +10297,7 @@ package android.provider { field public static final String NAMESPACE_MEDIA_NATIVE = "media_native"; field public static final String NAMESPACE_NETD_NATIVE = "netd_native"; field public static final String NAMESPACE_NNAPI_NATIVE = "nnapi_native"; + field public static final String NAMESPACE_ON_DEVICE_PERSONALIZATION = "on_device_personalization"; field public static final String NAMESPACE_OTA = "ota"; field public static final String NAMESPACE_PACKAGE_MANAGER_SERVICE = "package_manager_service"; field public static final String NAMESPACE_PERMISSIONS = "permissions"; diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index b1a4e4148eec..3d0ed20b60c6 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -868,6 +868,7 @@ public final class ActivityThread extends ClientTransactionHandler String processName; @UnsupportedAppUsage ApplicationInfo appInfo; + String sdkSandboxClientAppPackage; @UnsupportedAppUsage List<ProviderInfo> providers; ComponentName instrumentationName; @@ -1113,9 +1114,9 @@ public final class ActivityThread extends ClientTransactionHandler @Override public final void bindApplication(String processName, ApplicationInfo appInfo, - ProviderInfoList providerList, ComponentName instrumentationName, - ProfilerInfo profilerInfo, Bundle instrumentationArgs, - IInstrumentationWatcher instrumentationWatcher, + String sdkSandboxClientAppPackage, ProviderInfoList providerList, + ComponentName instrumentationName, ProfilerInfo profilerInfo, + Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher, IUiAutomationConnection instrumentationUiConnection, int debugMode, boolean enableBinderTracking, boolean trackAllocation, boolean isRestrictedBackupMode, boolean persistent, Configuration config, @@ -1155,6 +1156,7 @@ public final class ActivityThread extends ClientTransactionHandler AppBindData data = new AppBindData(); data.processName = processName; data.appInfo = appInfo; + data.sdkSandboxClientAppPackage = sdkSandboxClientAppPackage; data.providers = providerList.getList(); data.instrumentationName = instrumentationName; data.instrumentationArgs = instrumentationArgs; @@ -6536,6 +6538,9 @@ public final class ActivityThread extends ClientTransactionHandler } data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo); + if (data.sdkSandboxClientAppPackage != null) { + data.info.setSdkSandboxStorage(data.sdkSandboxClientAppPackage); + } if (agent != null) { handleAttachAgent(agent, data.info); diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 7c7c7ef382c1..4829dc085bd9 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -2367,7 +2367,7 @@ public class AppOpsManager { null, // no permission for OP_WRITE_MEDIA_AUDIO Manifest.permission.READ_MEDIA_VIDEO, null, // no permission for OP_WRITE_MEDIA_VIDEO - Manifest.permission.READ_MEDIA_IMAGE, + Manifest.permission.READ_MEDIA_IMAGES, null, // no permission for OP_WRITE_MEDIA_IMAGES null, // no permission for OP_LEGACY_STORAGE null, // no permission for OP_ACCESS_ACCESSIBILITY diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index a3dd705a7e29..f5eb1f6e24ed 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -1998,7 +1998,7 @@ class ContextImpl extends Context { private boolean bindServiceCommon(Intent service, ServiceConnection conn, int flags, String instanceName, Handler handler, Executor executor, UserHandle user) { // Keep this in sync with DevicePolicyManager.bindDeviceAdminServiceAsUser and - // ActivityManagerLocal.bindSupplementalProcessService + // ActivityManagerLocal.bindSdkSandboxService IServiceConnection sd; if (conn == null) { throw new IllegalArgumentException("connection is null"); diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl index 77657d58cc4c..f4fbcceeab8f 100644 --- a/core/java/android/app/IApplicationThread.aidl +++ b/core/java/android/app/IApplicationThread.aidl @@ -72,6 +72,7 @@ oneway interface IApplicationThread { @UnsupportedAppUsage void scheduleStopService(IBinder token); void bindApplication(in String packageName, in ApplicationInfo info, + in String sdkSandboxClientAppPackage, in ProviderInfoList providerList, in ComponentName testName, in ProfilerInfo profilerInfo, in Bundle testArguments, IInstrumentationWatcher testWatcher, IUiAutomationConnection uiAutomationConnection, diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index d35c5bebd301..deefea83c13d 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -37,6 +37,7 @@ import android.content.res.CompatibilityInfo; import android.content.res.Resources; import android.os.Build; import android.os.Bundle; +import android.os.Environment; import android.os.FileUtils; import android.os.GraphicsEnvironment; import android.os.Handler; @@ -411,6 +412,26 @@ public final class LoadedApk { } } + /** @hide */ + void setSdkSandboxStorage(String sdkSandboxClientAppPackage) { + int userId = UserHandle.myUserId(); + mDeviceProtectedDataDirFile = Environment + .getDataMiscDeSharedSdkSandboxDirectory(userId, sdkSandboxClientAppPackage) + .getAbsoluteFile(); + mCredentialProtectedDataDirFile = Environment + .getDataMiscCeSharedSdkSandboxDirectory(userId, sdkSandboxClientAppPackage) + .getAbsoluteFile(); + + if ((mApplicationInfo.privateFlags + & ApplicationInfo.PRIVATE_FLAG_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) != 0 + && PackageManager.APPLY_DEFAULT_TO_DEVICE_PROTECTED_STORAGE) { + mDataDirFile = mDeviceProtectedDataDirFile; + } else { + mDataDirFile = mCredentialProtectedDataDirFile; + } + mDataDir = mDataDirFile.getAbsolutePath(); + } + public static void makePaths(ActivityThread activityThread, ApplicationInfo aInfo, List<String> outZipPaths) { diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index c6e36a36701b..89854bbab3e8 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -844,6 +844,24 @@ public class StatusBarManager { } /** + * Sets an active {@link android.service.quicksettings.TileService} to listening state + * + * The {@code componentName}'s package must match the calling package. + * + * @param componentName the tile to set into listening state + * @see android.service.quicksettings.TileService#requestListeningState + * @hide + */ + public void requestTileServiceListeningState(@NonNull ComponentName componentName) { + Objects.requireNonNull(componentName); + try { + getService().requestTileServiceListeningState(componentName, mContext.getUserId()); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + /** * Request to the user to add a {@link android.service.quicksettings.TileService} * to the set of current QS tiles. * <p> diff --git a/core/java/android/app/cloudsearch/SearchResult.java b/core/java/android/app/cloudsearch/SearchResult.java index 1ca01d4afe61..c6583b65f9c2 100644 --- a/core/java/android/app/cloudsearch/SearchResult.java +++ b/core/java/android/app/cloudsearch/SearchResult.java @@ -71,8 +71,10 @@ public final class SearchResult implements Parcelable { EXTRAINFO_APP_BADGES, EXTRAINFO_ACTION_BUTTON_TEXT_PREREGISTERING, EXTRAINFO_ACTION_BUTTON_IMAGE_PREREGISTERING, - EXTRAINFO_APP_CARD_ACTION, - EXTRAINFO_INSTALL_BUTTON_ACTION, + EXTRAINFO_ACTION_APP_CARD, + EXTRAINFO_ACTION_INSTALL_BUTTON, + EXTRAINFO_APP_PACKAGE_NAME, + EXTRAINFO_APP_INSTALL_COUNT, EXTRAINFO_WEB_URL, EXTRAINFO_WEB_ICON}) public @interface SearchResultExtraInfoKey {} @@ -123,12 +125,18 @@ public final class SearchResult implements Parcelable { "android.app.cloudsearch.ACTION_BUTTON_IMAGE"; /** Intent for tapping the app card, PendingIntent expected. */ @SuppressLint("IntentName") - public static final String EXTRAINFO_APP_CARD_ACTION = - "android.app.cloudsearch.APP_CARD_ACTION"; + public static final String EXTRAINFO_ACTION_APP_CARD = + "android.app.cloudsearch.ACTION_APP_CARD"; /** Intent for tapping the install button, PendingIntent expected. */ @SuppressLint("IntentName") - public static final String EXTRAINFO_INSTALL_BUTTON_ACTION = - "android.app.cloudsearch.INSTALL_BUTTON_ACTION"; + public static final String EXTRAINFO_ACTION_INSTALL_BUTTON = + "android.app.cloudsearch.ACTION_INSTALL_BUTTON"; + /** App's package name, String value expected. */ + public static final String EXTRAINFO_APP_PACKAGE_NAME = + "android.app.cloudsearch.APP_PACKAGE_NAME"; + /** App's install count, double value expected. */ + public static final String EXTRAINFO_APP_INSTALL_COUNT = + "android.app.cloudsearch.APP_INSTALL_COUNT"; /** Web content's URL, String value expected. */ public static final String EXTRAINFO_WEB_URL = "android.app.cloudsearch.WEB_URL"; /** Web content's domain icon, android.graphics.drawable.Icon expected. */ diff --git a/core/java/android/content/pm/Signature.java b/core/java/android/content/pm/Signature.java index 3f5c5d21428e..d94b0d8f9072 100644 --- a/core/java/android/content/pm/Signature.java +++ b/core/java/android/content/pm/Signature.java @@ -312,7 +312,7 @@ public class Signature implements Parcelable { * @hide */ public static boolean areExactMatch(Signature[] a, Signature[] b) { - return (a.length == b.length) && ArrayUtils.containsAll(a, b) + return (ArrayUtils.size(a) == ArrayUtils.size(b)) && ArrayUtils.containsAll(a, b) && ArrayUtils.containsAll(b, a); } @@ -387,4 +387,4 @@ public class Signature implements Parcelable { return sPrime; } -}
\ No newline at end of file +} diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index de1dc8091b2a..5f9fdbfe7503 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -5655,6 +5655,7 @@ public abstract class BatteryStats implements Parcelable { .setMaxStatsAgeMs(0) .includePowerModels() .includeProcessStateData() + .includeVirtualUids() .build()); stats.dump(pw, prefix); diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java index 37bd51bb66c5..b3f4d9874f4e 100644 --- a/core/java/android/os/BatteryUsageStatsQuery.java +++ b/core/java/android/os/BatteryUsageStatsQuery.java @@ -42,6 +42,7 @@ public final class BatteryUsageStatsQuery implements Parcelable { FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL, FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY, FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA, + FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS, }) @Retention(RetentionPolicy.SOURCE) public @interface BatteryUsageStatsFlags {} @@ -69,6 +70,8 @@ public final class BatteryUsageStatsQuery implements Parcelable { public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA = 0x0008; + public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS = 0x0010; + private static final long DEFAULT_MAX_STATS_AGE_MS = 5 * 60 * 1000; private final int mFlags; @@ -271,6 +274,15 @@ public final class BatteryUsageStatsQuery implements Parcelable { } /** + * Requests to return attribution data for virtual UIDs such as + * {@link Process#SDK_SANDBOX_VIRTUAL_UID}. + */ + public Builder includeVirtualUids() { + mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS; + return this; + } + + /** * Requests to aggregate stored snapshots between the two supplied timestamps * @param fromTimestamp Exclusive starting timestamp, as per System.currentTimeMillis() * @param toTimestamp Inclusive ending timestamp, as per System.currentTimeMillis() diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 0a7a40798d71..ecdc803c0074 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -478,10 +478,20 @@ public class Environment { } /** {@hide} */ + public static File getDataMiscCeSharedSdkSandboxDirectory(int userId, String packageName) { + return buildPath(getDataMiscCeDirectory(userId), "sdksandbox", packageName, "shared"); + } + + /** {@hide} */ public static File getDataMiscDeDirectory(int userId) { return buildPath(getDataDirectory(), "misc_de", String.valueOf(userId)); } + /** {@hide} */ + public static File getDataMiscDeSharedSdkSandboxDirectory(int userId, String packageName) { + return buildPath(getDataMiscDeDirectory(userId), "sdksandbox", packageName, "shared"); + } + private static File getDataProfilesDeDirectory(int userId) { return buildPath(getDataDirectory(), "misc", "profiles", "cur", String.valueOf(userId)); } diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java index a1ff923e3b94..77d1498e1597 100644 --- a/core/java/android/os/UidBatteryConsumer.java +++ b/core/java/android/os/UidBatteryConsumer.java @@ -202,20 +202,24 @@ public final class UidBatteryConsumer extends BatteryConsumer { private static final String PACKAGE_NAME_UNINITIALIZED = ""; private final BatteryStats.Uid mBatteryStatsUid; private final int mUid; + private final boolean mIsVirtualUid; private String mPackageWithHighestDrain = PACKAGE_NAME_UNINITIALIZED; private boolean mExcludeFromBatteryUsageStats; public Builder(BatteryConsumerData data, @NonNull BatteryStats.Uid batteryStatsUid) { - super(data, CONSUMER_TYPE_UID); - mBatteryStatsUid = batteryStatsUid; - mUid = batteryStatsUid.getUid(); - data.putLong(COLUMN_INDEX_UID, mUid); + this(data, batteryStatsUid, batteryStatsUid.getUid()); } public Builder(BatteryConsumerData data, int uid) { + this(data, null, uid); + } + + private Builder(BatteryConsumerData data, @Nullable BatteryStats.Uid batteryStatsUid, + int uid) { super(data, CONSUMER_TYPE_UID); - mBatteryStatsUid = null; + mBatteryStatsUid = batteryStatsUid; mUid = uid; + mIsVirtualUid = mUid == Process.SDK_SANDBOX_VIRTUAL_UID; data.putLong(COLUMN_INDEX_UID, mUid); } @@ -232,6 +236,10 @@ public final class UidBatteryConsumer extends BatteryConsumer { return mUid; } + public boolean isVirtualUid() { + return mIsVirtualUid; + } + /** * Sets the name of the package owned by this UID that consumed the highest amount * of power since BatteryStats reset. diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index 052e4d0538f2..6982b3afbb39 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -322,6 +322,13 @@ public final class DeviceConfig { public static final String NAMESPACE_NNAPI_NATIVE = "nnapi_native"; /** + * Namespace for all OnDevicePersonalization related feature. + * @hide + */ + @SystemApi + public static final String NAMESPACE_ON_DEVICE_PERSONALIZATION = "on_device_personalization"; + + /** * Namespace for features related to the Package Manager Service. * * @hide diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java index b507328d21a1..0829d2813c83 100644 --- a/core/java/android/service/quicksettings/TileService.java +++ b/core/java/android/service/quicksettings/TileService.java @@ -15,18 +15,19 @@ */ package android.service.quicksettings; -import android.Manifest; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; import android.annotation.TestApi; import android.app.Dialog; import android.app.Service; +import android.app.StatusBarManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.drawable.Icon; +import android.os.Build; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -147,13 +148,6 @@ public class TileService extends Service { "android.service.quicksettings.TOGGLEABLE_TILE"; /** - * Used to notify SysUI that Listening has be requested. - * @hide - */ - public static final String ACTION_REQUEST_LISTENING = - "android.service.quicksettings.action.REQUEST_LISTENING"; - - /** * @hide */ public static final String EXTRA_SERVICE = "service"; @@ -482,14 +476,24 @@ public class TileService extends Service { * * This method is only applicable to tiles that have {@link #META_DATA_ACTIVE_TILE} defined * as true on their TileService Manifest declaration, and will do nothing otherwise. + * + * For apps targeting {@link Build.VERSION_CODES#TIRAMISU} or later, this call may throw + * the following exceptions if the request is not valid: + * <ul> + * <li> {@link NullPointerException} if {@code component} is {@code null}.</li> + * <li> {@link SecurityException} if the package of {@code component} does not match + * the calling package or if the calling user cannot act on behalf of the user from the + * {@code context}.</li> + * <li> {@link IllegalArgumentException} if the user of the {@code context} is not the + * current user.</li> + * </ul> */ public static final void requestListeningState(Context context, ComponentName component) { - final ComponentName sysuiComponent = ComponentName.unflattenFromString( - context.getResources().getString( - com.android.internal.R.string.config_systemUIServiceComponent)); - Intent intent = new Intent(ACTION_REQUEST_LISTENING); - intent.putExtra(Intent.EXTRA_COMPONENT_NAME, component); - intent.setPackage(sysuiComponent.getPackageName()); - context.sendBroadcast(intent, Manifest.permission.BIND_QUICK_SETTINGS_TILE); + StatusBarManager sbm = context.getSystemService(StatusBarManager.class); + if (sbm == null) { + Log.e(TAG, "No StatusBarManager service found"); + return; + } + sbm.requestTileServiceListeningState(component); } } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index a45535a08cf4..e79bdcef3507 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -873,6 +873,7 @@ public final class ViewRootImpl implements ViewParent, mDensity = context.getResources().getDisplayMetrics().densityDpi; mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi; mFallbackEventHandler = new PhoneFallbackEventHandler(context); + // TODO(b/222696368): remove getSfInstance usage and use vsyncId for transactions mChoreographer = useSfChoreographer ? Choreographer.getSfInstance() : Choreographer.getInstance(); mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE); @@ -1777,6 +1778,7 @@ public final class ViewRootImpl implements ViewParent, updateInternalDisplay(displayId, mView.getResources()); mImeFocusController.onMovedToDisplay(); mAttachInfo.mDisplayState = mDisplay.getState(); + mDisplayInstallOrientation = mDisplay.getInstallOrientation(); // Internal state updated, now notify the view hierarchy. mView.dispatchMovedToDisplay(mDisplay, config); } diff --git a/core/java/com/android/internal/graphics/SfVsyncFrameCallbackProvider.java b/core/java/com/android/internal/graphics/SfVsyncFrameCallbackProvider.java index 45555bf98071..dbbe4b9675d7 100644 --- a/core/java/com/android/internal/graphics/SfVsyncFrameCallbackProvider.java +++ b/core/java/com/android/internal/graphics/SfVsyncFrameCallbackProvider.java @@ -24,6 +24,7 @@ import android.view.Choreographer; * * @hide */ +// TODO(b/222698397): remove getSfInstance/this class usage and use vsyncId for transactions public final class SfVsyncFrameCallbackProvider implements AnimationFrameCallbackProvider { private final Choreographer mChoreographer; diff --git a/core/java/com/android/internal/os/AudioPowerCalculator.java b/core/java/com/android/internal/os/AudioPowerCalculator.java index f9310b0c28d9..ebf0ca263a62 100644 --- a/core/java/com/android/internal/os/AudioPowerCalculator.java +++ b/core/java/com/android/internal/os/AudioPowerCalculator.java @@ -78,7 +78,9 @@ public class AudioPowerCalculator extends PowerCalculator { final double powerMah = mPowerEstimator.calculatePower(durationMs); app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, powerMah); - total.durationMs += durationMs; - total.powerMah += powerMah; + if (!app.isVirtualUid()) { + total.durationMs += durationMs; + total.powerMah += powerMah; + } } } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 70b96392b0e5..52539566351b 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -546,9 +546,9 @@ public class BatteryStatsImpl extends BatteryStats { final LongArrayMultiStateCounter onBatteryScreenOffCounter = u.getProcStateScreenOffTimeCounter().getCounter(); - if (uid == parentUid) { - mKernelSingleUidTimeReader.addDelta(uid, onBatteryCounter, timestampMs); - mKernelSingleUidTimeReader.addDelta(uid, onBatteryScreenOffCounter, + if (uid == parentUid || Process.isSdkSandboxUid(uid)) { + mKernelSingleUidTimeReader.addDelta(parentUid, onBatteryCounter, timestampMs); + mKernelSingleUidTimeReader.addDelta(parentUid, onBatteryScreenOffCounter, timestampMs); } else { Uid.ChildUid childUid = u.getChildUid(uid); @@ -4560,7 +4560,10 @@ public class BatteryStatsImpl extends BatteryStats { mIsolatedUidRefCounts.put(uid, refCount + 1); } - public int mapUid(int uid) { + private int mapUid(int uid) { + if (Process.isSdkSandboxUid(uid)) { + return Process.getAppUidForSdkSandboxUid(uid); + } int isolated = mIsolatedUids.get(uid, -1); return isolated > 0 ? isolated : uid; } @@ -4656,16 +4659,18 @@ public class BatteryStatsImpl extends BatteryStats { long elapsedRealtimeMs, long uptimeMs) { int parentUid = mapUid(uid); if (uid != parentUid) { - // Isolated UIDs process state is already rolled up into parent, so no need to track - // Otherwise the parent's process state will get downgraded incorrectly - return; + if (Process.isIsolated(uid)) { + // Isolated UIDs process state is already rolled up into parent, so no need to track + // Otherwise the parent's process state will get downgraded incorrectly + return; + } } // TODO(b/155216561): It is possible for isolated uids to be in a higher // state than its parent uid. We should track the highest state within the union of host // and isolated uids rather than only the parent uid. FrameworkStatsLog.write(FrameworkStatsLog.UID_PROCESS_STATE_CHANGED, uid, ActivityManager.processStateAmToProto(state)); - getUidStatsLocked(uid, elapsedRealtimeMs, uptimeMs) + getUidStatsLocked(parentUid, elapsedRealtimeMs, uptimeMs) .updateUidProcessStateLocked(state, elapsedRealtimeMs, uptimeMs); } @@ -15970,6 +15975,9 @@ public class BatteryStatsImpl extends BatteryStats { public Uid getUidStatsLocked(int uid, long elapsedRealtimeMs, long uptimeMs) { Uid u = mUidStats.get(uid); if (u == null) { + if (Process.isSdkSandboxUid(uid)) { + Log.wtf(TAG, "Tracking an SDK Sandbox UID"); + } u = new Uid(this, uid, elapsedRealtimeMs, uptimeMs); mUidStats.put(uid, u); } diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java index a1c1917fd83e..81c6ee71e060 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java @@ -22,6 +22,7 @@ import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.Parcel; +import android.os.Process; import android.os.SystemClock; import android.os.UidBatteryConsumer; import android.util.Log; @@ -162,6 +163,8 @@ public class BatteryUsageStatsProvider { final boolean includeProcessStateData = ((query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA) != 0) && mStats.isProcessStateDataAvailable(); + final boolean includeVirtualUids = ((query.getFlags() + & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS) != 0); final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder( mStats.getCustomEnergyConsumerNames(), includePowerModels, @@ -174,6 +177,10 @@ public class BatteryUsageStatsProvider { SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats(); for (int i = uidStats.size() - 1; i >= 0; i--) { final BatteryStats.Uid uid = uidStats.valueAt(i); + if (!includeVirtualUids && uid.getUid() == Process.SDK_SANDBOX_VIRTUAL_UID) { + continue; + } + batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uid) .setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND, getProcessBackgroundTimeMs(uid, realtimeUs)) diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java index 2ebf689e2c7f..e52c8a3a3efb 100644 --- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java +++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java @@ -139,8 +139,10 @@ public class BluetoothPowerCalculator extends PowerCalculator { BatteryConsumer.POWER_COMPONENT_BLUETOOTH, powerAndDuration.powerMah, powerModel); - powerAndDuration.totalDurationMs += powerAndDuration.durationMs; - powerAndDuration.totalPowerMah += powerAndDuration.powerMah; + if (!app.isVirtualUid()) { + powerAndDuration.totalDurationMs += powerAndDuration.durationMs; + powerAndDuration.totalPowerMah += powerAndDuration.powerMah; + } if (query.isProcessStateDataNeeded() && powerAndDuration.keys != null) { for (int j = 0; j < powerAndDuration.keys.length; j++) { diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java index 1fc2baf040b6..8704e936c747 100644 --- a/core/java/com/android/internal/os/CpuPowerCalculator.java +++ b/core/java/com/android/internal/os/CpuPowerCalculator.java @@ -117,7 +117,9 @@ public class CpuPowerCalculator extends PowerCalculator { } } calculateApp(app, app.getBatteryStatsUid(), query, result, keys); - totalPowerMah += result.powerMah; + if (!app.isVirtualUid()) { + totalPowerMah += result.powerMah; + } } final long consumptionUC = batteryStats.getCpuMeasuredBatteryConsumptionUC(); diff --git a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java index cbbb52621111..0853bd801137 100644 --- a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java +++ b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java @@ -96,7 +96,9 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator { app.setConsumedPowerForCustomComponent( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i, customMeasuredPowerMah[i]); - newTotalPowerMah[i] += customMeasuredPowerMah[i]; + if (!app.isVirtualUid()) { + newTotalPowerMah[i] += customMeasuredPowerMah[i]; + } } } return newTotalPowerMah; diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java index 0f783062f3e7..070783a04105 100644 --- a/core/java/com/android/internal/os/GnssPowerCalculator.java +++ b/core/java/com/android/internal/os/GnssPowerCalculator.java @@ -58,8 +58,11 @@ public class GnssPowerCalculator extends PowerCalculator { final long consumptionUC = app.getBatteryStatsUid().getGnssMeasuredBatteryConsumptionUC(); final int powerModel = getPowerModel(consumptionUC, query); - appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), powerModel, + final double powerMah = calculateApp(app, app.getBatteryStatsUid(), powerModel, rawRealtimeUs, averageGnssPowerMa, consumptionUC); + if (!app.isVirtualUid()) { + appsPowerMah += powerMah; + } } final long consumptionUC = batteryStats.getGnssMeasuredBatteryConsumptionUC(); diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java index f4624de289be..d0df45c9af65 100644 --- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java +++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java @@ -136,12 +136,14 @@ public class MobileRadioPowerCalculator extends PowerCalculator { PowerAndDuration total, BatteryUsageStatsQuery query, BatteryConsumer.Key[] keys) { final long radioActiveDurationMs = calculateDuration(u, BatteryStats.STATS_SINCE_CHARGED); - total.totalAppDurationMs += radioActiveDurationMs; - final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC(); final int powerModel = getPowerModel(consumptionUC, query); final double powerMah = calculatePower(u, powerModel, radioActiveDurationMs, consumptionUC); - total.totalAppPowerMah += powerMah; + + if (!app.isVirtualUid()) { + total.totalAppDurationMs += radioActiveDurationMs; + total.totalAppPowerMah += powerMah; + } app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, radioActiveDurationMs) diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java index 67d3d6e7bede..5ca1a857fbcd 100644 --- a/core/java/com/android/internal/os/ScreenPowerCalculator.java +++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java @@ -96,8 +96,10 @@ public class ScreenPowerCalculator extends PowerCalculator { appPowerAndDuration.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, appPowerAndDuration.powerMah, powerModel); - totalAppPower += appPowerAndDuration.powerMah; - totalAppDuration += appPowerAndDuration.durationMs; + if (!app.isVirtualUid()) { + totalAppPower += appPowerAndDuration.powerMah; + totalAppDuration += appPowerAndDuration.durationMs; + } } break; case BatteryConsumer.POWER_MODEL_POWER_PROFILE: @@ -192,10 +194,13 @@ public class ScreenPowerCalculator extends PowerCalculator { long totalActivityTimeMs = 0; final SparseLongArray activityTimeArray = new SparseLongArray(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { - final BatteryStats.Uid uid = uidBatteryConsumerBuilders.valueAt(i).getBatteryStatsUid(); + final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); + final BatteryStats.Uid uid = app.getBatteryStatsUid(); final long timeMs = getProcessForegroundTimeMs(uid, rawRealtimeUs); activityTimeArray.put(uid.getUid(), timeMs); - totalActivityTimeMs += timeMs; + if (!app.isVirtualUid()) { + totalActivityTimeMs += timeMs; + } } if (totalActivityTimeMs >= MIN_ACTIVE_TIME_FOR_SMEARING) { diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java index 4a9c91d14c4c..573692ea63f3 100644 --- a/core/java/com/android/internal/os/SensorPowerCalculator.java +++ b/core/java/com/android/internal/os/SensorPowerCalculator.java @@ -51,7 +51,9 @@ public class SensorPowerCalculator extends PowerCalculator { builder.getUidBatteryConsumerBuilders(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); - appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs); + if (!app.isVirtualUid()) { + appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs); + } } builder.getAggregateBatteryConsumerBuilder( diff --git a/core/java/com/android/internal/os/UserPowerCalculator.java b/core/java/com/android/internal/os/UserPowerCalculator.java index 22cff6e2435a..79e3a195dc82 100644 --- a/core/java/com/android/internal/os/UserPowerCalculator.java +++ b/core/java/com/android/internal/os/UserPowerCalculator.java @@ -49,7 +49,11 @@ public class UserPowerCalculator extends PowerCalculator { builder.getUidBatteryConsumerBuilders(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { - UidBatteryConsumer.Builder uidBuilder = uidBatteryConsumerBuilders.valueAt(i); + final UidBatteryConsumer.Builder uidBuilder = uidBatteryConsumerBuilders.valueAt(i); + if (uidBuilder.isVirtualUid()) { + continue; + } + final int uid = uidBuilder.getUid(); if (UserHandle.getAppId(uid) < Process.FIRST_APPLICATION_UID) { continue; diff --git a/core/java/com/android/internal/os/VideoPowerCalculator.java b/core/java/com/android/internal/os/VideoPowerCalculator.java index a222bcb4dfbf..2daf15eb14a6 100644 --- a/core/java/com/android/internal/os/VideoPowerCalculator.java +++ b/core/java/com/android/internal/os/VideoPowerCalculator.java @@ -75,7 +75,9 @@ public class VideoPowerCalculator extends PowerCalculator { final double powerMah = mPowerEstimator.calculatePower(durationMs); app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO, durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO, powerMah); - total.durationMs += durationMs; - total.powerMah += powerMah; + if (!app.isVirtualUid()) { + total.durationMs += durationMs; + total.powerMah += powerMah; + } } } diff --git a/core/java/com/android/internal/os/WakelockPowerCalculator.java b/core/java/com/android/internal/os/WakelockPowerCalculator.java index 0251e1ccc885..3ae7113faf71 100644 --- a/core/java/com/android/internal/os/WakelockPowerCalculator.java +++ b/core/java/com/android/internal/os/WakelockPowerCalculator.java @@ -62,8 +62,10 @@ public class WakelockPowerCalculator extends PowerCalculator { BatteryStats.STATS_SINCE_CHARGED); app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.durationMs) .setConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.powerMah); - totalAppDurationMs += result.durationMs; - appPowerMah += result.powerMah; + if (!app.isVirtualUid()) { + totalAppDurationMs += result.durationMs; + appPowerMah += result.powerMah; + } if (app.getUid() == Process.ROOT_UID) { osBatteryConsumer = app; diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java index 8c3fb86331b2..2181821dd55a 100644 --- a/core/java/com/android/internal/os/WifiPowerCalculator.java +++ b/core/java/com/android/internal/os/WifiPowerCalculator.java @@ -111,9 +111,10 @@ public class WifiPowerCalculator extends PowerCalculator { calculateApp(powerDurationAndTraffic, app.getBatteryStatsUid(), powerModel, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, batteryStats.hasWifiActivityReporting(), consumptionUC); - - totalAppDurationMs += powerDurationAndTraffic.durationMs; - totalAppPowerMah += powerDurationAndTraffic.powerMah; + if (!app.isVirtualUid()) { + totalAppDurationMs += powerDurationAndTraffic.durationMs; + totalAppPowerMah += powerDurationAndTraffic.powerMah; + } app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI, powerDurationAndTraffic.durationMs); diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index d629d66d1c31..089179dbba27 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -297,6 +297,11 @@ oneway interface IStatusBar */ void runGcForTest(); + /** + * Send a request to SystemUI to put a given active tile in listening state + */ + void requestTileServiceListeningState(in ComponentName componentName); + void requestAddTile(in ComponentName componentName, in CharSequence appName, in CharSequence label, in Icon icon, in IAddTileResultCallback callback); void cancelRequestAddTile(in String packageName); diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index 1d60c501a88b..2ee5e797b4ab 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -91,7 +91,7 @@ interface IStatusBarService void onBubbleNotificationSuppressionChanged(String key, boolean isNotifSuppressed, boolean isBubbleSuppressed); void hideCurrentInputMethodForBubbles(); void grantInlineReplyUriPermission(String key, in Uri uri, in UserHandle user, String packageName); - void clearInlineReplyUriPermissions(String key); + oneway void clearInlineReplyUriPermissions(String key); void onNotificationFeedbackReceived(String key, in Bundle feedback); void onGlobalActionsShown(); @@ -171,6 +171,11 @@ interface IStatusBarService */ void suppressAmbientDisplay(boolean suppress); + /** + * Send a request to SystemUI to put a given active tile in listening state + */ + void requestTileServiceListeningState(in ComponentName componentName, int userId); + void requestAddTile(in ComponentName componentName, in CharSequence label, in Icon icon, int userId, in IAddTileResultCallback callback); void cancelRequestAddTile(in String packageName); diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index f83579207e31..521b2f6afa0f 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -1135,7 +1135,7 @@ public class LockPatternUtils { public List<ComponentName> getEnabledTrustAgents(int userId) { String serialized = getString(ENABLED_TRUST_AGENTS, userId); if (TextUtils.isEmpty(serialized)) { - return null; + return new ArrayList<ComponentName>(); } String[] split = serialized.split(","); ArrayList<ComponentName> activeTrustAgents = new ArrayList<ComponentName>(split.length); diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index eedf7fa34a04..eba6cca76389 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -1567,6 +1567,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_graphics_classes), REG_JNI(register_android_graphics_BLASTBufferQueue), REG_JNI(register_android_graphics_GraphicBuffer), + REG_JNI(register_android_graphics_GraphicsStatsService), REG_JNI(register_android_graphics_SurfaceTexture), REG_JNI(register_android_database_CursorWindow), REG_JNI(register_android_database_SQLiteConnection), diff --git a/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp b/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp index 0c05da551c8f..679a4f070290 100644 --- a/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp +++ b/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp @@ -34,6 +34,7 @@ #include <sys/mman.h> #include <sys/types.h> #include <sys/socket.h> +#include <sys/system_properties.h> #include <vector> namespace android { @@ -43,10 +44,10 @@ using android::base::StringPrintf; using android::zygote::ZygoteFailure; // WARNING: Knows a little about the wire protocol used to communicate with Zygote. -// TODO: Fix error handling. +// Commands and nice names have large arbitrary size limits to avoid dynamic memory allocation. constexpr size_t MAX_COMMAND_BYTES = 32768; -constexpr size_t NICE_NAME_BYTES = 50; +constexpr size_t NICE_NAME_BYTES = 128; // A buffer optionally bundled with a file descriptor from which we can fill it. // Does not own the file descriptor; destroying a NativeCommandBuffer does not @@ -190,6 +191,9 @@ class NativeCommandBuffer { size_t copy_len = std::min(name_len, NICE_NAME_BYTES - 1); memcpy(mNiceName, arg_start + NN_LENGTH, copy_len); mNiceName[copy_len] = '\0'; + if (haveWrapProperty()) { + return false; + } continue; } if (arg_end - arg_start == IW_LENGTH @@ -222,6 +226,8 @@ class NativeCommandBuffer { } saw_setgid = true; } + // ro.debuggable can be handled entirely in the child unless --invoke-with is also specified. + // Thus we do not need to check it here. } return saw_runtime_args && saw_setuid && saw_setgid; } @@ -249,6 +255,14 @@ class NativeCommandBuffer { } private: + bool haveWrapProperty() { + static const char* WRAP = "wrap."; + static const size_t WRAP_LENGTH = strlen(WRAP); + char propNameBuf[WRAP_LENGTH + NICE_NAME_BYTES]; + strcpy(propNameBuf, WRAP); + strlcpy(propNameBuf + WRAP_LENGTH, mNiceName, NICE_NAME_BYTES); + return __system_property_find(propNameBuf) != nullptr; + } // Picky version of atoi(). No sign or unexpected characters allowed. Return -1 on failure. static int digitsVal(char* start, char* end) { int result = 0; @@ -269,7 +283,7 @@ class NativeCommandBuffer { uint32_t mNext; // Index of first character past last line returned by readLine. int32_t mLinesLeft; // Lines in current command that haven't yet been read. int mFd; // Open file descriptor from which we can read more. -1 if none. - char mNiceName[NICE_NAME_BYTES]; + char mNiceName[NICE_NAME_BYTES]; // Always null terminated. char mBuffer[MAX_COMMAND_BYTES]; }; @@ -372,6 +386,7 @@ jboolean com_android_internal_os_ZygoteCommandBuffer_nativeForkRepeatedly( jint minUid, jstring managed_nice_name) { + ALOGI("Entering forkRepeatedly native zygote loop"); NativeCommandBuffer* n_buffer = reinterpret_cast<NativeCommandBuffer*>(j_buffer); int session_socket = n_buffer->getFd(); std::vector<int> session_socket_fds {session_socket}; @@ -400,7 +415,8 @@ jboolean com_android_internal_os_ZygoteCommandBuffer_nativeForkRepeatedly( socklen_t cred_size = sizeof credentials; if (getsockopt(n_buffer->getFd(), SOL_SOCKET, SO_PEERCRED, &credentials, &cred_size) == -1 || cred_size != sizeof credentials) { - fail_fn_1(CREATE_ERROR("ForkMany failed to get initial credentials, %s", strerror(errno))); + fail_fn_1(CREATE_ERROR("ForkRepeatedly failed to get initial credentials, %s", + strerror(errno))); } bool first_time = true; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index becac7f96428..10cb47ede31d 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1030,10 +1030,10 @@ targetSdkVersion}</a> of {@link android.os.Build.VERSION_CODES#S} or lower, this permission must not be used and the READ_EXTERNAL_STORAGE permission must be used instead. <p>Protection level: dangerous --> - <permission android:name="android.permission.READ_MEDIA_IMAGE" + <permission android:name="android.permission.READ_MEDIA_IMAGES" android:permissionGroup="android.permission-group.UNDEFINED" - android:label="@string/permlab_readMediaImage" - android:description="@string/permdesc_readMediaImage" + android:label="@string/permlab_readMediaImages" + android:description="@string/permdesc_readMediaImages" android:protectionLevel="dangerous" /> <!-- Allows an application to write to external storage. diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 0a572be35023..269aa1bb7729 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2723,7 +2723,7 @@ <string name="config_bandwidthEstimateSource">bandwidth_estimator</string> <!-- Whether force to enable telephony new data stack or not --> - <bool name="config_force_enable_telephony_new_data_stack">true</bool> + <bool name="config_force_enable_telephony_new_data_stack">false</bool> <!-- Whether WiFi display is supported by this device. There are many prerequisites for this feature to work correctly. @@ -2988,6 +2988,12 @@ </string-array> + <!-- When migrating notification settings into the permission framework, whether all existing + apps should be marked as 'user-set' (true) or whether only the apps that have explicitly + modified notification settings should be marked as 'user-set' (false). Users will not see + system generated permission prompts for 'user-set' apps. --> + <bool name="config_notificationForceUserSetOnUpgrade">true</bool> + <!-- Default Gravity setting for the system Toast view. Equivalent to: Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM --> <integer name="config_toastDefaultGravity">0x00000051</integer> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 5de8feca01dc..04a70cb67d8c 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1918,9 +1918,9 @@ <string name="permdesc_readMediaVideo">Allows the app to read video files from your shared storage.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. "shared storage" refers to a storage space on the device that all apps with this permission can read from. [CHAR LIMIT=none] --> - <string name="permlab_readMediaImage">read image files from shared storage</string> + <string name="permlab_readMediaImages">read image files from shared storage</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. "shared storage" refers to a storage space on the device that all apps with this permission can read from. [CHAR LIMIT=none] --> - <string name="permdesc_readMediaImage">Allows the app to read image files from your shared storage.</string> + <string name="permdesc_readMediaImages">Allows the app to read image files from your shared storage.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. "shared storage" refers to a storage space on the device that all apps with this permission can write to. [CHAR LIMIT=none] --> <string name="permlab_sdcardWrite">modify or delete the contents of your shared storage</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6f34b3f899f1..1f0b22b9e460 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4770,5 +4770,6 @@ <java-symbol type="integer" name="config_bg_current_drain_exempted_types" /> <java-symbol type="bool" name="config_bg_current_drain_high_threshold_by_bg_location" /> <java-symbol type="drawable" name="ic_swap_horiz" /> + <java-symbol type="bool" name="config_notificationForceUserSetOnUpgrade" /> </resources> diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index 5c9044c56f95..beadc4464516 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -424,6 +424,7 @@ public class TransactionParcelTests { @Override public void bindApplication(String s, ApplicationInfo applicationInfo, + String sdkSandboxClientAppPackage, ProviderInfoList list, ComponentName componentName, ProfilerInfo profilerInfo, Bundle bundle, IInstrumentationWatcher iInstrumentationWatcher, IUiAutomationConnection iUiAutomationConnection, int i, boolean b, boolean b1, diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java index 0e394c1ec7fd..bfb34499984b 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java @@ -30,6 +30,7 @@ import junit.framework.TestCase; public class BatteryStatsSensorTest extends TestCase { private static final int UID = 10500; + private static final int UID_2 = 10501; // second uid for testing pool usage private static final int SENSOR_ID = -10000; @SmallTest @@ -239,7 +240,6 @@ public class BatteryStatsSensorTest extends TestCase { @SmallTest public void testPooledBackgroundUsage() throws Exception { - final int UID_2 = 20000; // second uid for testing pool usage final MockClock clocks = new MockClock(); MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); bi.mForceOnBattery = true; diff --git a/core/tests/utiltests/src/com/android/internal/util/LockPatternUtilsTest.java b/core/tests/utiltests/src/com/android/internal/util/LockPatternUtilsTest.java index b659f37690a3..940ca96fac4f 100644 --- a/core/tests/utiltests/src/com/android/internal/util/LockPatternUtilsTest.java +++ b/core/tests/utiltests/src/com/android/internal/util/LockPatternUtilsTest.java @@ -19,14 +19,20 @@ package com.android.internal.util; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_MANAGED; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.ComponentName; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.UserInfo; @@ -50,6 +56,7 @@ import org.junit.runner.RunWith; import org.mockito.Mockito; import java.nio.charset.StandardCharsets; +import java.util.List; @RunWith(AndroidJUnit4.class) @SmallTest @@ -164,6 +171,16 @@ public class LockPatternUtilsTest { verify(ils).isWeakEscrowTokenValid(eq(testHandle), eq(testToken), eq(testUserId)); } + @Test + public void testGetEnabledTrustAgentsNotNull() throws RemoteException { + int testUserId = 10; + ILockSettings ils = createTestLockSettings(); + when(ils.getString(anyString(), any(), anyInt())).thenReturn(""); + List<ComponentName> trustAgents = mLockPatternUtils.getEnabledTrustAgents(testUserId); + assertNotNull(trustAgents); + assertEquals(0, trustAgents.size()); + } + private ILockSettings createTestLockSettings() { final Context context = spy(new ContextWrapper(InstrumentationRegistry.getTargetContext())); mLockPatternUtils = spy(new LockPatternUtils(context)); diff --git a/data/etc/platform.xml b/data/etc/platform.xml index 88920c865511..a8293397d7df 100644 --- a/data/etc/platform.xml +++ b/data/etc/platform.xml @@ -241,7 +241,7 @@ </split-permission> <split-permission name="android.permission.READ_EXTERNAL_STORAGE" targetSdk="33"> - <new-permission name="android.permission.READ_MEDIA_IMAGE" /> + <new-permission name="android.permission.READ_MEDIA_IMAGES" /> </split-permission> <split-permission name="android.permission.BLUETOOTH" targetSdk="31"> diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index ffaa4ea51452..c1addbf43937 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -1098,19 +1098,16 @@ public class RippleDrawable extends LayerDrawable { } // Draw the appropriate mask anchored to (0,0). + final int saveCount = mMaskCanvas.save(); final int left = bounds.left; final int top = bounds.top; - if (mState.mRippleStyle == STYLE_SOLID) { - mMaskCanvas.translate(-left, -top); - } + mMaskCanvas.translate(-left, -top); if (maskType == MASK_EXPLICIT) { drawMask(mMaskCanvas); } else if (maskType == MASK_CONTENT) { drawContent(mMaskCanvas); } - if (mState.mRippleStyle == STYLE_SOLID) { - mMaskCanvas.translate(left, top); - } + mMaskCanvas.restoreToCount(saveCount); if (mState.mRippleStyle == STYLE_PATTERNED) { for (int i = 0; i < mRunningAnimations.size(); i++) { mRunningAnimations.get(i).getProperties().getShader().setShader(mMaskShader); @@ -1210,9 +1207,13 @@ public class RippleDrawable extends LayerDrawable { updateMaskShaderIfNeeded(); // Position the shader to account for canvas translation. - if (mMaskShader != null && mState.mRippleStyle == STYLE_SOLID) { + if (mMaskShader != null) { final Rect bounds = getBounds(); - mMaskMatrix.setTranslate(bounds.left - x, bounds.top - y); + if (mState.mRippleStyle == STYLE_PATTERNED) { + mMaskMatrix.setTranslate(bounds.left, bounds.top); + } else { + mMaskMatrix.setTranslate(bounds.left - x, bounds.top - y); + } mMaskShader.setLocalMatrix(mMaskMatrix); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipInputConsumer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipInputConsumer.java index e57abc28bd0a..0f3ff36601fb 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipInputConsumer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipInputConsumer.java @@ -148,6 +148,7 @@ public class PipInputConsumer { mMainExecutor.execute(() -> { // Choreographer.getSfInstance() must be called on the thread that the input event // receiver should be receiving events + // TODO(b/222697646): remove getSfInstance usage and use vsyncId for transactions mInputEventReceiver = new InputEventReceiver(inputChannel, Looper.myLooper(), Choreographer.getSfInstance()); if (mRegistrationListener != null) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java index f3789fd5a3d6..fa0f0925a08a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java @@ -95,6 +95,8 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, final FrameCallbackScheduler scheduler = new FrameCallbackScheduler() { @Override public void postFrameCallback(@androidx.annotation.NonNull Runnable runnable) { + // TODO(b/222697646): remove getSfInstance usage and use vsyncId for + // transactions Choreographer.getSfInstance().postFrameCallback(t -> runnable.run()); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java index c816f18c2fc2..abf1a9500e6d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java @@ -625,6 +625,7 @@ public class PipResizeGestureHandler { class PipResizeInputEventReceiver extends BatchedInputEventReceiver { PipResizeInputEventReceiver(InputChannel channel, Looper looper) { + // TODO(b/222697646): remove getSfInstance usage and use vsyncId for transactions super(channel, looper, Choreographer.getSfInstance()); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsAlgorithm.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsAlgorithm.java index 72b934805c95..d6dacd14f536 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsAlgorithm.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsAlgorithm.java @@ -30,17 +30,18 @@ import android.content.res.Resources; import android.graphics.Rect; import android.os.SystemClock; import android.util.ArraySet; -import android.util.Log; import android.util.Size; import android.view.Gravity; import androidx.annotation.NonNull; +import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.R; import com.android.wm.shell.common.DisplayLayout; import com.android.wm.shell.pip.PipBoundsAlgorithm; import com.android.wm.shell.pip.PipSnapAlgorithm; import com.android.wm.shell.pip.tv.TvPipKeepClearAlgorithm.Placement; +import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.util.Set; @@ -90,7 +91,10 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { /** Returns the destination bounds to place the PIP window on entry. */ @Override public Rect getEntryDestinationBounds() { - if (DEBUG) Log.d(TAG, "getEntryDestinationBounds()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: getEntryDestinationBounds()", TAG); + } if (mTvPipBoundsState.isTvExpandedPipSupported() && mTvPipBoundsState.getDesiredTvExpandedAspectRatio() != 0 && !mTvPipBoundsState.isTvPipManuallyCollapsed()) { @@ -104,7 +108,10 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { /** Returns the current bounds adjusted to the new aspect ratio, if valid. */ @Override public Rect getAdjustedDestinationBounds(Rect currentBounds, float newAspectRatio) { - if (DEBUG) Log.d(TAG, "getAdjustedDestinationBounds: " + newAspectRatio); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: getAdjustedDestinationBounds: %f", TAG, newAspectRatio); + } return getTvPipBounds().getBounds(); } @@ -122,7 +129,11 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { Set<Rect> unrestrictedKeepClearAreas = mTvPipBoundsState.getUnrestrictedKeepClearAreas(); if (mTvPipBoundsState.isImeShowing()) { - if (DEBUG) Log.d(TAG, "IME showing, height: " + mTvPipBoundsState.getImeHeight()); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: IME showing, height: %d", + TAG, mTvPipBoundsState.getImeHeight()); + } final Rect imeBounds = new Rect( 0, @@ -145,15 +156,22 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { unrestrictedKeepClearAreas); if (DEBUG) { - Log.d(TAG, "pipSize: " + pipSize); - Log.d(TAG, "screenSize: " + screenSize); - Log.d(TAG, "stashOffset: " + mTvPipBoundsState.getStashOffset()); - Log.d(TAG, "insetBounds: " + insetBounds.toShortString()); - Log.d(TAG, "pipSize: " + pipSize); - Log.d(TAG, "gravity: " + Gravity.toString(mTvPipBoundsState.getTvPipGravity())); - Log.d(TAG, "restrictedKeepClearAreas: " + restrictedKeepClearAreas); - Log.d(TAG, "unrestrictedKeepClearAreas: " + unrestrictedKeepClearAreas); - Log.d(TAG, "placement: " + placement); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: screenSize: %s", TAG, screenSize); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: stashOffset: %d", TAG, mTvPipBoundsState.getStashOffset()); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: insetBounds: %s", TAG, insetBounds.toShortString()); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: pipSize: %s", TAG, pipSize); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: gravity: %s", TAG, Gravity.toString(mTvPipBoundsState.getTvPipGravity())); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: restrictedKeepClearAreas: %s", TAG, restrictedKeepClearAreas); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: unrestrictedKeepClearAreas: %s", TAG, unrestrictedKeepClearAreas); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: placement: %s", TAG, placement); } return placement; @@ -164,9 +182,11 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { */ int updateGravityOnExpandToggled(int previousGravity, boolean expanding) { if (DEBUG) { - Log.d(TAG, "updateGravityOnExpandToggled(), expanding: " + expanding - + ", mOrientation: " + mTvPipBoundsState.getTvFixedPipOrientation() - + ", previous gravity: " + Gravity.toString(previousGravity)); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: updateGravityOnExpandToggled(), expanding: %b" + + ", mOrientation: %d, previous gravity: %s", + TAG, expanding, mTvPipBoundsState.getTvFixedPipOrientation(), + Gravity.toString(previousGravity)); } if (!mTvPipBoundsState.isTvExpandedPipSupported()) { @@ -218,7 +238,10 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { } } mTvPipBoundsState.setTvPipGravity(updatedGravity); - if (DEBUG) Log.d(TAG, "new gravity: " + Gravity.toString(updatedGravity)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: new gravity: %s", TAG, Gravity.toString(updatedGravity)); + } return gravityToSave; } @@ -227,7 +250,10 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { * @return true if gravity changed */ boolean updateGravity(int keycode) { - if (DEBUG) Log.d(TAG, "updateGravity, keycode: " + keycode); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: updateGravity, keycode: %d", TAG, keycode); + } // Check if position change is valid if (mTvPipBoundsState.isTvPipExpanded()) { @@ -284,7 +310,10 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { if (updatedGravity != currentGravity) { mTvPipBoundsState.setTvPipGravity(updatedGravity); - if (DEBUG) Log.d(TAG, "new gravity: " + Gravity.toString(updatedGravity)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: new gravity: %s", TAG, Gravity.toString(updatedGravity)); + } return true; } return false; @@ -313,7 +342,9 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { final Size expandedSize; if (expandedRatio == 0) { - Log.d(TAG, "updateExpandedPipSize(): Expanded mode aspect ratio of 0 not supported"); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: updateExpandedPipSize(): Expanded mode aspect ratio" + + " of 0 not supported", TAG); return; } else if (expandedRatio < 1) { // vertical @@ -324,10 +355,16 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { float aspectRatioHeight = mFixedExpandedWidthInPx / expandedRatio; if (maxHeight > aspectRatioHeight) { - if (DEBUG) Log.d(TAG, "Accommodate aspect ratio"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Accommodate aspect ratio", TAG); + } expandedSize = new Size(mFixedExpandedWidthInPx, (int) aspectRatioHeight); } else { - if (DEBUG) Log.d(TAG, "Aspect ratio is too extreme, use max size"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Aspect ratio is too extreme, use max size", TAG); + } expandedSize = new Size(mFixedExpandedWidthInPx, maxHeight); } } @@ -339,10 +376,16 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { int maxWidth = displayLayout.width() - (2 * mScreenEdgeInsets.x); float aspectRatioWidth = mFixedExpandedHeightInPx * expandedRatio; if (maxWidth > aspectRatioWidth) { - if (DEBUG) Log.d(TAG, "Accommodate aspect ratio"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Accommodate aspect ratio", TAG); + } expandedSize = new Size((int) aspectRatioWidth, mFixedExpandedHeightInPx); } else { - if (DEBUG) Log.d(TAG, "Aspect ratio is too extreme, use max size"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Aspect ratio is too extreme, use max size", TAG); + } expandedSize = new Size(maxWidth, mFixedExpandedHeightInPx); } } @@ -350,8 +393,9 @@ public class TvPipBoundsAlgorithm extends PipBoundsAlgorithm { mTvPipBoundsState.setTvExpandedSize(expandedSize); if (DEBUG) { - Log.d(TAG, "updateExpandedPipSize(): expanded size, width=" + expandedSize.getWidth() - + ", height=" + expandedSize.getHeight()); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: updateExpandedPipSize(): expanded size, width: %d, height: %d", + TAG, expandedSize.getWidth(), expandedSize.getHeight()); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java index 03c5e98de298..f397ac01e60d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java @@ -32,9 +32,9 @@ import android.content.res.Resources; import android.graphics.Rect; import android.os.Handler; import android.os.RemoteException; -import android.util.Log; import android.view.Gravity; +import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.R; import com.android.wm.shell.WindowManagerShellWrapper; import com.android.wm.shell.common.DisplayController; @@ -50,6 +50,7 @@ import com.android.wm.shell.pip.PipMediaController; import com.android.wm.shell.pip.PipTaskOrganizer; import com.android.wm.shell.pip.PipTransitionController; import com.android.wm.shell.pip.tv.TvPipKeepClearAlgorithm.Placement; +import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -182,10 +183,16 @@ public class TvPipController implements PipTransitionController.PipTransitionCal } private void onConfigurationChanged(Configuration newConfig) { - if (DEBUG) Log.d(TAG, "onConfigurationChanged(), state=" + stateToName(mState)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onConfigurationChanged(), state=%s", TAG, stateToName(mState)); + } if (isPipShown()) { - if (DEBUG) Log.d(TAG, " > closing Pip."); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: > closing Pip.", TAG); + } closePip(); } @@ -208,10 +215,16 @@ public class TvPipController implements PipTransitionController.PipTransitionCal */ @Override public void showPictureInPictureMenu() { - if (DEBUG) Log.d(TAG, "showPictureInPictureMenu(), state=" + stateToName(mState)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: showPictureInPictureMenu(), state=%s", TAG, stateToName(mState)); + } if (mState == STATE_NO_PIP) { - if (DEBUG) Log.d(TAG, " > cannot open Menu from the current state."); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: > cannot open Menu from the current state.", TAG); + } return; } @@ -221,7 +234,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal @Override public void closeMenu() { - if (DEBUG) Log.d(TAG, "closeMenu(), state before=" + stateToName(mState)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: closeMenu(), state before=%s", TAG, stateToName(mState)); + } setState(STATE_PIP); mTvPipBoundsAlgorithm.keepUnstashedForCurrentKeepClearAreas(); updatePinnedStackBounds(); @@ -237,7 +253,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal */ @Override public void movePipToFullscreen() { - if (DEBUG) Log.d(TAG, "movePipToFullscreen(), state=" + stateToName(mState)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: movePipToFullscreen(), state=%s", TAG, stateToName(mState)); + } mPipTaskOrganizer.exitPip(mResizeAnimationDuration, false /* requestEnterSplit */); onPipDisappeared(); @@ -245,7 +264,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal @Override public void togglePipExpansion() { - if (DEBUG) Log.d(TAG, "togglePipExpansion()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: togglePipExpansion()", TAG); + } boolean expanding = !mTvPipBoundsState.isTvPipExpanded(); int saveGravity = mTvPipBoundsAlgorithm .updateGravityOnExpandToggled(mPreviousGravity, expanding); @@ -264,7 +286,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal mPreviousGravity = Gravity.NO_GRAVITY; updatePinnedStackBounds(); } else { - if (DEBUG) Log.d(TAG, "Position hasn't changed"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Position hasn't changed", TAG); + } } } @@ -323,10 +348,16 @@ public class TvPipController implements PipTransitionController.PipTransitionCal /** Animates the PiP to the given bounds. */ private void movePinnedStackTo(Rect bounds) { - if (DEBUG) Log.d(TAG, "movePinnedStackTo() - new pip bounds: " + bounds.toShortString()); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: movePinnedStack() - new pip bounds: %s", TAG, bounds.toShortString()); + } mPipTaskOrganizer.scheduleAnimateResizePip(bounds, mResizeAnimationDuration, rect -> { - if (DEBUG) Log.d(TAG, "movePinnedStack() animation done"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: movePinnedStack() animation done", TAG); + } mTvPipMenuController.updateExpansionState(); }); } @@ -336,7 +367,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal */ @Override public void closePip() { - if (DEBUG) Log.d(TAG, "closePip(), state=" + stateToName(mState)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: closePip(), state=%s", TAG, stateToName(mState)); + } removeTask(mPinnedTaskId); onPipDisappeared(); @@ -348,7 +382,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal private void checkIfPinnedTaskAppeared() { final TaskInfo pinnedTask = getPinnedTaskInfo(); - if (DEBUG) Log.d(TAG, "checkIfPinnedTaskAppeared(), task=" + pinnedTask); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: checkIfPinnedTaskAppeared(), task=%s", TAG, pinnedTask); + } if (pinnedTask == null || pinnedTask.topActivity == null) return; mPinnedTaskId = pinnedTask.taskId; @@ -357,16 +394,23 @@ public class TvPipController implements PipTransitionController.PipTransitionCal } private void checkIfPinnedTaskIsGone() { - if (DEBUG) Log.d(TAG, "onTaskStackChanged()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onTaskStackChanged()", TAG); + } if (isPipShown() && getPinnedTaskInfo() == null) { - Log.w(TAG, "Pinned task is gone."); + ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Pinned task is gone.", TAG); onPipDisappeared(); } } private void onPipDisappeared() { - if (DEBUG) Log.d(TAG, "onPipDisappeared() state=" + stateToName(mState)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onPipDisappeared() state=%s", TAG, stateToName(mState)); + } mPipNotificationController.dismiss(); mTvPipMenuController.hideMenu(); @@ -377,12 +421,18 @@ public class TvPipController implements PipTransitionController.PipTransitionCal @Override public void onPipTransitionStarted(int direction, Rect pipBounds) { - if (DEBUG) Log.d(TAG, "onPipTransition_Started(), state=" + stateToName(mState)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onPipTransition_Started(), state=%s", TAG, stateToName(mState)); + } } @Override public void onPipTransitionCanceled(int direction) { - if (DEBUG) Log.d(TAG, "onPipTransition_Canceled(), state=" + stateToName(mState)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onPipTransition_Canceled(), state=%s", TAG, stateToName(mState)); + } } @Override @@ -390,18 +440,25 @@ public class TvPipController implements PipTransitionController.PipTransitionCal if (PipAnimationController.isInPipDirection(direction) && mState == STATE_NO_PIP) { setState(STATE_PIP); } - if (DEBUG) Log.d(TAG, "onPipTransition_Finished(), state=" + stateToName(mState)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onPipTransition_Finished(), state=%s", TAG, stateToName(mState)); + } } private void setState(@State int state) { if (DEBUG) { - Log.d(TAG, "setState(), state=" + stateToName(state) + ", prev=" - + stateToName(mState)); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: setState(), state=%s, prev=%s", + TAG, stateToName(state), stateToName(mState)); } mState = state; if (mState == STATE_PIP_MENU) { - if (DEBUG) Log.d(TAG, " > show menu"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: > show menu", TAG); + } mTvPipMenuController.showMenu(); } @@ -429,7 +486,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal public void onActivityRestartAttempt(ActivityManager.RunningTaskInfo task, boolean homeTaskVisible, boolean clearedTask, boolean wasVisible) { if (task.getWindowingMode() == WINDOWING_MODE_PINNED) { - if (DEBUG) Log.d(TAG, "onPinnedActivityRestartAttempt()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onPinnedActivityRestartAttempt()", TAG); + } // If the "Pip-ed" Activity is launched again by Launcher or intent, make it // fullscreen. @@ -445,8 +505,9 @@ public class TvPipController implements PipTransitionController.PipTransitionCal @Override public void onImeVisibilityChanged(boolean imeVisible, int imeHeight) { if (DEBUG) { - Log.d(TAG, "onImeVisibilityChanged(), visible=" + imeVisible - + ", height=" + imeHeight); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onImeVisibilityChanged(), visible=%b, height=%d", + TAG, imeVisible, imeHeight); } if (imeVisible == mTvPipBoundsState.isImeShowing() @@ -464,7 +525,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal @Override public void onAspectRatioChanged(float ratio) { - if (DEBUG) Log.d(TAG, "onAspectRatioChanged: " + ratio); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onAspectRatioChanged: %f", TAG, ratio); + } boolean ratioChanged = mTvPipBoundsState.getAspectRatio() != ratio; mTvPipBoundsState.setAspectRatio(ratio); @@ -476,7 +540,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal @Override public void onExpandedAspectRatioChanged(float ratio) { - if (DEBUG) Log.d(TAG, "onExpandedAspectRatioChanged: " + ratio); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onExpandedAspectRatioChanged: %f", TAG, ratio); + } // 0) No update to the ratio --> don't do anything @@ -526,35 +593,50 @@ public class TvPipController implements PipTransitionController.PipTransitionCal @Override public void onActionsChanged(ParceledListSlice<RemoteAction> actions) { - if (DEBUG) Log.d(TAG, "onActionsChanged()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onActionsChanged()", TAG); + } mTvPipMenuController.setAppActions(actions); } }); } catch (RemoteException e) { - Log.e(TAG, "Failed to register pinned stack listener", e); + ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Failed to register pinned stack listener, %s", TAG, e); } } private static TaskInfo getPinnedTaskInfo() { - if (DEBUG) Log.d(TAG, "getPinnedTaskInfo()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: getPinnedTaskInfo()", TAG); + } try { final TaskInfo taskInfo = ActivityTaskManager.getService().getRootTaskInfo( WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED); - if (DEBUG) Log.d(TAG, " > taskInfo=" + taskInfo); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: > taskInfo=%s", TAG, taskInfo); + } return taskInfo; } catch (RemoteException e) { - Log.e(TAG, "getRootTaskInfo() failed", e); + ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: getRootTaskInfo() failed, %s", TAG, e); return null; } } private static void removeTask(int taskId) { - if (DEBUG) Log.d(TAG, "removeTask(), taskId=" + taskId); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: removeTask(), taskId=%d", TAG, taskId); + } try { ActivityTaskManager.getService().removeTask(taskId); } catch (Exception e) { - Log.e(TAG, "Atm.removeTask() failed", e); + ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Atm.removeTask() failed, %s", TAG, e); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java index b3c230683cb3..1a035c5a68db 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java @@ -30,17 +30,18 @@ import android.graphics.Rect; import android.graphics.RectF; import android.os.Handler; import android.os.RemoteException; -import android.util.Log; import android.view.SurfaceControl; import android.view.SyncRtSurfaceTransactionApplier; import android.view.WindowManagerGlobal; import androidx.annotation.Nullable; +import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.R; import com.android.wm.shell.common.SystemWindows; import com.android.wm.shell.pip.PipMediaController; import com.android.wm.shell.pip.PipMenuController; +import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.util.ArrayList; import java.util.List; @@ -110,7 +111,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis } void setDelegate(Delegate delegate) { - if (DEBUG) Log.d(TAG, "setDelegate(), delegate=" + delegate); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: setDelegate(), delegate=%s", TAG, delegate); + } if (mDelegate != null) { throw new IllegalStateException( "The delegate has already been set and should not change."); @@ -133,7 +137,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis } private void attachPipMenuView() { - if (DEBUG) Log.d(TAG, "attachPipMenuView()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: attachPipMenuView()", TAG); + } if (mPipMenuView != null) { detachPipMenuView(); @@ -148,7 +155,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis @Override public void showMenu() { - if (DEBUG) Log.d(TAG, "showMenu()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: showMenu()", TAG); + } if (mPipMenuView != null) { Rect menuBounds = getMenuBounds(mTvPipBoundsState.getBounds()); @@ -189,10 +199,16 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis void hideMenu() { if (!isMenuVisible()) { - if (DEBUG) Log.d(TAG, "hideMenu() - Menu isn't visible, so don't hide"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: hideMenu() - Menu isn't visible, so don't hide", TAG); + } return; } else { - if (DEBUG) Log.d(TAG, "hideMenu()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: hideMenu()", TAG); + } } mPipMenuView.hide(); @@ -208,7 +224,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis @Override public void onEnterMoveMode() { - if (DEBUG) Log.d(TAG, "onEnterMoveMode - " + mInMoveMode); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onEnterMoveMode - %b", TAG, mInMoveMode); + } mInMoveMode = true; mPipMenuView.showMenuButtons(false); mPipMenuView.showMovementHints(mDelegate.getPipGravity()); @@ -217,7 +236,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis @Override public boolean onExitMoveMode() { - if (DEBUG) Log.d(TAG, "onExitMoveMode - " + mInMoveMode); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onExitMoveMode - %b", TAG, mInMoveMode); + } if (mInMoveMode) { mInMoveMode = false; mPipMenuView.showMenuButtons(true); @@ -230,7 +252,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis @Override public boolean onPipMovement(int keycode) { - if (DEBUG) Log.d(TAG, "onPipMovement - " + mInMoveMode); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onPipMovement - %b", TAG, mInMoveMode); + } if (mInMoveMode) { mDelegate.movePip(keycode); } @@ -246,12 +271,18 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis @Override public void setAppActions(ParceledListSlice<RemoteAction> actions) { - if (DEBUG) Log.d(TAG, "setAppActions()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: setAppActions()", TAG); + } updateAdditionalActionsList(mAppActions, actions.getList()); } private void onMediaActionsChanged(List<RemoteAction> actions) { - if (DEBUG) Log.d(TAG, "onMediaActionsChanged()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: onMediaActionsChanged()", TAG); + } // Hide disabled actions. List<RemoteAction> enabledActions = new ArrayList<>(); @@ -292,7 +323,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis @Override public boolean isMenuVisible() { boolean isVisible = mPipMenuView != null && mPipMenuView.isVisible(); - if (DEBUG) Log.d(TAG, "isMenuVisible: " + isVisible); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: isMenuVisible: %b", TAG, isVisible); + } return isVisible; } @@ -303,7 +337,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis public void resizePipMenu(@android.annotation.Nullable SurfaceControl pipLeash, @android.annotation.Nullable SurfaceControl.Transaction t, Rect destinationBounds) { - if (DEBUG) Log.d(TAG, "resizePipMenu: " + destinationBounds.toShortString()); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: resizePipMenu: %s", TAG, destinationBounds.toShortString()); + } if (destinationBounds.isEmpty()) { return; } @@ -335,10 +372,16 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis @Override public void movePipMenu(SurfaceControl pipLeash, SurfaceControl.Transaction transaction, Rect pipDestBounds) { - if (DEBUG) Log.d(TAG, "movePipMenu: " + pipDestBounds.toShortString()); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: movePipMenu: %s", TAG, pipDestBounds.toShortString()); + } if (pipDestBounds.isEmpty()) { - if (transaction == null && DEBUG) Log.d(TAG, "no transaction given"); + if (transaction == null && DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: no transaction given", TAG); + } return; } if (!maybeCreateSyncApplier()) { @@ -351,10 +394,16 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis // resizing and the PiP menu is also resized. We then want to do a scale from the current // new menu bounds. if (pipLeash != null && transaction != null) { - if (DEBUG) Log.d(TAG, "mTmpSourceBounds based on mPipMenuView.getBoundsOnScreen()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: mTmpSourceBounds based on mPipMenuView.getBoundsOnScreen()", TAG); + } mPipMenuView.getBoundsOnScreen(mTmpSourceBounds); } else { - if (DEBUG) Log.d(TAG, "mTmpSourceBounds based on menu width and height"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: mTmpSourceBounds based on menu width and height", TAG); + } mTmpSourceBounds.set(0, 0, menuDestBounds.width(), menuDestBounds.height()); } @@ -389,7 +438,8 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis private boolean maybeCreateSyncApplier() { if (mPipMenuView == null || mPipMenuView.getViewRootImpl() == null) { - Log.v(TAG, "Not going to move PiP, either menu or its parent is not created."); + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Not going to move PiP, either menu or its parent is not created.", TAG); return false; } @@ -412,7 +462,10 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis @Override public void updateMenuBounds(Rect destinationBounds) { Rect menuBounds = getMenuBounds(destinationBounds); - if (DEBUG) Log.d(TAG, "updateMenuBounds: " + menuBounds.toShortString()); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: updateMenuBounds: %s", TAG, menuBounds.toShortString()); + } mSystemWindows.updateViewLayout(mPipMenuView, getPipMenuLayoutParams(MENU_WINDOW_TITLE, menuBounds.width(), menuBounds.height())); @@ -423,7 +476,7 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis @Override public void onFocusTaskChanged(ActivityManager.RunningTaskInfo taskInfo) { - Log.d(TAG, "onFocusTaskChanged"); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "%s: onFocusTaskChanged", TAG); } @Override @@ -465,13 +518,17 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis } private void grantPipMenuFocus(boolean grantFocus) { - if (DEBUG) Log.d(TAG, "grantWindowFocus(" + grantFocus + ")"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: grantWindowFocus(%b)", TAG, grantFocus); + } try { WindowManagerGlobal.getWindowSession().grantEmbeddedWindowFocus(null /* window */, mSystemWindows.getFocusGrantToken(mPipMenuView), grantFocus); } catch (Exception e) { - Log.e(TAG, "Unable to update focus", e); + ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Unable to update focus, %s", TAG, e); } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java index 3090139f6db9..984dea2c016e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java @@ -31,7 +31,6 @@ import android.content.Context; import android.graphics.Rect; import android.os.Handler; import android.util.AttributeSet; -import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.SurfaceControl; @@ -45,7 +44,9 @@ import android.widget.LinearLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.R; +import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.util.ArrayList; import java.util.List; @@ -118,17 +119,24 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { } void updateLayout(Rect updatedBounds) { - Log.d(TAG, "update menu layout: " + updatedBounds.toShortString()); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: update menu layout: %s", TAG, updatedBounds.toShortString()); boolean previouslyVertical = mCurrentBounds != null && mCurrentBounds.height() > mCurrentBounds.width(); boolean vertical = updatedBounds.height() > updatedBounds.width(); mCurrentBounds = updatedBounds; if (previouslyVertical == vertical) { - if (DEBUG) Log.d(TAG, "no update for menu layout"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: no update for menu layout", TAG); + } return; } else { - if (DEBUG) Log.d(TAG, "change menu layout to vertical: " + vertical); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: change menu layout to vertical: %b", TAG, vertical); + } } if (vertical) { @@ -154,7 +162,10 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { } void setIsExpanded(boolean expanded) { - if (DEBUG) Log.d(TAG, "setIsExpanded, expanded: " + expanded); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: setIsExpanded, expanded: %b", TAG, expanded); + } mExpandButton.setImageResource( expanded ? R.drawable.pip_ic_collapse : R.drawable.pip_ic_expand); mExpandButton.setTextAndDescription( @@ -162,7 +173,10 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { } void show(boolean inMoveMode, int gravity) { - if (DEBUG) Log.d(TAG, "show(), inMoveMode: " + inMoveMode); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: show(), inMoveMode: %b", TAG, inMoveMode); + } if (inMoveMode) { showMovementHints(gravity); } else { @@ -172,7 +186,9 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { } void hide() { - if (DEBUG) Log.d(TAG, "hide()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "%s: hide()", TAG); + } animateAlphaTo(0, mActionButtonsContainer); animateAlphaTo(0, mMenuFrameView); hideMovementHints(); @@ -205,7 +221,10 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { } void setAdditionalActions(List<RemoteAction> actions, Handler mainHandler) { - if (DEBUG) Log.d(TAG, "setAdditionalActions()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: setAdditionalActions()", TAG); + } // Make sure we exactly as many additional buttons as we have actions to display. final int actionsNumber = actions.size(); @@ -278,10 +297,12 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { try { action.getActionIntent().send(); } catch (PendingIntent.CanceledException e) { - Log.w(TAG, "Failed to send action", e); + ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Failed to send action, %s", TAG, e); } } else { - Log.w(TAG, "RemoteAction is null"); + ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: RemoteAction is null", TAG); } } } @@ -289,8 +310,9 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { @Override public boolean dispatchKeyEvent(KeyEvent event) { if (DEBUG) { - Log.d(TAG, "dispatchKeyEvent, action: " + event.getAction() - + ", keycode: " + event.getKeyCode()); + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: dispatchKeyEvent, action: %d, keycode: %d", + TAG, event.getAction(), event.getKeyCode()); } if (mListener != null && event.getAction() == ACTION_UP) { switch (event.getKeyCode()) { @@ -317,7 +339,10 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { * Shows user hints for moving the PiP, e.g. arrows. */ public void showMovementHints(int gravity) { - if (DEBUG) Log.d(TAG, "showMovementHints(), position: " + Gravity.toString(gravity)); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: showMovementHints(), position: %s", TAG, Gravity.toString(gravity)); + } animateAlphaTo(checkGravity(gravity, Gravity.BOTTOM) ? 1f : 0f, mArrowUp); animateAlphaTo(checkGravity(gravity, Gravity.TOP) ? 1f : 0f, mArrowDown); @@ -333,7 +358,10 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { * Hides user hints for moving the PiP, e.g. arrows. */ public void hideMovementHints() { - if (DEBUG) Log.d(TAG, "hideMovementHints()"); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: hideMovementHints()", TAG); + } animateAlphaTo(0, mArrowUp); animateAlphaTo(0, mArrowRight); animateAlphaTo(0, mArrowDown); @@ -344,7 +372,10 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { * Show or hide the pip user actions. */ public void showMenuButtons(boolean show) { - if (DEBUG) Log.d(TAG, "showMenuButtons: " + show); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: showMenuButtons: %b", TAG, show); + } animateAlphaTo(show ? 1 : 0, mActionButtonsContainer); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipNotificationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipNotificationController.java index dd7e29451ffc..7bd3ce9c45b2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipNotificationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipNotificationController.java @@ -28,13 +28,13 @@ import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.media.MediaMetadata; import android.os.Handler; -import android.os.UserHandle; import android.text.TextUtils; -import android.util.Log; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; +import com.android.internal.protolog.common.ProtoLog; import com.android.wm.shell.R; import com.android.wm.shell.pip.PipMediaController; +import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.util.Objects; @@ -98,7 +98,10 @@ public class TvPipNotificationController { } void setDelegate(Delegate delegate) { - if (DEBUG) Log.d(TAG, "setDelegate(), delegate=" + delegate); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: setDelegate(), delegate=%s", TAG, delegate); + } if (mDelegate != null) { throw new IllegalStateException( "The delegate has already been set and should not change."); @@ -240,7 +243,10 @@ public class TvPipNotificationController { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); - if (DEBUG) Log.d(TAG, "on(Broadcast)Receive(), action=" + action); + if (DEBUG) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: on(Broadcast)Receive(), action=%s", TAG, action); + } if (ACTION_SHOW_PIP_MENU.equals(action)) { mDelegate.showPictureInPictureMenu(); diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleFromLockScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleFromLockScreen.kt index 61e27f21aa0f..fb404b913465 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleFromLockScreen.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleFromLockScreen.kt @@ -16,6 +16,7 @@ package com.android.wm.shell.flicker.bubble +import android.platform.test.annotations.Presubmit import androidx.test.filters.FlakyTest import androidx.test.filters.RequiresDevice import androidx.test.uiautomator.By @@ -24,6 +25,8 @@ import com.android.server.wm.flicker.FlickerParametersRunnerFactory import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.annotation.Group4 import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled +import org.junit.Assume import org.junit.runner.RunWith import org.junit.Test import org.junit.runners.Parameterized @@ -69,9 +72,19 @@ class LaunchBubbleFromLockScreen(testSpec: FlickerTestParameter) : BaseBubbleScr } } - @FlakyTest + @Presubmit @Test fun testAppIsVisibleAtEnd() { + Assume.assumeFalse(isShellTransitionsEnabled) + testSpec.assertLayersEnd { + this.isVisible(testApp.component) + } + } + + @FlakyTest + @Test + fun testAppIsVisibleAtEnd_ShellTransit() { + Assume.assumeTrue(isShellTransitionsEnabled) testSpec.assertLayersEnd { this.isVisible(testApp.component) } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt index a57d3e63b559..c43230e77683 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt @@ -16,6 +16,7 @@ package com.android.wm.shell.flicker.bubble +import android.platform.test.annotations.Presubmit import androidx.test.filters.FlakyTest import android.platform.test.annotations.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory @@ -57,9 +58,19 @@ open class LaunchBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen } } - @FlakyTest(bugId = 218642026) + @Presubmit @Test open fun testAppIsAlwaysVisible() { + Assume.assumeFalse(isShellTransitionsEnabled) + testSpec.assertLayers { + this.isVisible(testApp.component) + } + } + + @FlakyTest(bugId = 218642026) + @Test + open fun testAppIsAlwaysVisible_ShellTransit() { + Assume.assumeTrue(isShellTransitionsEnabled) testSpec.assertLayers { this.isVisible(testApp.component) } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java index 28f21af5b56b..0529cdbcbb13 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java @@ -183,7 +183,7 @@ public class KeyguardPasswordViewController @Override void resetState() { mPasswordEntry.setTextOperationUser(UserHandle.of(KeyguardUpdateMonitor.getCurrentUser())); - mMessageAreaController.setMessage(R.string.keyguard_enter_your_password); + mMessageAreaController.setMessage(""); final boolean wasDisabled = mPasswordEntry.isEnabled(); mView.setPasswordEntryEnabled(true); mView.setPasswordEntryInputEnabled(true); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java index 7635f919567a..41f92407a683 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java @@ -358,7 +358,7 @@ public class KeyguardPatternViewController } private void displayDefaultSecurityMessage() { - mMessageAreaController.setMessage(R.string.keyguard_enter_your_pattern); + mMessageAreaController.setMessage(""); } private void handleAttemptLockout(long elapsedRealtimeDeadline) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java index cc7e4f7a0d9a..f7423ed12e68 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java @@ -132,7 +132,6 @@ public abstract class KeyguardPinBasedInputViewController<T extends KeyguardPinB @Override void resetState() { mView.setPasswordEntryEnabled(true); - mMessageAreaController.setMessage(R.string.keyguard_enter_your_pin); } @Override diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java index 160d82af98fe..9f4585fb1a92 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java @@ -76,6 +76,12 @@ public class KeyguardPinViewController } @Override + void resetState() { + super.resetState(); + mMessageAreaController.setMessage(""); + } + + @Override public boolean startDisappearAnimation(Runnable finishRunnable) { return mView.startDisappearAnimation( mKeyguardUpdateMonitor.needsSlowUnlockTransition(), finishRunnable); diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 370686a1e682..74659f71eb1f 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -558,7 +558,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme switch(event.getActionMasked()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_HOVER_ENTER: - if (!mDownDetected) { + if (!mDownDetected && mAccessibilityManager.isTouchExplorationEnabled()) { mVibrator.vibrate( Process.myUid(), getContext().getOpPackageName(), diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index bf42db53d3d8..bc7a3f6f4b13 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -584,16 +584,18 @@ public class UdfpsController implements DozeReceiver { } /** - * Play haptic to signal udfps scanning started. + * If a11y touchExplorationEnabled, play haptic to signal UDFPS scanning started. */ @VisibleForTesting public void playStartHaptic() { - mVibrator.vibrate( - Process.myUid(), - mContext.getOpPackageName(), - EFFECT_CLICK, - "udfps-onStart-click", - VIBRATION_ATTRIBUTES); + if (mAccessibilityManager.isTouchExplorationEnabled()) { + mVibrator.vibrate( + Process.myUid(), + mContext.getOpPackageName(), + EFFECT_CLICK, + "udfps-onStart-click", + VIBRATION_ATTRIBUTES); + } } @Nullable diff --git a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java index 508262d4ddec..835025bbfc88 100644 --- a/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java +++ b/packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java @@ -16,6 +16,8 @@ package com.android.systemui.charging; +import static com.android.systemui.charging.WirelessChargingLayout.UNKNOWN_BATTERY_LEVEL; + import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -76,6 +78,16 @@ public class WirelessChargingAnimation { } /** + * Creates a charging animation object using mostly default values for non-dozing and unknown + * battery level without charging number shown. + */ + public static WirelessChargingAnimation makeChargingAnimationWithNoBatteryLevel( + @NonNull Context context, UiEventLogger uiEventLogger) { + return makeWirelessChargingAnimation(context, null, + UNKNOWN_BATTERY_LEVEL, UNKNOWN_BATTERY_LEVEL, null, false, uiEventLogger); + } + + /** * Show the view for the specified duration. */ public void show(long delay) { diff --git a/packages/SystemUI/src/com/android/systemui/qrcodescanner/controller/QRCodeScannerController.java b/packages/SystemUI/src/com/android/systemui/qrcodescanner/controller/QRCodeScannerController.java index e26c768a5e80..8000bdccfa68 100644 --- a/packages/SystemUI/src/com/android/systemui/qrcodescanner/controller/QRCodeScannerController.java +++ b/packages/SystemUI/src/com/android/systemui/qrcodescanner/controller/QRCodeScannerController.java @@ -160,14 +160,15 @@ public class QRCodeScannerController implements * Returns true if lock screen entry point for QR Code Scanner is to be enabled. */ public boolean isEnabledForLockScreenButton() { - return mQRCodeScannerEnabled && mIntent != null && mConfigEnableLockScreenButton; + return mQRCodeScannerEnabled && mIntent != null && mConfigEnableLockScreenButton + && isActivityCallable(mIntent); } /** * Returns true if quick settings entry point for QR Code Scanner is to be enabled. */ public boolean isEnabledForQuickSettings() { - return mIntent != null; + return mIntent != null && isActivityCallable(mIntent); } /** @@ -278,7 +279,7 @@ public class QRCodeScannerController implements intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); } - if (isActivityCallable(intent)) { + if (isActivityAvailable(intent)) { mQRCodeScannerActivity = qrCodeScannerActivity; mComponentName = componentName; mIntent = intent; @@ -293,7 +294,7 @@ public class QRCodeScannerController implements } } - private boolean isActivityCallable(Intent intent) { + private boolean isActivityAvailable(Intent intent) { // Our intent should always be explicit and should have a component set if (intent.getComponent() == null) return false; @@ -307,6 +308,17 @@ public class QRCodeScannerController implements flags).isEmpty(); } + private boolean isActivityCallable(Intent intent) { + // Our intent should always be explicit and should have a component set + if (intent.getComponent() == null) return false; + + int flags = PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE + | PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS; + return !mContext.getPackageManager().queryIntentActivities(intent, + flags).isEmpty(); + } + private void unregisterUserChangeObservers() { mUserTracker.removeCallback(mUserChangedListener); diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java index 32515a258b46..4cacbbacec2f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java @@ -15,26 +15,22 @@ */ package com.android.systemui.qs.external; -import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Icon; import android.os.Binder; import android.os.Handler; import android.os.IBinder; -import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; import android.service.quicksettings.IQSService; import android.service.quicksettings.Tile; -import android.service.quicksettings.TileService; import android.util.ArrayMap; import android.util.Log; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.internal.statusbar.StatusBarIcon; @@ -42,6 +38,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.qs.QSTileHost; import com.android.systemui.settings.UserTracker; +import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -51,6 +48,7 @@ import java.util.Comparator; import java.util.Objects; import javax.inject.Inject; +import javax.inject.Provider; /** * Runs the day-to-day operations of which tiles should be bound and when. @@ -64,11 +62,12 @@ public class TileServices extends IQSService.Stub { private final ArrayMap<ComponentName, CustomTile> mTiles = new ArrayMap<>(); private final ArrayMap<IBinder, CustomTile> mTokenMap = new ArrayMap<>(); private final Context mContext; - private final Handler mHandler; private final Handler mMainHandler; + private final Provider<Handler> mHandlerProvider; private final QSTileHost mHost; private final KeyguardStateController mKeyguardStateController; private final BroadcastDispatcher mBroadcastDispatcher; + private final CommandQueue mCommandQueue; private final UserTracker mUserTracker; private int mMaxBound = DEFAULT_MAX_BOUND; @@ -76,23 +75,20 @@ public class TileServices extends IQSService.Stub { @Inject public TileServices( QSTileHost host, - @Main Looper looper, + @Main Provider<Handler> handlerProvider, BroadcastDispatcher broadcastDispatcher, UserTracker userTracker, - KeyguardStateController keyguardStateController) { + KeyguardStateController keyguardStateController, + CommandQueue commandQueue) { mHost = host; mKeyguardStateController = keyguardStateController; mContext = mHost.getContext(); mBroadcastDispatcher = broadcastDispatcher; - mHandler = new Handler(looper); - mMainHandler = new Handler(Looper.getMainLooper()); + mHandlerProvider = handlerProvider; + mMainHandler = mHandlerProvider.get(); mUserTracker = userTracker; - mBroadcastDispatcher.registerReceiver( - mRequestListeningReceiver, - new IntentFilter(TileService.ACTION_REQUEST_LISTENING), - null, // Use the default Executor - UserHandle.ALL - ); + mCommandQueue = commandQueue; + mCommandQueue.addCallback(mRequestListeningCallback); } public Context getContext() { @@ -118,7 +114,7 @@ public class TileServices extends IQSService.Stub { protected TileServiceManager onCreateTileService(ComponentName component, BroadcastDispatcher broadcastDispatcher) { - return new TileServiceManager(this, mHandler, component, + return new TileServiceManager(this, mHandlerProvider.get(), component, broadcastDispatcher, mUserTracker); } @@ -354,21 +350,14 @@ public class TileServices extends IQSService.Stub { public void destroy() { synchronized (mServices) { mServices.values().forEach(service -> service.handleDestroy()); - mBroadcastDispatcher.unregisterReceiver(mRequestListeningReceiver); } + mCommandQueue.removeCallback(mRequestListeningCallback); } - private final BroadcastReceiver mRequestListeningReceiver = new BroadcastReceiver() { + private final CommandQueue.Callbacks mRequestListeningCallback = new CommandQueue.Callbacks() { @Override - public void onReceive(Context context, Intent intent) { - if (TileService.ACTION_REQUEST_LISTENING.equals(intent.getAction())) { - try { - ComponentName c = intent.getParcelableExtra(Intent.EXTRA_COMPONENT_NAME); - requestListening(c); - } catch (ClassCastException ex) { - Log.e(TAG, "Bad component name", ex); - } - } + public void requestTileServiceListeningState(@NonNull ComponentName componentName) { + mMainHandler.post(() -> requestListening(componentName)); } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 5932a64c1c71..d9a98b165795 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -163,6 +163,7 @@ public class CommandQueue extends IStatusBar.Stub implements private static final int MSG_MEDIA_TRANSFER_RECEIVER_STATE = 65 << MSG_SHIFT; private static final int MSG_REGISTER_NEARBY_MEDIA_DEVICE_PROVIDER = 66 << MSG_SHIFT; private static final int MSG_UNREGISTER_NEARBY_MEDIA_DEVICE_PROVIDER = 67 << MSG_SHIFT; + private static final int MSG_TILE_SERVICE_REQUEST_LISTENING_STATE = 68 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -433,6 +434,11 @@ public class CommandQueue extends IStatusBar.Stub implements default void setNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {} /** + * @see IStatusBar#requestTileServiceListeningState + */ + default void requestTileServiceListeningState(@NonNull ComponentName componentName) {} + + /** * @see IStatusBar#requestAddTile */ default void requestAddTile( @@ -1190,6 +1196,12 @@ public class CommandQueue extends IStatusBar.Stub implements } @Override + public void requestTileServiceListeningState(@NonNull ComponentName componentName) { + mHandler.obtainMessage(MSG_TILE_SERVICE_REQUEST_LISTENING_STATE, componentName) + .sendToTarget(); + } + + @Override public void requestAddTile( @NonNull ComponentName componentName, @NonNull CharSequence appName, @@ -1686,6 +1698,12 @@ public class CommandQueue extends IStatusBar.Stub implements mCallbacks.get(i).unregisterNearbyMediaDevicesProvider(provider); } break; + case MSG_TILE_SERVICE_REQUEST_LISTENING_STATE: + ComponentName component = (ComponentName) msg.obj; + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).requestTileServiceListeningState(component); + } + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt index 2c1296f34a42..7fbb0f1182c0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt @@ -22,15 +22,18 @@ class NotificationLaunchAnimatorControllerProvider @Inject constructor( private val headsUpManager: HeadsUpManagerPhone, private val jankMonitor: InteractionJankMonitor ) { + @JvmOverloads fun getAnimatorController( - notification: ExpandableNotificationRow + notification: ExpandableNotificationRow, + onFinishAnimationCallback: Runnable = Runnable {} ): NotificationLaunchAnimatorController { return NotificationLaunchAnimatorController( notificationShadeWindowViewController, notificationListContainer, headsUpManager, notification, - jankMonitor + jankMonitor, + onFinishAnimationCallback ) } } @@ -45,7 +48,8 @@ class NotificationLaunchAnimatorController( private val notificationListContainer: NotificationListContainer, private val headsUpManager: HeadsUpManagerPhone, private val notification: ExpandableNotificationRow, - private val jankMonitor: InteractionJankMonitor + private val jankMonitor: InteractionJankMonitor, + private val onFinishAnimationCallback: Runnable ) : ActivityLaunchAnimator.Controller { companion object { @@ -119,6 +123,7 @@ class NotificationLaunchAnimatorController( if (!willAnimate) { removeHun(animate = true) + onFinishAnimationCallback.run() } } @@ -137,6 +142,7 @@ class NotificationLaunchAnimatorController( notificationShadeWindowViewController.setExpandAnimationRunning(false) notificationEntry.isExpandAnimationRunning = false removeHun(animate = true) + onFinishAnimationCallback.run() } override fun onLaunchAnimationStart(isExpandingFullyAbove: Boolean) { @@ -156,6 +162,7 @@ class NotificationLaunchAnimatorController( notificationListContainer.setExpandingNotification(null) applyParams(null) removeHun(animate = false) + onFinishAnimationCallback.run() } private fun applyParams(params: ExpandAnimationParameters?) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt index 0df2162d3338..da0169bd6dc4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt @@ -72,10 +72,11 @@ class HeadsUpCoordinator @Inject constructor( private var mEndLifetimeExtension: OnEndLifetimeExtensionCallback? = null private lateinit var mNotifPipeline: NotifPipeline private var mNow: Long = -1 - // notifs we've extended the lifetime for - private val mNotifsExtendingLifetime = ArraySet<NotificationEntry>() private val mPostedEntries = LinkedHashMap<String, PostedEntry>() + // notifs we've extended the lifetime for with cancellation callbacks + private val mNotifsExtendingLifetime = ArrayMap<NotificationEntry, Runnable?>() + override fun attach(pipeline: NotifPipeline) { mNotifPipeline = pipeline mHeadsUpManager.addListener(mOnHeadsUpChangedListener) @@ -460,23 +461,20 @@ class HeadsUpCoordinator @Inject constructor( } if (isSticky(entry)) { val removeAfterMillis = mHeadsUpManager.getEarliestRemovalTime(entry.key) - mExecutor.executeDelayed({ - val canStillRemove = mHeadsUpManager.canRemoveImmediately(entry.key) - if (mNotifsExtendingLifetime.contains(entry) && canStillRemove) { - mHeadsUpManager.removeNotification(entry.key, /* releaseImmediately */ true) - } + mNotifsExtendingLifetime[entry] = mExecutor.executeDelayed({ + mHeadsUpManager.removeNotification(entry.key, /* releaseImmediately */ true) }, removeAfterMillis) } else { mExecutor.execute { mHeadsUpManager.removeNotification(entry.key, /* releaseImmediately */ false) } + mNotifsExtendingLifetime[entry] = null } - mNotifsExtendingLifetime.add(entry) return true } override fun cancelLifetimeExtension(entry: NotificationEntry) { - mNotifsExtendingLifetime.remove(entry) + mNotifsExtendingLifetime.remove(entry)?.run() } } @@ -543,7 +541,8 @@ class HeadsUpCoordinator @Inject constructor( mPostedEntries[entry.key]?.calculateShouldBeHeadsUpStrict ?: isAttemptingToShowHun(entry) private fun endNotifLifetimeExtensionIfExtended(entry: NotificationEntry) { - if (mNotifsExtendingLifetime.remove(entry)) { + if (mNotifsExtendingLifetime.contains(entry)) { + mNotifsExtendingLifetime.remove(entry)?.run() mEndLifetimeExtension?.onEndLifetimeExtension(mLifetimeExtender, entry) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java index cd2affead92a..7c4e4499dca6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java @@ -73,7 +73,7 @@ public class NotificationGroupManagerLegacy implements GroupExpansionManager, Dumpable { - private static final String TAG = "NotifGroupManager"; + private static final String TAG = "LegacyNotifGroupManager"; private static final boolean DEBUG = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.DEBUG); private static final boolean SPEW = Compile.IS_DEBUG && Log.isLoggable(TAG, Log.VERBOSE); /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java index a7f950eaf167..ec2d608b2683 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java @@ -2881,8 +2881,7 @@ public class CentralSurfaces extends CoreStartable implements } boolean updateIsKeyguard(boolean forceStateChange) { - boolean wakeAndUnlocking = mBiometricUnlockController.getMode() - == BiometricUnlockController.MODE_WAKE_AND_UNLOCK; + boolean wakeAndUnlocking = mBiometricUnlockController.isWakeAndUnlock(); // For dozing, keyguard needs to be shown whenever the device is non-interactive. Otherwise // there's no surface we can show to the user. Note that the device goes fully interactive @@ -2892,7 +2891,7 @@ public class CentralSurfaces extends CoreStartable implements && (!mDeviceInteractive || (isGoingToSleep() && (isScreenFullyOff() || (mKeyguardStateController.isShowing() && !isOccluded())))); - boolean isWakingAndOccluded = isOccluded() && isWaking(); + boolean isWakingAndOccluded = isOccluded() && isWakingOrAwake(); boolean shouldBeKeyguard = (mStatusBarStateController.isKeyguardRequested() || keyguardForDozing) && !wakeAndUnlocking && !isWakingAndOccluded; if (keyguardForDozing) { @@ -3076,7 +3075,6 @@ public class CentralSurfaces extends CoreStartable implements mMessageRouter.cancelMessages(MSG_LAUNCH_TRANSITION_TIMEOUT); releaseGestureWakeLock(); mNotificationPanelViewController.onAffordanceLaunchEnded(); - mNotificationPanelViewController.cancelAnimation(); mNotificationPanelViewController.resetAlpha(); mNotificationPanelViewController.resetTranslation(); mNotificationPanelViewController.resetViewGroupFade(); @@ -3702,8 +3700,9 @@ public class CentralSurfaces extends CoreStartable implements == WakefulnessLifecycle.WAKEFULNESS_GOING_TO_SLEEP; } - boolean isWaking() { - return mWakefulnessLifecycle.getWakefulness() == WakefulnessLifecycle.WAKEFULNESS_WAKING; + boolean isWakingOrAwake() { + return mWakefulnessLifecycle.getWakefulness() == WakefulnessLifecycle.WAKEFULNESS_WAKING + || mWakefulnessLifecycle.getWakefulness() == WakefulnessLifecycle.WAKEFULNESS_AWAKE; } public void notifyBiometricAuthModeChanged() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java index 0ff010aedfff..16e573280417 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java @@ -386,10 +386,12 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW } visible = true; } - if (visible) { - mNotificationShadeView.setVisibility(View.VISIBLE); - } else { - mNotificationShadeView.setVisibility(View.INVISIBLE); + if (mNotificationShadeView != null) { + if (visible) { + mNotificationShadeView.setVisibility(View.VISIBLE); + } else { + mNotificationShadeView.setVisibility(View.INVISIBLE); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java index 108d98a129b2..637e4bee8948 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java @@ -370,6 +370,8 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte mLogger.logExpandingBubble(notificationKey); removeHunAfterClick(row); expandBubbleStackOnMainThread(entry); + mMainThreadHandler.post( + () -> mLaunchEventsEmitter.notifyFinishLaunchNotifActivity(entry)); } else { startNotificationIntent(intent, fillInIntent, entry, row, animate, isActivityIntent); } @@ -395,7 +397,6 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte mMainThreadHandler.post(() -> { final Runnable removeNotification = () -> { mOnUserInteractionCallback.onDismiss(entry, REASON_CLICK, summaryToRemove); - mLaunchEventsEmitter.notifyFinishLaunchNotifActivity(entry); }; if (mPresenter.isCollapsing()) { // To avoid lags we're only performing the remove @@ -405,9 +406,6 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte removeNotification.run(); } }); - } else { - mMainThreadHandler.post( - () -> mLaunchEventsEmitter.notifyFinishLaunchNotifActivity(entry)); } mIsCollapsingToShowActivityOverLockscreen = false; @@ -483,14 +481,19 @@ class StatusBarNotificationActivityStarter implements NotificationActivityStarte boolean isActivityIntent) { mLogger.logStartNotificationIntent(entry.getKey(), intent); try { + Runnable onFinishAnimationCallback = + () -> mLaunchEventsEmitter.notifyFinishLaunchNotifActivity(entry); ActivityLaunchAnimator.Controller animationController = new StatusBarLaunchAnimatorController( - mNotificationAnimationProvider.getAnimatorController(row), + mNotificationAnimationProvider + .getAnimatorController(row, onFinishAnimationCallback), mCentralSurfaces, isActivityIntent); - - mActivityLaunchAnimator.startPendingIntentWithAnimation(animationController, - animate, intent.getCreatorPackage(), (adapter) -> { + mActivityLaunchAnimator.startPendingIntentWithAnimation( + animationController, + animate, + intent.getCreatorPackage(), + (adapter) -> { long eventTime = row.getAndResetLastActionUpTime(); Bundle options = eventTime > 0 ? getActivityOptions( diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt index e980eb783d79..8e1e42a9c9a2 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt @@ -88,6 +88,6 @@ class KeyguardPatternViewControllerTest : SysuiTestCase() { fun onPause_clearsTextField() { mKeyguardPatternViewController.init() mKeyguardPatternViewController.onPause() - verify(mKeyguardMessageAreaController).setMessage(R.string.keyguard_enter_your_pattern) + verify(mKeyguardMessageAreaController).setMessage("") } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index 1856fda14e1b..613931f1341f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -48,6 +48,7 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import android.view.LayoutInflater; import android.view.MotionEvent; +import android.view.View; import android.view.WindowManager; import android.view.accessibility.AccessibilityManager; @@ -64,8 +65,8 @@ import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.LockscreenShadeTransitionController; import com.android.systemui.statusbar.VibratorHelper; -import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.CentralSurfaces; +import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.SystemUIDialogManager; import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController; @@ -188,6 +189,7 @@ public class UdfpsControllerTest extends SysuiTestCase { @Captor private ArgumentCaptor<IUdfpsOverlayController> mOverlayCaptor; private IUdfpsOverlayController mOverlayController; @Captor private ArgumentCaptor<UdfpsView.OnTouchListener> mTouchListenerCaptor; + @Captor private ArgumentCaptor<View.OnHoverListener> mHoverListenerCaptor; @Captor private ArgumentCaptor<Runnable> mOnIlluminatedRunnableCaptor; @Captor private ArgumentCaptor<ScreenLifecycle.Observer> mScreenObserverCaptor; private ScreenLifecycle.Observer mScreenObserver; @@ -568,23 +570,24 @@ public class UdfpsControllerTest extends SysuiTestCase { } @Test - public void playHapticOnTouchUdfpsArea() throws RemoteException { + public void playHapticOnTouchUdfpsArea_a11yTouchExplorationEnabled() throws RemoteException { // Configure UdfpsView to accept the ACTION_DOWN event when(mUdfpsView.isIlluminationRequested()).thenReturn(false); when(mUdfpsView.isWithinSensorArea(anyFloat(), anyFloat())).thenReturn(true); - // GIVEN that the overlay is showing + // GIVEN that the overlay is showing and a11y touch exploration enabled + when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(true); mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID, BiometricOverlayConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback); mFgExecutor.runAllReady(); - // WHEN ACTION_DOWN is received - verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture()); - MotionEvent downEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0); - mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent); - downEvent.recycle(); - MotionEvent moveEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0, 0, 0); - mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent); + // WHEN ACTION_HOVER is received + verify(mUdfpsView).setOnHoverListener(mHoverListenerCaptor.capture()); + MotionEvent enterEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_ENTER, 0, 0, 0); + mHoverListenerCaptor.getValue().onHover(mUdfpsView, enterEvent); + enterEvent.recycle(); + MotionEvent moveEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_MOVE, 0, 0, 0); + mHoverListenerCaptor.getValue().onHover(mUdfpsView, moveEvent); moveEvent.recycle(); // THEN tick haptic is played @@ -600,4 +603,34 @@ public class UdfpsControllerTest extends SysuiTestCase { assertEquals(VibrationAttributes.USAGE_COMMUNICATION_REQUEST, UdfpsController.VIBRATION_ATTRIBUTES.getUsage()); } + + @Test + public void noHapticOnTouchUdfpsArea_a11yTouchExplorationDisabled() throws RemoteException { + // Configure UdfpsView to accept the ACTION_DOWN event + when(mUdfpsView.isIlluminationRequested()).thenReturn(false); + when(mUdfpsView.isWithinSensorArea(anyFloat(), anyFloat())).thenReturn(true); + + // GIVEN that the overlay is showing and a11y touch exploration NOT enabled + when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(false); + mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID, + BiometricOverlayConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback); + mFgExecutor.runAllReady(); + + // WHEN ACTION_DOWN is received + verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture()); + MotionEvent downEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0); + mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent); + downEvent.recycle(); + MotionEvent moveEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0, 0, 0); + mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent); + moveEvent.recycle(); + + // THEN NO haptic played + verify(mVibrator, never()).vibrate( + anyInt(), + anyString(), + any(), + anyString(), + any()); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java index 19a9863f6f5e..6b7e5b9335f2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java @@ -20,21 +20,18 @@ import static junit.framework.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Intent; -import android.content.IntentFilter; import android.os.Handler; -import android.os.Looper; +import android.os.RemoteException; import android.os.UserHandle; -import android.service.quicksettings.TileService; +import android.service.quicksettings.IQSTileService; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -49,6 +46,7 @@ import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSFactoryImpl; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -68,17 +66,25 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Optional; +import javax.inject.Provider; + @SmallTest @RunWith(AndroidTestingRunner.class) @RunWithLooper public class TileServicesTest extends SysuiTestCase { private static int NUM_FAKES = TileServices.DEFAULT_MAX_BOUND * 2; + private static final ComponentName TEST_COMPONENT = + ComponentName.unflattenFromString("pkg/.cls"); + private TileServices mTileService; + private TestableLooper mTestableLooper; private ArrayList<TileServiceManager> mManagers; @Mock private BroadcastDispatcher mBroadcastDispatcher; @Mock + private CommandQueue mCommandQueue; + @Mock private StatusBarIconController mStatusBarIconController; @Mock private QSFactoryImpl mQSFactory; @@ -116,17 +122,20 @@ public class TileServicesTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); mDependency.injectMockDependency(BluetoothController.class); mManagers = new ArrayList<>(); + mTestableLooper = TestableLooper.get(this); when(mTileServiceRequestControllerBuilder.create(any())) .thenReturn(mTileServiceRequestController); when(mTileLifecycleManagerFactory.create(any(Intent.class), any(UserHandle.class))) .thenReturn(mTileLifecycleManager); + Provider<Handler> provider = () -> new Handler(mTestableLooper.getLooper()); + QSTileHost host = new QSTileHost(mContext, mStatusBarIconController, mQSFactory, - new Handler(), - Looper.myLooper(), + provider.get(), + mTestableLooper.getLooper(), mPluginManager, mTunerService, () -> mAutoTileManager, @@ -140,8 +149,8 @@ public class TileServicesTest extends SysuiTestCase { mock(CustomTileStatePersister.class), mTileServiceRequestControllerBuilder, mTileLifecycleManagerFactory); - mTileService = new TestTileServices(host, Looper.getMainLooper(), mBroadcastDispatcher, - mUserTracker, mKeyguardStateController); + mTileService = new TestTileServices(host, provider, mBroadcastDispatcher, + mUserTracker, mKeyguardStateController, mCommandQueue); } @After @@ -152,24 +161,6 @@ public class TileServicesTest extends SysuiTestCase { } @Test - public void testActiveTileListenerRegisteredOnAllUsers() { - ArgumentCaptor<IntentFilter> captor = ArgumentCaptor.forClass(IntentFilter.class); - verify(mBroadcastDispatcher).registerReceiver(any(), captor.capture(), any(), eq( - UserHandle.ALL)); - assertTrue(captor.getValue().hasAction(TileService.ACTION_REQUEST_LISTENING)); - } - - @Test - public void testBadComponentName_doesntCrash() { - ArgumentCaptor<BroadcastReceiver> captor = ArgumentCaptor.forClass(BroadcastReceiver.class); - verify(mBroadcastDispatcher).registerReceiver(captor.capture(), any(), any(), eq( - UserHandle.ALL)); - Intent intent = new Intent(TileService.ACTION_REQUEST_LISTENING) - .putExtra(Intent.EXTRA_COMPONENT_NAME, "abc"); - captor.getValue().onReceive(mContext, intent); - } - - @Test public void testRecalculateBindAllowance() { // Add some fake tiles. for (int i = 0; i < NUM_FAKES; i++) { @@ -225,11 +216,36 @@ public class TileServicesTest extends SysuiTestCase { } } + @Test + public void testRegisterCommand() { + verify(mCommandQueue).addCallback(any()); + } + + @Test + public void testRequestListeningStatusCommand() throws RemoteException { + ArgumentCaptor<CommandQueue.Callbacks> captor = + ArgumentCaptor.forClass(CommandQueue.Callbacks.class); + verify(mCommandQueue).addCallback(captor.capture()); + + CustomTile mockTile = mock(CustomTile.class); + when(mockTile.getComponent()).thenReturn(TEST_COMPONENT); + + TileServiceManager manager = mTileService.getTileWrapper(mockTile); + when(manager.isActiveTile()).thenReturn(true); + when(manager.getTileService()).thenReturn(mock(IQSTileService.class)); + + captor.getValue().requestTileServiceListeningState(TEST_COMPONENT); + mTestableLooper.processAllMessages(); + verify(manager).setBindRequested(true); + verify(manager.getTileService()).onStartListening(); + } + private class TestTileServices extends TileServices { - TestTileServices(QSTileHost host, Looper looper, + TestTileServices(QSTileHost host, Provider<Handler> handlerProvider, BroadcastDispatcher broadcastDispatcher, UserTracker userTracker, - KeyguardStateController keyguardStateController) { - super(host, looper, broadcastDispatcher, userTracker, keyguardStateController); + KeyguardStateController keyguardStateController, CommandQueue commandQueue) { + super(host, handlerProvider, broadcastDispatcher, userTracker, keyguardStateController, + commandQueue); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorControllerTest.kt index 3a60c049b3f3..9f82a5673c6e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorControllerTest.kt @@ -31,6 +31,7 @@ class NotificationLaunchAnimatorControllerTest : SysuiTestCase() { @Mock lateinit var notificationListContainer: NotificationListContainer @Mock lateinit var headsUpManager: HeadsUpManagerPhone @Mock lateinit var jankMonitor: InteractionJankMonitor + @Mock lateinit var onFinishAnimationCallback: Runnable private lateinit var notificationTestHelper: NotificationTestHelper private lateinit var notification: ExpandableNotificationRow @@ -52,7 +53,8 @@ class NotificationLaunchAnimatorControllerTest : SysuiTestCase() { notificationListContainer, headsUpManager, notification, - jankMonitor + jankMonitor, + onFinishAnimationCallback ) } @@ -61,7 +63,7 @@ class NotificationLaunchAnimatorControllerTest : SysuiTestCase() { } @Test - fun testHunIsRemovedIfWeDontAnimateLaunch() { + fun testHunIsRemovedAndCallbackIsInvokedIfWeDontAnimateLaunch() { flagNotificationAsHun() controller.onIntentStarted(willAnimate = false) @@ -69,10 +71,11 @@ class NotificationLaunchAnimatorControllerTest : SysuiTestCase() { assertFalse(notification.entry.isExpandAnimationRunning) verify(headsUpManager).removeNotification( notificationKey, true /* releaseImmediately */, true /* animate */) + verify(onFinishAnimationCallback).run() } @Test - fun testHunIsRemovedWhenAnimationIsCancelled() { + fun testHunIsRemovedAndCallbackIsInvokedWhenAnimationIsCancelled() { flagNotificationAsHun() controller.onLaunchAnimationCancelled() @@ -80,10 +83,11 @@ class NotificationLaunchAnimatorControllerTest : SysuiTestCase() { assertFalse(notification.entry.isExpandAnimationRunning) verify(headsUpManager).removeNotification( notificationKey, true /* releaseImmediately */, true /* animate */) + verify(onFinishAnimationCallback).run() } @Test - fun testHunIsRemovedWhenAnimationEnds() { + fun testHunIsRemovedAndCallbackIsInvokedWhenAnimationEnds() { flagNotificationAsHun() controller.onLaunchAnimationEnd(isExpandingFullyAbove = true) @@ -91,6 +95,7 @@ class NotificationLaunchAnimatorControllerTest : SysuiTestCase() { assertFalse(notification.entry.isExpandAnimationRunning) verify(headsUpManager).removeNotification( notificationKey, true /* releaseImmediately */, false /* animate */) + verify(onFinishAnimationCallback).run() } @Test @@ -99,4 +104,4 @@ class NotificationLaunchAnimatorControllerTest : SysuiTestCase() { assertTrue(notification.entry.isExpandAnimationRunning) } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt index 144eefb17283..699f77f9b7bb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt @@ -170,11 +170,41 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { } @Test + fun testCancelAndReAddStickyNotification() { + whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true) + addHUN(mEntry) + whenever(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false, true, false) + whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L) + assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0)) + addHUN(mEntry) + assertFalse(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0)) + mExecutor.advanceClockToLast() + mExecutor.runAllReady() + assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0)) + verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(false)) + verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(true)) + } + + @Test + fun hunNotRemovedWhenExtensionCancelled() { + whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true) + addHUN(mEntry) + whenever(mHeadsUpManager.canRemoveImmediately(anyString())).thenReturn(false) + whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L) + assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0)) + mNotifLifetimeExtender.cancelLifetimeExtension(mEntry) + mExecutor.advanceClockToLast() + mExecutor.runAllReady() + verify(mHeadsUpManager, times(0)).removeNotification(anyString(), any()) + } + + @Test fun testCancelUpdatedStickyNotification() { whenever(mHeadsUpManager.isSticky(anyString())).thenReturn(true) addHUN(mEntry) whenever(mHeadsUpManager.getEarliestRemovalTime(anyString())).thenReturn(1000L, 500L) assertTrue(mNotifLifetimeExtender.maybeExtendLifetime(mEntry, 0)) + addHUN(mEntry) mExecutor.advanceClockToLast() mExecutor.runAllReady() verify(mHeadsUpManager, times(0)).removeNotification(anyString(), eq(false)) @@ -305,6 +335,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() { mHuns.add(entry) whenever(mHeadsUpManager.topEntry).thenReturn(entry) mOnHeadsUpChangedListener.onHeadsUpStateChanged(entry, true) + mNotifLifetimeExtender.cancelLifetimeExtension(entry) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java index 27179fd7be92..d48ce8c6803e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java @@ -85,6 +85,7 @@ import com.android.systemui.wmshell.BubblesManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.Mockito; @@ -188,10 +189,11 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { when(mNotifPipelineFlags.isNewPipelineEnabled()).thenReturn(false); when(mOnUserInteractionCallback.getGroupSummaryToDismiss(mNotificationRow.getEntry())) .thenReturn(null); - when(mVisibilityProvider.obtain(anyString(), anyBoolean())).thenAnswer( - invocation-> NotificationVisibility.obtain(invocation.getArgument(0), 0, 1, false)); - when(mVisibilityProvider.obtain(any(NotificationEntry.class), anyBoolean())).thenAnswer( - invocation-> NotificationVisibility.obtain( + when(mVisibilityProvider.obtain(anyString(), anyBoolean())) + .thenAnswer(invocation -> NotificationVisibility.obtain( + invocation.getArgument(0), 0, 1, false)); + when(mVisibilityProvider.obtain(any(NotificationEntry.class), anyBoolean())) + .thenAnswer(invocation -> NotificationVisibility.obtain( invocation.<NotificationEntry>getArgument(0).getKey(), 0, 1, false)); HeadsUpManagerPhone headsUpManager = mock(HeadsUpManagerPhone.class); @@ -431,12 +433,18 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { } @Test - public void testNotifActivityStarterEventSourceFinishEvent_postPanelCollapse() { + public void testNotifActivityStarterEventSourceFinishEvent_postPanelCollapse() + throws Exception { NotifActivityLaunchEvents.Listener listener = mock(NotifActivityLaunchEvents.Listener.class); mLaunchEventsEmitter.registerListener(listener); mNotificationActivityStarter .onNotificationClicked(mNotificationRow.getEntry().getSbn(), mNotificationRow); + ArgumentCaptor<ActivityLaunchAnimator.Controller> controllerCaptor = + ArgumentCaptor.forClass(ActivityLaunchAnimator.Controller.class); + verify(mActivityLaunchAnimator).startPendingIntentWithAnimation( + controllerCaptor.capture(), anyBoolean(), any(), any()); + controllerCaptor.getValue().onIntentStarted(false); verify(listener).onFinishLaunchNotifActivity(mNotificationRow.getEntry()); } } diff --git a/services/api/current.txt b/services/api/current.txt index 45c00595841d..5a2880223f6c 100644 --- a/services/api/current.txt +++ b/services/api/current.txt @@ -38,7 +38,7 @@ package com.android.server { package com.android.server.am { public interface ActivityManagerLocal { - method public boolean bindSdkSandboxService(@NonNull android.content.Intent, @NonNull android.content.ServiceConnection, int, @NonNull String, int) throws android.os.RemoteException; + method public boolean bindSdkSandboxService(@NonNull android.content.Intent, @NonNull android.content.ServiceConnection, int, @NonNull String, @NonNull String, int) throws android.os.RemoteException; method public boolean canStartForegroundService(int, int, @NonNull String); } diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 68cd28809fd0..2068e6d380b7 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -48,6 +48,7 @@ import com.android.server.pm.PackageSetting; import com.android.server.pm.dex.DynamicCodeLogger; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.SharedUserApi; import com.android.server.pm.pkg.component.ParsedMainComponent; @@ -689,6 +690,8 @@ public abstract class PackageManagerInternal { @Nullable public abstract PackageStateInternal getPackageStateInternal(@NonNull String packageName); + public abstract @Nullable PackageState getPackageState(@NonNull String packageName); + @NonNull public abstract ArrayMap<String, ? extends PackageStateInternal> getPackageStates(); diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index d4ad718fbe73..48e3264b2c11 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -2722,7 +2722,7 @@ public final class ActiveServices { int bindServiceLocked(IApplicationThread caller, IBinder token, Intent service, String resolvedType, final IServiceConnection connection, int flags, String instanceName, boolean isSdkSandboxService, int sdkSandboxClientAppUid, - String callingPackage, final int userId) + String sdkSandboxClientAppPackage, String callingPackage, final int userId) throws TransactionTooLargeException { if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, "bindService: " + service + " type=" + resolvedType + " conn=" + connection.asBinder() @@ -2807,8 +2807,9 @@ public final class ActiveServices { final boolean allowInstant = (flags & Context.BIND_ALLOW_INSTANT) != 0; ServiceLookupResult res = retrieveServiceLocked(service, instanceName, - isSdkSandboxService, sdkSandboxClientAppUid, resolvedType, callingPackage, - callingPid, callingUid, userId, true, callerFg, isBindExternal, allowInstant); + isSdkSandboxService, sdkSandboxClientAppUid, sdkSandboxClientAppPackage, + resolvedType, callingPackage, callingPid, callingUid, userId, true, callerFg, + isBindExternal, allowInstant); if (res == null) { return 0; } @@ -3228,14 +3229,14 @@ public final class ActiveServices { int callingPid, int callingUid, int userId, boolean createIfNeeded, boolean callingFromFg, boolean isBindExternal, boolean allowInstant) { - return retrieveServiceLocked(service, instanceName, false, 0, resolvedType, callingPackage, - callingPid, callingUid, userId, createIfNeeded, callingFromFg, isBindExternal, - allowInstant); + return retrieveServiceLocked(service, instanceName, false, 0, null, resolvedType, + callingPackage, callingPid, callingUid, userId, createIfNeeded, callingFromFg, + isBindExternal, allowInstant); } private ServiceLookupResult retrieveServiceLocked(Intent service, String instanceName, boolean isSdkSandboxService, int sdkSandboxClientAppUid, - String resolvedType, + String sdkSandboxClientAppPackage, String resolvedType, String callingPackage, int callingPid, int callingUid, int userId, boolean createIfNeeded, boolean callingFromFg, boolean isBindExternal, boolean allowInstant) { @@ -3416,7 +3417,8 @@ public final class ActiveServices { : null; r = new ServiceRecord(mAm, className, name, definingPackageName, definingUid, filter, sInfo, callingFromFg, res, - sdkSandboxProcessName, sdkSandboxClientAppUid); + sdkSandboxProcessName, sdkSandboxClientAppUid, + sdkSandboxClientAppPackage); res.setService(r); smap.mServicesByInstanceName.put(name, r); smap.mServicesByIntent.put(filter, r); @@ -4195,7 +4197,7 @@ public final class ActiveServices { if (r.isSdkSandbox) { final int uid = Process.toSdkSandboxUid(r.sdkSandboxClientAppUid); app = mAm.startSdkSandboxProcessLocked(procName, r.appInfo, true, intentFlags, - hostingRecord, ZYGOTE_POLICY_FLAG_EMPTY, uid); + hostingRecord, ZYGOTE_POLICY_FLAG_EMPTY, uid, r.sdkSandboxClientAppPackage); r.isolationHostProc = app; } else { app = mAm.startProcessLocked(procName, r.appInfo, true, intentFlags, diff --git a/services/core/java/com/android/server/am/ActivityManagerLocal.java b/services/core/java/com/android/server/am/ActivityManagerLocal.java index 3226a2b58a96..1d2c36b63bda 100644 --- a/services/core/java/com/android/server/am/ActivityManagerLocal.java +++ b/services/core/java/com/android/server/am/ActivityManagerLocal.java @@ -74,6 +74,8 @@ public interface ActivityManagerLocal { * @param conn Receives information as the service is started and stopped. * This must be a valid ServiceConnection object; it must not be null. * @param clientAppUid Uid of the app for which the sdk sandbox process needs to be spawned. + * @param clientAppPackage Package of the app for which the sdk sandbox process needs to + * be spawned. This package must belong to the clientAppUid. * @param processName Unique identifier for the service instance. Each unique name here will * result in a different service instance being created. Identifiers must only contain * ASCII letters, digits, underscores, and periods. @@ -87,6 +89,7 @@ public interface ActivityManagerLocal { */ @SuppressLint("RethrowRemoteException") boolean bindSdkSandboxService(@NonNull Intent service, @NonNull ServiceConnection conn, - int clientAppUid, @NonNull String processName, @Context.BindServiceFlags int flags) + int clientAppUid, @NonNull String clientAppPackage, @NonNull String processName, + @Context.BindServiceFlags int flags) throws RemoteException; } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 95e35ef6cf32..bd000e20fc64 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -36,6 +36,7 @@ import static android.app.ActivityManager.PROCESS_STATE_TOP; import static android.app.ActivityManager.StopUserOnSwitch; import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL; +import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.OP_NONE; import static android.content.pm.ApplicationInfo.HIDDEN_API_ENFORCEMENT_DEFAULT; import static android.content.pm.PackageManager.GET_SHARED_LIBRARY_FILES; @@ -1895,6 +1896,7 @@ public class ActivityManagerService extends IActivityManager.Stub 0, false, 0, + null, new HostingRecord("system")); app.setPersistent(true); app.setPid(MY_PID); @@ -2783,7 +2785,8 @@ public class ActivityManagerService extends IActivityManager.Stub false /* knownToBeDead */, 0 /* intentFlags */, sNullHostingRecord /* hostingRecord */, ZYGOTE_POLICY_FLAG_EMPTY, true /* allowWhileBooting */, true /* isolated */, - uid, false /* supplemental */, 0 /* supplementalUid */, + uid, false /* isSdkSandbox */, 0 /* sdkSandboxUid */, + null /* sdkSandboxClientAppPackage */, abiOverride, entryPoint, entryPointArgs, crashHandler); return proc != null; } @@ -2792,11 +2795,12 @@ public class ActivityManagerService extends IActivityManager.Stub @GuardedBy("this") final ProcessRecord startSdkSandboxProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, - HostingRecord hostingRecord, int zygotePolicyFlags, int sdkSandboxUid) { + HostingRecord hostingRecord, int zygotePolicyFlags, int sdkSandboxUid, + String sdkSandboxClientAppPackage) { return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingRecord, zygotePolicyFlags, false /* allowWhileBooting */, false /* isolated */, 0 /* isolatedUid */, - true /* isSdkSandbox */, sdkSandboxUid, + true /* isSdkSandbox */, sdkSandboxUid, sdkSandboxClientAppPackage, null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */, null /* crashHandler */); } @@ -2808,7 +2812,8 @@ public class ActivityManagerService extends IActivityManager.Stub boolean isolated) { return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingRecord, zygotePolicyFlags, allowWhileBooting, isolated, 0 /* isolatedUid */, - false /* isSdkSandbox */, 0 /* sdkSandboxClientdAppUid */, + false /* isSdkSandbox */, 0 /* sdkSandboxClientAppUid */, + null /* sdkSandboxClientAppPackage */, null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */, null /* crashHandler */); } @@ -4773,7 +4778,8 @@ public class ActivityManagerService extends IActivityManager.Stub thread.runIsolatedEntryPoint( app.getIsolatedEntryPoint(), app.getIsolatedEntryPointArgs()); } else if (instr2 != null) { - thread.bindApplication(processName, appInfo, providerList, + thread.bindApplication(processName, appInfo, app.sdkSandboxClientAppPackage, + providerList, instr2.mClass, profilerInfo, instr2.mArguments, instr2.mWatcher, @@ -4787,8 +4793,8 @@ public class ActivityManagerService extends IActivityManager.Stub app.getDisabledCompatChanges(), serializedSystemFontMap, app.getStartElapsedTime(), app.getStartUptime()); } else { - thread.bindApplication(processName, appInfo, providerList, null, profilerInfo, - null, null, null, testMode, + thread.bindApplication(processName, appInfo, app.sdkSandboxClientAppPackage, + providerList, null, profilerInfo, null, null, null, testMode, mBinderTransactionTrackingEnabled, enableTrackAllocation, isRestrictedBackupMode || !normalMode, app.isPersistent(), new Configuration(app.getWindowProcessController().getConfiguration()), @@ -6553,7 +6559,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (app == null) { app = mProcessList.newProcessRecordLocked(info, customProcess, isolated, 0, - false, 0, + false, 0, null, new HostingRecord("added application", customProcess != null ? customProcess : info.processName)); updateLruProcessLocked(app, false, null); @@ -12395,13 +12401,13 @@ public class ActivityManagerService extends IActivityManager.Stub String resolvedType, IServiceConnection connection, int flags, String instanceName, String callingPackage, int userId) throws TransactionTooLargeException { return bindServiceInstance(caller, token, service, resolvedType, connection, flags, - instanceName, false, 0, callingPackage, userId); + instanceName, false, 0, null, callingPackage, userId); } private int bindServiceInstance(IApplicationThread caller, IBinder token, Intent service, String resolvedType, IServiceConnection connection, int flags, String instanceName, - boolean isSdkSandboxService, int sdkSandboxClientdAppUid, String callingPackage, - int userId) + boolean isSdkSandboxService, int sdkSandboxClientAppUid, + String sdkSandboxClientAppPackage, String callingPackage, int userId) throws TransactionTooLargeException { enforceNotIsolatedCaller("bindService"); @@ -12438,8 +12444,8 @@ public class ActivityManagerService extends IActivityManager.Stub } synchronized (this) { return mServices.bindServiceLocked(caller, token, service, resolvedType, connection, - flags, instanceName, isSdkSandboxService, sdkSandboxClientdAppUid, - callingPackage, userId); + flags, instanceName, isSdkSandboxService, sdkSandboxClientAppUid, + sdkSandboxClientAppPackage, callingPackage, userId); } } finally { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); @@ -16022,22 +16028,29 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public boolean bindSdkSandboxService(Intent service, ServiceConnection conn, - int userAppUid, String processName, int flags) throws RemoteException { + int clientAppUid, String clientAppPackage, String processName, int flags) + throws RemoteException { if (service == null) { throw new IllegalArgumentException("intent is null"); } if (conn == null) { throw new IllegalArgumentException("connection is null"); } + if (clientAppPackage == null) { + throw new IllegalArgumentException("clientAppPackage is null"); + } if (processName == null) { throw new IllegalArgumentException("processName is null"); } if (service.getComponent() == null) { throw new IllegalArgumentException("service must specify explicit component"); } - if (!UserHandle.isApp(userAppUid)) { + if (!UserHandle.isApp(clientAppUid)) { throw new IllegalArgumentException("uid is not within application range"); } + if (mAppOpsService.checkPackage(clientAppUid, clientAppPackage) != MODE_ALLOWED) { + throw new IllegalArgumentException("uid does not belong to provided package"); + } Handler handler = mContext.getMainThreadHandler(); @@ -16046,8 +16059,8 @@ public class ActivityManagerService extends IActivityManager.Stub return ActivityManagerService.this.bindServiceInstance( mContext.getIApplicationThread(), mContext.getActivityToken(), service, service.resolveTypeIfNeeded(mContext.getContentResolver()), sd, flags, - processName, /*isSupplementalProcessService*/ true, userAppUid, - mContext.getOpPackageName(), UserHandle.getUserId(userAppUid)) != 0; + processName, /*isSdkSandboxService*/ true, clientAppUid, clientAppPackage, + mContext.getOpPackageName(), UserHandle.getUserId(clientAppUid)) != 0; } @Override diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java index d6a4cf650cba..ac0e22032b65 100644 --- a/services/core/java/com/android/server/am/AppProfiler.java +++ b/services/core/java/com/android/server/am/AppProfiler.java @@ -1886,8 +1886,7 @@ public class AppProfiler { BatteryStatsImpl.Uid.Proc ps = st.batteryStats; if (ps == null || !ps.isActive()) { st.batteryStats = ps = bstats.getProcessStatsLocked( - bstats.mapUid(st.uid), st.name, - elapsedRealtime, uptime); + st.uid, st.name, elapsedRealtime, uptime); } ps.addCpuTimeLocked(st.rel_utime, st.rel_stime); } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 91822ac353ab..eb7897b2c678 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -799,6 +799,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub final BatteryUsageStatsQuery querySinceReset = new BatteryUsageStatsQuery.Builder() .includeProcessStateData() + .includeVirtualUids() .build(); bus = getBatteryUsageStats(List.of(querySinceReset)).get(0); break; @@ -806,6 +807,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub final BatteryUsageStatsQuery queryPowerProfile = new BatteryUsageStatsQuery.Builder() .includeProcessStateData() + .includeVirtualUids() .powerProfileModeledOnly() .build(); bus = getBatteryUsageStats(List.of(queryPowerProfile)).get(0); @@ -821,6 +823,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub final BatteryUsageStatsQuery queryBeforeReset = new BatteryUsageStatsQuery.Builder() .includeProcessStateData() + .includeVirtualUids() .aggregateSnapshots(sessionStart, sessionEnd) .build(); bus = getBatteryUsageStats(List.of(queryBeforeReset)).get(0); diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 48ca59dc4c64..5bb946f3cd50 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2365,7 +2365,7 @@ public final class ProcessList { ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, HostingRecord hostingRecord, int zygotePolicyFlags, boolean allowWhileBooting, boolean isolated, int isolatedUid, - boolean isSdkSandbox, int sdkSandboxUid, + boolean isSdkSandbox, int sdkSandboxUid, String sdkSandboxClientAppPackage, String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) { long startTime = SystemClock.uptimeMillis(); ProcessRecord app; @@ -2460,7 +2460,7 @@ public final class ProcessList { if (app == null) { checkSlow(startTime, "startProcess: creating new process record"); app = newProcessRecordLocked(info, processName, isolated, isolatedUid, isSdkSandbox, - sdkSandboxUid, hostingRecord); + sdkSandboxUid, sdkSandboxClientAppPackage, hostingRecord); if (app == null) { Slog.w(TAG, "Failed making new process record for " + processName + "/" + info.uid + " isolated=" + isolated); @@ -2956,7 +2956,7 @@ public final class ProcessList { @GuardedBy("mService") ProcessRecord newProcessRecordLocked(ApplicationInfo info, String customProcess, boolean isolated, int isolatedUid, boolean isSdkSandbox, int sdkSandboxUid, - HostingRecord hostingRecord) { + String sdkSandboxClientAppPackage, HostingRecord hostingRecord) { String proc = customProcess != null ? customProcess : info.processName; final int userId = UserHandle.getUserId(info.uid); int uid = info.uid; @@ -2992,6 +2992,7 @@ public final class ProcessList { FrameworkStatsLog.ISOLATED_UID_CHANGED__EVENT__CREATED); } final ProcessRecord r = new ProcessRecord(mService, info, proc, uid, + sdkSandboxClientAppPackage, hostingRecord.getDefiningUid(), hostingRecord.getDefiningProcessName()); final ProcessStateRecord state = r.mState; diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index f7cc3d780f89..4908698a237f 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -84,6 +84,8 @@ class ProcessRecord implements WindowProcessListener { final int uid; // uid of process; may be different from 'info' if isolated final int userId; // user of process. final String processName; // name of the process + final String sdkSandboxClientAppPackage; // if this is an sdk sandbox process, name of the + // app package for which it is running /** * Overall state of process's uid. @@ -493,11 +495,12 @@ class ProcessRecord implements WindowProcessListener { ProcessRecord(ActivityManagerService _service, ApplicationInfo _info, String _processName, int _uid) { - this(_service, _info, _processName, _uid, -1, null); + this(_service, _info, _processName, _uid, null, -1, null); } ProcessRecord(ActivityManagerService _service, ApplicationInfo _info, String _processName, - int _uid, int _definingUid, String _definingProcessName) { + int _uid, String _sdkSandboxClientAppPackage, int _definingUid, + String _definingProcessName) { mService = _service; mProcLock = _service.mProcLock; info = _info; @@ -530,6 +533,7 @@ class ProcessRecord implements WindowProcessListener { uid = _uid; userId = UserHandle.getUserId(_uid); processName = _processName; + sdkSandboxClientAppPackage = _sdkSandboxClientAppPackage; mPersistent = false; mRemoved = false; mProfile = new ProcessProfileRecord(this); diff --git a/services/core/java/com/android/server/am/ServiceRecord.java b/services/core/java/com/android/server/am/ServiceRecord.java index c53d4d6b5015..795311f019a4 100644 --- a/services/core/java/com/android/server/am/ServiceRecord.java +++ b/services/core/java/com/android/server/am/ServiceRecord.java @@ -96,6 +96,8 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN final long createRealTime; // when this service was created final boolean isSdkSandbox; // whether this is a sdk sandbox service final int sdkSandboxClientAppUid; // the app uid for which this sdk sandbox service is running + final String sdkSandboxClientAppPackage; // the app package for which this sdk sandbox service + // is running final ArrayMap<Intent.FilterComparison, IntentBindRecord> bindings = new ArrayMap<Intent.FilterComparison, IntentBindRecord>(); // All active bindings to the service. @@ -573,13 +575,14 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN Intent.FilterComparison intent, ServiceInfo sInfo, boolean callerIsFg, Runnable restarter) { this(ams, name, instanceName, definingPackageName, definingUid, intent, sInfo, callerIsFg, - restarter, null, 0); + restarter, null, 0, null); } ServiceRecord(ActivityManagerService ams, ComponentName name, ComponentName instanceName, String definingPackageName, int definingUid, Intent.FilterComparison intent, ServiceInfo sInfo, boolean callerIsFg, - Runnable restarter, String sdkSandboxProcessName, int sdkSandboxClientAppUid) { + Runnable restarter, String sdkSandboxProcessName, int sdkSandboxClientAppUid, + String sdkSandboxClientAppPackage) { this.ams = ams; this.name = name; this.instanceName = instanceName; @@ -590,8 +593,9 @@ final class ServiceRecord extends Binder implements ComponentName.WithComponentN serviceInfo = sInfo; appInfo = sInfo.applicationInfo; packageName = sInfo.applicationInfo.packageName; - isSdkSandbox = sdkSandboxProcessName != null; + this.isSdkSandbox = sdkSandboxProcessName != null; this.sdkSandboxClientAppUid = sdkSandboxClientAppUid; + this.sdkSandboxClientAppPackage = sdkSandboxClientAppPackage; if ((sInfo.flags & ServiceInfo.FLAG_ISOLATED_PROCESS) != 0) { processName = sInfo.processName + ":" + instanceName.getClassName(); } else if (sdkSandboxProcessName != null) { diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 265ad7dee388..1885b5596e3e 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -630,6 +630,7 @@ public class NotificationManagerService extends SystemService { private int mWarnRemoteViewsSizeBytes; private int mStripRemoteViewsSizeBytes; final boolean mEnableAppSettingMigration; + private boolean mForceUserSetOnUpgrade; private MetricsLogger mMetricsLogger; private TriPredicate<String, Integer, String> mAllowedManagedServicePackages; @@ -2294,6 +2295,7 @@ public class NotificationManagerService extends SystemService { mMsgPkgsAllowedAsConvos = Set.of(getStringArrayResource( com.android.internal.R.array.config_notificationMsgPkgsAllowedAsConvos)); + mStatsManager = statsManager; mToastRateLimiter = toastRateLimiter; @@ -2386,6 +2388,9 @@ public class NotificationManagerService extends SystemService { WorkerHandler handler = new WorkerHandler(Looper.myLooper()); + mForceUserSetOnUpgrade = getContext().getResources().getBoolean( + R.bool.config_notificationForceUserSetOnUpgrade); + init(handler, new RankingHandlerWorker(mRankingThread.getLooper()), AppGlobals.getPackageManager(), getContext().getPackageManager(), getLocalService(LightsManager.class), @@ -2414,7 +2419,8 @@ public class NotificationManagerService extends SystemService { LocalServices.getService(ActivityManagerInternal.class), createToastRateLimiter(), new PermissionHelper(LocalServices.getService( PermissionManagerServiceInternal.class), AppGlobals.getPackageManager(), - AppGlobals.getPermissionManager(), mEnableAppSettingMigration), + AppGlobals.getPermissionManager(), mEnableAppSettingMigration, + mForceUserSetOnUpgrade), LocalServices.getService(UsageStatsManagerInternal.class)); publishBinderService(Context.NOTIFICATION_SERVICE, mService, /* allowIsolated= */ false, @@ -6069,6 +6075,7 @@ public class NotificationManagerService extends SystemService { pw.println(" mMaxPackageEnqueueRate=" + mMaxPackageEnqueueRate); pw.println(" hideSilentStatusBar=" + mPreferencesHelper.shouldHideSilentStatusIcons()); + pw.println(" mForceUserSetOnUpgrade=" + mForceUserSetOnUpgrade); } pw.println(" mArchive=" + mArchive.toString()); mArchive.dumpImpl(pw, filter); diff --git a/services/core/java/com/android/server/notification/PermissionHelper.java b/services/core/java/com/android/server/notification/PermissionHelper.java index e551f1056b24..b4230c11bcab 100644 --- a/services/core/java/com/android/server/notification/PermissionHelper.java +++ b/services/core/java/com/android/server/notification/PermissionHelper.java @@ -57,13 +57,16 @@ public final class PermissionHelper { private final IPermissionManager mPermManager; // TODO (b/194833441): Remove when the migration is enabled private final boolean mMigrationEnabled; + private final boolean mForceUserSetOnUpgrade; public PermissionHelper(PermissionManagerServiceInternal pmi, IPackageManager packageManager, - IPermissionManager permManager, boolean migrationEnabled) { + IPermissionManager permManager, boolean migrationEnabled, + boolean forceUserSetOnUpgrade) { mPmi = pmi; mPackageManager = packageManager; mPermManager = permManager; mMigrationEnabled = migrationEnabled; + mForceUserSetOnUpgrade = forceUserSetOnUpgrade; } public boolean isMigrationEnabled() { @@ -223,8 +226,9 @@ public final class PermissionHelper { return; } if (!isPermissionFixed(pkgPerm.packageName, pkgPerm.userId)) { + boolean userSet = mForceUserSetOnUpgrade ? true : pkgPerm.userModifiedSettings; setNotificationPermission(pkgPerm.packageName, pkgPerm.userId, pkgPerm.granted, - pkgPerm.userSet, !pkgPerm.userSet); + userSet, !userSet); } } @@ -305,13 +309,13 @@ public final class PermissionHelper { public final String packageName; public final @UserIdInt int userId; public final boolean granted; - public final boolean userSet; + public final boolean userModifiedSettings; public PackagePermission(String pkg, int userId, boolean granted, boolean userSet) { this.packageName = pkg; this.userId = userId; this.granted = granted; - this.userSet = userSet; + this.userModifiedSettings = userSet; } @Override @@ -319,13 +323,14 @@ public final class PermissionHelper { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; PackagePermission that = (PackagePermission) o; - return userId == that.userId && granted == that.granted && userSet == that.userSet + return userId == that.userId && granted == that.granted && userModifiedSettings + == that.userModifiedSettings && Objects.equals(packageName, that.packageName); } @Override public int hashCode() { - return Objects.hash(packageName, userId, granted, userSet); + return Objects.hash(packageName, userId, granted, userModifiedSettings); } @Override @@ -334,7 +339,7 @@ public final class PermissionHelper { "packageName='" + packageName + '\'' + ", userId=" + userId + ", granted=" + granted + - ", userSet=" + userSet + + ", userSet=" + userModifiedSettings + '}'; } } diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java index 2824585bf5aa..aa467e782e84 100644 --- a/services/core/java/com/android/server/pm/ApkChecksums.java +++ b/services/core/java/com/android/server/pm/ApkChecksums.java @@ -34,7 +34,6 @@ import android.content.Context; import android.content.pm.ApkChecksum; import android.content.pm.Checksum; import android.content.pm.IOnChecksumsReadyListener; -import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.Signature; import android.content.pm.SigningDetails.SignatureSchemeVersion; @@ -63,7 +62,6 @@ import android.util.apk.VerityBuilder; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.security.VerityUtils; -import com.android.server.LocalServices; import com.android.server.pm.parsing.pkg.AndroidPackage; import java.io.ByteArrayOutputStream; diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 7b2dc28a396f..d117967954d3 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -52,7 +52,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.function.QuadFunction; import com.android.server.FgThread; -import com.android.server.LocalServices; import com.android.server.compat.CompatChange; import com.android.server.om.OverlayReferenceMapper; import com.android.server.pm.parsing.pkg.AndroidPackage; @@ -487,12 +486,12 @@ public class AppsFilter implements Watchable, Snappable { } /** Builder method for an AppsFilter */ - public static AppsFilter create(@NonNull PackageManagerServiceInjector injector, - @NonNull PackageManagerInternal pmInt) { + public static AppsFilter create( + PackageManagerInternal pms, PackageManagerServiceInjector injector) { final boolean forceSystemAppsQueryable = injector.getContext().getResources() .getBoolean(R.bool.config_forceSystemPackagesQueryable); - final FeatureConfigImpl featureConfig = new FeatureConfigImpl(pmInt, injector); + final FeatureConfigImpl featureConfig = new FeatureConfigImpl(pms, injector); final String[] forcedQueryablePackageNames; if (forceSystemAppsQueryable) { // all system apps already queryable, no need to read and parse individual exceptions @@ -513,7 +512,7 @@ public class AppsFilter implements Watchable, Snappable { }; AppsFilter appsFilter = new AppsFilter(stateProvider, featureConfig, forcedQueryablePackageNames, forceSystemAppsQueryable, null, - injector.getBackgroundExecutor(), pmInt); + injector.getBackgroundExecutor(), pms); featureConfig.setAppsFilter(appsFilter); return appsFilter; } diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java index 9ff4aab83cff..ecbb4a9d45a1 100644 --- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java +++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java @@ -19,7 +19,6 @@ package com.android.server.pm; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import android.annotation.IntDef; -import android.annotation.NonNull; import android.annotation.Nullable; import android.app.job.JobInfo; import android.app.job.JobParameters; @@ -270,7 +269,7 @@ public final class BackgroundDexOptService { PackageManagerService pm = mInjector.getPackageManagerService(); ArraySet<String> packagesToOptimize; if (packageNames == null) { - packagesToOptimize = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer()); + packagesToOptimize = mDexOptHelper.getOptimizablePackages(); } else { packagesToOptimize = new ArraySet<>(packageNames); } @@ -335,7 +334,7 @@ public final class BackgroundDexOptService { return false; } - ArraySet<String> pkgs = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer()); + ArraySet<String> pkgs = mDexOptHelper.getOptimizablePackages(); if (pkgs.isEmpty()) { Slog.i(TAG, "No packages to optimize"); markPostBootUpdateCompleted(params); @@ -557,8 +556,8 @@ public final class BackgroundDexOptService { } /** Gets the size of a package. */ - private long getPackageSize(@NonNull Computer snapshot, String pkg) { - PackageInfo info = snapshot.getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM); + private long getPackageSize(PackageManagerService pm, String pkg) { + PackageInfo info = pm.snapshotComputer().getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM); long size = 0; if (info != null && info.applicationInfo != null) { File path = Paths.get(info.applicationInfo.sourceDir).toFile(); @@ -606,9 +605,8 @@ public final class BackgroundDexOptService { Slog.d(TAG, "Should Downgrade " + shouldDowngrade); } if (shouldDowngrade) { - final Computer snapshot = pm.snapshotComputer(); Set<String> unusedPackages = - snapshot.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis); + pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis); if (DEBUG) { Slog.d(TAG, "Unsused Packages " + String.join(",", unusedPackages)); } @@ -620,7 +618,7 @@ public final class BackgroundDexOptService { // Should be aborted by the scheduler. return abortCode; } - @DexOptResult int downgradeResult = downgradePackage(snapshot, pm, pkg, + @DexOptResult int downgradeResult = downgradePackage(pm, pkg, /* isForPrimaryDex= */ true, isPostBootUpdate); if (downgradeResult == PackageDexOptimizer.DEX_OPT_PERFORMED) { updatedPackages.add(pkg); @@ -631,7 +629,7 @@ public final class BackgroundDexOptService { return status; } if (supportSecondaryDex) { - downgradeResult = downgradePackage(snapshot, pm, pkg, + downgradeResult = downgradePackage(pm, pkg, /* isForPrimaryDex= */false, isPostBootUpdate); status = convertPackageDexOptimizerStatusToInternal(downgradeResult); if (status != STATUS_OK) { @@ -698,8 +696,8 @@ public final class BackgroundDexOptService { * @return PackageDexOptimizer.DEX_* */ @DexOptResult - private int downgradePackage(@NonNull Computer snapshot, PackageManagerService pm, String pkg, - boolean isForPrimaryDex, boolean isPostBootUpdate) { + private int downgradePackage(PackageManagerService pm, String pkg, boolean isForPrimaryDex, + boolean isPostBootUpdate) { if (DEBUG) { Slog.d(TAG, "Downgrading " + pkg); } @@ -711,15 +709,15 @@ public final class BackgroundDexOptService { if (!isPostBootUpdate) { dexoptFlags |= DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB; } - long package_size_before = getPackageSize(snapshot, pkg); + long package_size_before = getPackageSize(pm, pkg); int result = PackageDexOptimizer.DEX_OPT_SKIPPED; if (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg)) { // This applies for system apps or if packages location is not a directory, i.e. // monolithic install. - if (!pm.canHaveOatDir(snapshot, pkg)) { + if (!pm.canHaveOatDir(pkg)) { // For apps that don't have the oat directory, instead of downgrading, // remove their compiler artifacts from dalvik cache. - pm.deleteOatArtifactsOfPackage(snapshot, pkg); + pm.deleteOatArtifactsOfPackage(pkg); } else { result = performDexOptPrimary(pkg, reason, dexoptFlags); } @@ -728,9 +726,8 @@ public final class BackgroundDexOptService { } if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) { - final Computer newSnapshot = pm.snapshotComputer(); FrameworkStatsLog.write(FrameworkStatsLog.APP_DOWNGRADED, pkg, package_size_before, - getPackageSize(newSnapshot, pkg), /*aggressive=*/ false); + getPackageSize(pm, pkg), /*aggressive=*/ false); } return result; } diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java index 8e853019de90..6103d688e2b1 100644 --- a/services/core/java/com/android/server/pm/Computer.java +++ b/services/core/java/com/android/server/pm/Computer.java @@ -58,6 +58,10 @@ import com.android.server.utils.WatchedLongSparseArray; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; import java.util.List; import java.util.Set; @@ -88,69 +92,92 @@ import java.util.Set; * and other managers (like PermissionManager) mean deadlock is possible. On the * other hand, not overriding in {@link ComputerLocked} may leave a function walking * unstable data. + * + * To coax developers to consider such issues carefully, all methods in + * {@link Computer} must be annotated with <code>@LiveImplementation(override = + * MANDATORY)</code> or <code>LiveImplementation(locked = NOT_ALLOWED)</code>. A unit + * test verifies the annotation and that the annotation corresponds to the code in + * {@link ComputerEngine} and {@link ComputerLocked}. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public interface Computer extends PackageDataSnapshot { /** + * Every method must be annotated. + */ + @Target({ ElementType.METHOD }) + @Retention(RetentionPolicy.RUNTIME) + @interface LiveImplementation { + // A Computer method must be annotated with one of the following values: + // MANDATORY - the method must be overridden in ComputerEngineLive. The + // format of the override is a call to the super method, wrapped in a + // synchronization block. + // NOT_ALLOWED - the method may not appear in the live computer. It must + // be final in the ComputerEngine. + int MANDATORY = 1; + int NOT_ALLOWED = 2; + int override() default MANDATORY; + String rationale() default ""; + } + + /** * Administrative statistics: record that the snapshot has been used. Every call * to use() increments the usage counter. */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) default void use() { } /** * Fetch the snapshot usage counter. * @return The number of times this snapshot was used. */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) default int getUsed() { return 0; } + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent, String resolvedType, long flags, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent, String resolvedType, long flags, int userId, int callingUid, boolean includeInstantApps); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody(Intent intent, String resolvedType, long flags, int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits, String pkgName, String instantAppPkgName); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ActivityInfo getActivityInfo(ComponentName component, long flags, int userId); - - /** - * Important: The provided filterCallingUid is used exclusively to filter out activities - * that can be seen based on user state. It's typically the original caller uid prior - * to clearing. Because it can only be provided by trusted code, its value can be - * trusted and will be used as-is; unlike userId which will be validated by this method. - */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ActivityInfo getActivityInfoInternal(ComponentName component, long flags, int filterCallingUid, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) AndroidPackage getPackage(String packageName); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) AndroidPackage getPackage(int uid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ApplicationInfo generateApplicationInfoFromSettings(String packageName, long flags, int filterCallingUid, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ApplicationInfo getApplicationInfo(String packageName, long flags, int userId); - - /** - * Important: The provided filterCallingUid is used exclusively to filter out applications - * that can be seen based on user state. It's typically the original caller uid prior - * to clearing. Because it can only be provided by trusted code, its value can be - * trusted and will be used as-is; unlike userId which will be validated by this method. - */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ApplicationInfo getApplicationInfoInternal(String packageName, long flags, int filterCallingUid, int userId); - - /** - * Report the 'Home' activity which is currently set as "always use this one". If non is set - * then reports the most likely home activity or null if there are more than one. - */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ComponentName getDefaultHomeActivity(int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent, String resolvedType, long flags, int sourceUserId, int parentUserId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) Intent getHomeIntent(); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) List<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(Intent intent, String resolvedType, int userId); @@ -165,11 +192,15 @@ public interface Computer extends PackageDataSnapshot { * @param intent * @return A filtered list of resolved activities. */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) List<ResolveInfo> applyPostResolutionFilter(@NonNull List<ResolveInfo> resolveInfos, String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid, boolean resolveForStart, int userId, Intent intent); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageInfo generatePackageInfo(PackageStateInternal ps, long flags, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageInfo getPackageInfo(String packageName, long flags, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageInfo getPackageInfoInternal(String packageName, long versionCode, long flags, int filterCallingUid, int userId); @@ -178,69 +209,79 @@ public interface Computer extends PackageDataSnapshot { * known {@link PackageState} instances without a {@link PackageState#getAndroidPackage()} * will not be represented. */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) String[] getAllAvailablePackageNames(); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageStateInternal getPackageStateInternal(String packageName); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) PackageStateInternal getPackageStateInternal(String packageName, int callingUid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) + @Nullable PackageState getPackageStateCopied(@NonNull String packageName); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ParceledListSlice<PackageInfo> getInstalledPackages(long flags, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ResolveInfo createForwardingResolveInfoUnchecked(WatchedIntentFilter filter, int sourceUserId, int targetUserId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) ServiceInfo getServiceInfo(ComponentName component, long flags, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) SharedLibraryInfo getSharedLibraryInfo(String name, long version); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) String getInstantAppPackageName(int callingUid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) String resolveExternalPackageName(AndroidPackage pkg); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) String resolveInternalPackageName(String packageName, long versionCode); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) String[] getPackagesForUid(int uid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) UserInfo getProfileParent(int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean canViewInstantApps(int callingUid, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid, int userId, long flags); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isCallerSameApp(String packageName, int uid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isComponentVisibleToInstantApp(@Nullable ComponentName component); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isComponentVisibleToInstantApp(@Nullable ComponentName component, @PackageManager.ComponentType int type); - - /** - * From Android R, camera intents have to match system apps. The only exception to this is if - * the DPC has set the camera persistent preferred activity. This case was introduced - * because it is important that the DPC has the ability to set both system and non-system - * camera persistent preferred activities. - * - * @return {@code true} if the intent is a camera intent and the persistent preferred - * activity was not set by the DPC. - */ - boolean isImplicitImageCaptureIntentAndNotSetByDpc(Intent intent, int userId, + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) + boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId, String resolvedType, long flags); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isInstantApp(String packageName, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isInstantAppInternal(String packageName, @UserIdInt int userId, int callingUid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean isSameProfileGroup(@UserIdInt int callerUserId, @UserIdInt int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid, @Nullable ComponentName component, @PackageManager.ComponentType int componentType, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) boolean shouldFilterApplication(@NonNull SharedUserSetting sus, int callingUid, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) int checkUidPermission(String permName, int uid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) int getPackageUidInternal(String packageName, long flags, int userId, int callingUid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) long updateFlagsForApplication(long flags, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) long updateFlagsForComponent(long flags, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) long updateFlagsForPackage(long flags, int userId); - - /** - * Update given flags when being used to request {@link ResolveInfo}. - * <p>Instant apps are resolved specially, depending upon context. Minimally, - * {@code}flags{@code} must have the {@link PackageManager#MATCH_INSTANT} - * flag set. However, this flag is only honoured in three circumstances: - * <ul> - * <li>when called from a system process</li> - * <li>when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}</li> - * <li>when resolution occurs to start an activity with a {@code android.intent.action.VIEW} - * action and a {@code android.intent.category.BROWSABLE} category</li> - * </ul> - */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) long updateFlagsForResolve(long flags, int userId, int callingUid, boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) long updateFlagsForResolve(long flags, int userId, int callingUid, boolean wantInstantApps, boolean onlyExposedExplicitly, boolean isImplicitImageCaptureIntentAndNotSetByDpc); @@ -258,99 +299,117 @@ public interface Computer extends PackageDataSnapshot { * @param checkShell whether to prevent shell from access if there's a debugging restriction * @param message the message to log on security exception */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId, boolean requireFullPermission, boolean checkShell, String message); - - /** - * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS - * or INTERACT_ACROSS_USERS_FULL permissions, if the {@code userId} is not for the caller. - * - * @param checkShell whether to prevent shell from access if there's a debugging restriction - * @param message the message to log on security exception - */ + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, boolean requireFullPermission, boolean checkShell, String message); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, boolean requireFullPermission, boolean checkShell, boolean requirePermissionWhenSameUser, String message); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) SigningDetails getSigningDetails(@NonNull String packageName); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) SigningDetails getSigningDetails(int uid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) boolean filterAppAccess(String packageName, int callingUid, int userId); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) boolean filterAppAccess(int uid, int callingUid); + @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY) void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState); + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityInternal( Intent intent, String resolvedType, long flags, List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered); - ResolveInfo findPersistentPreferredActivity(Intent intent, String resolvedType, long flags, + @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED) + ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType, long flags, List<ResolveInfo> query, boolean debug, int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) PreferredIntentResolver getPreferredActivities(@UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ArrayMap<String, ? extends PackageStateInternal> getPackageStates(); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String getRenamedPackage(@NonNull String packageName); /** * @return set of packages to notify */ + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManagerService.PackageStartability int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isPackageAvailable(String packageName, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] currentToCanonicalPackageNames(@NonNull String[] names); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] canonicalToCurrentPackageNames(@NonNull String[] names); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull int[] getPackageGids(@NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getTargetSdkVersion(@NonNull String packageName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName, @NonNull ComponentName component, @NonNull Intent intent, String resolvedType); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ActivityInfo getReceiverInfo(@NonNull ComponentName component, @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid, int userId, boolean throwIfPermNotDeclared); - /** - * Returns true if the system or user is explicitly preventing an otherwise valid installer to - * complete an install. This includes checks like unknown sources and user restrictions. - */ + @Computer.LiveImplementation(override = LiveImplementation.NOT_ALLOWED) boolean isInstallDisabledForPackage(@NonNull String packageName, int uid, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo, @PackageManager.PackageInfoFlagsBits long flags, int callingUid, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries( @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ProviderInfo getProviderInfo(@NonNull ComponentName component, @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String[] getSystemSharedLibraryNames(); @@ -358,103 +417,136 @@ public interface Computer extends PackageDataSnapshot { * @return the state if the given package has a state and isn't filtered by visibility. * Provides no guarantee that the package is in any usable state. */ + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int checkSignatures(@NonNull String pkg1, @NonNull String pkg2); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int checkUidSignatures(int uid1, int uid2); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate, @PackageManager.CertificateInputType int type); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, @PackageManager.CertificateInputType int type); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List<String> getAllPackages(); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String getNameForUid(int uid); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String[] getNamesForUids(@NonNull int[] uids); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getUidForSharedUser(@NonNull String sharedUserName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getFlagsForUid(int uid); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getPrivateFlagsForUid(int uid); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isUidPrivileged(int uid); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] getAppOpPermissionPackages(@NonNull String permissionName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(@NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List<ApplicationInfo> getInstalledApplications( @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId, int callingUid); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ProviderInfo resolveContentProvider(@NonNull String name, @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId, int callingUid); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid, @NonNull String visibleAuthority); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) void querySyncProviders(boolean safeMode, @NonNull List<String> outNames, @NonNull List<ProviderInfo> outInfo); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName, int uid, @PackageManager.ComponentInfoFlagsBits long flags, @Nullable String metaDataKey); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ParceledListSlice<InstrumentationInfo> queryInstrumentation( @NonNull String targetPackage, int flags); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List<PackageStateInternal> findSharedNonSystemLibraries( @NonNull PackageStateInternal pkgSetting); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName, @UserIdInt int[] userIds, boolean isInstantApp); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable String getInstallerPackageName(@NonNull String packageName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable InstallSourceInfo getInstallSourceInfo(@NonNull String packageName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManager.EnabledState int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManager.EnabledState int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManager.EnabledState int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid, @UserIdInt int userId); @@ -465,19 +557,25 @@ public interface Computer extends PackageDataSnapshot { * are all effectively enabled for the given component. Or if the component cannot be found, * returns false. */ + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable KeySet getSigningKeySet(@NonNull String packageName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId); @@ -487,37 +585,49 @@ public interface Computer extends PackageDataSnapshot { * package visibility filtering is enabled on it. If the UID is part of a shared user ID, * return {@code true} if any one application belongs to the shared user ID meets the criteria. */ + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canQueryPackage(int callingUid, @Nullable String targetPackageName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getPackageUid(@NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canAccessComponent(int callingUid, @NonNull ComponentName component, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @PackageManager.InstallReason int getInstallReason(@NonNull String packageName, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canPackageQuery(@NonNull String sourcePackageName, @NonNull String targetPackageName, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, @UserIdInt int sourceUserId, @UserIdInt int targetUserId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull SparseArray<String> getAppsWithSharedUserIds(); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] getSharedUserPackagesForPackage(@NonNull String packageName, @UserIdInt int userId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull Set<String> getUnusedPackages(long downgradeTimeThresholdMillis); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId); @@ -528,49 +638,55 @@ public interface Computer extends PackageDataSnapshot { * * @return The filtered packages */ + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull String[] filterOnlySystemPackages(@Nullable String... pkgNames); // The methods in this block should be removed once SettingBase is interface snapshotted + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull List<AndroidPackage> getPackagesForAppId(int appId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) int getUidTargetSdkVersion(int uid); /** * @see PackageManagerInternal#getProcessesForUid(int) */ + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ArrayMap<String, ProcessInfo> getProcessesForUid(int uid); // End block + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries(); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable SharedUserApi getSharedUser(int sharedUserAppIde); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @NonNull ComponentResolverApi getComponentResolver(); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable PackageStateInternal getDisabledSystemPackage(@NonNull String packageName); + @Computer.LiveImplementation(override = LiveImplementation.MANDATORY) @Nullable ResolveInfo getInstantAppInstallerInfo(); - - @NonNull - WatchedArrayMap<String, Integer> getFrozenPackages(); - - @Nullable - ComponentName getInstantAppInstallerComponent(); } diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index 06e827a8897f..0c9855b2385d 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -466,7 +466,7 @@ public class ComputerEngine implements Computer { flags = updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart, comp != null || pkgName != null /*onlyExposedExplicitly*/, - isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType, + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, flags)); List<ResolveInfo> list = Collections.emptyList(); boolean skipPostResolution = false; @@ -1722,6 +1722,15 @@ public class ComputerEngine implements Computer { return mSettings.getPackage(packageName); } + @Nullable + public PackageState getPackageStateCopied(@NonNull String packageName) { + int callingUid = Binder.getCallingUid(); + packageName = resolveInternalPackageNameInternalLocked( + packageName, PackageManager.VERSION_CODE_HIGHEST, callingUid); + PackageStateInternal pkgSetting = mSettings.getPackage(packageName); + return pkgSetting == null ? null : PackageStateImpl.copy(pkgSetting); + } + public final ParceledListSlice<PackageInfo> getInstalledPackages(long flags, int userId) { final int callingUid = Binder.getCallingUid(); if (getInstantAppPackageName(callingUid) != null) { @@ -2459,7 +2468,7 @@ public class ComputerEngine implements Computer { * @return {@code true} if the intent is a camera intent and the persistent preferred * activity was not set by the DPC. */ - public final boolean isImplicitImageCaptureIntentAndNotSetByDpc(Intent intent, + public final boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) { return intent.isImplicitImageCaptureIntent() && !isPersistentPreferredActivitySetByDpm( intent, userId, resolvedType, flags); @@ -3219,12 +3228,12 @@ public class ComputerEngine implements Computer { flags = updateFlagsForResolve( flags, userId, callingUid, false /*includeInstantApps*/, - isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, flags)); intent = PackageManagerServiceUtils.updateIntentForResolve(intent); // Try to find a matching persistent preferred activity. - result.mPreferredResolveInfo = findPersistentPreferredActivity(intent, + result.mPreferredResolveInfo = findPersistentPreferredActivityLP(intent, resolvedType, flags, query, debug, userId); // If a persistent preferred activity matched, use it. @@ -3435,7 +3444,7 @@ public class ComputerEngine implements Computer { userId, queryMayBeFiltered, callingUid, isDeviceProvisioned); } - public final ResolveInfo findPersistentPreferredActivity(Intent intent, + public final ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, List<ResolveInfo> query, boolean debug, int userId) { final int n = query.size(); @@ -5409,7 +5418,7 @@ public class ComputerEngine implements Computer { } long flags = updateFlagsForResolve(0, parent.id, callingUid, false /*includeInstantApps*/, - isImplicitImageCaptureIntentAndNotSetByDpc(intent, parent.id, + isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, parent.id, resolvedType, 0)); flags |= PackageManager.MATCH_DEFAULT_ONLY; CrossProfileDomainInfo xpDomainInfo = getCrossProfileDomainPreferredLpr( @@ -5685,17 +5694,4 @@ public class ComputerEngine implements Computer { public ResolveInfo getInstantAppInstallerInfo() { return mInstantAppInstallerInfo; } - - @NonNull - @Override - public WatchedArrayMap<String, Integer> getFrozenPackages() { - return mFrozenPackages; - } - - @Nullable - @Override - public ComponentName getInstantAppInstallerComponent() { - return mLocalInstantAppInstallerActivity == null - ? null : mLocalInstantAppInstallerActivity.getComponentName(); - } } diff --git a/services/core/java/com/android/server/pm/ComputerLocked.java b/services/core/java/com/android/server/pm/ComputerLocked.java index af196d51331f..5d89c7daeaf5 100644 --- a/services/core/java/com/android/server/pm/ComputerLocked.java +++ b/services/core/java/com/android/server/pm/ComputerLocked.java @@ -16,21 +16,62 @@ package com.android.server.pm; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.UserIdInt; import android.content.ComponentName; +import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.ComponentInfo; +import android.content.pm.InstallSourceInfo; +import android.content.pm.InstrumentationInfo; +import android.content.pm.KeySet; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ParceledListSlice; +import android.content.pm.ProcessInfo; +import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; +import android.content.pm.SharedLibraryInfo; +import android.content.pm.SigningDetails; +import android.content.pm.VersionedPackage; +import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.Pair; +import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.PackageState; +import com.android.server.pm.pkg.PackageStateInternal; +import com.android.server.pm.pkg.SharedUserApi; +import com.android.server.pm.resolution.ComponentResolverApi; +import com.android.server.utils.WatchedArrayMap; +import com.android.server.utils.WatchedLongSparseArray; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; /** * This subclass is the external interface to the live computer. Some internal helper - * methods are overridden to fetch live data instead of snapshot data. + * methods are overridden to fetch live data instead of snapshot data. For each + * Computer interface that is overridden in this class, the override takes the PM lock + * and then delegates to the live computer engine. This is required because there are + * no locks taken in the engine itself. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) public final class ComputerLocked extends ComputerEngine { + private final Object mLock; ComputerLocked(PackageManagerService.Snapshot args) { super(args); + mLock = mService.mLock; } protected ComponentName resolveComponentName() { @@ -42,4 +83,814 @@ public final class ComputerLocked extends ComputerEngine { protected ApplicationInfo androidApplication() { return mService.getCoreAndroidApplication(); } + + public @NonNull List<ResolveInfo> queryIntentServicesInternalBody(Intent intent, + String resolvedType, int flags, int userId, int callingUid, + String instantAppPkgName) { + synchronized (mLock) { + return super.queryIntentServicesInternalBody(intent, resolvedType, flags, userId, + callingUid, instantAppPkgName); + } + } + public @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody( + Intent intent, String resolvedType, long flags, int filterCallingUid, int userId, + boolean resolveForStart, boolean allowDynamicSplits, String pkgName, + String instantAppPkgName) { + synchronized (mLock) { + return super.queryIntentActivitiesInternalBody(intent, resolvedType, flags, + filterCallingUid, userId, resolveForStart, allowDynamicSplits, pkgName, + instantAppPkgName); + } + } + public ActivityInfo getActivityInfoInternalBody(ComponentName component, int flags, + int filterCallingUid, int userId) { + synchronized (mLock) { + return super.getActivityInfoInternalBody(component, flags, filterCallingUid, + userId); + } + } + public AndroidPackage getPackage(String packageName) { + synchronized (mLock) { + return super.getPackage(packageName); + } + } + public AndroidPackage getPackage(int uid) { + synchronized (mLock) { + return super.getPackage(uid); + } + } + public ApplicationInfo getApplicationInfoInternalBody(String packageName, int flags, + int filterCallingUid, int userId) { + synchronized (mLock) { + return super.getApplicationInfoInternalBody(packageName, flags, filterCallingUid, + userId); + } + } + public ArrayList<ResolveInfo> filterCandidatesWithDomainPreferredActivitiesLPrBody( + Intent intent, int matchFlags, List<ResolveInfo> candidates, + CrossProfileDomainInfo xpDomainInfo, int userId, boolean debug) { + synchronized (mLock) { + return super.filterCandidatesWithDomainPreferredActivitiesLPrBody(intent, + matchFlags, candidates, xpDomainInfo, userId, debug); + } + } + public PackageInfo getPackageInfoInternalBody(String packageName, long versionCode, + int flags, int filterCallingUid, int userId) { + synchronized (mLock) { + return super.getPackageInfoInternalBody(packageName, versionCode, flags, + filterCallingUid, userId); + } + } + + @Override + public String[] getAllAvailablePackageNames() { + synchronized (mLock) { + return super.getAllAvailablePackageNames(); + } + } + + public PackageStateInternal getPackageStateInternal(String packageName, int callingUid) { + synchronized (mLock) { + return super.getPackageStateInternal(packageName, callingUid); + } + } + + @Nullable + public PackageState getPackageStateCopied(@NonNull String packageName) { + synchronized (mLock) { + return super.getPackageStateCopied(packageName); + } + } + + public ParceledListSlice<PackageInfo> getInstalledPackagesBody(int flags, int userId, + int callingUid) { + synchronized (mLock) { + return super.getInstalledPackagesBody(flags, userId, callingUid); + } + } + public ServiceInfo getServiceInfoBody(ComponentName component, int flags, int userId, + int callingUid) { + synchronized (mLock) { + return super.getServiceInfoBody(component, flags, userId, callingUid); + } + } + public String getInstantAppPackageName(int callingUid) { + synchronized (mLock) { + return super.getInstantAppPackageName(callingUid); + } + } + public String[] getPackagesForUidInternalBody(int callingUid, int userId, int appId, + boolean isCallerInstantApp) { + synchronized (mLock) { + return super.getPackagesForUidInternalBody(callingUid, userId, appId, + isCallerInstantApp); + } + } + public boolean isInstantAppInternalBody(String packageName, @UserIdInt int userId, + int callingUid) { + synchronized (mLock) { + return super.isInstantAppInternalBody(packageName, userId, callingUid); + } + } + public boolean isInstantAppResolutionAllowedBody(Intent intent, + List<ResolveInfo> resolvedActivities, int userId, boolean skipPackageCheck, + int flags) { + synchronized (mLock) { + return super.isInstantAppResolutionAllowedBody(intent, resolvedActivities, userId, + skipPackageCheck, flags); + } + } + public int getPackageUidInternal(String packageName, int flags, int userId, + int callingUid) { + synchronized (mLock) { + return super.getPackageUidInternal(packageName, flags, userId, callingUid); + } + } + public SigningDetails getSigningDetails(@NonNull String packageName) { + synchronized (mLock) { + return super.getSigningDetails(packageName); + } + } + public SigningDetails getSigningDetails(int uid) { + synchronized (mLock) { + return super.getSigningDetails(uid); + } + } + public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { + synchronized (mLock) { + return super.filterAppAccess(pkg, callingUid, userId); + } + } + public boolean filterAppAccess(String packageName, int callingUid, int userId) { + synchronized (mLock) { + return super.filterAppAccess(packageName, callingUid, userId); + } + } + public boolean filterAppAccess(int uid, int callingUid) { + synchronized (mLock) { + return super.filterAppAccess(uid, callingUid); + } + } + public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) { + synchronized (mLock) { + super.dump(type, fd, pw, dumpState); + } + } + public PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityBody( + Intent intent, String resolvedType, int flags, List<ResolveInfo> query, boolean always, + boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered, + int callingUid, boolean isDeviceProvisioned) { + synchronized (mLock) { + return super.findPreferredActivityBody(intent, resolvedType, flags, query, always, + removeMatches, debug, userId, queryMayBeFiltered, callingUid, + isDeviceProvisioned); + } + } + + @Override + public PreferredIntentResolver getPreferredActivities(int userId) { + synchronized (mLock) { + return super.getPreferredActivities(userId); + } + } + + @NonNull + @Override + public ArrayMap<String, ? extends PackageStateInternal> getPackageStates() { + synchronized (mLock) { + return super.getPackageStates(); + } + } + + @Nullable + @Override + public String getRenamedPackage(@NonNull String packageName) { + synchronized (mLock) { + return super.getRenamedPackage(packageName); + } + } + + @NonNull + @Override + public ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages) { + synchronized (mLock) { + return super.getNotifyPackagesForReplacedReceived(packages); + } + } + + @Override + public int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid, + @UserIdInt int userId) { + synchronized (mLock) { + return super.getPackageStartability(safeMode, packageName, callingUid, userId); + } + } + + @Override + public boolean isPackageAvailable(String packageName, @UserIdInt int userId) { + synchronized (mLock) { + return super.isPackageAvailable(packageName, userId); + } + } + + @Override + public String[] currentToCanonicalPackageNames(String[] names) { + synchronized (mLock) { + return super.currentToCanonicalPackageNames(names); + } + } + + @Override + public String[] canonicalToCurrentPackageNames(String[] names) { + synchronized (mLock) { + return super.canonicalToCurrentPackageNames(names); + } + } + + @Override + public int[] getPackageGids(@NonNull String packageName, + @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { + synchronized (mLock) { + return super.getPackageGids(packageName, flags, userId); + } + } + + @Override + public int getTargetSdkVersion(@NonNull String packageName) { + synchronized (mLock) { + return super.getTargetSdkVersion(packageName); + } + } + + @Override + public boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName, + @NonNull ComponentName component, @NonNull Intent intent, String resolvedType) { + synchronized (mLock) { + return super.activitySupportsIntent(resolveComponentName, component, intent, + resolvedType); + } + } + + @Nullable + @Override + public ActivityInfo getReceiverInfo(@NonNull ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { + synchronized (mLock) { + return super.getReceiverInfo(component, flags, userId); + } + } + + @Nullable + @Override + public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName, + @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { + synchronized (mLock) { + return super.getSharedLibraries(packageName, flags, userId); + } + } + + @Override + public boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid, + @UserIdInt int userId, boolean throwIfPermNotDeclared) { + synchronized (mLock) { + return super.canRequestPackageInstalls(packageName, callingUid, userId, + throwIfPermNotDeclared); + } + } + + @Override + public List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo, + @PackageManager.PackageInfoFlagsBits long flags, int callingUid, + @UserIdInt int userId) { + synchronized (mLock) { + return super.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, userId); + } + } + + @Nullable + @Override + public ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries( + @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, + @UserIdInt int userId) { + synchronized (mLock) { + return super.getDeclaredSharedLibraries(packageName, flags, userId); + } + } + + @Nullable + @Override + public ProviderInfo getProviderInfo(@NonNull ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { + synchronized (mLock) { + return super.getProviderInfo(component, flags, userId); + } + } + + @Nullable + @Override + public String[] getSystemSharedLibraryNames() { + synchronized (mLock) { + return super.getSystemSharedLibraryNames(); + } + } + + @Override + public int checkSignatures(@NonNull String pkg1, + @NonNull String pkg2) { + synchronized (mLock) { + return super.checkSignatures(pkg1, pkg2); + } + } + + @Override + public int checkUidSignatures(int uid1, int uid2) { + synchronized (mLock) { + return super.checkUidSignatures(uid1, uid2); + } + } + + @Override + public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate, + int type) { + synchronized (mLock) { + return super.hasSigningCertificate(packageName, certificate, type); + } + } + + @Override + public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, int type) { + synchronized (mLock) { + return super.hasUidSigningCertificate(uid, certificate, type); + } + } + + @Override + public List<String> getAllPackages() { + synchronized (mLock) { + return super.getAllPackages(); + } + } + + @Nullable + @Override + public String getNameForUid(int uid) { + synchronized (mLock) { + return super.getNameForUid(uid); + } + } + + @Nullable + @Override + public String[] getNamesForUids(int[] uids) { + synchronized (mLock) { + return super.getNamesForUids(uids); + } + } + + @Override + public int getUidForSharedUser(@NonNull String sharedUserName) { + synchronized (mLock) { + return super.getUidForSharedUser(sharedUserName); + } + } + + @Override + public int getFlagsForUid(int uid) { + synchronized (mLock) { + return super.getFlagsForUid(uid); + } + } + + @Override + public int getPrivateFlagsForUid(int uid) { + synchronized (mLock) { + return super.getPrivateFlagsForUid(uid); + } + } + + @Override + public boolean isUidPrivileged(int uid) { + synchronized (mLock) { + return super.isUidPrivileged(uid); + } + } + + @NonNull + @Override + public String[] getAppOpPermissionPackages(@NonNull String permissionName) { + synchronized (mLock) { + return super.getAppOpPermissionPackages(permissionName); + } + } + + @NonNull + @Override + public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions( + @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, + @UserIdInt int userId) { + synchronized (mLock) { + return super.getPackagesHoldingPermissions(permissions, flags, userId); + } + } + + @NonNull + @Override + public List<ApplicationInfo> getInstalledApplications( + @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId, + int callingUid) { + synchronized (mLock) { + return super.getInstalledApplications(flags, userId, callingUid); + } + } + + @Nullable + @Override + public ProviderInfo resolveContentProvider(@NonNull String name, + @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId, + int callingUid) { + synchronized (mLock) { + return super.resolveContentProvider(name, flags, userId, callingUid); + } + } + + @Nullable + @Override + public ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid, + @NonNull String visibleAuthority) { + synchronized (mLock) { + return super.getGrantImplicitAccessProviderInfo(recipientUid, visibleAuthority); + } + } + + @Override + public void querySyncProviders(boolean safeMode, @NonNull List<String> outNames, + @NonNull List<ProviderInfo> outInfo) { + synchronized (mLock) { + super.querySyncProviders(safeMode, outNames, outInfo); + } + } + + @NonNull + @Override + public ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName, + int uid, @PackageManager.ComponentInfoFlagsBits long flags, + @Nullable String metaDataKey) { + synchronized (mLock) { + return super.queryContentProviders(processName, uid, flags, metaDataKey); + } + } + + @Nullable + @Override + public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) { + synchronized (mLock) { + return super.getInstrumentationInfo(component, flags); + } + } + + @NonNull + @Override + public ParceledListSlice<InstrumentationInfo> queryInstrumentation( + @NonNull String targetPackage, int flags) { + synchronized (mLock) { + return super.queryInstrumentation(targetPackage, flags); + } + } + + @NonNull + @Override + public List<PackageStateInternal> findSharedNonSystemLibraries( + @NonNull PackageStateInternal pkgSetting) { + synchronized (mLock) { + return super.findSharedNonSystemLibraries(pkgSetting); + } + } + + @Override + public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, + @UserIdInt int userId) { + synchronized (mLock) { + return super.getApplicationHiddenSettingAsUser(packageName, userId); + } + } + + @Override + public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) { + synchronized (mLock) { + return super.isPackageSuspendedForUser(packageName, userId); + } + } + + @Override + public boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, + @UserIdInt int userId) { + synchronized (mLock) { + return super.isSuspendingAnyPackages(suspendingPackage, userId); + } + } + + @NonNull + @Override + public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) { + synchronized (mLock) { + return super.getAllIntentFilters(packageName); + } + } + + @Override + public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) { + synchronized (mLock) { + return super.getBlockUninstallForUser(packageName, userId); + } + } + + @Nullable + @Override + public SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName, + @UserIdInt int[] userIds, boolean isInstantApp) { + synchronized (mLock) { + return super.getBroadcastAllowList(packageName, userIds, isInstantApp); + } + } + + @Nullable + @Override + public String getInstallerPackageName(@NonNull String packageName) { + synchronized (mLock) { + return super.getInstallerPackageName(packageName); + } + } + + @Nullable + @Override + public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) { + synchronized (mLock) { + return super.getInstallSourceInfo(packageName); + } + } + + @Override + public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) { + synchronized (mLock) { + return super.getApplicationEnabledSetting(packageName, userId); + } + } + + @Override + public int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid, + @UserIdInt int userId) { + synchronized (mLock) { + return super.getComponentEnabledSetting(component, callingUid, userId); + } + } + + @Override + public int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid, + @UserIdInt int userId) { + synchronized (mLock) { + return super.getComponentEnabledSettingInternal(component, callingUid, userId); + } + } + + @Override + public boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo, + @UserIdInt int userId) { + synchronized (mLock) { + return super.isComponentEffectivelyEnabled(componentInfo, userId); + } + } + + @Nullable + @Override + public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) { + synchronized (mLock) { + return super.getKeySetByAlias(packageName, alias); + } + } + + @Nullable + @Override + public KeySet getSigningKeySet(@NonNull String packageName) { + synchronized (mLock) { + return super.getSigningKeySet(packageName); + } + } + + @Override + public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) { + synchronized (mLock) { + return super.isPackageSignedByKeySet(packageName, ks); + } + } + + @Override + public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) { + synchronized (mLock) { + return super.isPackageSignedByKeySetExactly(packageName, ks); + } + } + + @Nullable + @Override + public int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) { + synchronized (mLock) { + return super.getVisibilityAllowList(packageName, userId); + } + } + + @Override + public boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) { + synchronized (mLock) { + return super.canQueryPackage(callingUid, targetPackageName); + } + } + + @Override + public int getPackageUid(@NonNull String packageName, + @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { + synchronized (mLock) { + return super.getPackageUid(packageName, flags, userId); + } + } + + @Override + public boolean canAccessComponent(int callingUid, @NonNull ComponentName component, + @UserIdInt int userId) { + synchronized (mLock) { + return super.canAccessComponent(callingUid, component, userId); + } + } + + @Override + public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) { + synchronized (mLock) { + return super.isCallerInstallerOfRecord(pkg, callingUid); + } + } + + @Override + public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) { + synchronized (mLock) { + return super.getInstallReason(packageName, userId); + } + } + + @Override + public boolean canPackageQuery(@NonNull String sourcePackageName, + @NonNull String targetPackageName, @UserIdInt int userId) { + synchronized (mLock) { + return super.canPackageQuery(sourcePackageName, targetPackageName, userId); + } + } + + @Override + public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, + @UserIdInt int sourceUserId, @UserIdInt int targetUserId) { + synchronized (mLock) { + return super.canForwardTo(intent, resolvedType, sourceUserId, targetUserId); + } + } + + @NonNull + @Override + public List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags) { + synchronized (mLock) { + return super.getPersistentApplications(safeMode, flags); + } + } + + @NonNull + @Override + public SparseArray<String> getAppsWithSharedUserIds() { + synchronized (mLock) { + return super.getAppsWithSharedUserIds(); + } + } + + @NonNull + @Override + public String[] getSharedUserPackagesForPackage(@NonNull String packageName, + @UserIdInt int userId) { + synchronized (mLock) { + return super.getSharedUserPackagesForPackage(packageName, userId); + } + } + + @NonNull + @Override + public Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) { + synchronized (mLock) { + return super.getUnusedPackages(downgradeTimeThresholdMillis); + } + } + + @Nullable + @Override + public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) { + synchronized (mLock) { + return super.getHarmfulAppWarning(packageName, userId); + } + } + + @NonNull + @Override + public String[] filterOnlySystemPackages(@Nullable String... pkgNames) { + synchronized (mLock) { + return super.filterOnlySystemPackages(pkgNames); + } + } + + @NonNull + @Override + public List<AndroidPackage> getPackagesForAppId(int appId) { + synchronized (mLock) { + return super.getPackagesForAppId(appId); + } + } + + @Override + public int getUidTargetSdkVersion(int uid) { + synchronized (mLock) { + return super.getUidTargetSdkVersion(uid); + } + } + + @Nullable + @Override + public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) { + synchronized (mLock) { + return super.getProcessesForUid(uid); + } + } + + @Override + public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid, + @UserIdInt int userId) { + synchronized (mLock) { + return super.getPackageStateFiltered(packageName, callingUid, userId); + } + } + + @Override + public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) { + synchronized (mLock) { + return super.getBlockUninstall(userId, packageName); + } + } + + @NonNull + @Override + public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() { + synchronized (mLock) { + return super.getSharedLibraries(); + } + } + + @Nullable + @Override + public Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId) { + synchronized (mLock) { + return super.getPackageOrSharedUser(appId); + } + } + + @Nullable + @Override + public SharedUserApi getSharedUser(int sharedUserAppId) { + synchronized (mLock) { + return super.getSharedUser(sharedUserAppId); + } + } + + @NonNull + @Override + public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) { + synchronized (mLock) { + return super.getSharedUserPackages(sharedUserAppId); + } + } + + @NonNull + @Override + public ComponentResolverApi getComponentResolver() { + synchronized (mLock) { + return super.getComponentResolver(); + } + } + + @Nullable + @Override + public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) { + synchronized (mLock) { + return super.getDisabledSystemPackage(packageName); + } + } + + @Nullable + @Override + public ResolveInfo getInstantAppInstallerInfo() { + synchronized (mLock) { + return super.getInstantAppInstallerInfo(); + } + } } diff --git a/services/core/java/com/android/server/pm/ComputerTracker.java b/services/core/java/com/android/server/pm/ComputerTracker.java new file mode 100644 index 000000000000..216ad71b4d5d --- /dev/null +++ b/services/core/java/com/android/server/pm/ComputerTracker.java @@ -0,0 +1,1327 @@ +/* + * 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.pm; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.UserIdInt; +import android.content.ComponentName; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.ComponentInfo; +import android.content.pm.InstallSourceInfo; +import android.content.pm.InstrumentationInfo; +import android.content.pm.KeySet; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; +import android.content.pm.ParceledListSlice; +import android.content.pm.ProcessInfo; +import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; +import android.content.pm.SharedLibraryInfo; +import android.content.pm.SigningDetails; +import android.content.pm.UserInfo; +import android.content.pm.VersionedPackage; +import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.Pair; +import android.util.SparseArray; + +import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.pkg.PackageState; +import com.android.server.pm.pkg.PackageStateInternal; +import com.android.server.pm.pkg.SharedUserApi; +import com.android.server.pm.resolution.ComponentResolverApi; +import com.android.server.utils.WatchedArrayMap; +import com.android.server.utils.WatchedLongSparseArray; + +import java.io.FileDescriptor; +import java.io.PrintWriter; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * This subclass delegates to methods in a Computer after reference-counting the computer. + */ +public final class ComputerTracker implements Computer { + + // The number of times a thread reused a computer in its stack instead of fetching + // a snapshot computer. + private final AtomicInteger mReusedSnapshot = new AtomicInteger(0); + + private final PackageManagerService mService; + ComputerTracker(PackageManagerService s) { + mService = s; + } + + private ThreadComputer snapshot() { + ThreadComputer current = PackageManagerService.sThreadComputer.get(); + if (current.mRefCount > 0) { + current.acquire(); + mReusedSnapshot.incrementAndGet(); + } else { + current.acquire(mService.snapshotComputer()); + } + return current; + } + + public @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, + int filterCallingUid, int userId, boolean resolveForStart, + boolean allowDynamicSplits) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.queryIntentActivitiesInternal(intent, resolvedType, flags, + privateResolveFlags, filterCallingUid, userId, resolveForStart, + allowDynamicSplits); + } finally { + current.release(); + } + } + public @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.queryIntentActivitiesInternal(intent, resolvedType, flags, + userId); + } finally { + current.release(); + } + } + public @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId, + int callingUid, boolean includeInstantApps) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.queryIntentServicesInternal(intent, resolvedType, flags, + userId, callingUid, includeInstantApps); + } finally { + current.release(); + } + } + public @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody( + Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits, + String pkgName, String instantAppPkgName) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.queryIntentActivitiesInternalBody(intent, resolvedType, + flags, filterCallingUid, userId, resolveForStart, allowDynamicSplits, + pkgName, instantAppPkgName); + } finally { + current.release(); + } + } + public ActivityInfo getActivityInfo(ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getActivityInfo(component, flags, userId); + } finally { + current.release(); + } + } + public ActivityInfo getActivityInfoInternal(ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, + int filterCallingUid, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getActivityInfoInternal(component, flags, filterCallingUid, + userId); + } finally { + current.release(); + } + } + public AndroidPackage getPackage(String packageName) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getPackage(packageName); + } finally { + current.release(); + } + } + public AndroidPackage getPackage(int uid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getPackage(uid); + } finally { + current.release(); + } + } + public ApplicationInfo generateApplicationInfoFromSettings(String packageName, + long flags, int filterCallingUid, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.generateApplicationInfoFromSettings(packageName, flags, + filterCallingUid, userId); + } finally { + current.release(); + } + } + public ApplicationInfo getApplicationInfo(String packageName, + @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getApplicationInfo(packageName, flags, userId); + } finally { + current.release(); + } + } + public ApplicationInfo getApplicationInfoInternal(String packageName, + @PackageManager.ApplicationInfoFlagsBits long flags, int filterCallingUid, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getApplicationInfoInternal(packageName, flags, + filterCallingUid, userId); + } finally { + current.release(); + } + } + public ComponentName getDefaultHomeActivity(int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getDefaultHomeActivity(userId); + } finally { + current.release(); + } + } + public ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates, + int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getHomeActivitiesAsUser(allHomeCandidates, userId); + } finally { + current.release(); + } + } + public CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int sourceUserId, + int parentUserId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getCrossProfileDomainPreferredLpr(intent, resolvedType, + flags, sourceUserId, parentUserId); + } finally { + current.release(); + } + } + public Intent getHomeIntent() { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getHomeIntent(); + } finally { + current.release(); + } + } + public List<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters( + Intent intent, String resolvedType, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getMatchingCrossProfileIntentFilters(intent, resolvedType, + userId); + } finally { + current.release(); + } + } + public List<ResolveInfo> applyPostResolutionFilter( + @NonNull List<ResolveInfo> resolveInfos, + String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid, + boolean resolveForStart, int userId, Intent intent) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.applyPostResolutionFilter(resolveInfos, ephemeralPkgName, + allowDynamicSplits, filterCallingUid, resolveForStart, userId, intent); + } finally { + current.release(); + } + } + public PackageInfo generatePackageInfo(PackageStateInternal ps, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.generatePackageInfo(ps, flags, userId); + } finally { + current.release(); + } + } + public PackageInfo getPackageInfo(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getPackageInfo(packageName, flags, userId); + } finally { + current.release(); + } + } + public PackageInfo getPackageInfoInternal(String packageName, long versionCode, + long flags, int filterCallingUid, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getPackageInfoInternal(packageName, versionCode, flags, + filterCallingUid, userId); + } finally { + current.release(); + } + } + public PackageStateInternal getPackageStateInternal(String packageName) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getPackageStateInternal(packageName); + } finally { + current.release(); + } + } + public PackageStateInternal getPackageStateInternal(String packageName, int callingUid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getPackageStateInternal(packageName, callingUid); + } finally { + current.release(); + } + } + + @Nullable + public PackageState getPackageStateCopied(@NonNull String packageName) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getPackageStateCopied(packageName); + } finally { + current.release(); + } + } + + public ParceledListSlice<PackageInfo> getInstalledPackages(long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getInstalledPackages(flags, userId); + } finally { + current.release(); + } + } + public ResolveInfo createForwardingResolveInfoUnchecked(WatchedIntentFilter filter, + int sourceUserId, int targetUserId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.createForwardingResolveInfoUnchecked(filter, sourceUserId, + targetUserId); + } finally { + current.release(); + } + } + public ServiceInfo getServiceInfo(ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getServiceInfo(component, flags, userId); + } finally { + current.release(); + } + } + public SharedLibraryInfo getSharedLibraryInfo(String name, long version) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getSharedLibraryInfo(name, version); + } finally { + current.release(); + } + } + public SigningDetails getSigningDetails(@NonNull String packageName) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getSigningDetails(packageName); + } finally { + current.release(); + } + } + public SigningDetails getSigningDetails(int uid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getSigningDetails(uid); + } finally { + current.release(); + } + } + public String getInstantAppPackageName(int callingUid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getInstantAppPackageName(callingUid); + } finally { + current.release(); + } + } + public String resolveExternalPackageName(AndroidPackage pkg) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.resolveExternalPackageName(pkg); + } finally { + current.release(); + } + } + public String resolveInternalPackageName(String packageName, long versionCode) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.resolveInternalPackageName(packageName, versionCode); + } finally { + current.release(); + } + } + public String[] getPackagesForUid(int uid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getPackagesForUid(uid); + } finally { + current.release(); + } + } + public UserInfo getProfileParent(int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getProfileParent(userId); + } finally { + current.release(); + } + } + public boolean canViewInstantApps(int callingUid, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.canViewInstantApps(callingUid, userId); + } finally { + current.release(); + } + } + public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.filterAppAccess(pkg, callingUid, userId); + } finally { + current.release(); + } + } + public boolean filterAppAccess(String packageName, int callingUid, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.filterAppAccess(packageName, callingUid, userId); + } finally { + current.release(); + } + } + public boolean filterAppAccess(int uid, int callingUid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.filterAppAccess(uid, callingUid); + } finally { + current.release(); + } + } + public boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid, + int userId, @PackageManager.ComponentInfoFlagsBits long flags) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.filterSharedLibPackage(ps, uid, userId, flags); + } finally { + current.release(); + } + } + public boolean isCallerSameApp(String packageName, int uid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.isCallerSameApp(packageName, uid); + } finally { + current.release(); + } + } + public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.isComponentVisibleToInstantApp(component); + } finally { + current.release(); + } + } + public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component, + @PackageManager.ComponentType int type) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.isComponentVisibleToInstantApp(component, type); + } finally { + current.release(); + } + } + public boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, + int userId, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, + userId, resolvedType, flags); + } finally { + current.release(); + } + } + public boolean isInstantApp(String packageName, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.isInstantApp(packageName, userId); + } finally { + current.release(); + } + } + public boolean isInstantAppInternal(String packageName, @UserIdInt int userId, + int callingUid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.isInstantAppInternal(packageName, userId, callingUid); + } finally { + current.release(); + } + } + public boolean isSameProfileGroup(@UserIdInt int callerUserId, + @UserIdInt int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.isSameProfileGroup(callerUserId, userId); + } finally { + current.release(); + } + } + public boolean shouldFilterApplication(@NonNull SharedUserSetting sus, + int callingUid, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.shouldFilterApplication(sus, callingUid, userId); + } finally { + current.release(); + } + } + public boolean shouldFilterApplication(@Nullable PackageStateInternal ps, + int callingUid, @Nullable ComponentName component, + @PackageManager.ComponentType int componentType, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.shouldFilterApplication(ps, callingUid, component, + componentType, userId); + } finally { + current.release(); + } + } + public boolean shouldFilterApplication(@Nullable PackageStateInternal ps, + int callingUid, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.shouldFilterApplication(ps, callingUid, userId); + } finally { + current.release(); + } + } + public int checkUidPermission(String permName, int uid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.checkUidPermission(permName, uid); + } finally { + current.release(); + } + } + public int getPackageUidInternal(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId, int callingUid) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.getPackageUidInternal(packageName, flags, userId, + callingUid); + } finally { + current.release(); + } + } + public long updateFlagsForApplication(long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.updateFlagsForApplication(flags, userId); + } finally { + current.release(); + } + } + public long updateFlagsForComponent(long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.updateFlagsForComponent(flags, userId); + } finally { + current.release(); + } + } + public long updateFlagsForPackage(long flags, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.updateFlagsForPackage(flags, userId); + } finally { + current.release(); + } + } + public long updateFlagsForResolve(long flags, int userId, int callingUid, + boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.updateFlagsForResolve(flags, userId, callingUid, + wantInstantApps, isImplicitImageCaptureIntentAndNotSetByDpc); + } finally { + current.release(); + } + } + public long updateFlagsForResolve(long flags, int userId, int callingUid, + boolean wantInstantApps, boolean onlyExposedExplicitly, + boolean isImplicitImageCaptureIntentAndNotSetByDpc) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.updateFlagsForResolve(flags, userId, callingUid, + wantInstantApps, onlyExposedExplicitly, + isImplicitImageCaptureIntentAndNotSetByDpc); + } finally { + current.release(); + } + } + public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) { + ThreadComputer current = snapshot(); + try { + current.mComputer.dump(type, fd, pw, dumpState); + } finally { + current.release(); + } + } + public void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId, + boolean requireFullPermission, boolean checkShell, String message) { + ThreadComputer current = snapshot(); + try { + current.mComputer.enforceCrossUserOrProfilePermission(callingUid, userId, + requireFullPermission, checkShell, message); + } finally { + current.release(); + } + } + public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, + boolean requireFullPermission, boolean checkShell, String message) { + ThreadComputer current = snapshot(); + try { + current.mComputer.enforceCrossUserPermission(callingUid, userId, + requireFullPermission, checkShell, message); + } finally { + current.release(); + } + } + public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, + boolean requireFullPermission, boolean checkShell, + boolean requirePermissionWhenSameUser, String message) { + ThreadComputer current = snapshot(); + try { + current.mComputer.enforceCrossUserPermission(callingUid, userId, + requireFullPermission, checkShell, requirePermissionWhenSameUser, message); + } finally { + current.release(); + } + } + public PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityInternal( + Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug, + int userId, boolean queryMayBeFiltered) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.findPreferredActivityInternal(intent, resolvedType, flags, + query, always, removeMatches, debug, userId, queryMayBeFiltered); + } finally { + current.release(); + } + } + public ResolveInfo findPersistentPreferredActivityLP(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + List<ResolveInfo> query, boolean debug, int userId) { + ThreadComputer current = snapshot(); + try { + return current.mComputer.findPersistentPreferredActivityLP(intent, resolvedType, + flags, query, debug, userId); + } finally { + current.release(); + } + } + + @Override + public String[] getAllAvailablePackageNames() { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getAllAvailablePackageNames(); + } + } + + @Override + public PreferredIntentResolver getPreferredActivities(int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPreferredActivities(userId); + } + } + + @NonNull + @Override + public ArrayMap<String, ? extends PackageStateInternal> getPackageStates() { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPackageStates(); + } + } + + @Nullable + @Override + public String getRenamedPackage(@NonNull String packageName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getRenamedPackage(packageName); + } + } + + @NonNull + @Override + public ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getNotifyPackagesForReplacedReceived(packages); + } + } + + @Override + public int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPackageStartability(safeMode, packageName, callingUid, + userId); + } + } + + @Override + public boolean isPackageAvailable(String packageName, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.isPackageAvailable(packageName, userId); + } + } + + @Override + public String[] currentToCanonicalPackageNames(String[] names) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.currentToCanonicalPackageNames(names); + } + } + + @Override + public String[] canonicalToCurrentPackageNames(String[] names) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.canonicalToCurrentPackageNames(names); + } + } + + @Override + public int[] getPackageGids(@NonNull String packageName, + @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPackageGids(packageName, flags, userId); + } + } + + @Override + public int getTargetSdkVersion(@NonNull String packageName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getTargetSdkVersion(packageName); + } + } + + @Override + public boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName, + @NonNull ComponentName component, @NonNull Intent intent, String resolvedType) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.activitySupportsIntent(resolveComponentName, component, intent, + resolvedType); + } + } + + @Nullable + @Override + public ActivityInfo getReceiverInfo(@NonNull ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getReceiverInfo(component, flags, userId); + } + } + + @Nullable + @Override + public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName, + @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getSharedLibraries(packageName, flags, userId); + } + } + + @Override + public boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid, + @UserIdInt int userId, boolean throwIfPermNotDeclared) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.canRequestPackageInstalls(packageName, callingUid, userId, + throwIfPermNotDeclared); + } + } + + @Override + public boolean isInstallDisabledForPackage(@NonNull String packageName, int uid, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.isInstallDisabledForPackage(packageName, uid, userId); + } + } + + @Override + public List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo, + @PackageManager.PackageInfoFlagsBits long flags, int callingUid, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, + userId); + } + } + + @Nullable + @Override + public ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries( + @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getDeclaredSharedLibraries(packageName, flags, userId); + } + } + + @Nullable + @Override + public ProviderInfo getProviderInfo(@NonNull ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getProviderInfo(component, flags, userId); + } + } + + @Nullable + @Override + public String[] getSystemSharedLibraryNames() { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getSystemSharedLibraryNames(); + } + } + + @Override + public int checkSignatures(@NonNull String pkg1, + @NonNull String pkg2) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.checkSignatures(pkg1, pkg2); + } + } + + @Override + public int checkUidSignatures(int uid1, int uid2) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.checkUidSignatures(uid1, uid2); + } + } + + @Override + public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate, + int type) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.hasSigningCertificate(packageName, certificate, type); + } + } + + @Override + public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, int type) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.hasUidSigningCertificate(uid, certificate, type); + } + } + + @Override + public List<String> getAllPackages() { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getAllPackages(); + } + } + + @Nullable + @Override + public String getNameForUid(int uid) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getNameForUid(uid); + } + } + + @Nullable + @Override + public String[] getNamesForUids(int[] uids) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getNamesForUids(uids); + } + } + + @Override + public int getUidForSharedUser(@NonNull String sharedUserName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getUidForSharedUser(sharedUserName); + } + } + + @Override + public int getFlagsForUid(int uid) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getFlagsForUid(uid); + } + } + + @Override + public int getPrivateFlagsForUid(int uid) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPrivateFlagsForUid(uid); + } + } + + @Override + public boolean isUidPrivileged(int uid) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.isUidPrivileged(uid); + } + } + + @NonNull + @Override + public String[] getAppOpPermissionPackages(@NonNull String permissionName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getAppOpPermissionPackages(permissionName); + } + } + + @NonNull + @Override + public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions( + @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPackagesHoldingPermissions(permissions, flags, userId); + } + } + + @NonNull + @Override + public List<ApplicationInfo> getInstalledApplications( + @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId, + int callingUid) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getInstalledApplications(flags, userId, callingUid); + } + } + + @Nullable + @Override + public ProviderInfo resolveContentProvider(@NonNull String name, + @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId, + int callingUid) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.resolveContentProvider(name, flags, userId, callingUid); + } + } + + @Nullable + @Override + public ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid, + @NonNull String visibleAuthority) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getGrantImplicitAccessProviderInfo(recipientUid, + visibleAuthority); + } + } + + @Override + public void querySyncProviders(boolean safeMode, @NonNull List<String> outNames, + @NonNull List<ProviderInfo> outInfo) { + try (ThreadComputer current = snapshot()) { + current.mComputer.querySyncProviders(safeMode, outNames, outInfo); + } + } + + @NonNull + @Override + public ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName, + int uid, @PackageManager.ComponentInfoFlagsBits long flags, + @Nullable String metaDataKey) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.queryContentProviders(processName, uid, flags, metaDataKey); + } + } + + @Nullable + @Override + public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getInstrumentationInfo(component, flags); + } + } + + @NonNull + @Override + public ParceledListSlice<InstrumentationInfo> queryInstrumentation( + @NonNull String targetPackage, int flags) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.queryInstrumentation(targetPackage, flags); + } + } + + @NonNull + @Override + public List<PackageStateInternal> findSharedNonSystemLibraries( + @NonNull PackageStateInternal pkgSetting) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.findSharedNonSystemLibraries(pkgSetting); + } + } + + @Override + public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getApplicationHiddenSettingAsUser(packageName, userId); + } + } + + @Override + public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.isPackageSuspendedForUser(packageName, userId); + } + } + + @Override + public boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.isSuspendingAnyPackages(suspendingPackage, userId); + } + } + + @NonNull + @Override + public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getAllIntentFilters(packageName); + } + } + + @Override + public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getBlockUninstallForUser(packageName, userId); + } + } + + @Nullable + @Override + public SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName, + @UserIdInt int[] userIds, boolean isInstantApp) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getBroadcastAllowList(packageName, userIds, isInstantApp); + } + } + + @Nullable + @Override + public String getInstallerPackageName(@NonNull String packageName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getInstallerPackageName(packageName); + } + } + + @Nullable + @Override + public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getInstallSourceInfo(packageName); + } + } + + @Override + public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getApplicationEnabledSetting(packageName, userId); + } + } + + @Override + public int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getComponentEnabledSetting(component, callingUid, userId); + } + } + + @Override + public int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getComponentEnabledSettingInternal( + component, callingUid, userId); + } + } + + @Override + public boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.isComponentEffectivelyEnabled(componentInfo, userId); + } + } + + @Nullable + @Override + public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getKeySetByAlias(packageName, alias); + } + } + + @Nullable + @Override + public KeySet getSigningKeySet(@NonNull String packageName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getSigningKeySet(packageName); + } + } + + @Override + public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.isPackageSignedByKeySet(packageName, ks); + } + } + + @Override + public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.isPackageSignedByKeySetExactly(packageName, ks); + } + } + + @Nullable + @Override + public int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getVisibilityAllowList(packageName, userId); + } + } + + @Override + public boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.canQueryPackage(callingUid, targetPackageName); + } + } + + @Override + public int getPackageUid(@NonNull String packageName, + @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPackageUid(packageName, flags, userId); + } + } + + @Override + public boolean canAccessComponent(int callingUid, @NonNull ComponentName component, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.canAccessComponent(callingUid, component, userId); + } + } + + @Override + public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.isCallerInstallerOfRecord(pkg, callingUid); + } + } + + @Override + public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getInstallReason(packageName, userId); + } + } + + @Override + public boolean canPackageQuery(@NonNull String sourcePackageName, + @NonNull String targetPackageName, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.canPackageQuery(sourcePackageName, targetPackageName, userId); + } + } + + @Override + public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, + @UserIdInt int sourceUserId, @UserIdInt int targetUserId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.canForwardTo(intent, resolvedType, sourceUserId, targetUserId); + } + } + + @NonNull + @Override + public List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPersistentApplications(safeMode, flags); + } + } + + @NonNull + @Override + public SparseArray<String> getAppsWithSharedUserIds() { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getAppsWithSharedUserIds(); + } + } + + @NonNull + @Override + public String[] getSharedUserPackagesForPackage(@NonNull String packageName, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getSharedUserPackagesForPackage(packageName, userId); + } + } + + @NonNull + @Override + public Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getUnusedPackages(downgradeTimeThresholdMillis); + } + } + + @Nullable + @Override + public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getHarmfulAppWarning(packageName, userId); + } + } + + @NonNull + @Override + public String[] filterOnlySystemPackages(@Nullable String... pkgNames) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.filterOnlySystemPackages(pkgNames); + } + } + + @NonNull + @Override + public List<AndroidPackage> getPackagesForAppId(int appId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPackagesForAppId(appId); + } + } + + @Override + public int getUidTargetSdkVersion(int uid) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getUidTargetSdkVersion(uid); + } + } + + @Nullable + @Override + public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getProcessesForUid(uid); + } + } + + @Override + public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid, + @UserIdInt int userId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPackageStateFiltered(packageName, callingUid, userId); + } + } + + @Override + public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getBlockUninstall(userId, packageName); + } + } + + @NonNull + @Override + public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getSharedLibraries(); + } + } + + @Nullable + @Override + public Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getPackageOrSharedUser(appId); + } + } + + @Nullable + @Override + public SharedUserApi getSharedUser(int sharedUserAppId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getSharedUser(sharedUserAppId); + } + } + + @NonNull + @Override + public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getSharedUserPackages(sharedUserAppId); + } + } + + @NonNull + @Override + public ComponentResolverApi getComponentResolver() { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getComponentResolver(); + } + } + + @Nullable + @Override + public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getDisabledSystemPackage(packageName); + } + } + + @Nullable + @Override + public ResolveInfo getInstantAppInstallerInfo() { + try (ThreadComputer current = snapshot()) { + return current.mComputer.getInstantAppInstallerInfo(); + } + } +} diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index 0e1c1ad4120f..664c7bb929d7 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -147,7 +147,6 @@ final class DeletePackageHelper { final SparseArray<TempUserState> priorUserStates; /** enabled state of the uninstalled application */ synchronized (mPm.mLock) { - final Computer computer = mPm.snapshotComputer(); uninstalledPs = mPm.mSettings.getPackageLPr(packageName); if (uninstalledPs == null) { Slog.w(TAG, "Not removing non-existent package " + packageName); @@ -171,10 +170,10 @@ final class DeletePackageHelper { if (pkg != null) { SharedLibraryInfo libraryInfo = null; if (pkg.getStaticSharedLibName() != null) { - libraryInfo = computer.getSharedLibraryInfo(pkg.getStaticSharedLibName(), + libraryInfo = mPm.getSharedLibraryInfo(pkg.getStaticSharedLibName(), pkg.getStaticSharedLibVersion()); } else if (pkg.getSdkLibName() != null) { - libraryInfo = computer.getSharedLibraryInfo(pkg.getSdkLibName(), + libraryInfo = mPm.getSharedLibraryInfo(pkg.getSdkLibName(), pkg.getSdkLibVersionMajor()); } @@ -184,7 +183,7 @@ final class DeletePackageHelper { continue; } List<VersionedPackage> libClientPackages = - computer.getPackagesUsingSharedLibrary(libraryInfo, + mPm.getPackagesUsingSharedLibrary(libraryInfo, MATCH_KNOWN_PACKAGES, Process.SYSTEM_UID, currUserId); if (!ArrayUtils.isEmpty(libClientPackages)) { Slog.w(TAG, "Not removing package " + pkg.getManifestPackageName() @@ -455,11 +454,11 @@ final class DeletePackageHelper { if (affectedUserIds == null) { affectedUserIds = mPm.resolveUserIds(userId); } - final Computer snapshot = mPm.snapshotComputer(); for (final int affectedUserId : affectedUserIds) { if (hadSuspendAppsPermission.get(affectedUserId)) { - mPm.unsuspendForSuspendingPackage(snapshot, packageName, affectedUserId); - mPm.removeAllDistractingPackageRestrictions(snapshot, affectedUserId); + mPm.unsuspendForSuspendingPackage(mPm.snapshotComputer(), packageName, + affectedUserId); + mPm.removeAllDistractingPackageRestrictions(affectedUserId); } } @@ -622,8 +621,7 @@ final class DeletePackageHelper { final int callingUid = Binder.getCallingUid(); mPm.mContext.enforceCallingOrSelfPermission( android.Manifest.permission.DELETE_PACKAGES, null); - final Computer snapshot = mPm.snapshotComputer(); - final boolean canViewInstantApps = snapshot.canViewInstantApps(callingUid, userId); + final boolean canViewInstantApps = mPm.canViewInstantApps(callingUid, userId); Preconditions.checkNotNull(versionedPackage); Preconditions.checkNotNull(observer); Preconditions.checkArgumentInRange(versionedPackage.getLongVersionCode(), @@ -646,13 +644,12 @@ final class DeletePackageHelper { } // Normalize package name to handle renamed packages and static libs - final String internalPackageName = - snapshot.resolveInternalPackageName(packageName, versionCode); + final String internalPackageName = mPm.resolveInternalPackageName(packageName, versionCode); final int uid = Binder.getCallingUid(); - if (!isOrphaned(snapshot, internalPackageName) + if (!isOrphaned(internalPackageName) && !allowSilentUninstall - && !isCallerAllowedToSilentlyUninstall(snapshot, uid, internalPackageName)) { + && !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) { mPm.mHandler.post(() -> { try { final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE); @@ -683,7 +680,8 @@ final class DeletePackageHelper { return; } - if (!deleteAllUsers && snapshot.getBlockUninstallForUser(internalPackageName, userId)) { + if (!deleteAllUsers && mPm.mIPackageManager + .getBlockUninstallForUser(internalPackageName, userId)) { mPm.mHandler.post(() -> { try { observer.onPackageDeleted(packageName, @@ -758,45 +756,44 @@ final class DeletePackageHelper { }); } - private boolean isOrphaned(@NonNull Computer snapshot, String packageName) { - final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + private boolean isOrphaned(String packageName) { + final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName); return packageState != null && packageState.getInstallSource().isOrphaned; } - private boolean isCallerAllowedToSilentlyUninstall(@NonNull Computer snapshot, int callingUid, - String pkgName) { + private boolean isCallerAllowedToSilentlyUninstall(int callingUid, String pkgName) { if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID || UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) { return true; } final int callingUserId = UserHandle.getUserId(callingUid); // If the caller installed the pkgName, then allow it to silently uninstall. - if (callingUid == snapshot.getPackageUid(snapshot.getInstallerPackageName(pkgName), 0, - callingUserId)) { + if (callingUid == mPm.mIPackageManager.getPackageUid( + mPm.mIPackageManager.getInstallerPackageName(pkgName), 0, callingUserId)) { return true; } // Allow package verifier to silently uninstall. - if (mPm.mRequiredVerifierPackage != null && callingUid == snapshot + if (mPm.mRequiredVerifierPackage != null && callingUid == mPm.mIPackageManager .getPackageUid(mPm.mRequiredVerifierPackage, 0, callingUserId)) { return true; } // Allow package uninstaller to silently uninstall. - if (mPm.mRequiredUninstallerPackage != null && callingUid == snapshot + if (mPm.mRequiredUninstallerPackage != null && callingUid == mPm.mIPackageManager .getPackageUid(mPm.mRequiredUninstallerPackage, 0, callingUserId)) { return true; } // Allow storage manager to silently uninstall. - if (mPm.mStorageManagerPackage != null && callingUid == snapshot.getPackageUid( + if (mPm.mStorageManagerPackage != null && callingUid == mPm.mIPackageManager.getPackageUid( mPm.mStorageManagerPackage, 0, callingUserId)) { return true; } // Allow caller having MANAGE_PROFILE_AND_DEVICE_OWNERS permission to silently // uninstall for device owner provisioning. - return snapshot.checkUidPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, callingUid) + return mPm.mIPackageManager.checkUidPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, callingUid) == PERMISSION_GRANTED; } @@ -902,8 +899,8 @@ final class DeletePackageHelper { int installedForUsersCount = 0; synchronized (mPm.mLock) { // Normalize package name to handle renamed packages and static libs - final String internalPkgName = mPm.snapshotComputer() - .resolveInternalPackageName(packageName, versionCode); + final String internalPkgName = mPm.resolveInternalPackageName(packageName, + versionCode); final PackageSetting ps = mPm.mSettings.getPackageLPr(internalPkgName); if (ps != null) { int[] installedUsers = ps.queryInstalledUsers(mUserManagerInternal.getUserIds(), diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java index 50b2e2321886..74ea7cc9b4e1 100644 --- a/services/core/java/com/android/server/pm/DexOptHelper.java +++ b/services/core/java/com/android/server/pm/DexOptHelper.java @@ -266,9 +266,8 @@ final class DexOptHelper { return; } - final Computer snapshot = mPm.snapshotComputer(); List<PackageStateInternal> pkgSettings = - getPackagesForDexopt(snapshot.getPackageStates().values(), mPm); + getPackagesForDexopt(mPm.getPackageStates().values(), mPm); List<AndroidPackage> pkgs = new ArrayList<>(pkgSettings.size()); for (int index = 0; index < pkgSettings.size(); index++) { @@ -283,19 +282,17 @@ final class DexOptHelper { final int elapsedTimeSeconds = (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime); - final Computer newSnapshot = mPm.snapshotComputer(); - MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_dexopted", stats[0]); MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_skipped", stats[1]); MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_failed", stats[2]); - MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_total", - getOptimizablePackages(newSnapshot).size()); + MetricsLogger.histogram( + mPm.mContext, "opt_dialog_num_total", getOptimizablePackages().size()); MetricsLogger.histogram(mPm.mContext, "opt_dialog_time_s", elapsedTimeSeconds); } - public ArraySet<String> getOptimizablePackages(@NonNull Computer snapshot) { + public ArraySet<String> getOptimizablePackages() { ArraySet<String> pkgs = new ArraySet<>(); - mPm.forEachPackageState(snapshot, packageState -> { + mPm.forEachPackageState(packageState -> { final AndroidPackage pkg = packageState.getPkg(); if (pkg != null && mPm.mPackageDexOptimizer.canOptimizePackage(pkg)) { pkgs.add(packageState.getPackageName()); @@ -305,10 +302,10 @@ final class DexOptHelper { } /*package*/ boolean performDexOpt(DexoptOptions options) { - final Computer snapshot = mPm.snapshotComputer(); - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) { return false; - } else if (snapshot.isInstantApp(options.getPackageName(), UserHandle.getCallingUserId())) { + } else if (mPm.mIPackageManager.isInstantApp(options.getPackageName(), + UserHandle.getCallingUserId())) { return false; } @@ -420,10 +417,10 @@ final class DexOptHelper { mPm.getDexManager().getPackageUseInfoOrDefault(p.getPackageName()), options); } - public void forceDexOpt(@NonNull Computer snapshot, String packageName) { + public void forceDexOpt(String packageName) { PackageManagerServiceUtils.enforceSystemOrRoot("forceDexOpt"); - final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName); final AndroidPackage pkg = packageState == null ? null : packageState.getPkg(); if (packageState == null || pkg == null) { throw new IllegalArgumentException("Unknown package: " + packageName); @@ -488,21 +485,19 @@ final class DexOptHelper { ArrayList<PackageStateInternal> sortTemp = new ArrayList<>(remainingPkgSettings.size()); - final Computer snapshot = packageManagerService.snapshotComputer(); - // Give priority to core apps. - applyPackageFilter(snapshot, pkgSetting -> pkgSetting.getPkg().isCoreApp(), result, + applyPackageFilter(pkgSetting -> pkgSetting.getPkg().isCoreApp(), result, remainingPkgSettings, sortTemp, packageManagerService); // Give priority to system apps that listen for pre boot complete. Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED); final ArraySet<String> pkgNames = getPackageNamesForIntent(intent, UserHandle.USER_SYSTEM); - applyPackageFilter(snapshot, pkgSetting -> pkgNames.contains(pkgSetting.getPackageName()), result, + applyPackageFilter(pkgSetting -> pkgNames.contains(pkgSetting.getPackageName()), result, remainingPkgSettings, sortTemp, packageManagerService); // Give priority to apps used by other apps. DexManager dexManager = packageManagerService.getDexManager(); - applyPackageFilter(snapshot, pkgSetting -> + applyPackageFilter(pkgSetting -> dexManager.getPackageUseInfoOrDefault(pkgSetting.getPackageName()) .isAnyCodePathUsedByOtherApps(), result, remainingPkgSettings, sortTemp, packageManagerService); @@ -540,7 +535,7 @@ final class DexOptHelper { // No historical info. Take all. remainingPredicate = pkgSetting -> true; } - applyPackageFilter(snapshot, remainingPredicate, result, remainingPkgSettings, sortTemp, + applyPackageFilter(remainingPredicate, result, remainingPkgSettings, sortTemp, packageManagerService); if (debug) { @@ -555,7 +550,7 @@ final class DexOptHelper { // package will be removed from {@code packages} and added to {@code result} with its // dependencies. If usage data is available, the positive packages will be sorted by usage // data (with {@code sortTemp} as temporary storage). - private static void applyPackageFilter(@NonNull Computer snapshot, + private static void applyPackageFilter( Predicate<PackageStateInternal> filter, Collection<PackageStateInternal> result, Collection<PackageStateInternal> packages, @@ -573,7 +568,8 @@ final class DexOptHelper { for (PackageStateInternal pkgSetting : sortTemp) { result.add(pkgSetting); - List<PackageStateInternal> deps = snapshot.findSharedNonSystemLibraries(pkgSetting); + List<PackageStateInternal> deps = + packageManagerService.findSharedNonSystemLibraries(pkgSetting); if (!deps.isEmpty()) { deps.removeAll(result); result.addAll(deps); diff --git a/services/core/java/com/android/server/pm/DomainVerificationConnection.java b/services/core/java/com/android/server/pm/DomainVerificationConnection.java index 20e4dd8a995b..db8c6dc60b5e 100644 --- a/services/core/java/com/android/server/pm/DomainVerificationConnection.java +++ b/services/core/java/com/android/server/pm/DomainVerificationConnection.java @@ -21,6 +21,7 @@ import static com.android.server.pm.PackageManagerService.DOMAIN_VERIFICATION; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; +import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Message; import android.os.UserHandle; @@ -34,10 +35,13 @@ import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV2; public final class DomainVerificationConnection implements DomainVerificationService.Connection, DomainVerificationProxyV1.Connection, DomainVerificationProxyV2.Connection { final PackageManagerService mPm; + final PackageManagerInternal mPmInternal; final UserManagerInternal mUmInternal; + // TODO(b/198166813): remove PMS dependency DomainVerificationConnection(PackageManagerService pm) { mPm = pm; + mPmInternal = mPm.mInjector.getLocalService(PackageManagerInternal.class); mUmInternal = mPm.mInjector.getLocalService(UserManagerInternal.class); } @@ -78,18 +82,18 @@ public final class DomainVerificationConnection implements DomainVerificationSer @Override public boolean isCallerPackage(int callingUid, @NonNull String packageName) { final int callingUserId = UserHandle.getUserId(callingUid); - return callingUid == mPm.snapshotComputer().getPackageUid(packageName, 0, callingUserId); + return callingUid == mPmInternal.getPackageUid(packageName, 0, callingUserId); } @Nullable @Override public AndroidPackage getPackage(@NonNull String packageName) { - return mPm.snapshotComputer().getPackage(packageName); + return mPmInternal.getPackage(packageName); } @Override public boolean filterAppAccess(String packageName, int callingUid, int userId) { - return mPm.snapshotComputer().filterAppAccess(packageName, callingUid, userId); + return mPmInternal.filterAppAccess(packageName, callingUid, userId); } @Override @@ -104,6 +108,6 @@ public final class DomainVerificationConnection implements DomainVerificationSer @NonNull public Computer snapshot() { - return mPm.snapshotComputer(); + return (Computer) mPmInternal.snapshot(); } } diff --git a/services/core/java/com/android/server/pm/DumpHelper.java b/services/core/java/com/android/server/pm/DumpHelper.java index f83ef5aea23a..05ef3c4ec300 100644 --- a/services/core/java/com/android/server/pm/DumpHelper.java +++ b/services/core/java/com/android/server/pm/DumpHelper.java @@ -55,7 +55,6 @@ final class DumpHelper { @NeverCompile // Avoid size overhead of debugging code. public void doDump(FileDescriptor fd, PrintWriter pw, String[] args) { - final Computer snapshot = mPm.snapshotComputer(); DumpState dumpState = new DumpState(); ArraySet<String> permissionNames = null; @@ -122,7 +121,7 @@ final class DumpHelper { } // Normalize package name to handle renamed packages and static libs - pkg = snapshot.resolveInternalPackageName(pkg, PackageManager.VERSION_CODE_HIGHEST); + pkg = mPm.resolveInternalPackageName(pkg, PackageManager.VERSION_CODE_HIGHEST); pw.println(mPm.checkPermission(perm, pkg, user)); return; @@ -244,7 +243,7 @@ final class DumpHelper { // Return if the package doesn't exist. if (packageName != null - && snapshot.getPackageStateInternal(packageName) == null + && mPm.getPackageStateInternal(packageName) == null && !mPm.mApexManager.isApexPackage(packageName)) { pw.println("Unable to find package: " + packageName); return; @@ -258,7 +257,7 @@ final class DumpHelper { if (!checkin && dumpState.isDumping(DumpState.DUMP_VERSION) && packageName == null) { - snapshot.dump(DumpState.DUMP_VERSION, fd, pw, dumpState); + mPm.dumpComputer(DumpState.DUMP_VERSION, fd, pw, dumpState); } if (!checkin @@ -274,7 +273,7 @@ final class DumpHelper { final String knownPackage = PackageManagerInternal.knownPackageToString(i); ipw.print(knownPackage); ipw.println(":"); - final String[] pkgNames = mPm.getKnownPackageNamesInternal(snapshot, i, + final String[] pkgNames = mPm.getKnownPackageNamesInternal(i, UserHandle.USER_SYSTEM); ipw.increaseIndent(); if (ArrayUtils.isEmpty(pkgNames)) { @@ -289,6 +288,8 @@ final class DumpHelper { ipw.decreaseIndent(); } + final Computer snapshot = mPm.snapshotComputer(); + if (dumpState.isDumping(DumpState.DUMP_VERIFIERS) && packageName == null) { final String requiredVerifierPackage = mPm.mRequiredVerifierPackage; @@ -342,7 +343,7 @@ final class DumpHelper { if (dumpState.isDumping(DumpState.DUMP_LIBS) && packageName == null) { - snapshot.dump(DumpState.DUMP_LIBS, fd, pw, dumpState); + mPm.dumpComputer(DumpState.DUMP_LIBS, fd, pw, dumpState); } if (dumpState.isDumping(DumpState.DUMP_FEATURES) @@ -388,17 +389,17 @@ final class DumpHelper { } if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED)) { - snapshot.dump(DumpState.DUMP_PREFERRED, fd, pw, dumpState); + mPm.dumpComputer(DumpState.DUMP_PREFERRED, fd, pw, dumpState); } if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED_XML) && packageName == null) { - snapshot.dump(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState); + mPm.dumpComputer(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState); } if (!checkin && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) { - snapshot.dump(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState); + mPm.dumpComputer(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState); } if (!checkin && dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) { @@ -428,7 +429,7 @@ final class DumpHelper { if (!checkin && dumpState.isDumping(DumpState.DUMP_QUERIES)) { - snapshot.dump(DumpState.DUMP_QUERIES, fd, pw, dumpState); + mPm.dumpComputer(DumpState.DUMP_QUERIES, fd, pw, dumpState); } if (dumpState.isDumping(DumpState.DUMP_SHARED_USERS)) { @@ -528,12 +529,12 @@ final class DumpHelper { if (!checkin && dumpState.isDumping(DumpState.DUMP_DEXOPT)) { - snapshot.dump(DumpState.DUMP_DEXOPT, fd, pw, dumpState); + mPm.dumpComputer(DumpState.DUMP_DEXOPT, fd, pw, dumpState); } if (!checkin && dumpState.isDumping(DumpState.DUMP_COMPILER_STATS)) { - snapshot.dump(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState); + mPm.dumpComputer(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState); } if (dumpState.isDumping(DumpState.DUMP_MESSAGES) @@ -580,7 +581,7 @@ final class DumpHelper { pw.println(" Known digesters list flag: " + PackageManagerService.getKnownDigestersList()); - PerUidReadTimeouts[] items = mPm.getPerUidReadTimeouts(snapshot); + PerUidReadTimeouts[] items = mPm.getPerUidReadTimeouts(); pw.println(" Timeouts (" + items.length + "):"); for (PerUidReadTimeouts item : items) { pw.print(" ("); diff --git a/services/core/java/com/android/server/pm/IPackageManagerBase.java b/services/core/java/com/android/server/pm/IPackageManagerBase.java deleted file mode 100644 index e1aee6d747f4..000000000000 --- a/services/core/java/com/android/server/pm/IPackageManagerBase.java +++ /dev/null @@ -1,1189 +0,0 @@ -/* - * 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 com.android.server.pm; - - -import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.SuppressLint; -import android.annotation.UserIdInt; -import android.app.role.RoleManager; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.IPackageDeleteObserver; -import android.content.pm.IPackageDeleteObserver2; -import android.content.pm.IPackageInstaller; -import android.content.pm.IPackageManager; -import android.content.pm.IPackageStatsObserver; -import android.content.pm.InstallSourceInfo; -import android.content.pm.InstrumentationInfo; -import android.content.pm.IntentFilterVerificationInfo; -import android.content.pm.KeySet; -import android.content.pm.ModuleInfo; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.ParceledListSlice; -import android.content.pm.PermissionGroupInfo; -import android.content.pm.PermissionInfo; -import android.content.pm.ProviderInfo; -import android.content.pm.ResolveInfo; -import android.content.pm.ServiceInfo; -import android.content.pm.SharedLibraryInfo; -import android.content.pm.VersionedPackage; -import android.content.pm.dex.IArtManager; -import android.os.Binder; -import android.os.Process; -import android.os.RemoteException; -import android.os.Trace; -import android.os.UserHandle; -import android.permission.PermissionManager; - -import com.android.internal.R; -import com.android.internal.content.InstallLocationUtils; -import com.android.internal.util.CollectionUtils; -import com.android.server.pm.pkg.PackageStateInternal; -import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; -import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV1; - -import java.util.List; -import java.util.Objects; - -/** - * Contains all simply proxy methods which need a snapshot instance and just calls a method on it, - * with no additional logic. Separated with all methods marked final and deprecated to prevent their - * use from other methods which may need a snapshot for non-trivial reasons. - */ -public abstract class IPackageManagerBase extends IPackageManager.Stub { - - @NonNull - private final PackageManagerService mService; - - @NonNull - private final Context mContext; - - @NonNull private final DexOptHelper mDexOptHelper; - @NonNull private final ModuleInfoProvider mModuleInfoProvider; - @NonNull private final PreferredActivityHelper mPreferredActivityHelper; - @NonNull private final ResolveIntentHelper mResolveIntentHelper; - - @NonNull - private final DomainVerificationManagerInternal mDomainVerificationManager; - - @NonNull - private final DomainVerificationConnection mDomainVerificationConnection; - - @NonNull - private final PackageInstallerService mInstallerService; - - @NonNull - private final PackageProperty mPackageProperty; - - @NonNull - private final ComponentName mResolveComponentName; - - @Nullable - private final ComponentName mInstantAppResolverSettingsComponent; - - @NonNull - private final String mRequiredSupplementalProcessPackage; - - @Nullable - private final String mServicesExtensionPackageName; - - @Nullable - private final String mSharedSystemSharedLibraryPackageName; - - public IPackageManagerBase(@NonNull PackageManagerService service, @NonNull Context context, - @NonNull DexOptHelper dexOptHelper, @NonNull ModuleInfoProvider moduleInfoProvider, - @NonNull PreferredActivityHelper preferredActivityHelper, - @NonNull ResolveIntentHelper resolveIntentHelper, - @NonNull DomainVerificationManagerInternal domainVerificationManager, - @NonNull DomainVerificationConnection domainVerificationConnection, - @NonNull PackageInstallerService installerService, - @NonNull PackageProperty packageProperty, @NonNull ComponentName resolveComponentName, - @Nullable ComponentName instantAppResolverSettingsComponent, - @NonNull String requiredSupplementalProcessPackage, - @Nullable String servicesExtensionPackageName, - @Nullable String sharedSystemSharedLibraryPackageName) { - mService = service; - mContext = context; - mDexOptHelper = dexOptHelper; - mModuleInfoProvider = moduleInfoProvider; - mPreferredActivityHelper = preferredActivityHelper; - mResolveIntentHelper = resolveIntentHelper; - mDomainVerificationManager = domainVerificationManager; - mDomainVerificationConnection = domainVerificationConnection; - mInstallerService = installerService; - mPackageProperty = packageProperty; - mResolveComponentName = resolveComponentName; - mInstantAppResolverSettingsComponent = instantAppResolverSettingsComponent; - mRequiredSupplementalProcessPackage = requiredSupplementalProcessPackage; - mServicesExtensionPackageName = servicesExtensionPackageName; - mSharedSystemSharedLibraryPackageName = sharedSystemSharedLibraryPackageName; - } - - protected Computer snapshot() { - return mService.snapshotComputer(); - } - - @Override - @Deprecated - public final boolean activitySupportsIntent(ComponentName component, Intent intent, - String resolvedType) { - return snapshot().activitySupportsIntent(mResolveComponentName, component, intent, - resolvedType); - } - - @Override - @Deprecated - public final void addCrossProfileIntentFilter(IntentFilter intentFilter, String ownerPackage, - int sourceUserId, int targetUserId, int flags) { - mService.addCrossProfileIntentFilter(snapshot(), - new WatchedIntentFilter(intentFilter), ownerPackage, sourceUserId, targetUserId, - flags); - } - - // NOTE: Can't remove due to unsupported app usage - @Override - @Deprecated - public final boolean addPermission(PermissionInfo info) { - // Because this is accessed via the package manager service AIDL, - // go through the permission manager service AIDL - return mContext.getSystemService(PermissionManager.class).addPermission(info, false); - } - - // NOTE: Can't remove due to unsupported app usage - @Override - @Deprecated - public final boolean addPermissionAsync(PermissionInfo info) { - // Because this is accessed via the package manager service AIDL, - // go through the permission manager service AIDL - return mContext.getSystemService(PermissionManager.class).addPermission(info, true); - } - - @Override - @Deprecated - public final void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity, - int userId) { - mPreferredActivityHelper.addPersistentPreferredActivity(new WatchedIntentFilter(filter), - activity, userId); - } - - @Override - @Deprecated - public final void addPreferredActivity(IntentFilter filter, int match, - ComponentName[] set, ComponentName activity, int userId, boolean removeExisting) { - mPreferredActivityHelper.addPreferredActivity(snapshot(), - new WatchedIntentFilter(filter), match, set, activity, true, userId, - "Adding preferred", removeExisting); - } - - /* - * Returns if intent can be forwarded from the sourceUserId to the targetUserId - */ - @Override - @Deprecated - public final boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, - @UserIdInt int sourceUserId, @UserIdInt int targetUserId) { - return snapshot().canForwardTo(intent, resolvedType, sourceUserId, targetUserId); - } - - @Override - @Deprecated - public final boolean canRequestPackageInstalls(String packageName, int userId) { - return snapshot().canRequestPackageInstalls(packageName, Binder.getCallingUid(), userId, - true /* throwIfPermNotDeclared*/); - } - - @Override - @Deprecated - public final String[] canonicalToCurrentPackageNames(String[] names) { - return snapshot().canonicalToCurrentPackageNames(names); - } - - // NOTE: Can't remove due to unsupported app usage - @Override - @Deprecated - public final int checkPermission(String permName, String pkgName, int userId) { - return mService.checkPermission(permName, pkgName, userId); - } - - @Override - @Deprecated - public final int checkSignatures(@NonNull String pkg1, @NonNull String pkg2) { - return snapshot().checkSignatures(pkg1, pkg2); - } - - @Override - @Deprecated - public final int checkUidPermission(String permName, int uid) { - return snapshot().checkUidPermission(permName, uid); - } - - @Override - @Deprecated - public final int checkUidSignatures(int uid1, int uid2) { - return snapshot().checkUidSignatures(uid1, uid2); - } - - @Override - @Deprecated - public final void clearPackagePersistentPreferredActivities(String packageName, int userId) { - mPreferredActivityHelper.clearPackagePersistentPreferredActivities(packageName, userId); - } - - @Override - @Deprecated - public final void clearPackagePreferredActivities(String packageName) { - mPreferredActivityHelper.clearPackagePreferredActivities(snapshot(), - packageName); - } - - @Override - @Deprecated - public final String[] currentToCanonicalPackageNames(String[] names) { - return snapshot().currentToCanonicalPackageNames(names); - } - - @Override - @Deprecated - public final void deleteExistingPackageAsUser(VersionedPackage versionedPackage, - final IPackageDeleteObserver2 observer, final int userId) { - mService.deleteExistingPackageAsUser(versionedPackage, observer, userId); - } - - @Override - @Deprecated - public final void deletePackageAsUser(String packageName, int versionCode, - IPackageDeleteObserver observer, int userId, int flags) { - deletePackageVersioned(new VersionedPackage(packageName, versionCode), - new PackageManager.LegacyPackageDeleteObserver(observer).getBinder(), userId, - flags); - } - - @Override - @Deprecated - public final void deletePackageVersioned(VersionedPackage versionedPackage, - final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) { - mService.deletePackageVersioned(versionedPackage, observer, userId, deleteFlags); - } - - @Override - @Deprecated - public final ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) { - return mPreferredActivityHelper.findPersistentPreferredActivity(snapshot(), intent, userId); - } - - @Override - @Deprecated - public final void forceDexOpt(String packageName) { - mDexOptHelper.forceDexOpt(snapshot(), packageName); - } - - @Override - @Deprecated - public final ActivityInfo getActivityInfo(ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, int userId) { - return snapshot().getActivityInfo(component, flags, userId); - } - - @NonNull - @Override - @Deprecated - public final ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) { - return snapshot().getAllIntentFilters(packageName); - } - - @Override - @Deprecated - public final List<String> getAllPackages() { - return snapshot().getAllPackages(); - } - - // NOTE: Can't remove due to unsupported app usage - @NonNull - @Override - @Deprecated - public final String[] getAppOpPermissionPackages(@NonNull String permissionName) { - return snapshot().getAppOpPermissionPackages(permissionName); - } - - @Override - @Deprecated - public final String getAppPredictionServicePackageName() { - return mService.mAppPredictionServicePackage; - } - - @PackageManager.EnabledState - @Override - @Deprecated - public final int getApplicationEnabledSetting(@NonNull String packageName, - @UserIdInt int userId) { - return snapshot().getApplicationEnabledSetting(packageName, userId); - } - - /** - * Returns true if application is not found or there was an error. Otherwise it returns the - * hidden state of the package for the given user. - */ - @Override - @Deprecated - public final boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, - @UserIdInt int userId) { - return snapshot().getApplicationHiddenSettingAsUser(packageName, userId); - } - - @Override - @Deprecated - public final ApplicationInfo getApplicationInfo(String packageName, - @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { - return snapshot().getApplicationInfo(packageName, flags, userId); - } - - @Override - @Deprecated - public final IArtManager getArtManager() { - return mService.mArtManagerService; - } - - @Override - @Deprecated - public final @Nullable - String getAttentionServicePackageName() { - return mService.ensureSystemPackageName(snapshot(), - mService.getPackageFromComponentString(R.string.config_defaultAttentionService)); - } - - @Override - @Deprecated - public final boolean getBlockUninstallForUser(@NonNull String packageName, - @UserIdInt int userId) { - return snapshot().getBlockUninstallForUser(packageName, userId); - } - - @Override - @Deprecated - public final int getComponentEnabledSetting(@NonNull ComponentName component, int userId) { - return snapshot().getComponentEnabledSetting(component, Binder.getCallingUid(), userId); - } - - @Override - @Deprecated - public final String getContentCaptureServicePackageName() { - return mService.ensureSystemPackageName(snapshot(), - mService.getPackageFromComponentString( - R.string.config_defaultContentCaptureService)); - } - - @Nullable - @Override - @Deprecated - public final ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries( - @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, - @NonNull int userId) { - return snapshot().getDeclaredSharedLibraries(packageName, flags, userId); - } - - /** - * Non-Binder method, support for the backup/restore mechanism: write the default browser (etc) - * settings in its canonical XML format. Returns the default browser XML representation as a - * byte array, or null if there is none. - */ - @Override - @Deprecated - public final byte[] getDefaultAppsBackup(int userId) { - return mPreferredActivityHelper.getDefaultAppsBackup(userId); - } - - @Override - @Deprecated - public final String getDefaultTextClassifierPackageName() { - return mService.mDefaultTextClassifierPackage; - } - - @Override - @Deprecated - public final int getFlagsForUid(int uid) { - return snapshot().getFlagsForUid(uid); - } - - @Nullable - @Override - @Deprecated - public final CharSequence getHarmfulAppWarning(@NonNull String packageName, - @UserIdInt int userId) { - return snapshot().getHarmfulAppWarning(packageName, userId); - } - - @Override - @Deprecated - public final ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) { - final Computer snapshot = snapshot(); - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - return snapshot.getHomeActivitiesAsUser(allHomeCandidates, - UserHandle.getCallingUserId()); - } - - @Deprecated - public final String getIncidentReportApproverPackageName() { - return mService.mIncidentReportApproverPackage; - } - - @Override - @Deprecated - public final int getInstallLocation() { - // allow instant app access - return android.provider.Settings.Global.getInt(mContext.getContentResolver(), - android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION, - InstallLocationUtils.APP_INSTALL_AUTO); - } - - @PackageManager.InstallReason - @Override - @Deprecated - public final int getInstallReason(@NonNull String packageName, @UserIdInt int userId) { - return snapshot().getInstallReason(packageName, userId); - } - - @Override - @Nullable - @Deprecated - public final InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) { - return snapshot().getInstallSourceInfo(packageName); - } - - @Override - @Deprecated - public final ParceledListSlice<ApplicationInfo> getInstalledApplications( - @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { - final int callingUid = Binder.getCallingUid(); - return new ParceledListSlice<>( - snapshot().getInstalledApplications(flags, userId, callingUid)); - } - - @Override - @Deprecated - public final List<ModuleInfo> getInstalledModules(int flags) { - return mModuleInfoProvider.getInstalledModules(flags); - } - - @Override - @Deprecated - public final ParceledListSlice<PackageInfo> getInstalledPackages( - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return snapshot().getInstalledPackages(flags, userId); - } - - @Nullable - @Override - @Deprecated - public final String getInstallerPackageName(@NonNull String packageName) { - return snapshot().getInstallerPackageName(packageName); - } - - @Override - @Deprecated - public final ComponentName getInstantAppInstallerComponent() { - final Computer snapshot = snapshot(); - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - return snapshot.getInstantAppInstallerComponent(); - } - - @Override - @Deprecated - public final @Nullable - ComponentName getInstantAppResolverComponent() { - final Computer snapshot = snapshot(); - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - return mService.getInstantAppResolver(snapshot); - } - - @Override - @Deprecated - public final ComponentName getInstantAppResolverSettingsComponent() { - return mInstantAppResolverSettingsComponent; - } - - @Nullable - @Override - @Deprecated - public final InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, - int flags) { - return snapshot().getInstrumentationInfo(component, flags); - } - - @Override - @Deprecated - public final @NonNull - ParceledListSlice<IntentFilterVerificationInfo> - getIntentFilterVerifications(String packageName) { - return ParceledListSlice.emptyList(); - } - - @Override - @Deprecated - public final int getIntentVerificationStatus(String packageName, int userId) { - return mDomainVerificationManager.getLegacyState(packageName, userId); - } - - @Nullable - @Override - @Deprecated - public final KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) { - return snapshot().getKeySetByAlias(packageName, alias); - } - - @Override - @Deprecated - public final ModuleInfo getModuleInfo(String packageName, - @PackageManager.ModuleInfoFlags int flags) { - return mModuleInfoProvider.getModuleInfo(packageName, flags); - } - - @Nullable - @Override - @Deprecated - public final String getNameForUid(int uid) { - return snapshot().getNameForUid(uid); - } - - @Nullable - @Override - @Deprecated - public final String[] getNamesForUids(@NonNull int[] uids) { - return snapshot().getNamesForUids(uids); - } - - @Override - @Deprecated - public final int[] getPackageGids(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return snapshot().getPackageGids(packageName, flags, userId); - } - - @Override - @Deprecated - public final PackageInfo getPackageInfo(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return snapshot().getPackageInfo(packageName, flags, userId); - } - - @Override - @Deprecated - public final PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return snapshot().getPackageInfoInternal(versionedPackage.getPackageName(), - versionedPackage.getLongVersionCode(), flags, Binder.getCallingUid(), userId); - } - - @Override - @Deprecated - public final IPackageInstaller getPackageInstaller() { - // Return installer service for internal calls. - if (PackageManagerServiceUtils.isSystemOrRoot()) { - return mInstallerService; - } - final Computer snapshot = snapshot(); - // Return null for InstantApps. - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { - return null; - } - return mInstallerService; - } - - @Override - @Deprecated - public final void getPackageSizeInfo(final String packageName, int userId, - final IPackageStatsObserver observer) { - throw new UnsupportedOperationException( - "Shame on you for calling the hidden API getPackageSizeInfo(). Shame!"); - } - - @Override - @Deprecated - public final int getPackageUid(@NonNull String packageName, - @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { - return snapshot().getPackageUid(packageName, flags, userId); - } - - /** - * <em>IMPORTANT:</em> Not all packages returned by this method may be known - * to the system. There are two conditions in which this may occur: - * <ol> - * <li>The package is on adoptable storage and the device has been removed</li> - * <li>The package is being removed and the internal structures are partially updated</li> - * </ol> - * The second is an artifact of the current data structures and should be fixed. See - * b/111075456 for one such instance. - * This binder API is cached. If the algorithm in this method changes, - * or if the underlying objecs (as returned by getSettingLPr()) change - * then the logic that invalidates the cache must be revisited. See - * calls to invalidateGetPackagesForUidCache() to locate the points at - * which the cache is invalidated. - */ - @Override - @Deprecated - public final String[] getPackagesForUid(int uid) { - final int callingUid = Binder.getCallingUid(); - final int userId = UserHandle.getUserId(uid); - snapshot().enforceCrossUserOrProfilePermission(callingUid, userId, - /* requireFullPermission */ false, - /* checkShell */ false, "getPackagesForUid"); - return snapshot().getPackagesForUid(uid); - } - - @Override - @Deprecated - public final ParceledListSlice<PackageInfo> getPackagesHoldingPermissions( - @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, - @UserIdInt int userId) { - return snapshot().getPackagesHoldingPermissions(permissions, flags, userId); - } - - // NOTE: Can't remove due to unsupported app usage - @Override - @Deprecated - public final PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) { - return mService.getPermissionGroupInfo(groupName, flags); - } - - @Override - @Deprecated - public final @NonNull - ParceledListSlice<ApplicationInfo> getPersistentApplications(int flags) { - final Computer snapshot = snapshot(); - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { - return ParceledListSlice.emptyList(); - } - return new ParceledListSlice<>(snapshot.getPersistentApplications(isSafeMode(), flags)); - } - - @Override - @Deprecated - public final int getPreferredActivities(List<IntentFilter> outFilters, - List<ComponentName> outActivities, String packageName) { - return mPreferredActivityHelper.getPreferredActivities(snapshot(), outFilters, - outActivities, packageName); - } - - /** - * Non-Binder method, support for the backup/restore mechanism: write the full set of preferred - * activities in its canonical XML format. Returns the XML output as a byte array, or null if - * there is none. - */ - @Override - @Deprecated - public final byte[] getPreferredActivityBackup(int userId) { - return mPreferredActivityHelper.getPreferredActivityBackup(userId); - } - - @Override - @Deprecated - public final int getPrivateFlagsForUid(int uid) { - return snapshot().getPrivateFlagsForUid(uid); - } - - @Override - @Deprecated - public final PackageManager.Property getProperty(String propertyName, String packageName, - String className) { - Objects.requireNonNull(propertyName); - Objects.requireNonNull(packageName); - PackageStateInternal packageState = snapshot().getPackageStateFiltered(packageName, - Binder.getCallingUid(), UserHandle.getCallingUserId()); - if (packageState == null) { - return null; - } - return mPackageProperty.getProperty(propertyName, packageName, className); - } - - @Nullable - @Override - @Deprecated - public final ProviderInfo getProviderInfo(@NonNull ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { - return snapshot().getProviderInfo(component, flags, userId); - } - - @Override - @Deprecated - public final ActivityInfo getReceiverInfo(ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, int userId) { - return snapshot().getReceiverInfo(component, flags, userId); - } - - @Override - @Deprecated - public final @Nullable - String getRotationResolverPackageName() { - return mService.ensureSystemPackageName(snapshot(), - mService.getPackageFromComponentString( - R.string.config_defaultRotationResolverService)); - } - - @Nullable - @Override - @Deprecated - public final ServiceInfo getServiceInfo(@NonNull ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { - return snapshot().getServiceInfo(component, flags, userId); - } - - @Override - @Deprecated - public final @NonNull - String getServicesSystemSharedLibraryPackageName() { - return mServicesExtensionPackageName; - } - - @Override - @Deprecated - public final String getSetupWizardPackageName() { - if (Binder.getCallingUid() != Process.SYSTEM_UID) { - throw new SecurityException("Non-system caller"); - } - return mService.mSetupWizardPackage; - } - - @Override - @Deprecated - public final ParceledListSlice<SharedLibraryInfo> getSharedLibraries(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return snapshot().getSharedLibraries(packageName, flags, userId); - } - - @Override - @Deprecated - public final @NonNull - String getSharedSystemSharedLibraryPackageName() { - return mSharedSystemSharedLibraryPackageName; - } - - @Nullable - @Override - @Deprecated - public final KeySet getSigningKeySet(@NonNull String packageName) { - return snapshot().getSigningKeySet(packageName); - } - - @Override - @Deprecated - public final String getSdkSandboxPackageName() { - return mService.getSdkSandboxPackageName(); - } - - @Override - @Deprecated - public final String getSystemCaptionsServicePackageName() { - return mService.ensureSystemPackageName(snapshot(), - mService.getPackageFromComponentString( - R.string.config_defaultSystemCaptionsService)); - } - - @Nullable - @Override - @Deprecated - public final String[] getSystemSharedLibraryNames() { - return snapshot().getSystemSharedLibraryNames(); - } - - @Override - @Deprecated - public final String getSystemTextClassifierPackageName() { - return mService.mSystemTextClassifierPackageName; - } - - @Override - @Deprecated - public final int getTargetSdkVersion(@NonNull String packageName) { - return snapshot().getTargetSdkVersion(packageName); - } - - @Override - @Deprecated - public final int getUidForSharedUser(@NonNull String sharedUserName) { - return snapshot().getUidForSharedUser(sharedUserName); - } - - @SuppressLint("MissingPermission") - @Override - @Deprecated - public final String getWellbeingPackageName() { - final long identity = Binder.clearCallingIdentity(); - try { - return CollectionUtils.firstOrNull( - mContext.getSystemService(RoleManager.class).getRoleHolders( - RoleManager.ROLE_SYSTEM_WELLBEING)); - } finally { - Binder.restoreCallingIdentity(identity); - } - } - - // NOTE: Can't remove due to unsupported app usage - @SuppressLint("MissingPermission") - @Override - @Deprecated - public final void grantRuntimePermission(String packageName, String permName, - final int userId) { - // Because this is accessed via the package manager service AIDL, - // go through the permission manager service AIDL - mContext.getSystemService(PermissionManager.class) - .grantRuntimePermission(packageName, permName, UserHandle.of(userId)); - } - - @Override - @Deprecated - public final boolean hasSigningCertificate(@NonNull String packageName, - @NonNull byte[] certificate, - @PackageManager.CertificateInputType int type) { - return snapshot().hasSigningCertificate(packageName, certificate, type); - } - - @Override - @Deprecated - public final boolean hasSystemFeature(String name, int version) { - return mService.hasSystemFeature(name, version); - } - - @Override - @Deprecated - public final boolean hasSystemUidErrors() { - // allow instant applications - return false; - } - - @Override - @Deprecated - public final boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, - @PackageManager.CertificateInputType int type) { - return snapshot().hasUidSigningCertificate(uid, certificate, type); - } - - @Override - @Deprecated - public final boolean isDeviceUpgrading() { - return mService.isDeviceUpgrading(); - } - - @Override - @Deprecated - public final boolean isFirstBoot() { - return mService.isFirstBoot(); - } - - @Override - @Deprecated - public final boolean isInstantApp(String packageName, int userId) { - return snapshot().isInstantApp(packageName, userId); - } - - @Override - @Deprecated - public final boolean isOnlyCoreApps() { - return mService.isOnlyCoreApps(); - } - - @Override - @Deprecated - public final boolean isPackageAvailable(String packageName, int userId) { - return snapshot().isPackageAvailable(packageName, userId); - } - - @Override - @Deprecated - public final boolean isPackageDeviceAdminOnAnyUser(String packageName) { - return mService.isPackageDeviceAdminOnAnyUser(snapshot(), - packageName); - } - - @Override - @Deprecated - public final boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) { - return snapshot().isPackageSignedByKeySet(packageName, ks); - } - - @Override - @Deprecated - public final boolean isPackageSignedByKeySetExactly(@NonNull String packageName, - @NonNull KeySet ks) { - return snapshot().isPackageSignedByKeySetExactly(packageName, ks); - } - - @Override - @Deprecated - public final boolean isPackageSuspendedForUser(@NonNull String packageName, - @UserIdInt int userId) { - return snapshot().isPackageSuspendedForUser(packageName, userId); - } - - @Override - @Deprecated - public final boolean isSafeMode() { - // allow instant applications - return mService.getSafeMode(); - } - - @Override - @Deprecated - public final boolean isStorageLow() { - return mService.isStorageLow(); - } - - @Override - @Deprecated - public final boolean isUidPrivileged(int uid) { - return snapshot().isUidPrivileged(uid); - } - - /** - * Ask the package manager to perform a dex-opt with the given compiler filter. - * <p> - * Note: exposed only for the shell command to allow moving packages explicitly to a definite - * state. - */ - @Override - @Deprecated - public final boolean performDexOptMode(String packageName, - boolean checkProfiles, String targetCompilerFilter, boolean force, - boolean bootComplete, String splitName) { - return mDexOptHelper.performDexOptMode(packageName, checkProfiles, targetCompilerFilter, - force, bootComplete, splitName); - } - - /** - * Ask the package manager to perform a dex-opt with the given compiler filter on the secondary - * dex files belonging to the given package. - * <p> - * Note: exposed only for the shell command to allow moving packages explicitly to a definite - * state. - */ - @Override - @Deprecated - public final boolean performDexOptSecondary(String packageName, String compilerFilter, - boolean force) { - return mDexOptHelper.performDexOptSecondary(packageName, compilerFilter, force); - } - - @Override - @Deprecated - public final @NonNull - ParceledListSlice<ResolveInfo> queryIntentActivities(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - try { - Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities"); - - return new ParceledListSlice<>(snapshot().queryIntentActivitiesInternal(intent, - resolvedType, flags, userId)); - } finally { - Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); - } - } - - @NonNull - @Override - @Deprecated - public final ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName, - int uid, @PackageManager.ComponentInfoFlagsBits long flags, - @Nullable String metaDataKey) { - return snapshot().queryContentProviders(processName, uid, flags, metaDataKey); - } - - @NonNull - @Override - @Deprecated - public final ParceledListSlice<InstrumentationInfo> queryInstrumentation( - @NonNull String targetPackage, int flags) { - return snapshot().queryInstrumentation(targetPackage, flags); - } - - @Override - @Deprecated - public final @NonNull - ParceledListSlice<ResolveInfo> queryIntentActivityOptions( - ComponentName caller, Intent[] specifics, String[] specificTypes, Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return new ParceledListSlice<>(mResolveIntentHelper.queryIntentActivityOptionsInternal( - snapshot(), caller, specifics, specificTypes, intent, resolvedType, flags, - userId)); - } - - @Override - @Deprecated - public final @NonNull - ParceledListSlice<ResolveInfo> queryIntentContentProviders(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return new ParceledListSlice<>(mResolveIntentHelper.queryIntentContentProvidersInternal( - snapshot(), intent, resolvedType, flags, userId)); - } - - @Override - @Deprecated - public final @NonNull - ParceledListSlice<ResolveInfo> queryIntentReceivers(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return new ParceledListSlice<>(mResolveIntentHelper.queryIntentReceiversInternal( - snapshot(), intent, resolvedType, flags, userId, Binder.getCallingUid())); - } - - @Override - @Deprecated - public final @NonNull - ParceledListSlice<ResolveInfo> queryIntentServices(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - final int callingUid = Binder.getCallingUid(); - return new ParceledListSlice<>(snapshot().queryIntentServicesInternal( - intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/)); - } - - @Override - @Deprecated - public final void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) { - snapshot().querySyncProviders(isSafeMode(), outNames, outInfo); - } - - @Override - @Deprecated - public final void removePermission(String permName) { - // Because this is accessed via the package manager service AIDL, - // go through the permission manager service AIDL - mContext.getSystemService(PermissionManager.class).removePermission(permName); - } - - @Override - @Deprecated - public final void replacePreferredActivity(IntentFilter filter, int match, - ComponentName[] set, ComponentName activity, int userId) { - mPreferredActivityHelper.replacePreferredActivity(snapshot(), - new WatchedIntentFilter(filter), match, set, activity, userId); - } - - @Override - @Deprecated - public final ProviderInfo resolveContentProvider(String name, - @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return snapshot().resolveContentProvider(name, flags, userId, Binder.getCallingUid()); - } - - @Override - @Deprecated - public final void resetApplicationPreferences(int userId) { - mPreferredActivityHelper.resetApplicationPreferences(userId); - } - - @Override - @Deprecated - public final ResolveInfo resolveIntent(Intent intent, String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - return mResolveIntentHelper.resolveIntentInternal(snapshot(), intent, - resolvedType, flags, 0 /*privateResolveFlags*/, userId, false, - Binder.getCallingUid()); - } - - @Override - @Deprecated - public final ResolveInfo resolveService(Intent intent, String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, int userId) { - final int callingUid = Binder.getCallingUid(); - return mResolveIntentHelper.resolveServiceInternal(snapshot(), intent, - resolvedType, flags, userId, callingUid); - } - - @Override - @Deprecated - public final void restoreDefaultApps(byte[] backup, int userId) { - mPreferredActivityHelper.restoreDefaultApps(backup, userId); - } - - @Override - @Deprecated - public final void restorePreferredActivities(byte[] backup, int userId) { - mPreferredActivityHelper.restorePreferredActivities(backup, userId); - } - - @Override - @Deprecated - public final void setHomeActivity(ComponentName comp, int userId) { - mPreferredActivityHelper.setHomeActivity(snapshot(), comp, userId); - } - - @Override - @Deprecated - public final void setLastChosenActivity(Intent intent, String resolvedType, int flags, - IntentFilter filter, int match, ComponentName activity) { - mPreferredActivityHelper.setLastChosenActivity(snapshot(), intent, resolvedType, - flags, new WatchedIntentFilter(filter), match, activity); - } - - @Override - @Deprecated - public final boolean updateIntentVerificationStatus(String packageName, int status, - int userId) { - return mDomainVerificationManager.setLegacyUserState(packageName, userId, status); - } - - @Override - @Deprecated - public final void verifyIntentFilter(int id, int verificationCode, List<String> failedDomains) { - DomainVerificationProxyV1.queueLegacyVerifyResult(mContext, mDomainVerificationConnection, - id, verificationCode, failedDomains, Binder.getCallingUid()); - } - - @Override - @Deprecated - public final boolean canPackageQuery(@NonNull String sourcePackageName, - @NonNull String targetPackageName, @UserIdInt int userId) { - return snapshot().canPackageQuery(sourcePackageName, targetPackageName, userId); - } - - @Override - @Deprecated - public final void deletePreloadsFileCache() throws RemoteException { - mService.deletePreloadsFileCache(); - } - - @Override - @Deprecated - public final void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden) - throws RemoteException { - mService.setSystemAppHiddenUntilInstalled(snapshot(), packageName, hidden); - } - - @Override - @Deprecated - public final boolean setSystemAppInstallState(String packageName, - boolean installed, int userId) throws RemoteException { - return mService.setSystemAppInstallState(snapshot(), packageName, installed, userId); - } - - @Override - @Deprecated - public final void finishPackageInstall(int token, boolean didLaunch) throws RemoteException { - mService.finishPackageInstall(token, didLaunch); - } -} diff --git a/services/core/java/com/android/server/pm/IncrementalProgressListener.java b/services/core/java/com/android/server/pm/IncrementalProgressListener.java index 703bbda92182..fa11924218d4 100644 --- a/services/core/java/com/android/server/pm/IncrementalProgressListener.java +++ b/services/core/java/com/android/server/pm/IncrementalProgressListener.java @@ -33,8 +33,7 @@ final class IncrementalProgressListener extends IPackageLoadingProgressCallback. @Override public void onPackageLoadingProgressChanged(float progress) { - PackageStateInternal packageState = mPm.snapshotComputer() - .getPackageStateInternal(mPackageName); + PackageStateInternal packageState = mPm.getPackageStateInternal(mPackageName); if (packageState == null) { return; } diff --git a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java index 91750dee7688..8d7762410b27 100644 --- a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java +++ b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java @@ -171,7 +171,7 @@ final class InitAndSystemPackageHelper { } } OverlayConfig overlayConfig = OverlayConfig.initializeSystemInstance( - consumer -> mPm.forEachPackage(mPm.snapshotComputer(), + consumer -> mPm.forEachPackage( pkg -> consumer.accept(pkg, pkg.isSystem(), apkInApexPreInstalledPaths.get(pkg.getPackageName())))); // Prune any system packages that no longer exist. diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index b39b24f6defa..8667ffd7930c 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -527,10 +527,8 @@ final class InstallPackageHelper { + android.Manifest.permission.INSTALL_PACKAGES + "."); } PackageSetting pkgSetting; - final Computer preLockSnapshot = mPm.snapshotComputer(); - preLockSnapshot.enforceCrossUserPermission(callingUid, userId, - true /* requireFullPermission */, true /* checkShell */, - "installExistingPackage for user " + userId); + mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, + true /* checkShell */, "installExistingPackage for user " + userId); if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) { return PackageManager.INSTALL_FAILED_USER_RESTRICTED; } @@ -545,12 +543,11 @@ final class InstallPackageHelper { // writer synchronized (mPm.mLock) { - final Computer snapshot = mPm.snapshotComputer(); pkgSetting = mPm.mSettings.getPackageLPr(packageName); if (pkgSetting == null) { return PackageManager.INSTALL_FAILED_INVALID_URI; } - if (!snapshot.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) { + if (!mPm.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) { // only allow the existing package to be used if it's installed as a full // application for at least one user boolean installAllowed = false; @@ -600,8 +597,7 @@ final class InstallPackageHelper { mAppDataHelper.prepareAppDataAfterInstallLIF(pkgSetting.getPkg()); } } - mPm.sendPackageAddedForUser(mPm.snapshotComputer(), packageName, pkgSetting, userId, - DataLoaderType.NONE); + mPm.sendPackageAddedForUser(packageName, pkgSetting, userId, DataLoaderType.NONE); synchronized (mPm.mLock) { mPm.updateSequenceNumberLP(pkgSetting, new int[]{ userId }); } @@ -1906,8 +1902,8 @@ final class InstallPackageHelper { AndroidPackage oldPackage = mPm.mPackages.get(packageName); // Set the update and install times - PackageStateInternal deletedPkgSetting = mPm.snapshotComputer() - .getPackageStateInternal(oldPackage.getPackageName()); + PackageStateInternal deletedPkgSetting = mPm.getPackageStateInternal( + oldPackage.getPackageName()); reconciledPkg.mPkgSetting .setFirstInstallTimeFromReplaced(deletedPkgSetting, request.mAllUsers) .setLastUpdateTime(System.currentTimeMillis()); @@ -2575,10 +2571,9 @@ final class InstallPackageHelper { size = i; mPm.mPendingBroadcasts.clear(); } - final Computer snapshot = mPm.snapshotComputer(); // Send broadcasts for (int i = 0; i < size; i++) { - mPm.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */, + mPm.sendPackageChangedBroadcast(packages[i], true /* dontKillApp */, components[i], uids[i], null /* reason */); } Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); @@ -2597,7 +2592,7 @@ final class InstallPackageHelper { final boolean update = res.mRemovedInfo != null && res.mRemovedInfo.mRemovedPackage != null; final String packageName = res.mName; final PackageStateInternal pkgSetting = - succeeded ? mPm.snapshotComputer().getPackageStateInternal(packageName) : null; + succeeded ? mPm.getPackageStateInternal(packageName) : null; final boolean removedBeforeUpdate = (pkgSetting == null) || (pkgSetting.isSystem() && !pkgSetting.getPath().getPath().equals( res.mPkg.getPath())); @@ -2695,9 +2690,9 @@ final class InstallPackageHelper { // sendPackageAddedForNewUsers also deals with system apps int appId = UserHandle.getAppId(res.mUid); boolean isSystem = res.mPkg.isSystem(); - mPm.sendPackageAddedForNewUsers(mPm.snapshotComputer(), packageName, - isSystem || virtualPreload, virtualPreload /*startReceiver*/, appId, - firstUserIds, firstInstantUserIds, dataLoaderType); + mPm.sendPackageAddedForNewUsers(packageName, isSystem || virtualPreload, + virtualPreload /*startReceiver*/, appId, firstUserIds, firstInstantUserIds, + dataLoaderType); // Send added for users that don't see the package for the first time Bundle extras = new Bundle(); @@ -2710,8 +2705,7 @@ final class InstallPackageHelper { final SparseArray<int[]> newBroadcastAllowList; synchronized (mPm.mLock) { newBroadcastAllowList = mPm.mAppsFilter.getVisibilityAllowList( - mPm.snapshotComputer() - .getPackageStateInternal(packageName, Process.SYSTEM_UID), + mPm.getPackageStateInternal(packageName, Process.SYSTEM_UID), updateUserIds, mPm.mSettings.getPackagesLocked()); } mPm.sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, @@ -2813,12 +2807,11 @@ final class InstallPackageHelper { } } else if (!ArrayUtils.isEmpty(res.mLibraryConsumers)) { // if static shared lib // No need to kill consumers if it's installation of new version static shared lib. - final Computer snapshot = mPm.snapshotComputer(); final boolean dontKillApp = !update && res.mPkg.getStaticSharedLibName() != null; for (int i = 0; i < res.mLibraryConsumers.size(); i++) { AndroidPackage pkg = res.mLibraryConsumers.get(i); // send broadcast that all consumers of the static shared library have changed - mPm.sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), dontKillApp, + mPm.sendPackageChangedBroadcast(pkg.getPackageName(), dontKillApp, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), null); } diff --git a/services/core/java/com/android/server/pm/ModuleInfoProvider.java b/services/core/java/com/android/server/pm/ModuleInfoProvider.java index 230f5558b37d..0ffc1ed9e90c 100644 --- a/services/core/java/com/android/server/pm/ModuleInfoProvider.java +++ b/services/core/java/com/android/server/pm/ModuleInfoProvider.java @@ -16,7 +16,6 @@ package com.android.server.pm; -import android.annotation.NonNull; import android.content.Context; import android.content.pm.IPackageManager; import android.content.pm.ModuleInfo; @@ -26,7 +25,6 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.UserHandle; import android.text.TextUtils; import android.util.ArrayMap; @@ -60,7 +58,7 @@ public class ModuleInfoProvider { private static final String MODULE_METADATA_KEY = "android.content.pm.MODULE_METADATA"; private final Context mContext; - private IPackageManager mPackageManager; + private final IPackageManager mPackageManager; private final ApexManager mApexManager; private final Map<String, ModuleInfo> mModuleInfo; @@ -68,8 +66,9 @@ public class ModuleInfoProvider { private volatile boolean mMetadataLoaded; private volatile String mPackageName; - ModuleInfoProvider(Context context) { + ModuleInfoProvider(Context context, IPackageManager packageManager) { mContext = context; + mPackageManager = packageManager; mApexManager = ApexManager.getInstance(); mModuleInfo = new ArrayMap<>(); } @@ -78,20 +77,12 @@ public class ModuleInfoProvider { public ModuleInfoProvider( XmlResourceParser metadata, Resources resources, ApexManager apexManager) { mContext = null; + mPackageManager = null; mApexManager = apexManager; mModuleInfo = new ArrayMap<>(); loadModuleMetadata(metadata, resources); } - @NonNull - private IPackageManager getPackageManager() { - if (mPackageManager == null) { - mPackageManager = IPackageManager.Stub.asInterface( - ServiceManager.getService("package")); - } - return mPackageManager; - } - /** Called by the {@code PackageManager} when it has completed its boot sequence */ public void systemReady() { mPackageName = mContext.getResources().getString( @@ -104,7 +95,7 @@ public class ModuleInfoProvider { final Resources packageResources; final PackageInfo pi; try { - pi = getPackageManager().getPackageInfo(mPackageName, + pi = mPackageManager.getPackageInfo(mPackageName, PackageManager.GET_META_DATA, UserHandle.USER_SYSTEM); Context packageContext = mContext.createPackageContext(mPackageName, 0); @@ -192,7 +183,7 @@ public class ModuleInfoProvider { List<PackageInfo> allPackages; try { - allPackages = getPackageManager().getInstalledPackages( + allPackages = mPackageManager.getInstalledPackages( flags | PackageManager.MATCH_APEX, UserHandle.getCallingUserId()).getList(); } catch (RemoteException e) { Slog.w(TAG, "Unable to retrieve all package names", e); diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java index c5ca06cc7b84..5fc90b1d994f 100644 --- a/services/core/java/com/android/server/pm/MovePackageHelper.java +++ b/services/core/java/com/android/server/pm/MovePackageHelper.java @@ -57,8 +57,6 @@ import com.android.internal.os.SomeArgs; import com.android.internal.util.FrameworkStatsLog; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; -import com.android.server.pm.pkg.PackageStateInternal; -import com.android.server.pm.pkg.PackageStateUtils; import java.io.File; import java.util.Objects; @@ -79,74 +77,81 @@ public final class MovePackageHelper { final StorageManager storage = mPm.mInjector.getSystemService(StorageManager.class); final PackageManager pm = mPm.mContext.getPackageManager(); - Computer snapshot = mPm.snapshotComputer(); - final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); - if (packageState == null - || packageState.getPkg() == null - || snapshot.shouldFilterApplication(packageState, callingUid, user.getIdentifier())) { - throw new PackageManagerException(MOVE_FAILED_DOESNT_EXIST, "Missing package"); - } - final AndroidPackage pkg = packageState.getPkg(); - if (pkg.isSystem()) { - throw new PackageManagerException(MOVE_FAILED_SYSTEM_PACKAGE, - "Cannot move system application"); - } - - final boolean isInternalStorage = VolumeInfo.ID_PRIVATE_INTERNAL.equals(volumeUuid); - final boolean allow3rdPartyOnInternal = mPm.mContext.getResources().getBoolean( - com.android.internal.R.bool.config_allow3rdPartyAppOnInternal); - if (isInternalStorage && !allow3rdPartyOnInternal) { - throw new PackageManagerException(MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL, - "3rd party apps are not allowed on internal storage"); - } + final String currentVolumeUuid; + final File codeFile; + final InstallSource installSource; + final String packageAbiOverride; + final int appId; + final String seinfo; + final String label; + final int targetSdkVersion; + final PackageFreezer freezer; + final int[] installedUserIds; + final boolean isCurrentLocationExternal; + final String fromCodePath; + // reader + synchronized (mPm.mLock) { + final AndroidPackage pkg = mPm.mPackages.get(packageName); + final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName); + if (pkg == null + || ps == null + || mPm.shouldFilterApplication(ps, callingUid, user.getIdentifier())) { + throw new PackageManagerException(MOVE_FAILED_DOESNT_EXIST, "Missing package"); + } + if (pkg.isSystem()) { + throw new PackageManagerException(MOVE_FAILED_SYSTEM_PACKAGE, + "Cannot move system application"); + } - final String currentVolumeUuid = packageState.getVolumeUuid(); + final boolean isInternalStorage = VolumeInfo.ID_PRIVATE_INTERNAL.equals(volumeUuid); + final boolean allow3rdPartyOnInternal = mPm.mContext.getResources().getBoolean( + com.android.internal.R.bool.config_allow3rdPartyAppOnInternal); + if (isInternalStorage && !allow3rdPartyOnInternal) { + throw new PackageManagerException(MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL, + "3rd party apps are not allowed on internal storage"); + } - final File probe = new File(pkg.getPath()); - final File probeOat = new File(probe, "oat"); - if (!probe.isDirectory() || !probeOat.isDirectory()) { - throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, - "Move only supported for modern cluster style installs"); - } + currentVolumeUuid = ps.getVolumeUuid(); - if (Objects.equals(currentVolumeUuid, volumeUuid)) { - throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, - "Package already moved to " + volumeUuid); - } - if (!pkg.isExternalStorage() - && mPm.isPackageDeviceAdminOnAnyUser(snapshot, packageName)) { - throw new PackageManagerException(MOVE_FAILED_DEVICE_ADMIN, - "Device admin cannot be moved"); - } + final File probe = new File(pkg.getPath()); + final File probeOat = new File(probe, "oat"); + if (!probe.isDirectory() || !probeOat.isDirectory()) { + throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, + "Move only supported for modern cluster style installs"); + } - if (snapshot.getFrozenPackages().containsKey(packageName)) { - throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING, - "Failed to move already frozen package"); - } + if (Objects.equals(currentVolumeUuid, volumeUuid)) { + throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, + "Package already moved to " + volumeUuid); + } + if (!pkg.isExternalStorage() && mPm.isPackageDeviceAdminOnAnyUser(packageName)) { + throw new PackageManagerException(MOVE_FAILED_DEVICE_ADMIN, + "Device admin cannot be moved"); + } - final boolean isCurrentLocationExternal = pkg.isExternalStorage(); - final File codeFile = new File(pkg.getPath()); - final InstallSource installSource = packageState.getInstallSource(); - final String packageAbiOverride = packageState.getCpuAbiOverride(); - final int appId = UserHandle.getAppId(pkg.getUid()); - final String seinfo = AndroidPackageUtils.getSeInfo(pkg, packageState); - final String label = String.valueOf(pm.getApplicationLabel( - AndroidPackageUtils.generateAppInfoWithoutState(pkg))); - final int targetSdkVersion = pkg.getTargetSdkVersion(); - final int[] installedUserIds = PackageStateUtils.queryInstalledUsers(packageState, - mPm.mUserManager.getUserIds(), true); - final String fromCodePath; - if (codeFile.getParentFile().getName().startsWith( - PackageManagerService.RANDOM_DIR_PREFIX)) { - fromCodePath = codeFile.getParentFile().getAbsolutePath(); - } else { - fromCodePath = codeFile.getAbsolutePath(); - } + if (mPm.mFrozenPackages.containsKey(packageName)) { + throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING, + "Failed to move already frozen package"); + } - final PackageFreezer freezer; - synchronized (mPm.mLock) { + isCurrentLocationExternal = pkg.isExternalStorage(); + codeFile = new File(pkg.getPath()); + installSource = ps.getInstallSource(); + packageAbiOverride = ps.getCpuAbiOverride(); + appId = UserHandle.getAppId(pkg.getUid()); + seinfo = AndroidPackageUtils.getSeInfo(pkg, ps); + label = String.valueOf(pm.getApplicationLabel( + AndroidPackageUtils.generateAppInfoWithoutState(pkg))); + targetSdkVersion = pkg.getTargetSdkVersion(); freezer = mPm.freezePackage(packageName, "movePackageInternal"); + installedUserIds = ps.queryInstalledUsers(mPm.mUserManager.getUserIds(), true); + if (codeFile.getParentFile().getName().startsWith( + PackageManagerService.RANDOM_DIR_PREFIX)) { + fromCodePath = codeFile.getParentFile().getAbsolutePath(); + } else { + fromCodePath = codeFile.getAbsolutePath(); + } } final Bundle extras = new Bundle(); diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index cc4a76034b2b..bd0091480caf 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -131,9 +131,8 @@ public class OtaDexoptService extends IOtaDexopt.Stub { Predicate<PackageStateInternal> isPlatformPackage = pkgSetting -> PLATFORM_PACKAGE_NAME.equals(pkgSetting.getPkg().getPackageName()); // Important: the packages we need to run with ab-ota compiler-reason. - final Computer snapshot = mPackageManagerService.snapshotComputer(); final Collection<? extends PackageStateInternal> allPackageStates = - snapshot.getPackageStates().values(); + mPackageManagerService.getPackageStates().values(); important = DexOptHelper.getPackagesForDexopt(allPackageStates,mPackageManagerService, DEBUG_DEXOPT); // Remove Platform Package from A/B OTA b/160735835. @@ -166,7 +165,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub { Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: " + DexOptHelper.packagesToString(others)); for (PackageStateInternal pkg : others) { - mPackageManagerService.deleteOatArtifactsOfPackage(snapshot, pkg.getPackageName()); + mPackageManagerService.deleteOatArtifactsOfPackage(pkg.getPackageName()); } } long spaceAvailableNow = getAvailableSpace(); diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 4e702e2c9df5..6613f016f66a 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -597,8 +597,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements String installerAttributionTag, int userId) throws IOException { final int callingUid = Binder.getCallingUid(); - final Computer snapshot = mPm.snapshotComputer(); - snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "createSession"); + mPm.enforceCrossUserPermission( + callingUid, userId, true, true, "createSession"); if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) { throw new SecurityException("User restriction prevents installing"); @@ -663,7 +663,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements params.installFlags &= ~PackageManager.INSTALL_ALL_USERS; params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; if ((params.installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0 - && !mPm.isCallerVerifier(snapshot, callingUid)) { + && !mPm.isCallerVerifier(callingUid)) { params.installFlags &= ~PackageManager.INSTALL_VIRTUAL_PRELOAD; } if (mContext.checkCallingOrSelfPermission( @@ -676,7 +676,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements String originatingPackageName = null; if (params.originatingUid != SessionParams.UID_UNKNOWN && params.originatingUid != callingUid) { - String[] packages = snapshot.getPackagesForUid(params.originatingUid); + String[] packages = mPm.mIPackageManager.getPackagesForUid(params.originatingUid); if (packages != null && packages.length > 0) { // Choose an arbitrary representative package in the case of a shared UID. originatingPackageName = packages[0]; @@ -727,7 +727,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements if ((params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0 && !isCalledBySystemOrShell(callingUid) - && (snapshot.getFlagsForUid(callingUid) & ApplicationInfo.FLAG_SYSTEM) + && (mPm.mIPackageManager.getFlagsForUid(callingUid) & ApplicationInfo.FLAG_SYSTEM) == 0) { throw new SecurityException( "Only system apps could use the PackageManager.INSTALL_INSTANT_APP flag."); @@ -1038,12 +1038,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements return "smdl" + sessionId + ".tmp"; } - private boolean shouldFilterSession(@NonNull Computer snapshot, int uid, SessionInfo info) { + private boolean shouldFilterSession(int uid, SessionInfo info) { if (info == null) { return false; } - return uid != info.getInstallerUid() - && !snapshot.canQueryPackage(uid, info.getAppPackageName()); + return uid != info.getInstallerUid() && !mPm.canQueryPackage(uid, info.getAppPackageName()); } @Override @@ -1056,7 +1055,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements ? session.generateInfoForCaller(true /* includeIcon */, callingUid) : null; } - return shouldFilterSession(mPm.snapshotComputer(), callingUid, result) ? null : result; + return shouldFilterSession(callingUid, result) ? null : result; } @Override @@ -1071,16 +1070,15 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } } - final Computer snapshot = mPm.snapshotComputer(); - result.removeIf(info -> shouldFilterSession(snapshot, callingUid, info)); + result.removeIf(info -> shouldFilterSession(callingUid, info)); return new ParceledListSlice<>(result); } @Override public ParceledListSlice<SessionInfo> getAllSessions(int userId) { final int callingUid = Binder.getCallingUid(); - final Computer snapshot = mPm.snapshotComputer(); - snapshot.enforceCrossUserPermission(callingUid, userId, true, false, "getAllSessions"); + mPm.enforceCrossUserPermission( + callingUid, userId, true, false, "getAllSessions"); final List<SessionInfo> result = new ArrayList<>(); synchronized (mSessions) { @@ -1092,16 +1090,15 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } } - result.removeIf(info -> shouldFilterSession(snapshot, callingUid, info)); + result.removeIf(info -> shouldFilterSession(callingUid, info)); return new ParceledListSlice<>(result); } @Override public ParceledListSlice<SessionInfo> getMySessions(String installerPackageName, int userId) { - final Computer snapshot = mPm.snapshotComputer(); - final int callingUid = Binder.getCallingUid(); - snapshot.enforceCrossUserPermission(callingUid, userId, true, false, "getMySessions"); - mAppOps.checkPackage(callingUid, installerPackageName); + mPm.enforceCrossUserPermission( + Binder.getCallingUid(), userId, true, false, "getMySessions"); + mAppOps.checkPackage(Binder.getCallingUid(), installerPackageName); final List<SessionInfo> result = new ArrayList<>(); synchronized (mSessions) { @@ -1123,9 +1120,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements @Override public void uninstall(VersionedPackage versionedPackage, String callerPackageName, int flags, IntentSender statusReceiver, int userId) { - final Computer snapshot = mPm.snapshotComputer(); final int callingUid = Binder.getCallingUid(); - snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); + mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) { mAppOps.checkPackage(callingUid, callerPackageName); } @@ -1158,7 +1154,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements .setAdmin(callerPackageName) .write(); } else { - ApplicationInfo appInfo = snapshot.getApplicationInfo(callerPackageName, 0, userId); + ApplicationInfo appInfo = mPm.mIPackageManager + .getApplicationInfo(callerPackageName, 0, userId); if (appInfo.targetSdkVersion >= Build.VERSION_CODES.P) { mContext.enforceCallingOrSelfPermission(Manifest.permission.REQUEST_DELETE_PACKAGES, null); @@ -1177,8 +1174,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements String callerPackageName, IntentSender statusReceiver, int userId) { final int callingUid = Binder.getCallingUid(); mContext.enforceCallingOrSelfPermission(Manifest.permission.DELETE_PACKAGES, null); - final Computer snapshot = mPm.snapshotComputer(); - snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); + mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) { mAppOps.checkPackage(callingUid, callerPackageName); } @@ -1210,9 +1206,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements @Override public void registerCallback(IPackageInstallerCallback callback, int userId) { - final Computer snapshot = mPm.snapshotComputer(); - snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, - "registerCallback"); + mPm.enforceCrossUserPermission( + Binder.getCallingUid(), userId, true, false, "registerCallback"); registerCallback(callback, eventUserId -> userId == eventUserId); } @@ -1300,13 +1295,13 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } } - private boolean shouldFilterSession(@NonNull Computer snapshot, int uid, int sessionId) { + private boolean shouldFilterSession(int uid, int sessionId) { final PackageInstallerSession session = getSession(sessionId); if (session == null) { return false; } return uid != session.getInstallerUid() - && !snapshot.canQueryPackage(uid, session.getPackageName()); + && !mPm.canQueryPackage(uid, session.getPackageName()); } static class PackageDeleteObserverAdapter extends PackageDeleteObserver { @@ -1459,12 +1454,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements final int sessionId = msg.arg1; final int userId = msg.arg2; final int n = mCallbacks.beginBroadcast(); - final Computer snapshot = mPm.snapshotComputer(); for (int i = 0; i < n; i++) { final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i); final BroadcastCookie cookie = (BroadcastCookie) mCallbacks.getBroadcastCookie(i); if (cookie.userCheck.test(userId) - && !shouldFilterSession(snapshot, cookie.callingUid, sessionId)) { + && !shouldFilterSession(cookie.callingUid, sessionId)) { try { invokeCallback(callback, msg); } catch (RemoteException ignored) { diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 68be64fdba0d..bcda046c2abe 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -860,8 +860,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { return USER_ACTION_NOT_NEEDED; } - if (snapshot.isInstallDisabledForPackage(getInstallerPackageName(), mInstallerUid, - userId)) { + if (mPm.isInstallDisabledForPackage(getInstallerPackageName(), mInstallerUid, userId)) { // show the installer to account for device poslicy or unknown sources use cases return USER_ACTION_REQUIRED; } @@ -3756,8 +3755,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { }; if (!manualStartAndDestroy) { - final PerUidReadTimeouts[] perUidReadTimeouts = - mPm.getPerUidReadTimeouts(mPm.snapshotComputer()); + final PerUidReadTimeouts[] perUidReadTimeouts = mPm.getPerUidReadTimeouts(); final StorageHealthCheckParams healthCheckParams = new StorageHealthCheckParams(); healthCheckParams.blockedTimeoutMs = INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS; diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java deleted file mode 100644 index 2b733754685e..000000000000 --- a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java +++ /dev/null @@ -1,751 +0,0 @@ -/* - * 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 com.android.server.pm; - -import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; -import static android.content.pm.PackageManager.RESTRICTION_NONE; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.UserIdInt; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; -import android.content.pm.AuxiliaryResolveInfo; -import android.content.pm.Checksum; -import android.content.pm.IOnChecksumsReadyListener; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; -import android.content.pm.ProcessInfo; -import android.content.pm.ProviderInfo; -import android.content.pm.ResolveInfo; -import android.content.pm.SuspendDialogInfo; -import android.os.Binder; -import android.os.Build; -import android.os.Bundle; -import android.os.Handler; -import android.os.Process; -import android.os.storage.StorageManager; -import android.util.ArrayMap; -import android.util.ArraySet; -import android.util.SparseArray; - -import com.android.server.pm.dex.DexManager; -import com.android.server.pm.dex.DynamicCodeLogger; -import com.android.server.pm.parsing.pkg.AndroidPackage; -import com.android.server.pm.permission.PermissionManagerServiceInternal; -import com.android.server.pm.pkg.AndroidPackageApi; -import com.android.server.pm.pkg.PackageStateInternal; -import com.android.server.pm.pkg.PackageStateUtils; -import com.android.server.pm.pkg.SharedUserApi; -import com.android.server.pm.pkg.component.ParsedMainComponent; -import com.android.server.pm.pkg.mutate.PackageStateMutator; - -import java.io.IOException; -import java.util.List; -import java.util.concurrent.Executor; -import java.util.function.Consumer; - -/** - * Internal manager variant of {@link IPackageManagerBase}. See that class for info. - * {@link PackageManagerInternal} should eventually passing in a snapshot instance, deprecating - * this class, but that requires much larger refactor. - */ -abstract class PackageManagerInternalBase extends PackageManagerInternal { - - @NonNull - private final PackageManagerService mService; - - public PackageManagerInternalBase(@NonNull PackageManagerService service) { - mService = service; - } - - @NonNull protected abstract Context getContext(); - @NonNull protected abstract PermissionManagerServiceInternal getPermissionManager(); - @NonNull protected abstract AppDataHelper getAppDataHelper(); - @NonNull protected abstract PackageObserverHelper getPackageObserverHelper(); - @NonNull protected abstract ResolveIntentHelper getResolveIntentHelper(); - @NonNull protected abstract SuspendPackageHelper getSuspendPackageHelper(); - @NonNull protected abstract ProtectedPackages getProtectedPackages(); - @NonNull protected abstract UserNeedsBadgingCache getUserNeedsBadging(); - @NonNull protected abstract InstantAppRegistry getInstantAppRegistry(); - @NonNull protected abstract ApexManager getApexManager(); - @NonNull protected abstract DexManager getDexManager(); - - @Override - public final Computer snapshot() { - return mService.snapshotComputer(); - } - - @Override - @Deprecated - public final List<ApplicationInfo> getInstalledApplications( - @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) { - return snapshot().getInstalledApplications(flags, userId, callingUid); - } - - @Override - @Deprecated - public final boolean isInstantApp(String packageName, int userId) { - return snapshot().isInstantApp(packageName, userId); - } - - @Override - @Deprecated - public final String getInstantAppPackageName(int uid) { - return snapshot().getInstantAppPackageName(uid); - } - - @Override - @Deprecated - public final boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { - return snapshot().filterAppAccess(pkg, callingUid, userId); - } - - @Override - @Deprecated - public final boolean filterAppAccess(String packageName, int callingUid, int userId) { - return snapshot().filterAppAccess(packageName, callingUid, userId); - } - - @Override - @Deprecated - public final boolean filterAppAccess(int uid, int callingUid) { - return snapshot().filterAppAccess(uid, callingUid); - } - - @Nullable - @Override - @Deprecated - public final int[] getVisibilityAllowList(@NonNull String packageName, int userId) { - return snapshot().getVisibilityAllowList(packageName, userId); - } - - @Override - @Deprecated - public final boolean canQueryPackage(int callingUid, @Nullable String packageName) { - return snapshot().canQueryPackage(callingUid, packageName); - } - - @Override - @Deprecated - public final AndroidPackage getPackage(String packageName) { - return snapshot().getPackage(packageName); - } - - @Nullable - @Override - @Deprecated - public final AndroidPackageApi getAndroidPackage(@NonNull String packageName) { - return snapshot().getPackage(packageName); - } - - @Override - @Deprecated - public final AndroidPackage getPackage(int uid) { - return snapshot().getPackage(uid); - } - - @Override - @Deprecated - public final List<AndroidPackage> getPackagesForAppId(int appId) { - return snapshot().getPackagesForAppId(appId); - } - - @Nullable - @Override - @Deprecated - public final PackageStateInternal getPackageStateInternal(String packageName) { - return snapshot().getPackageStateInternal(packageName); - } - - @NonNull - @Override - @Deprecated - public final ArrayMap<String, ? extends PackageStateInternal> getPackageStates() { - return snapshot().getPackageStates(); - } - - @Override - @Deprecated - public final void removePackageListObserver(PackageListObserver observer) { - getPackageObserverHelper().removeObserver(observer); - } - - @Override - @Deprecated - public final PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) { - return snapshot().getDisabledSystemPackage(packageName); - } - - @Override - @Deprecated - public final @NonNull String[] getKnownPackageNames(int knownPackage, int userId) { - return mService.getKnownPackageNamesInternal(snapshot(), knownPackage, userId); - } - - @Override - @Deprecated - public final void setKeepUninstalledPackages(final List<String> packageList) { - mService.setKeepUninstalledPackagesInternal(snapshot(), packageList); - } - - @Override - @Deprecated - public final boolean isPermissionsReviewRequired(String packageName, int userId) { - return getPermissionManager().isPermissionsReviewRequired(packageName, userId); - } - - @Override - @Deprecated - public final PackageInfo getPackageInfo(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int filterCallingUid, int userId) { - return snapshot().getPackageInfoInternal(packageName, - PackageManager.VERSION_CODE_HIGHEST, flags, filterCallingUid, userId); - } - - @Override - @Deprecated - public final Bundle getSuspendedPackageLauncherExtras(String packageName, int userId) { - return getSuspendPackageHelper().getSuspendedPackageLauncherExtras(snapshot(), packageName, - userId, Binder.getCallingUid()); - } - - @Override - @Deprecated - public final boolean isPackageSuspended(String packageName, int userId) { - return getSuspendPackageHelper().isPackageSuspended(snapshot(), packageName, userId, - Binder.getCallingUid()); - } - - @Override - @Deprecated - public final void removeNonSystemPackageSuspensions(String packageName, int userId) { - getSuspendPackageHelper().removeSuspensionsBySuspendingPackage(snapshot(), - new String[]{packageName}, - (suspendingPackage) -> !PackageManagerService.PLATFORM_PACKAGE_NAME.equals( - suspendingPackage), - userId); - } - - @Override - @Deprecated - public final void removeDistractingPackageRestrictions(String packageName, int userId) { - mService.removeDistractingPackageRestrictions(snapshot(), new String[]{packageName}, - userId); - } - - @Override - @Deprecated - public final void removeAllDistractingPackageRestrictions(int userId) { - mService.removeAllDistractingPackageRestrictions(snapshot(), userId); - } - - @Override - @Deprecated - public final String getSuspendingPackage(String suspendedPackage, int userId) { - return getSuspendPackageHelper().getSuspendingPackage(snapshot(), suspendedPackage, userId, - Binder.getCallingUid()); - } - - @Override - @Deprecated - public final SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage, - String suspendingPackage, int userId) { - return getSuspendPackageHelper().getSuspendedDialogInfo(snapshot(), suspendedPackage, - suspendingPackage, userId, Binder.getCallingUid()); - } - - @Override - @Deprecated - public final int getDistractingPackageRestrictions(String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - return (packageState == null) ? RESTRICTION_NONE - : packageState.getUserStateOrDefault(userId).getDistractionFlags(); - } - - @Override - @Deprecated - public final int getPackageUid(String packageName, - @PackageManager.PackageInfoFlagsBits long flags, int userId) { - return snapshot().getPackageUidInternal(packageName, flags, userId, Process.SYSTEM_UID); - } - - @Override - @Deprecated - public final ApplicationInfo getApplicationInfo(String packageName, - @PackageManager.ApplicationInfoFlagsBits long flags, int filterCallingUid, int userId) { - return snapshot().getApplicationInfoInternal(packageName, flags, filterCallingUid, userId); - } - - @Override - @Deprecated - public final ActivityInfo getActivityInfo(ComponentName component, - @PackageManager.ComponentInfoFlagsBits long flags, int filterCallingUid, int userId) { - return snapshot().getActivityInfoInternal(component, flags, filterCallingUid, userId); - } - - @Override - @Deprecated - public final List<ResolveInfo> queryIntentActivities( - Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - int filterCallingUid, int userId) { - return snapshot().queryIntentActivitiesInternal(intent, resolvedType, flags, userId); - } - - @Override - @Deprecated - public final List<ResolveInfo> queryIntentReceivers(Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - int filterCallingUid, int userId) { - return getResolveIntentHelper().queryIntentReceiversInternal( - snapshot(), intent, resolvedType, flags, userId, filterCallingUid); - } - - @Override - @Deprecated - public final List<ResolveInfo> queryIntentServices( - Intent intent, @PackageManager.ResolveInfoFlagsBits long flags, int callingUid, - int userId) { - final String resolvedType = intent.resolveTypeIfNeeded(getContext().getContentResolver()); - return snapshot().queryIntentServicesInternal(intent, resolvedType, flags, userId, - callingUid, false); - } - - @Override - @Deprecated - public final ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates, - int userId) { - return snapshot().getHomeActivitiesAsUser(allHomeCandidates, userId); - } - - @Override - @Deprecated - public final ComponentName getDefaultHomeActivity(int userId) { - return snapshot().getDefaultHomeActivity(userId); - } - - @Override - @Deprecated - public final ComponentName getSystemUiServiceComponent() { - return ComponentName.unflattenFromString(getContext().getResources().getString( - com.android.internal.R.string.config_systemUIServiceComponent)); - } - - @Override - @Deprecated - public final void setDeviceOwnerProtectedPackages( - String deviceOwnerPackageName, List<String> packageNames) { - getProtectedPackages().setDeviceOwnerProtectedPackages( - deviceOwnerPackageName, packageNames); - } - - @Override - @Deprecated - public final boolean isPackageDataProtected(int userId, String packageName) { - return getProtectedPackages().isPackageDataProtected(userId, packageName); - } - - @Override - @Deprecated - public final boolean isPackageStateProtected(String packageName, int userId) { - return getProtectedPackages().isPackageStateProtected(userId, packageName); - } - - @Override - @Deprecated - public final boolean isPackageEphemeral(int userId, String packageName) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - return packageState != null - && packageState.getUserStateOrDefault(userId).isInstantApp(); - } - - @Override - @Deprecated - public final boolean wasPackageEverLaunched(String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState == null) { - throw new IllegalArgumentException("Unknown package: " + packageName); - } - return !packageState.getUserStateOrDefault(userId).isNotLaunched(); - } - - @Override - @Deprecated - public final boolean isEnabledAndMatches(ParsedMainComponent component, long flags, int userId) { - return PackageStateUtils.isEnabledAndMatches( - getPackageStateInternal(component.getPackageName()), component, flags, userId); - } - - @Override - @Deprecated - public final boolean userNeedsBadging(int userId) { - return getUserNeedsBadging().get(userId); - } - - @Override - @Deprecated - public final String getNameForUid(int uid) { - return snapshot().getNameForUid(uid); - } - - @Override - @Deprecated - public final void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj, - Intent origIntent, String resolvedType, String callingPackage, - @Nullable String callingFeatureId, boolean isRequesterInstantApp, - Bundle verificationBundle, int userId) { - mService.requestInstantAppResolutionPhaseTwo(responseObj, origIntent, - resolvedType, callingPackage, callingFeatureId, isRequesterInstantApp, - verificationBundle, userId); - } - - @Override - @Deprecated - public final void grantImplicitAccess(int userId, Intent intent, - int recipientAppId, int visibleUid, boolean direct) { - grantImplicitAccess(userId, intent, recipientAppId, visibleUid, direct, - false /* retainOnUpdate */); - } - - @Override - @Deprecated - public final void grantImplicitAccess(int userId, Intent intent, - int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) { - mService.grantImplicitAccess(snapshot(), userId, intent, - recipientAppId, visibleUid, direct, retainOnUpdate); - } - - @Override - @Deprecated - public final boolean isInstantAppInstallerComponent(ComponentName component) { - final ActivityInfo instantAppInstallerActivity = mService.mInstantAppInstallerActivity; - return instantAppInstallerActivity != null - && instantAppInstallerActivity.getComponentName().equals(component); - } - - @Override - @Deprecated - public final void pruneInstantApps() { - getInstantAppRegistry().pruneInstantApps(snapshot()); - } - - @Override - @Deprecated - public final String getSetupWizardPackageName() { - return mService.mSetupWizardPackage; - } - - @Override - @Deprecated - public final ResolveInfo resolveIntent(Intent intent, String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, - @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int userId, - boolean resolveForStart, int filterCallingUid) { - return getResolveIntentHelper().resolveIntentInternal(snapshot(), - intent, resolvedType, flags, privateResolveFlags, userId, resolveForStart, - filterCallingUid); - } - - @Override - @Deprecated - public final ResolveInfo resolveService(Intent intent, String resolvedType, - @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) { - return getResolveIntentHelper().resolveServiceInternal(snapshot(), intent, - resolvedType, flags, userId, callingUid); - } - - @Override - @Deprecated - public final ProviderInfo resolveContentProvider(String name, - @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) { - return snapshot().resolveContentProvider(name, flags, userId,callingUid); - } - - @Override - @Deprecated - public final int getUidTargetSdkVersion(int uid) { - return snapshot().getUidTargetSdkVersion(uid); - } - - @Override - @Deprecated - public final int getPackageTargetSdkVersion(String packageName) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState != null && packageState.getPkg() != null) { - return packageState.getPkg().getTargetSdkVersion(); - } - return Build.VERSION_CODES.CUR_DEVELOPMENT; - } - - @Override - @Deprecated - public final boolean canAccessInstantApps(int callingUid, @UserIdInt int userId) { - return snapshot().canViewInstantApps(callingUid, userId); - } - - @Override - @Deprecated - public final boolean canAccessComponent(int callingUid, @NonNull ComponentName component, - @UserIdInt int userId) { - return snapshot().canAccessComponent(callingUid, component, userId); - } - - @Override - @Deprecated - public final boolean hasInstantApplicationMetadata(String packageName, int userId) { - return getInstantAppRegistry().hasInstantApplicationMetadata(packageName, userId); - } - - @Override - @Deprecated - public final SparseArray<String> getAppsWithSharedUserIds() { - return snapshot().getAppsWithSharedUserIds(); - } - - @Override - @NonNull - @Deprecated - public final String[] getSharedUserPackagesForPackage(String packageName, int userId) { - return snapshot().getSharedUserPackagesForPackage(packageName, userId); - } - - @Override - @Deprecated - public final ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) { - return snapshot().getProcessesForUid(uid); - } - - @Override - @Deprecated - public final int[] getPermissionGids(String permissionName, int userId) { - return getPermissionManager().getPermissionGids(permissionName, userId); - } - - @Override - @Deprecated - public final boolean isOnlyCoreApps() { - return mService.isOnlyCoreApps(); - } - - @Override - @Deprecated - public final void freeStorage(String volumeUuid, long bytes, - @StorageManager.AllocateFlags int flags) throws IOException { - mService.freeStorage(volumeUuid, bytes, flags); - } - - @Override - @Deprecated - public final void freeAllAppCacheAboveQuota(@NonNull String volumeUuid) throws IOException { - mService.freeAllAppCacheAboveQuota(volumeUuid); - } - - @Override - @Deprecated - public final void forEachPackageSetting(Consumer<PackageSetting> actionLocked) { - mService.forEachPackageSetting(actionLocked); - } - - @Override - @Deprecated - public final void forEachPackageState(Consumer<PackageStateInternal> action) { - mService.forEachPackageState(snapshot(), action); - } - - @Override - @Deprecated - public final void forEachPackage(Consumer<AndroidPackage> action) { - mService.forEachPackage(snapshot(), action); - } - - @Override - @Deprecated - public final void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action, - @UserIdInt int userId) { - mService.forEachInstalledPackage(snapshot(), action, userId); - } - - @Override - @Deprecated - public final ArraySet<String> getEnabledComponents(String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState == null) { - return new ArraySet<>(); - } - return packageState.getUserStateOrDefault(userId).getEnabledComponents(); - } - - @Override - @Deprecated - public final ArraySet<String> getDisabledComponents(String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState == null) { - return new ArraySet<>(); - } - return packageState.getUserStateOrDefault(userId).getDisabledComponents(); - } - - @Override - @Deprecated - public final @PackageManager.EnabledState int getApplicationEnabledState( - String packageName, int userId) { - final PackageStateInternal packageState = getPackageStateInternal(packageName); - if (packageState == null) { - return COMPONENT_ENABLED_STATE_DEFAULT; - } - return packageState.getUserStateOrDefault(userId).getEnabledState(); - } - - @Override - @Deprecated - public final @PackageManager.EnabledState int getComponentEnabledSetting( - @NonNull ComponentName componentName, int callingUid, int userId) { - return snapshot().getComponentEnabledSettingInternal( - componentName, callingUid, userId); - } - - @Override - @Deprecated - public final void setEnableRollbackCode(int token, int enableRollbackCode) { - mService.setEnableRollbackCode(token, enableRollbackCode); - } - - @Override - @Deprecated - public final void finishPackageInstall(int token, boolean didLaunch) { - mService.finishPackageInstall(token, didLaunch); - } - - @Override - @Deprecated - public final boolean isApexPackage(String packageName) { - return getApexManager().isApexPackage(packageName); - } - - @Override - @Deprecated - public final List<String> getApksInApex(String apexPackageName) { - return getApexManager().getApksInApex(apexPackageName); - } - - @Override - @Deprecated - public final boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) { - return snapshot().isCallerInstallerOfRecord(pkg, callingUid); - } - - @Override - @Deprecated - public final List<String> getMimeGroup(String packageName, String mimeGroup) { - return mService.getMimeGroupInternal(snapshot(), packageName, mimeGroup); - } - - @Override - @Deprecated - public final boolean isSystemPackage(@NonNull String packageName) { - return packageName.equals(mService.ensureSystemPackageName(snapshot(), packageName)); - } - - @Override - @Deprecated - public final void unsuspendForSuspendingPackage(final String packageName, int affectedUser) { - mService.unsuspendForSuspendingPackage(snapshot(), packageName, affectedUser); - } - - @Override - @Deprecated - public final boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { - return snapshot().isSuspendingAnyPackages(suspendingPackage, userId); - } - - @Override - @Deprecated - public final void requestChecksums(@NonNull String packageName, boolean includeSplits, - @Checksum.TypeMask int optional, @Checksum.TypeMask int required, - @Nullable List trustedInstallers, - @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId, - @NonNull Executor executor, @NonNull Handler handler) { - mService.requestChecksumsInternal(snapshot(), packageName, includeSplits, optional, - required, trustedInstallers, onChecksumsReadyListener, userId, executor, - handler); - } - - @Override - @Deprecated - public final boolean isPackageFrozen(@NonNull String packageName, - int callingUid, int userId) { - return snapshot().getPackageStartability(mService.getSafeMode(), packageName, callingUid, userId) - == PackageManagerService.PACKAGE_STARTABILITY_FROZEN; - } - - @Override - @Deprecated - public final long deleteOatArtifactsOfPackage(String packageName) { - return mService.deleteOatArtifactsOfPackage(snapshot(), packageName); - } - - @Override - @Deprecated - public final void reconcileAppsData(int userId, @StorageManager.StorageFlags int flags, - boolean migrateAppsData) { - getAppDataHelper().reconcileAppsData(userId, flags, migrateAppsData); - } - - @Override - @NonNull - public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) { - return snapshot().getSharedUserPackages(sharedUserAppId); - } - - @Override - @Nullable - public SharedUserApi getSharedUserApi(int sharedUserAppId) { - return snapshot().getSharedUser(sharedUserAppId); - } - - @NonNull - @Override - @Deprecated - public final PackageStateMutator.InitialState recordInitialState() { - return mService.recordInitialState(); - } - - @Nullable - @Override - @Deprecated - public final PackageStateMutator.Result commitPackageStateMutation( - @Nullable PackageStateMutator.InitialState state, - @NonNull Consumer<PackageStateMutator> consumer) { - return mService.commitPackageStateMutation(state, consumer); - } - - @Override - @Deprecated - public final void shutdown() { - mService.shutdown(); - } - - @Override - @Deprecated - public final DynamicCodeLogger getDynamicCodeLogger() { - return getDexManager().getDynamicCodeLogger(); - } -} diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 99c9c689544d..e20a861e2eae 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -29,6 +29,7 @@ import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.content.pm.PackageManager.RESTRICTION_NONE; import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.os.storage.StorageManager.FLAG_STORAGE_CE; import static android.os.storage.StorageManager.FLAG_STORAGE_DE; @@ -82,15 +83,21 @@ import android.content.pm.IDexModuleRegisterCallback; import android.content.pm.IOnChecksumsReadyListener; import android.content.pm.IPackageChangeObserver; import android.content.pm.IPackageDataObserver; +import android.content.pm.IPackageDeleteObserver; import android.content.pm.IPackageDeleteObserver2; import android.content.pm.IPackageInstallObserver2; +import android.content.pm.IPackageInstaller; import android.content.pm.IPackageLoadingProgressCallback; import android.content.pm.IPackageManager; import android.content.pm.IPackageMoveObserver; +import android.content.pm.IPackageStatsObserver; import android.content.pm.IncrementalStatesInfo; import android.content.pm.InstallSourceInfo; import android.content.pm.InstantAppInfo; import android.content.pm.InstantAppRequest; +import android.content.pm.InstrumentationInfo; +import android.content.pm.IntentFilterVerificationInfo; +import android.content.pm.KeySet; import android.content.pm.ModuleInfo; import android.content.pm.PackageChangeEvent; import android.content.pm.PackageInfo; @@ -102,8 +109,11 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.PackagePartitions; import android.content.pm.ParceledListSlice; import android.content.pm.PermissionGroupInfo; +import android.content.pm.PermissionInfo; +import android.content.pm.ProcessInfo; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; import android.content.pm.SharedLibraryInfo; import android.content.pm.Signature; import android.content.pm.SigningDetails; @@ -112,6 +122,7 @@ import android.content.pm.TestUtilityService; import android.content.pm.UserInfo; import android.content.pm.VerifierDeviceIdentity; import android.content.pm.VersionedPackage; +import android.content.pm.dex.IArtManager; import android.content.pm.overlay.OverlayPaths; import android.content.pm.parsing.PackageLite; import android.content.res.Resources; @@ -202,6 +213,7 @@ import com.android.server.pm.Settings.VersionInfo; import com.android.server.pm.dex.ArtManagerService; import com.android.server.pm.dex.ArtUtils; import com.android.server.pm.dex.DexManager; +import com.android.server.pm.dex.DynamicCodeLogger; import com.android.server.pm.dex.ViewCompiler; import com.android.server.pm.parsing.PackageCacher; import com.android.server.pm.parsing.PackageInfoUtils; @@ -213,7 +225,10 @@ import com.android.server.pm.permission.LegacyPermissionManagerInternal; import com.android.server.pm.permission.LegacyPermissionManagerService; import com.android.server.pm.permission.PermissionManagerService; import com.android.server.pm.permission.PermissionManagerServiceInternal; +import com.android.server.pm.pkg.AndroidPackageApi; +import com.android.server.pm.pkg.PackageState; import com.android.server.pm.pkg.PackageStateInternal; +import com.android.server.pm.pkg.PackageStateUtils; import com.android.server.pm.pkg.PackageUserState; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.SharedUserApi; @@ -398,8 +413,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService public @interface ScanFlags {} /** - * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, - * int)}. + * Used as the result code of the {@link #getPackageStartability}. */ @IntDef(value = { PACKAGE_STARTABILITY_OK, @@ -412,43 +426,40 @@ public class PackageManagerService implements PackageSender, TestUtilityService public @interface PackageStartability {} /** - * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, - * int)} to indicate the given package is allowed to start. + * Used as the result code of the {@link #getPackageStartability} to indicate + * the given package is allowed to start. */ public static final int PACKAGE_STARTABILITY_OK = 0; /** - * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, - * int)} to indicate the given package is <b>not</b> allowed to start because it's not found + * Used as the result code of the {@link #getPackageStartability} to indicate + * the given package is <b>not</b> allowed to start because it's not found * (could be due to that package is invisible to the given user). */ public static final int PACKAGE_STARTABILITY_NOT_FOUND = 1; /** - * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, - * int)} to indicate the given package is <b>not</b> allowed to start because it's not a system - * app and the system is running in safe mode. + * Used as the result code of the {@link #getPackageStartability} to indicate + * the given package is <b>not</b> allowed to start because it's not a system app + * and the system is running in safe mode. */ public static final int PACKAGE_STARTABILITY_NOT_SYSTEM = 2; /** - * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, - * int)} to indicate the given package is <b>not</b> allowed to start because it's currently - * frozen. + * Used as the result code of the {@link #getPackageStartability} to indicate + * the given package is <b>not</b> allowed to start because it's currently frozen. */ public static final int PACKAGE_STARTABILITY_FROZEN = 3; /** - * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int, - * int)} to indicate the given package is <b>not</b> allowed to start because it doesn't support + * Used as the result code of the {@link #getPackageStartability} to indicate + * the given package is <b>not</b> allowed to start because it doesn't support * direct boot. */ public static final int PACKAGE_STARTABILITY_DIRECT_BOOT_UNSUPPORTED = 4; private static final String STATIC_SHARED_LIB_DELIMITER = "_"; - /** - * Extension of the compressed packages - */ + /** Extension of the compressed packages */ public final static String COMPRESSED_EXTENSION = ".gz"; /** Suffix of stub packages on the system partition */ public final static String STUB_SUFFIX = "-Stub"; @@ -633,6 +644,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService */ boolean mPromoteSystemApps; + // TODO: Make IPackageManager reference private to hide discouraged APIs + final IPackageManagerImpl mIPackageManager; + private final PackageManagerInternal mPmInternal; private final TestUtilityService mTestUtilityService; @Watched @@ -1043,6 +1057,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService // A lock-free cache for frequently called functions. private volatile Computer mSnapshotComputer; + // A trampoline that directs callers to either the live or snapshot computer. + final ComputerTracker mComputer = new ComputerTracker(this); + // If true, the snapshot is invalid (stale). The attribute is static since it may be // set from outside classes. The attribute may be set to true anywhere, although it // should only be set true while holding mLock. However, the attribute id guaranteed @@ -1071,8 +1088,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService * Return the cached computer. The method will rebuild the cached computer if necessary. * The live computer will be returned if snapshots are disabled. */ - @VisibleForTesting(visibility = Visibility.PACKAGE) - @NonNull public Computer snapshotComputer() { if (Thread.holdsLock(mLock)) { // If the current thread holds mLock then it may have modified state but not @@ -1232,15 +1247,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService ApkChecksums.Injector injector = new ApkChecksums.Injector( () -> mContext, () -> handler, - mInjector::getIncrementalManager, - () -> mInjector.getLocalService(PackageManagerInternal.class)); + () -> mInjector.getIncrementalManager(), + () -> mPmInternal); ApkChecksums.getChecksums(filesToChecksum, optional, required, installerPackageName, trustedCerts, onChecksumsReadyListener, injector); }); } - void requestChecksumsInternal(@NonNull Computer snapshot, @NonNull String packageName, - boolean includeSplits, @Checksum.TypeMask int optional, @Checksum.TypeMask int required, + private void requestChecksumsInternal(@NonNull String packageName, boolean includeSplits, + @Checksum.TypeMask int optional, @Checksum.TypeMask int required, @Nullable List trustedInstallers, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId, @NonNull Executor executor, @NonNull Handler handler) { @@ -1249,12 +1264,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService Objects.requireNonNull(executor); Objects.requireNonNull(handler); - final ApplicationInfo applicationInfo = snapshot.getApplicationInfoInternal(packageName, 0, + final ApplicationInfo applicationInfo = getApplicationInfoInternal(packageName, 0, Binder.getCallingUid(), userId); if (applicationInfo == null) { throw new ParcelableException(new PackageManager.NameNotFoundException(packageName)); } - final InstallSourceInfo installSourceInfo = snapshot.getInstallSourceInfo(packageName); + final InstallSourceInfo installSourceInfo = + mIPackageManager.getInstallSourceInfo(packageName); final String installerPackageName = installSourceInfo != null ? installSourceInfo.getInitiatingPackageName() : null; @@ -1278,8 +1294,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService ApkChecksums.Injector injector = new ApkChecksums.Injector( () -> mContext, () -> handler, - mInjector::getIncrementalManager, - () -> mInjector.getLocalService(PackageManagerInternal.class)); + () -> mInjector.getIncrementalManager(), + () -> mPmInternal); ApkChecksums.getChecksums(filesToChecksum, optional, required, installerPackageName, trustedCerts, onChecksumsReadyListener, injector); }); @@ -1424,15 +1440,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService RuntimePermissionsPersistence.createInstance(), i.getPermissionManagerServiceInternal(), domainVerificationService, lock), - (i, pm) -> AppsFilter.create(i, i.getLocalService(PackageManagerInternal.class)), + (i, pm) -> AppsFilter.create(pm.mPmInternal, i), (i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"), (i, pm) -> SystemConfig.getInstance(), (i, pm) -> new PackageDexOptimizer(i.getInstaller(), i.getInstallLock(), i.getContext(), "*dexopt*"), - (i, pm) -> new DexManager(i.getContext(), i.getPackageDexOptimizer(), + (i, pm) -> new DexManager(i.getContext(), pm.mIPackageManager, + i.getPackageDexOptimizer(), i.getInstaller(), i.getInstallLock()), + (i, pm) -> new ArtManagerService(i.getContext(), pm.mIPackageManager, i.getInstaller(), i.getInstallLock()), - (i, pm) -> new ArtManagerService(i.getContext(), i.getInstaller(), - i.getInstallLock()), (i, pm) -> ApexManager.getInstance(), (i, pm) -> new ViewCompiler(i.getInstallLock(), i.getInstaller()), (i, pm) -> (IncrementalManager) @@ -1454,7 +1470,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService i.getContext(), pm, i::getScanningPackageParser), (i, pm, cn) -> new InstantAppResolverConnection( i.getContext(), cn, Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE), - (i, pm) -> new ModuleInfoProvider(i.getContext()), + (i, pm) -> new ModuleInfoProvider(i.getContext(), pm.mIPackageManager), (i, pm) -> LegacyPermissionManagerService.create(i.getContext()), (i, pm) -> domainVerificationService, (i, pm) -> { @@ -1482,15 +1498,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService final CompatChange.ChangeListener selinuxChangeListener = packageName -> { synchronized (m.mInstallLock) { - final Computer snapshot = m.snapshotComputer(); - final PackageStateInternal packageState = - snapshot.getPackageStateInternal(packageName); + final PackageStateInternal packageState = m.getPackageStateInternal(packageName); if (packageState == null) { Slog.e(TAG, "Failed to find package setting " + packageName); return; } AndroidPackage pkg = packageState.getPkg(); - SharedUserApi sharedUser = snapshot.getSharedUser( + SharedUserApi sharedUser = m.mComputer.getSharedUser( packageState.getSharedUserAppId()); String oldSeInfo = AndroidPackageUtils.getSeInfo(pkg, packageState); @@ -1517,12 +1531,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService selinuxChangeListener); m.installAllowlistedSystemPackages(); - IPackageManagerImpl iPackageManager = m.new IPackageManagerImpl(); - ServiceManager.addService("package", iPackageManager); + ServiceManager.addService("package", m.mIPackageManager); final PackageManagerNative pmn = new PackageManagerNative(m); ServiceManager.addService("package_native", pmn); LocalManagerRegistry.addManager(PackageManagerLocal.class, m.new PackageManagerLocalImpl()); - return Pair.create(m, iPackageManager); + return Pair.create(m, m.mIPackageManager); } /** Install/uninstall system packages for all users based on their user-type, as applicable. */ @@ -1628,6 +1641,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPackageDexOptimizer = testParams.packageDexOptimizer; mPackageParserCallback = testParams.packageParserCallback; mPendingBroadcasts = testParams.pendingPackageBroadcasts; + mIPackageManager = new IPackageManagerImpl(); + mPmInternal = testParams.pmInternal; mTestUtilityService = testParams.testUtilityService; mProcessLoggingHandler = testParams.processLoggingHandler; mProtectedPackages = testParams.protectedPackages; @@ -1688,6 +1703,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService public PackageManagerService(PackageManagerServiceInjector injector, boolean onlyCore, boolean factoryTest, final String buildFingerprint, final boolean isEngBuild, final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion) { + mIPackageManager = new IPackageManagerImpl(); mIsEngBuild = isEngBuild; mIsUserDebugBuild = isUserDebugBuild; mSdkVersion = sdkVersion; @@ -1718,9 +1734,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService t.traceBegin("createSubComponents"); // Expose private service for system components to use. - LocalServices.addService(PackageManagerInternal.class, new PackageManagerInternalImpl()); + mPmInternal = new PackageManagerInternalImpl(); LocalServices.addService(TestUtilityService.class, this); mTestUtilityService = LocalServices.getService(TestUtilityService.class); + LocalServices.addService(PackageManagerInternal.class, mPmInternal); mUserManager = injector.getUserManagerService(); mUserNeedsBadging = new UserNeedsBadgingCache(mUserManager); mComponentResolver = injector.getComponentResolver(); @@ -1738,7 +1755,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public boolean hasFeature(String feature) { - return PackageManagerService.this.hasSystemFeature(feature, 0); + return PackageManagerService.this.mIPackageManager.hasSystemFeature(feature, 0); } }; @@ -1868,10 +1885,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int dependencyCount = entry.dependencies.length; for (int j = 0; j < dependencyCount; j++) { final SharedLibraryInfo dependency = - computer.getSharedLibraryInfo(entry.dependencies[j], undefinedVersion); + getSharedLibraryInfo(entry.dependencies[j], undefinedVersion); if (dependency != null) { - computer.getSharedLibraryInfo(name, undefinedVersion) - .addDependency(dependency); + getSharedLibraryInfo(name, undefinedVersion).addDependency(dependency); } } } @@ -1883,7 +1899,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService t.traceEnd(); t.traceBegin("read user settings"); - mFirstBoot = !mSettings.readLPw(computer, + mFirstBoot = !mSettings.readLPw(mLiveComputer, mInjector.getUserManagerInternal().getUsers( /* excludePartial= */ true, /* excludeDying= */ false, @@ -1964,26 +1980,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService // Resolve protected action filters. Only the setup wizard is allowed to // have a high priority filter for these actions. mSetupWizardPackage = getSetupWizardPackageNameImpl(computer); - mComponentResolver.fixProtectedFilterPriorities(mSetupWizardPackage); - - mDefaultTextClassifierPackage = ensureSystemPackageName(computer, - mContext.getString(R.string.config_servicesExtensionPackage)); - mSystemTextClassifierPackageName = ensureSystemPackageName(computer, - mContext.getString(R.string.config_defaultTextClassifierPackage)); - mConfiguratorPackage = ensureSystemPackageName(computer, - mContext.getString(R.string.config_deviceConfiguratorPackageName)); - mAppPredictionServicePackage = ensureSystemPackageName(computer, - getPackageFromComponentString(R.string.config_defaultAppPredictionService)); - mIncidentReportApproverPackage = ensureSystemPackageName(computer, - mContext.getString(R.string.config_incidentReportApproverPackage)); + mComponentResolver.fixProtectedFilterPriorities(mPmInternal.getSetupWizardPackageName()); + + mDefaultTextClassifierPackage = mIPackageManager.getDefaultTextClassifierPackageName(); + mSystemTextClassifierPackageName = + mIPackageManager.getSystemTextClassifierPackageName(); + mConfiguratorPackage = getDeviceConfiguratorPackageName(); + mAppPredictionServicePackage = mIPackageManager.getAppPredictionServicePackageName(); + mIncidentReportApproverPackage = + mIPackageManager.getIncidentReportApproverPackageName(); mRetailDemoPackage = getRetailDemoPackageName(); - mOverlayConfigSignaturePackage = ensureSystemPackageName(computer, - mInjector.getSystemConfig().getOverlayConfigSignaturePackage()); - mRecentsPackage = ensureSystemPackageName(computer, - getPackageFromComponentString(R.string.config_recentsComponentName)); - mAmbientContextDetectionPackage = ensureSystemPackageName(computer, - getPackageFromComponentString( - R.string.config_defaultAmbientContextDetectionService)); + mOverlayConfigSignaturePackage = getOverlayConfigSignaturePackageName(); + mRecentsPackage = getRecentsPackageName(); + mAmbientContextDetectionPackage = getAmbientContextDetectionPackageName(); // Now that we know all of the shared libraries, update all clients to have // the correct library paths. @@ -2117,8 +2126,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mDomainVerificationManager.setProxy(domainVerificationProxy); - mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr(computer); - mSharedSystemSharedLibraryPackageName = getRequiredSharedLibrary(computer, + mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr(); + mSharedSystemSharedLibraryPackageName = getRequiredSharedLibrary( PackageManager.SYSTEM_SHARED_LIBRARY_SHARED, SharedLibraryInfo.VERSION_UNDEFINED); } else { @@ -2134,11 +2143,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService mRequiredPermissionControllerPackage = getRequiredPermissionControllerLPr(computer); mSettings.setPermissionControllerVersion( - computer.getPackageInfo(mRequiredPermissionControllerPackage, 0, + mIPackageManager.getPackageInfo(mRequiredPermissionControllerPackage, 0, UserHandle.USER_SYSTEM).getLongVersionCode()); // Resolve the sdk sandbox package - mRequiredSdkSandboxPackage = getRequiredSdkSandboxPackageName(computer); + mRequiredSdkSandboxPackage = getRequiredSdkSandboxPackageName(); // Initialize InstantAppRegistry's Instant App list for all users. for (AndroidPackage pkg : mPackages.values()) { @@ -2146,8 +2155,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService continue; } for (int userId : userIds) { - final PackageStateInternal ps = - computer.getPackageStateInternal(pkg.getPackageName()); + final PackageStateInternal ps = getPackageStateInternal(pkg.getPackageName()); if (ps == null || !ps.getUserStateOrDefault(userId).isInstantApp() || !ps.getUserStateOrDefault(userId).isInstalled()) { continue; @@ -2157,7 +2165,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } mInstallerService = mInjector.getPackageInstallerService(); - final ComponentName instantAppResolverComponent = getInstantAppResolver(computer); + final ComponentName instantAppResolverComponent = getInstantAppResolver(); if (instantAppResolverComponent != null) { if (DEBUG_INSTANT) { Slog.d(TAG, "Set ephemeral resolver: " + instantAppResolverComponent); @@ -2183,7 +2191,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService // scanning). final Map<Integer, List<PackageInfo>> userPackages = new HashMap<>(); for (int userId : userIds) { - userPackages.put(userId, computer.getInstalledPackages(/*flags*/ 0, userId) + userPackages.put(userId, mIPackageManager.getInstalledPackages(/*flags*/ 0, userId) .getList()); } mDexManager.load(userPackages); @@ -2194,7 +2202,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService SystemClock.uptimeMillis() - startTime); } - // Rebuild the live computer since some attributes have been rebuilt. + // Rebild the live computer since some attributes have been rebuilt. mLiveComputer = createLiveComputer(); } // synchronized (mLock) @@ -2202,7 +2210,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService // CHECKSTYLE:ON IndentationCheck mModuleInfoProvider = mInjector.getModuleInfoProvider(); - mInjector.getSystemWrapper().enablePackageCaches(); // Now after opening every single application zip, make sure they @@ -2274,9 +2281,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @NonNull - private String getRequiredSharedLibrary(@NonNull Computer snapshot, @NonNull String name, - int version) { - SharedLibraryInfo libraryInfo = snapshot.getSharedLibraryInfo(name, version); + private String getRequiredSharedLibrary(@NonNull String name, int version) { + SharedLibraryInfo libraryInfo = getSharedLibraryInfo(name, version); if (libraryInfo == null) { throw new IllegalStateException("Missing required shared library:" + name); } @@ -2288,9 +2294,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @NonNull - private String getRequiredServicesExtensionPackageLPr(@NonNull Computer computer) { + private String getRequiredServicesExtensionPackageLPr() { String servicesExtensionPackage = - ensureSystemPackageName(computer, + ensureSystemPackageName( mContext.getString(R.string.config_servicesExtensionPackage)); if (TextUtils.isEmpty(servicesExtensionPackage)) { throw new RuntimeException( @@ -2369,7 +2375,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService for (int i = 0; i < N; i++) { final ResolveInfo cur = matches.get(i); final String packageName = cur.getComponentInfo().packageName; - if (checkPermission( + if (mIPackageManager.checkPermission( android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT, packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { continue; @@ -2399,7 +2405,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService for (int i = 0; i < N; i++) { final ResolveInfo cur = matches.get(i); final String packageName = cur.getComponentInfo().packageName; - if (checkPermission( + if (mIPackageManager.checkPermission( android.Manifest.permission.DOMAIN_VERIFICATION_AGENT, packageName, UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) { Slog.w(TAG, "Domain verification agent found but does not hold permission: " @@ -2408,7 +2414,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } if (best == null || cur.priority > best.priority) { - if (computer.isComponentEffectivelyEnabled(cur.getComponentInfo(), + if (mComputer.isComponentEffectivelyEnabled(cur.getComponentInfo(), UserHandle.USER_SYSTEM)) { best = cur; } else { @@ -2424,7 +2430,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService return null; } - @Nullable ComponentName getInstantAppResolver(@NonNull Computer snapshot) { + private @Nullable ComponentName getInstantAppResolver() { final String[] packageArray = mContext.getResources().getStringArray(R.array.config_ephemeralResolverPackage); if (packageArray.length == 0 && !Build.IS_DEBUGGABLE) { @@ -2440,7 +2446,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService | MATCH_DIRECT_BOOT_UNAWARE | (!Build.IS_DEBUGGABLE ? MATCH_SYSTEM_ONLY : 0); final Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE); - List<ResolveInfo> resolvers = snapshot.queryIntentServicesInternal(resolverIntent, null, + List<ResolveInfo> resolvers = queryIntentServicesInternal(resolverIntent, null, resolveFlags, UserHandle.USER_SYSTEM, callingUid, false /*includeInstantApps*/); final int N = resolvers.size(); if (N == 0) { @@ -2513,7 +2519,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService Iterator<ResolveInfo> iter = matches.iterator(); while (iter.hasNext()) { final ResolveInfo rInfo = iter.next(); - if (checkPermission( + if (mIPackageManager.checkPermission( Manifest.permission.INSTALL_PACKAGES, rInfo.activityInfo.packageName, 0) == PERMISSION_GRANTED || mIsEngBuild) { continue; @@ -2544,6 +2550,48 @@ public class PackageManagerService implements PackageSender, TestUtilityService return matches.get(0).getComponentInfo().getComponentName(); } + /** + * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int) + */ + boolean shouldFilterApplication( + @Nullable PackageStateInternal ps, int callingUid, int userId) { + return mComputer.shouldFilterApplication( + ps, callingUid, userId); + } + + private @PackageStartability int getPackageStartability(String packageName, + int callingUid, int userId) { + return mComputer.getPackageStartability(mSafeMode, packageName, callingUid, userId); + } + + /** + * Returns whether or not a full application can see an instant application. + * <p> + * Currently, there are four cases in which this can occur: + * <ol> + * <li>The calling application is a "special" process. Special processes + * are those with a UID < {@link Process#FIRST_APPLICATION_UID}.</li> + * <li>The calling application has the permission + * {@link android.Manifest.permission#ACCESS_INSTANT_APPS}.</li> + * <li>The calling application is the default launcher on the + * system partition.</li> + * <li>The calling application is the default app prediction service.</li> + * </ol> + */ + boolean canViewInstantApps(int callingUid, int userId) { + return mComputer.canViewInstantApps(callingUid, userId); + } + + private PackageInfo generatePackageInfo(@NonNull PackageStateInternal ps, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return mComputer.generatePackageInfo(ps, flags, userId); + } + + int getPackageUidInternal(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId, int callingUid) { + return mComputer.getPackageUidInternal(packageName, flags, userId, callingUid); + } + public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) { // Because this is accessed via the package manager service AIDL, // go through the permission manager service AIDL @@ -2552,6 +2600,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService } /** + * Important: The provided filterCallingUid is used exclusively to filter out applications + * that can be seen based on user state. It's typically the original caller uid prior + * to clearing. Because it can only be provided by trusted code, its value can be + * trusted and will be used as-is; unlike userId which will be validated by this method. + */ + private ApplicationInfo getApplicationInfoInternal(String packageName, + @PackageManager.ApplicationInfoFlagsBits long flags, + int filterCallingUid, int userId) { + return mComputer.getApplicationInfoInternal(packageName, flags, + filterCallingUid, userId); + } + + /** * Blocking call to clear all cached app data above quota. */ public void freeAllAppCacheAboveQuota(String volumeUuid) throws IOException { @@ -2587,7 +2648,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService // 2. Consider preloaded data (after 1w honeymoon, unless aggressive) if (internalVolume && (aggressive || SystemProperties .getBoolean("persist.sys.preloads.file_cache_expired", false))) { - deletePreloadsFileCache(); + mIPackageManager.deletePreloadsFileCache(); if (file.getUsableSpace() >= bytes) return; } @@ -2708,6 +2769,43 @@ public class PackageManagerService implements PackageSender, TestUtilityService return recommendedInstallLocation; } + /** + * Update given flags when being used to request {@link ResolveInfo}. + * <p>Instant apps are resolved specially, depending upon context. Minimally, + * {@code}flags{@code} must have the {@link PackageManager#MATCH_INSTANT} + * flag set. However, this flag is only honoured in three circumstances: + * <ul> + * <li>when called from a system process</li> + * <li>when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}</li> + * <li>when resolution occurs to start an activity with a {@code android.intent.action.VIEW} + * action and a {@code android.intent.category.BROWSABLE} category</li> + * </ul> + */ + long updateFlagsForResolve(long flags, int userId, int callingUid, + boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc) { + return mComputer.updateFlagsForResolve(flags, userId, callingUid, + wantInstantApps, isImplicitImageCaptureIntentAndNotSetByDpc); + } + + /** + * Important: The provided filterCallingUid is used exclusively to filter out activities + * that can be seen based on user state. It's typically the original caller uid prior + * to clearing. Because it can only be provided by trusted code, its value can be + * trusted and will be used as-is; unlike userId which will be validated by this method. + */ + private ActivityInfo getActivityInfoInternal(ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, int filterCallingUid, int userId) { + return mComputer.getActivityInfoInternal(component, flags, + filterCallingUid, userId); + } + + @Nullable + List<VersionedPackage> getPackagesUsingSharedLibrary( + SharedLibraryInfo libInfo, @PackageManager.PackageInfoFlagsBits long flags, + int callingUid, int userId) { + return mComputer.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, userId); + } + public ModuleInfo getModuleInfo(String packageName, @PackageManager.ModuleInfoFlags int flags) { return mModuleInfoProvider.getModuleInfo(packageName, flags); } @@ -2742,7 +2840,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mRequiredInstallerPackage; } - void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj, + private void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj, Intent origIntent, String resolvedType, String callingPackage, @Nullable String callingFeatureId, boolean isRequesterInstantApp, Bundle verificationBundle, int userId) { @@ -2754,6 +2852,31 @@ public class PackageManagerService implements PackageSender, TestUtilityService mHandler.sendMessage(msg); } + /** + * From Android R, camera intents have to match system apps. The only exception to this is if + * the DPC has set the camera persistent preferred activity. This case was introduced + * because it is important that the DPC has the ability to set both system and non-system + * camera persistent preferred activities. + * + * @return {@code true} if the intent is a camera intent and the persistent preferred + * activity was not set by the DPC. + */ + @GuardedBy("mLock") + boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) { + return mComputer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, + resolvedType, flags); + } + + @GuardedBy("mLock") + ResolveInfo findPersistentPreferredActivityLP(Intent intent, + String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, List<ResolveInfo> query, boolean debug, + int userId) { + return mComputer.findPersistentPreferredActivityLP(intent, + resolvedType, flags, query, debug, userId); + } + // findPreferredActivityBody returns two items: a "things changed" flag and a // ResolveInfo, which is the preferred activity itself. static class FindPreferredActivityBodyResult { @@ -2761,6 +2884,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService ResolveInfo mPreferredResolveInfo; } + FindPreferredActivityBodyResult findPreferredActivityInternal( + Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + List<ResolveInfo> query, boolean always, + boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered) { + return mComputer.findPreferredActivityInternal( + intent, resolvedType, flags, + query, always, + removeMatches, debug, userId, queryMayBeFiltered); + } + + /** + * Returns the package name of the calling Uid if it's an instant app. If it isn't + * instant, returns {@code null}. + */ + String getInstantAppPackageName(int callingUid) { + return mComputer.getInstantAppPackageName(callingUid); + } + public @NonNull ParceledListSlice<ResolveInfo> queryIntentReceivers(@NonNull Computer snapshot, Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId) { @@ -2768,6 +2909,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService snapshot, intent, resolvedType, flags, userId, Binder.getCallingUid())); } + @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId, + int callingUid, boolean includeInstantApps) { + return mComputer.queryIntentServicesInternal(intent, + resolvedType, flags, userId, callingUid, + includeInstantApps); + } + + private boolean isInstantAppInternal(String packageName, @UserIdInt int userId, + int callingUid) { + return mComputer.isInstantAppInternal(packageName, userId, + callingUid); + } + + boolean isCallerSameApp(String packageName, int uid) { + return mComputer.isCallerSameApp(packageName, uid); + } + public static void reportSettingsProblem(int priority, String msg) { logCriticalInfo(priority, msg); } @@ -2784,6 +2943,39 @@ public class PackageManagerService implements PackageSender, TestUtilityService return packageName + STATIC_SHARED_LIB_DELIMITER + libraryVersion; } + /** + * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS + * or INTERACT_ACROSS_USERS_FULL permissions, if the {@code userId} is not for the caller. + * + * @param checkShell whether to prevent shell from access if there's a debugging restriction + * @param message the message to log on security exception + */ + void enforceCrossUserPermission(int callingUid, @UserIdInt int userId, + boolean requireFullPermission, boolean checkShell, String message) { + mComputer.enforceCrossUserPermission(callingUid, userId, + requireFullPermission, checkShell, message); + } + + /** + * Checks if the request is from the system or an app that has the appropriate cross-user + * permissions defined as follows: + * <ul> + * <li>INTERACT_ACROSS_USERS_FULL if {@code requireFullPermission} is true.</li> + * <li>INTERACT_ACROSS_USERS if the given {@code userId} is in a different profile group + * to the caller.</li> + * <li>Otherwise, INTERACT_ACROSS_PROFILES if the given {@code userId} is in the same profile + * group as the caller.</li> + * </ul> + * + * @param checkShell whether to prevent shell from access if there's a debugging restriction + * @param message the message to log on security exception + */ + private void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId, + boolean requireFullPermission, boolean checkShell, String message) { + mComputer.enforceCrossUserOrProfilePermission(callingUid, userId, + requireFullPermission, checkShell, message); + } + public void performFstrimIfNeeded() { PackageManagerServiceUtils.enforceSystemOrRoot("Only the system can request fstrim"); @@ -2841,6 +3033,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mDexManager; } + @NonNull + List<PackageStateInternal> findSharedNonSystemLibraries( + @NonNull PackageStateInternal pkgSetting) { + return mComputer.findSharedNonSystemLibraries(pkgSetting); + } + + @Nullable + SharedLibraryInfo getSharedLibraryInfo(String name, long version) { + return mComputer.getSharedLibraryInfo(name, version); + } + public void shutdown() { mCompilerStats.writeNow(); mDexManager.writePackageDexUsageNow(); @@ -2938,14 +3141,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPackageObserverHelper.notifyRemoved(packageName, uid); } - void sendPackageAddedForUser(@NonNull Computer snapshot, String packageName, - @NonNull PackageStateInternal packageState, int userId, int dataLoaderType) { + void sendPackageAddedForUser(String packageName, @NonNull PackageStateInternal packageState, + int userId, int dataLoaderType) { final PackageUserStateInternal userState = packageState.getUserStateOrDefault(userId); final boolean isSystem = packageState.isSystem(); final boolean isInstantApp = userState.isInstantApp(); final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId }; final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; - sendPackageAddedForNewUsers(snapshot, packageName, isSystem /*sendBootCompleted*/, + sendPackageAddedForNewUsers(packageName, isSystem /*sendBootCompleted*/, false /*startReceiver*/, packageState.getAppId(), userIds, instantUserIds, dataLoaderType); @@ -2957,15 +3160,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName, - boolean sendBootCompleted, boolean includeStopped, @AppIdInt int appId, int[] userIds, - int[] instantUserIds, int dataLoaderType) { + public void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted, + boolean includeStopped, @AppIdInt int appId, int[] userIds, int[] instantUserIds, + int dataLoaderType) { if (ArrayUtils.isEmpty(userIds) && ArrayUtils.isEmpty(instantUserIds)) { return; } SparseArray<int[]> broadcastAllowList = mAppsFilter.getVisibilityAllowList( - snapshot.getPackageStateInternal(packageName, Process.SYSTEM_UID), - userIds, snapshot.getPackageStates()); + getPackageStateInternal(packageName, Process.SYSTEM_UID), + userIds, getPackageStates()); mHandler.post(() -> mBroadcastHelper.sendPackageAddedForNewUsers( packageName, appId, userIds, instantUserIds, dataLoaderType, broadcastAllowList)); if (sendBootCompleted && !ArrayUtils.isEmpty(userIds)) { @@ -2999,8 +3202,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService return false; } - private void enforceCanSetPackagesSuspendedAsUser(@NonNull Computer snapshot, - String callingPackage, int callingUid, int userId, String callingMethod) { + private void enforceCanSetPackagesSuspendedAsUser(String callingPackage, int callingUid, + int userId, String callingMethod) { if (callingUid == Process.ROOT_UID // Need to compare app-id to allow system dialogs access on secondary users || UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) { @@ -3009,7 +3212,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId); if (ownerPackage != null) { - final int ownerUid = snapshot.getPackageUid(ownerPackage, 0, userId); + final int ownerUid = mIPackageManager.getPackageUid(ownerPackage, 0, userId); if (ownerUid == callingUid) { return; } @@ -3018,7 +3221,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mContext.enforceCallingOrSelfPermission(android.Manifest.permission.SUSPEND_APPS, callingMethod); - final int packageUid = snapshot.getPackageUid(callingPackage, 0, userId); + final int packageUid = mIPackageManager.getPackageUid(callingPackage, 0, userId); final boolean allowedPackageUid = packageUid == callingUid; // TODO(b/139383163): remove special casing for shell and enforce INTERACT_ACROSS_USERS_FULL final boolean allowedShell = callingUid == SHELL_UID @@ -3039,9 +3242,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService allPackages, suspendingPackage::equals, userId); } - void removeAllDistractingPackageRestrictions(@NonNull Computer snapshot, int userId) { - final String[] allPackages = snapshot.getAllAvailablePackageNames(); - removeDistractingPackageRestrictions(snapshot, allPackages, userId); + private boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { + return mComputer.isSuspendingAnyPackages(suspendingPackage, userId); + } + + void removeAllDistractingPackageRestrictions(int userId) { + final String[] allPackages = mComputer.getAllAvailablePackageNames(); + removeDistractingPackageRestrictions(allPackages, userId); } /** @@ -3053,12 +3260,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService * @param packagesToChange The packages on which restrictions are to be removed. * @param userId the user for which changes are taking place. */ - void removeDistractingPackageRestrictions(@NonNull Computer snapshot, - String[] packagesToChange, int userId) { + private void removeDistractingPackageRestrictions(String[] packagesToChange, int userId) { final List<String> changedPackages = new ArrayList<>(); final IntArray changedUids = new IntArray(); for (String packageName : packagesToChange) { - final PackageStateInternal ps = snapshot.getPackageStateInternal(packageName); + final PackageStateInternal ps = getPackageStateInternal(packageName); if (ps != null && ps.getUserStateOrDefault(userId).getDistractionFlags() != 0) { changedPackages.add(ps.getPackageName()); changedUids.add(UserHandle.getUid(userId, ps.getAppId())); @@ -3081,7 +3287,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - void setEnableRollbackCode(int token, int enableRollbackCode) { + private void setEnableRollbackCode(int token, int enableRollbackCode) { final Message msg = mHandler.obtainMessage(ENABLE_ROLLBACK_STATUS); msg.arg1 = token; msg.arg2 = enableRollbackCode; @@ -3128,7 +3334,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (DEBUG_BACKUP) { Slog.i(TAG, "Package " + packageName + " sending normal FIRST_LAUNCH"); } - final boolean isInstantApp = snapshotComputer().isInstantAppInternal( + final boolean isInstantApp = isInstantAppInternal( packageName, userId, Process.SYSTEM_UID); final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId }; final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; @@ -3178,22 +3384,30 @@ public class PackageManagerService implements PackageSender, TestUtilityService versionedPackage, observer, userId, deleteFlags, false); } - boolean isCallerVerifier(@NonNull Computer snapshot, int callingUid) { + private String resolveExternalPackageName(AndroidPackage pkg) { + return mComputer.resolveExternalPackageName(pkg); + } + + String resolveInternalPackageName(String packageName, long versionCode) { + return mComputer.resolveInternalPackageName(packageName, versionCode); + } + + boolean isCallerVerifier(int callingUid) { final int callingUserId = UserHandle.getUserId(callingUid); - return mRequiredVerifierPackage != null && callingUid == snapshot.getPackageUid( + return mRequiredVerifierPackage != null && callingUid == mIPackageManager.getPackageUid( mRequiredVerifierPackage, 0, callingUserId); } - public boolean isPackageDeviceAdminOnAnyUser(@NonNull Computer snapshot, String packageName) { + public boolean isPackageDeviceAdminOnAnyUser(String packageName) { final int callingUid = Binder.getCallingUid(); - if (snapshot.checkUidPermission(android.Manifest.permission.MANAGE_USERS, callingUid) - != PERMISSION_GRANTED) { + if (mIPackageManager.checkUidPermission(android.Manifest.permission.MANAGE_USERS, + callingUid) != PERMISSION_GRANTED) { EventLog.writeEvent(0x534e4554, "128599183", -1, ""); throw new SecurityException(android.Manifest.permission.MANAGE_USERS + " permission is required to call this API"); } - if (snapshot.getInstantAppPackageName(callingUid) != null - && !snapshot.isCallerSameApp(packageName, callingUid)) { + if (getInstantAppPackageName(callingUid) != null + && !isCallerSameApp(packageName, callingUid)) { return false; } return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL); @@ -3242,15 +3456,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mDevicePolicyManager; } - private boolean clearApplicationUserDataLIF(@NonNull Computer snapshot, String packageName, - int userId) { + private boolean clearApplicationUserDataLIF(String packageName, int userId) { if (packageName == null) { Slog.w(TAG, "Attempt to delete null packageName."); return false; } // Try finding details about the requested package - AndroidPackage pkg = snapshot.getPackage(packageName); + AndroidPackage pkg = getPackage(packageName); if (pkg == null) { Slog.w(TAG, "Package named '" + packageName + "' doesn't exist."); return false; @@ -3273,8 +3486,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService } else { flags = 0; } - mAppDataHelper.prepareAppDataContentsLIF(pkg, snapshot.getPackageStateInternal(packageName), - userId, flags); + mAppDataHelper.prepareAppDataContentsLIF(pkg, getPackageStateInternal(packageName), userId, + flags); return true; } @@ -3325,6 +3538,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } + int getUidTargetSdkVersion(int uid) { + return mComputer.getUidTargetSdkVersion(uid); + } + void postPreferredActivityChangedBroadcast(int userId) { mHandler.post(() -> mBroadcastHelper.sendPreferredActivityChangedBroadcast(userId)); } @@ -3345,19 +3562,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService // Persistent preferred activity might have came into effect due to this // install. - mPreferredActivityHelper.updateDefaultHomeNotLocked(snapshotComputer(), userId); + mPreferredActivityHelper.updateDefaultHomeNotLocked(userId); } /** * Variant that takes a {@link WatchedIntentFilter} */ - public void addCrossProfileIntentFilter(@NonNull Computer snapshot, - WatchedIntentFilter intentFilter, String ownerPackage, int sourceUserId, - int targetUserId, int flags) { + public void addCrossProfileIntentFilter(WatchedIntentFilter intentFilter, String ownerPackage, + int sourceUserId, int targetUserId, int flags) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); int callingUid = Binder.getCallingUid(); - enforceOwnerRights(snapshot, ownerPackage, callingUid); + enforceOwnerRights(ownerPackage, callingUid); PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(), UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId); if (intentFilter.countActions() == 0) { @@ -3385,18 +3601,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService } // Enforcing that callingUid is owning pkg on userId - private void enforceOwnerRights(@NonNull Computer snapshot, String pkg, int callingUid) { + private void enforceOwnerRights(String pkg, int callingUid) { // The system owns everything. if (UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) { return; } - final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid); + final String[] callerPackageNames = mIPackageManager.getPackagesForUid(callingUid); if (!ArrayUtils.contains(callerPackageNames, pkg)) { throw new SecurityException("Calling uid " + callingUid + " does not own package " + pkg); } final int callingUserId = UserHandle.getUserId(callingUid); - PackageInfo pi = snapshot.getPackageInfo(pkg, 0, callingUserId); + PackageInfo pi = mIPackageManager.getPackageInfo(pkg, 0, callingUserId); if (pi == null) { throw new IllegalArgumentException("Unknown package " + pkg + " on user " + callingUserId); @@ -3410,13 +3626,29 @@ public class PackageManagerService implements PackageSender, TestUtilityService } final UserInfo parent = ums.getProfileParent(userId); final int launcherUid = (parent != null) ? parent.id : userId; - // TODO: Should this snapshot be moved further up? - final ComponentName launcherComponent = snapshotComputer() - .getDefaultHomeActivity(launcherUid); + final ComponentName launcherComponent = getDefaultHomeActivity(launcherUid); mBroadcastHelper.sendSessionCommitBroadcast(sessionInfo, userId, launcherUid, launcherComponent, mAppPredictionServicePackage); } + /** + * Report the 'Home' activity which is currently set as "always use this one". If non is set + * then reports the most likely home activity or null if there are more than one. + */ + private ComponentName getDefaultHomeActivity(int userId) { + return mComputer.getDefaultHomeActivity(userId); + } + + Intent getHomeIntent() { + return mComputer.getHomeIntent(); + } + + ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates, + int userId) { + return mComputer.getHomeActivitiesAsUser(allHomeCandidates, + userId); + } + private @Nullable String getSetupWizardPackageNameImpl(@NonNull Computer computer) { final Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_SETUP_WIZARD); @@ -3450,11 +3682,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @NonNull - private static String getRequiredSdkSandboxPackageName(@NonNull Computer computer) { + private @NonNull String getRequiredSdkSandboxPackageName() { final Intent intent = new Intent(SdkSandboxManagerLocal.SERVICE_INTERFACE); - final List<ResolveInfo> matches = computer.queryIntentServicesInternal( + final List<ResolveInfo> matches = queryIntentServicesInternal( intent, /* resolvedType= */ null, MATCH_SYSTEM_ONLY | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, @@ -3470,6 +3701,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Nullable + private String getDeviceConfiguratorPackageName() { + return ensureSystemPackageName(mContext.getString( + R.string.config_deviceConfiguratorPackageName)); + } + + public @Nullable String getAmbientContextDetectionPackageName() { + return ensureSystemPackageName(getPackageFromComponentString( + R.string.config_defaultAmbientContextDetectionService)); + } + + public String getOverlayConfigSignaturePackageName() { + return ensureSystemPackageName(mInjector.getSystemConfig() + .getOverlayConfigSignaturePackage()); + } + + @Nullable private String getRetailDemoPackageName() { final String predefinedPkgName = mContext.getString(R.string.config_retailDemoPackage); final String predefinedSignature = mContext.getString( @@ -3505,7 +3752,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Nullable - String getPackageFromComponentString(@StringRes int stringResId) { + private String getRecentsPackageName() { + return ensureSystemPackageName( + getPackageFromComponentString(R.string.config_recentsComponentName)); + + } + + @Nullable + private String getPackageFromComponentString(@StringRes int stringResId) { final String componentString = mContext.getString(stringResId); if (TextUtils.isEmpty(componentString)) { return null; @@ -3518,17 +3772,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Nullable - String ensureSystemPackageName(@NonNull Computer snapshot, - @Nullable String packageName) { + private String ensureSystemPackageName(@Nullable String packageName) { if (packageName == null) { return null; } final long token = Binder.clearCallingIdentity(); try { - if (snapshot.getPackageInfo(packageName, MATCH_FACTORY_ONLY, + if (mIPackageManager.getPackageInfo(packageName, MATCH_FACTORY_ONLY, UserHandle.USER_SYSTEM) == null) { PackageInfo packageInfo = - snapshot.getPackageInfo(packageName, 0, UserHandle.USER_SYSTEM); + mIPackageManager.getPackageInfo(packageName, 0, UserHandle.USER_SYSTEM); if (packageInfo != null) { EventLog.writeEvent(0x534e4554, "145981139", packageInfo.applicationInfo.uid, ""); @@ -3610,10 +3863,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService private void setEnabledSettings(List<ComponentEnabledSetting> settings, int userId, String callingPackage) { final int callingUid = Binder.getCallingUid(); - // TODO: This method is not properly snapshotified beyond this call - final Computer preLockSnapshot = snapshotComputer(); - preLockSnapshot.enforceCrossUserPermission(callingUid, userId, - false /* requireFullPermission */, true /* checkShell */, "set enabled"); + enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, + true /* checkShell */, "set enabled"); final int targetSize = settings.size(); for (int i = 0; i < targetSize; i++) { @@ -3669,7 +3920,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService final Map<String, PackageSetting> pkgSettings = new ArrayMap<>(targetSize); // reader synchronized (mLock) { - final Computer snapshot = snapshotComputer(); // Checks for target packages for (int i = 0; i < targetSize; i++) { final ComponentEnabledSetting setting = settings.get(i); @@ -3679,13 +3929,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService continue; } final boolean isCallerTargetApp = ArrayUtils.contains( - snapshot.getPackagesForUid(callingUid), packageName); + mIPackageManager.getPackagesForUid(callingUid), packageName); final PackageSetting pkgSetting = mSettings.getPackageLPr(packageName); // Limit who can change which apps if (!isCallerTargetApp) { // Don't allow apps that don't have permission to modify other apps if (!allowedByPermission - || snapshot.shouldFilterApplication(pkgSetting, callingUid, userId)) { + || shouldFilterApplication(pkgSetting, callingUid, userId)) { throw new SecurityException("Attempt to change component state; " + "pid=" + Binder.getCallingPid() + ", uid=" + callingUid @@ -3858,13 +4108,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService final long callingId = Binder.clearCallingIdentity(); try { - final Computer newSnapshot = snapshotComputer(); for (int i = 0; i < sendNowBroadcasts.size(); i++) { final String packageName = sendNowBroadcasts.keyAt(i); final ArrayList<String> components = sendNowBroadcasts.valueAt(i); final int packageUid = UserHandle.getUid( userId, pkgSettings.get(packageName).getAppId()); - sendPackageChangedBroadcast(newSnapshot, packageName, false /* dontKillApp */, + sendPackageChangedBroadcast(packageName, false /* dontKillApp */, components, packageUid, null /* reason */); } } finally { @@ -3888,13 +4137,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService pkgSetting.setEnabled(newState, userId, callingPackage); if ((newState == COMPONENT_ENABLED_STATE_DISABLED_USER || newState == COMPONENT_ENABLED_STATE_DISABLED) - && checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId) - == PERMISSION_GRANTED) { + && mIPackageManager.checkPermission(Manifest.permission.SUSPEND_APPS, + packageName, userId) == PERMISSION_GRANTED) { // This app should not generally be allowed to get disabled by the UI, but // if it ever does, we don't want to end up with some of the user's apps // permanently suspended. unsuspendForSuspendingPackage(computer, packageName, userId); - removeAllDistractingPackageRestrictions(computer, userId); + removeAllDistractingPackageRestrictions(userId); } success = true; } else { @@ -3945,20 +4194,25 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - void sendPackageChangedBroadcast(@NonNull Computer snapshot, String packageName, + void sendPackageChangedBroadcast(String packageName, boolean dontKillApp, ArrayList<String> componentNames, int packageUid, String reason) { final int userId = UserHandle.getUserId(packageUid); - final boolean isInstantApp = - snapshot.isInstantAppInternal(packageName, userId, Process.SYSTEM_UID); + final boolean isInstantApp = isInstantAppInternal(packageName, userId, Process.SYSTEM_UID); final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId }; final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY; - final SparseArray<int[]> broadcastAllowList = snapshot.getBroadcastAllowList( + final SparseArray<int[]> broadcastAllowList = getBroadcastAllowList( packageName, userIds, isInstantApp); mHandler.post(() -> mBroadcastHelper.sendPackageChangedBroadcast( packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList)); } + @Nullable + private SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName, + @UserIdInt int[] userIds, boolean isInstantApp) { + return mComputer.getBroadcastAllowList(packageName, userIds, isInstantApp); + } + /** * Used by SystemServer */ @@ -4042,7 +4296,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService // Now that we're mostly running, clean up stale users and apps mUserManager.reconcileUsers(StorageManager.UUID_PRIVATE_INTERNAL); - storageEventHelper.reconcileApps(snapshotComputer(), StorageManager.UUID_PRIVATE_INTERNAL); + storageEventHelper.reconcileApps(StorageManager.UUID_PRIVATE_INTERNAL); mPermissionManager.onSystemReady(); @@ -4054,7 +4308,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int livingUserCount = livingUsers.size(); for (int i = 0; i < livingUserCount; i++) { final int userId = livingUsers.get(i).id; - if (mSettings.isPermissionUpgradeNeeded(userId)) { + if (mPmInternal.isPermissionUpgradeNeeded(userId)) { grantPermissionsUserIds = ArrayUtils.appendInt( grantPermissionsUserIds, userId); } @@ -4096,12 +4350,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (packageName == null) { return; } - final Computer snapshot = snapshotComputer(); - AndroidPackage pkg = snapshot.getPackage(packageName); + AndroidPackage pkg = mPackages.get(packageName); if (pkg == null) { return; } - sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), + sendPackageChangedBroadcast(pkg.getPackageName(), true /* dontKillApp */, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), @@ -4154,6 +4407,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService mSnapshotStatistics.dump(pw, " ", now, hits, -1, isBrief); } + /** + * Dump package manager states to the file according to a given dumping type of + * {@link DumpState}. + */ + void dumpComputer(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) { + mComputer.dump(type, fd, pw, dumpState); + } + //TODO: b/111402650 private void disableSkuSpecificApps() { String[] apkList = mContext.getResources().getStringArray( @@ -4167,11 +4428,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (!TextUtils.isEmpty(sku) && ArrayUtils.contains(skuArray, sku)) { return; } - final Computer snapshot = snapshotComputer(); for (String packageName : apkList) { - setSystemAppHiddenUntilInstalled(snapshot, packageName, true); + mIPackageManager.setSystemAppHiddenUntilInstalled(packageName, true); for (UserInfo user : mInjector.getUserManagerInternal().getUsers(false)) { - setSystemAppInstallState(snapshot, packageName, false, user.id); + mIPackageManager.setSystemAppInstallState(packageName, false, user.id); } } } @@ -4264,7 +4524,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPermissionManager.writeLegacyPermissionStateTEMP(); mSettings.readPermissionStateForUserSyncLPr(userId); mPermissionManager.readLegacyPermissionStateTEMP(); - return mSettings.isPermissionUpgradeNeeded(userId); + return mPmInternal.isPermissionUpgradeNeeded(userId); } } @@ -4284,8 +4544,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - private void deletePackageIfUnused(@NonNull Computer snapshot, final String packageName) { - PackageStateInternal ps = snapshot.getPackageStateInternal(packageName); + boolean userNeedsBadging(int userId) { + return mUserNeedsBadging.get(userId); + } + + private void deletePackageIfUnused(final String packageName) { + PackageStateInternal ps = getPackageStateInternal(packageName); if (ps == null) { return; } @@ -4303,101 +4567,41 @@ public class PackageManagerService implements PackageSender, TestUtilityService 0, PackageManager.DELETE_ALL_USERS, true /*removedBySystem*/)); } - void deletePreloadsFileCache() { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CLEAR_APP_CACHE, - "deletePreloadsFileCache"); - File dir = Environment.getDataPreloadsFileCacheDirectory(); - Slog.i(PackageManagerService.TAG, "Deleting preloaded file cache " + dir); - FileUtils.deleteContents(dir); + private AndroidPackage getPackage(String packageName) { + return mComputer.getPackage(packageName); } - void setSystemAppHiddenUntilInstalled(@NonNull Computer snapshot, String packageName, - boolean hidden) { - final int callingUid = Binder.getCallingUid(); - final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID - || callingUid == Process.SYSTEM_UID; - if (!calledFromSystemOrPhone) { - mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, - "setSystemAppHiddenUntilInstalled"); - } - - final PackageStateInternal stateRead = snapshot.getPackageStateInternal(packageName); - if (stateRead == null || !stateRead.isSystem() || stateRead.getPkg() == null) { - return; - } - if (stateRead.getPkg().isCoreApp() && !calledFromSystemOrPhone) { - throw new SecurityException("Only system or phone callers can modify core apps"); - } - - commitPackageStateMutation(null, mutator -> { - mutator.forPackage(packageName) - .setHiddenUntilInstalled(hidden); - mutator.forDisabledSystemPackage(packageName) - .setHiddenUntilInstalled(hidden); - }); + private AndroidPackage getPackage(int uid) { + return mComputer.getPackage(uid); } - boolean setSystemAppInstallState(@NonNull Computer snapshot, String packageName, - boolean installed, int userId) { - final int callingUid = Binder.getCallingUid(); - final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID - || callingUid == Process.SYSTEM_UID; - if (!calledFromSystemOrPhone) { - mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, - "setSystemAppHiddenUntilInstalled"); - } + private SigningDetails getSigningDetails(@NonNull String packageName) { + return mComputer.getSigningDetails(packageName); + } - final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); - // The target app should always be in system - if (packageState == null || !packageState.isSystem() || packageState.getPkg() == null) { - return false; - } - if (packageState.getPkg().isCoreApp() && !calledFromSystemOrPhone) { - throw new SecurityException("Only system or phone callers can modify core apps"); - } - // Check if the install state is the same - if (packageState.getUserStateOrDefault(userId).isInstalled() == installed) { - return false; - } + private SigningDetails getSigningDetails(int uid) { + return mComputer.getSigningDetails(uid); + } - final long callingId = Binder.clearCallingIdentity(); - try { - if (installed) { - // install the app from uninstalled state - mInstallPackageHelper.installExistingPackageAsUser( - packageName, - userId, - PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS, - PackageManager.INSTALL_REASON_DEVICE_SETUP, - null, - null); - return true; - } + private boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { + return mComputer.filterAppAccess(pkg, callingUid, userId); + } - // uninstall the app from installed state - deletePackageVersioned( - new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST), - new PackageManager.LegacyPackageDeleteObserver(null).getBinder(), - userId, - PackageManager.DELETE_SYSTEM_APP); - return true; - } finally { - Binder.restoreCallingIdentity(callingId); - } + private boolean filterAppAccess(String packageName, int callingUid, int userId) { + return mComputer.filterAppAccess(packageName, callingUid, userId); } - void finishPackageInstall(int token, boolean didLaunch) { - PackageManagerServiceUtils.enforceSystemOrRoot( - "Only the system is allowed to finish installs"); + private boolean filterAppAccess(int uid, int callingUid) { + return mComputer.filterAppAccess(uid, callingUid); + } - if (PackageManagerService.DEBUG_INSTALL) { - Slog.v(PackageManagerService.TAG, "BM finishing package install for " + token); - } - Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token); + @Nullable + private int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) { + return mComputer.getVisibilityAllowList(packageName, userId); + } - final Message msg = mHandler.obtainMessage(PackageManagerService.POST_INSTALL, token, - didLaunch ? 1 : 0); - mHandler.sendMessage(msg); + boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) { + return mComputer.canQueryPackage(callingUid, targetPackageName); } void checkPackageStartable(@NonNull Computer snapshot, @NonNull String packageName, @@ -4485,15 +4689,71 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - public class IPackageManagerImpl extends IPackageManagerBase { + public class IPackageManagerImpl extends IPackageManager.Stub { - public IPackageManagerImpl() { - super(PackageManagerService.this, mContext, mDexOptHelper, mModuleInfoProvider, - mPreferredActivityHelper, mResolveIntentHelper, mDomainVerificationManager, - mDomainVerificationConnection, mInstallerService, mPackageProperty, - mResolveComponentName, mInstantAppResolverSettingsComponent, - mRequiredSdkSandboxPackage, mServicesExtensionPackageName, - mSharedSystemSharedLibraryPackageName); + @Override + public boolean activitySupportsIntent(ComponentName component, Intent intent, + String resolvedType) { + return mComputer.activitySupportsIntent(mResolveComponentName, component, intent, + resolvedType); + } + + @Override + public void addCrossProfileIntentFilter(IntentFilter intentFilter, String ownerPackage, + int sourceUserId, int targetUserId, int flags) { + PackageManagerService.this.addCrossProfileIntentFilter( + new WatchedIntentFilter(intentFilter), ownerPackage, sourceUserId, targetUserId, + flags); + } + + // NOTE: Can't remove due to unsupported app usage + @Override + public boolean addPermission(PermissionInfo info) { + // Because this is accessed via the package manager service AIDL, + // go through the permission manager service AIDL + return mContext.getSystemService(PermissionManager.class).addPermission(info, false); + } + + // NOTE: Can't remove due to unsupported app usage + @Override + public boolean addPermissionAsync(PermissionInfo info) { + // Because this is accessed via the package manager service AIDL, + // go through the permission manager service AIDL + return mContext.getSystemService(PermissionManager.class).addPermission(info, true); + } + + @Override + public void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity, + int userId) { + mPreferredActivityHelper.addPersistentPreferredActivity(new WatchedIntentFilter(filter), + activity, userId); + } + + @Override + public void addPreferredActivity(IntentFilter filter, int match, + ComponentName[] set, ComponentName activity, int userId, boolean removeExisting) { + mPreferredActivityHelper.addPreferredActivity(new WatchedIntentFilter(filter), match, + set, activity, true, userId, "Adding preferred", removeExisting); + } + + /* + * Returns if intent can be forwarded from the sourceUserId to the targetUserId + */ + @Override + public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType, + @UserIdInt int sourceUserId, @UserIdInt int targetUserId) { + return mComputer.canForwardTo(intent, resolvedType, sourceUserId, targetUserId); + } + + @Override + public boolean canRequestPackageInstalls(String packageName, int userId) { + return mComputer.canRequestPackageInstalls(packageName, Binder.getCallingUid(), userId, + true /* throwIfPermNotDeclared*/); + } + + @Override + public String[] canonicalToCurrentPackageNames(String[] names) { + return mComputer.canonicalToCurrentPackageNames(names); } @Override @@ -4502,13 +4762,33 @@ public class PackageManagerService implements PackageSender, TestUtilityService .checkPackageStartable(snapshotComputer(), packageName, userId); } + // NOTE: Can't remove due to unsupported app usage + @Override + public int checkPermission(String permName, String pkgName, int userId) { + return PackageManagerService.this.checkPermission(permName, pkgName, userId); + } + + @Override + public int checkSignatures(@NonNull String pkg1, @NonNull String pkg2) { + return mComputer.checkSignatures(pkg1, pkg2); + } + + @Override + public int checkUidPermission(String permName, int uid) { + return mComputer.checkUidPermission(permName, uid); + } + + @Override + public int checkUidSignatures(int uid1, int uid2) { + return mComputer.checkUidSignatures(uid1, uid2); + } + @Override public void clearApplicationProfileData(String packageName) { PackageManagerServiceUtils.enforceSystemOrRoot( "Only the system can clear all profile data"); - final Computer snapshot = snapshotComputer(); - final AndroidPackage pkg = snapshot.getPackage(packageName); + final AndroidPackage pkg = getPackage(packageName); try (PackageFreezer ignored = freezePackage(packageName, "clearApplicationProfileData")) { synchronized (mInstallLock) { mAppDataHelper.clearAppProfilesLIF(pkg); @@ -4523,11 +4803,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService android.Manifest.permission.CLEAR_APP_USER_DATA, null); final int callingUid = Binder.getCallingUid(); - final Computer snapshot = snapshotComputer(); - snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, + enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, false /* checkShell */, "clear application data"); - if (snapshot.getPackageStateFiltered(packageName, callingUid, userId) == null) { + if (mComputer.getPackageStateFiltered(packageName, callingUid, userId) == null) { if (observer != null) { mHandler.post(() -> { try { @@ -4552,8 +4831,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService try (PackageFreezer freezer = freezePackage(packageName, "clearApplicationUserData")) { synchronized (mInstallLock) { - succeeded = clearApplicationUserDataLIF(snapshotComputer(), packageName, - userId); + succeeded = clearApplicationUserDataLIF(packageName, userId); } mInstantAppRegistry.deleteInstantApplicationMetadata(packageName, userId); synchronized (mLock) { @@ -4571,9 +4849,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService } if (checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId) == PERMISSION_GRANTED) { - final Computer snapshot = snapshotComputer(); - unsuspendForSuspendingPackage(snapshot, packageName, userId); - removeAllDistractingPackageRestrictions(snapshot, userId); + unsuspendForSuspendingPackage(snapshotComputer(), packageName, userId); + removeAllDistractingPackageRestrictions(userId); flushPackageRestrictionsAsUserInternalLocked(userId); } } @@ -4593,8 +4870,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mContext.enforceCallingOrSelfPermission( android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null); final int callingUid = Binder.getCallingUid(); - final Computer snapshot = snapshotComputer(); - enforceOwnerRights(snapshot, ownerPackage, callingUid); + enforceOwnerRights(ownerPackage, callingUid); PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(), UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId); synchronized (mLock) { @@ -4612,7 +4888,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public final void deleteApplicationCacheFiles(final String packageName, + public void clearPackagePersistentPreferredActivities(String packageName, int userId) { + mPreferredActivityHelper.clearPackagePersistentPreferredActivities(packageName, userId); + } + + @Override + public void clearPackagePreferredActivities(String packageName) { + mPreferredActivityHelper.clearPackagePreferredActivities(packageName); + } + + @Override + public String[] currentToCanonicalPackageNames(String[] names) { + return mComputer.currentToCanonicalPackageNames(names); + } + + @Override + public void deleteApplicationCacheFiles(final String packageName, final IPackageDataObserver observer) { final int userId = UserHandle.getCallingUserId(); deleteApplicationCacheFilesAsUser(packageName, userId, observer); @@ -4637,18 +4928,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService mContext.enforceCallingOrSelfPermission( android.Manifest.permission.INTERNAL_DELETE_CACHE_FILES, null); } - final Computer snapshot = snapshotComputer(); - snapshot.enforceCrossUserPermission(callingUid, userId, /* requireFullPermission= */ true, + enforceCrossUserPermission(callingUid, userId, /* requireFullPermission= */ true, /* checkShell= */ false, "delete application cache files"); final int hasAccessInstantApps = mContext.checkCallingOrSelfPermission( android.Manifest.permission.ACCESS_INSTANT_APPS); + final AndroidPackage pkg = getPackage(packageName); + // Queue up an async operation since the package deletion may take a little while. mHandler.post(() -> { - // Snapshot in the Handler Runnable since this may be deferred quite a bit - // TODO: Is this and the later mInstallLock re-snapshot necessary? - final Computer newSnapshot = snapshotComputer(); - final PackageStateInternal ps = newSnapshot.getPackageStateInternal(packageName); + final PackageStateInternal ps = + pkg == null ? null : getPackageStateInternal(pkg.getPackageName()); boolean doClearData = true; if (ps != null) { final boolean targetIsInstantApp = @@ -4659,8 +4949,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (doClearData) { synchronized (mInstallLock) { final int flags = FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL; - // Snapshot again after mInstallLock? - final AndroidPackage pkg = snapshotComputer().getPackage(packageName); // We're only clearing cache files, so we don't care if the // app is unfrozen and still able to run mAppDataHelper.clearAppDataLIF(pkg, userId, @@ -4680,18 +4968,47 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public void deleteExistingPackageAsUser(VersionedPackage versionedPackage, + final IPackageDeleteObserver2 observer, final int userId) { + PackageManagerService.this.deleteExistingPackageAsUser(versionedPackage, observer, + userId); + } + + @Override + public void deletePackageAsUser(String packageName, int versionCode, + IPackageDeleteObserver observer, int userId, int flags) { + deletePackageVersioned(new VersionedPackage(packageName, versionCode), + new PackageManager.LegacyPackageDeleteObserver(observer).getBinder(), userId, flags); + } + + @Override + public void deletePackageVersioned(VersionedPackage versionedPackage, + final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) { + PackageManagerService.this.deletePackageVersioned(versionedPackage, observer, + userId, deleteFlags); + } + + @Override + public void deletePreloadsFileCache() { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CLEAR_APP_CACHE, + "deletePreloadsFileCache"); + File dir = Environment.getDataPreloadsFileCacheDirectory(); + Slog.i(PackageManagerService.TAG, "Deleting preloaded file cache " + dir); + FileUtils.deleteContents(dir); + } + + @Override public void dumpProfiles(String packageName) { /* Only the shell, root, or the app user should be able to dump profiles. */ final int callingUid = Binder.getCallingUid(); - final Computer snapshot = snapshotComputer(); - final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid); + final String[] callerPackageNames = getPackagesForUid(callingUid); if (callingUid != Process.SHELL_UID && callingUid != Process.ROOT_UID && !ArrayUtils.contains(callerPackageNames, packageName)) { throw new SecurityException("dumpProfiles"); } - AndroidPackage pkg = snapshot.getPackage(packageName); + AndroidPackage pkg = mComputer.getPackage(packageName); if (pkg == null) { throw new IllegalArgumentException("Unknown package: " + packageName); } @@ -4745,25 +5062,46 @@ public class PackageManagerService implements PackageSender, TestUtilityService }); } + @Override + public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) { + return mPreferredActivityHelper.findPersistentPreferredActivity(intent, userId); + } + + @Override + public void finishPackageInstall(int token, boolean didLaunch) { + PackageManagerServiceUtils.enforceSystemOrRoot( + "Only the system is allowed to finish installs"); + + if (PackageManagerService.DEBUG_INSTALL) { + Slog.v(PackageManagerService.TAG, "BM finishing package install for " + token); + } + Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token); + + final Message msg = mHandler.obtainMessage(PackageManagerService.POST_INSTALL, token, didLaunch ? 1 : 0); + mHandler.sendMessage(msg); + } + @WorkerThread @Override public void flushPackageRestrictionsAsUser(int userId) { - final Computer snapshot = snapshotComputer(); - final int callingUid = Binder.getCallingUid(); - if (snapshot.getInstantAppPackageName(callingUid) != null) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return; } if (!mUserManager.exists(userId)) { return; } - snapshot.enforceCrossUserPermission(callingUid, userId, - false /* requireFullPermission*/, false /* checkShell */, - "flushPackageRestrictions"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission*/, + false /* checkShell */, "flushPackageRestrictions"); synchronized (mLock) { flushPackageRestrictionsAsUserInternalLocked(userId); } } + @Override + public void forceDexOpt(String packageName) { + mDexOptHelper.forceDexOpt(packageName); + } + @Override public void freeStorage(final String volumeUuid, final long freeStorageSize, @@ -4812,17 +5150,83 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public ActivityInfo getActivityInfo(ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, int userId) { + return mComputer.getActivityInfo(component, flags, userId); + } + + @NonNull + @Override + public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) { + return mComputer.getAllIntentFilters(packageName); + } + + @Override + public List<String> getAllPackages() { + return mComputer.getAllPackages(); + } + + // NOTE: Can't remove due to unsupported app usage + @NonNull + @Override + public String[] getAppOpPermissionPackages(@NonNull String permissionName) { + return mComputer.getAppOpPermissionPackages(permissionName); + } + + @Override + public String getAppPredictionServicePackageName() { + return ensureSystemPackageName( + getPackageFromComponentString(R.string.config_defaultAppPredictionService)); + } + + @PackageManager.EnabledState + @Override + public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) { + return mComputer.getApplicationEnabledSetting(packageName, userId); + } + + /** + * Returns true if application is not found or there was an error. Otherwise it returns + * the hidden state of the package for the given user. + */ + @Override + public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, + @UserIdInt int userId) { + return mComputer.getApplicationHiddenSettingAsUser(packageName, userId); + } + + @Override + public ApplicationInfo getApplicationInfo(String packageName, + @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { + return mComputer.getApplicationInfo(packageName, flags, userId); + } + + @Override + public IArtManager getArtManager() { + return mArtManagerService; + } + + @Override + public @Nullable String getAttentionServicePackageName() { + return ensureSystemPackageName( + getPackageFromComponentString(R.string.config_defaultAttentionService)); + } + + @Override + public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) { + return mComputer.getBlockUninstallForUser(packageName, userId); + } + + @Override public ChangedPackages getChangedPackages(int sequenceNumber, int userId) { final int callingUid = Binder.getCallingUid(); - final Computer snapshot = snapshotComputer(); - if (snapshot.getInstantAppPackageName(callingUid) != null) { + if (getInstantAppPackageName(callingUid) != null) { return null; } if (!mUserManager.exists(userId)) { return null; } - snapshot.enforceCrossUserPermission(callingUid, userId, false, false, - "getChangedPackages"); + enforceCrossUserPermission(callingUid, userId, false, false, "getChangedPackages"); final ChangedPackages changedPackages = mChangedPackagesTracker.getChangedPackages( sequenceNumber, userId); @@ -4830,9 +5234,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService final List<String> packageNames = changedPackages.getPackageNames(); for (int index = packageNames.size() - 1; index >= 0; index--) { // Filter out the changes if the calling package should not be able to see it. - final PackageStateInternal packageState = - snapshot.getPackageStateInternal(packageNames.get(index)); - if (snapshot.shouldFilterApplication(packageState, callingUid, userId)) { + final PackageSetting ps = mSettings.getPackageLPr(packageNames.get(index)); + if (shouldFilterApplication(ps, callingUid, userId)) { packageNames.remove(index); } } @@ -4842,6 +5245,41 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public int getComponentEnabledSetting(@NonNull ComponentName component, int userId) { + return mComputer.getComponentEnabledSetting(component, Binder.getCallingUid(), userId); + } + + @Override + public String getContentCaptureServicePackageName() { + return ensureSystemPackageName( + getPackageFromComponentString(R.string.config_defaultContentCaptureService)); + } + + @Nullable + @Override + public ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries( + @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags, + @NonNull int userId) { + return mComputer.getDeclaredSharedLibraries(packageName, flags, userId); + } + + /** + * Non-Binder method, support for the backup/restore mechanism: write the + * default browser (etc) settings in its canonical XML format. Returns the default + * browser XML representation as a byte array, or null if there is none. + */ + @Override + public byte[] getDefaultAppsBackup(int userId) { + return mPreferredActivityHelper.getDefaultAppsBackup(userId); + } + + @Override + public String getDefaultTextClassifierPackageName() { + return ensureSystemPackageName( + mContext.getString(R.string.config_servicesExtensionPackage)); + } + + @Override public byte[] getDomainVerificationBackup(int userId) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { throw new SecurityException("Only the system may call getDomainVerificationBackup()"); @@ -4863,6 +5301,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public int getFlagsForUid(int uid) { + return mComputer.getFlagsForUid(uid); + } + + @Nullable + @Override + public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) { + return mComputer.getHarmfulAppWarning(packageName, userId); + } + + @Override public IBinder getHoldLockToken() { if (!Build.IS_DEBUGGABLE) { throw new SecurityException("getHoldLockToken requires a debuggable build"); @@ -4878,15 +5327,72 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } + return getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getCallingUserId()); + } + + public String getIncidentReportApproverPackageName() { + return ensureSystemPackageName(mContext.getString( + R.string.config_incidentReportApproverPackage)); + } + + @Override + public int getInstallLocation() { + // allow instant app access + return android.provider.Settings.Global.getInt(mContext.getContentResolver(), + android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION, + InstallLocationUtils.APP_INSTALL_AUTO); + } + + @PackageManager.InstallReason + @Override + public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) { + return mComputer.getInstallReason(packageName, userId); + } + + @Override + @Nullable + public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) { + return mComputer.getInstallSourceInfo(packageName); + } + + @Override + public ParceledListSlice<ApplicationInfo> getInstalledApplications( + @PackageManager.ApplicationInfoFlagsBits long flags, int userId) { + final int callingUid = Binder.getCallingUid(); + return new ParceledListSlice<>( + mComputer.getInstalledApplications(flags, userId, callingUid)); + } + + @Override + public List<ModuleInfo> getInstalledModules(int flags) { + return mModuleInfoProvider.getInstalledModules(flags); + } + + @Override + public ParceledListSlice<PackageInfo> getInstalledPackages( + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return mComputer.getInstalledPackages(flags, userId); + } + + @Nullable + @Override + public String getInstallerPackageName(@NonNull String packageName) { + return mComputer.getInstallerPackageName(packageName); + } + + @Override public String getInstantAppAndroidId(String packageName, int userId) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.ACCESS_INSTANT_APPS, "getInstantAppAndroidId"); - final Computer snapshot = snapshotComputer(); - snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_INSTANT_APPS, + "getInstantAppAndroidId"); + enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, false /* checkShell */, "getInstantAppAndroidId"); // Make sure the target is an Instant App. - if (!snapshot.isInstantApp(packageName, userId)) { + if (!isInstantApp(packageName, userId)) { return null; } return mInstantAppRegistry.getInstantAppAndroidId(packageName, userId); @@ -4898,14 +5404,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService return null; } - final Computer snapshot = snapshotComputer(); - snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, + enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, false /* checkShell */, "getInstantAppCookie"); - if (!snapshot.isCallerSameApp(packageName, Binder.getCallingUid())) { + if (!isCallerSameApp(packageName, Binder.getCallingUid())) { return null; } - PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + PackageStateInternal packageState = getPackageStateInternal(packageName); if (packageState == null || packageState.getPkg() == null) { return null; } @@ -4918,12 +5423,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService return null; } - final Computer snapshot = snapshotComputer(); - if (!snapshot.canViewInstantApps(Binder.getCallingUid(), userId)) { + if (!canViewInstantApps(Binder.getCallingUid(), userId)) { mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS, "getInstantAppIcon"); } - snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, + enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, false /* checkShell */, "getInstantAppIcon"); @@ -4931,31 +5435,76 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public ParceledListSlice<InstantAppInfo> getInstantApps(int userId) { - if (HIDE_EPHEMERAL_APIS) { + public ComponentName getInstantAppInstallerComponent() { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return null; } + return mInstantAppInstallerActivity == null + ? null : mInstantAppInstallerActivity.getComponentName(); + } - final Computer snapshot = snapshotComputer(); - if (!snapshot.canViewInstantApps(Binder.getCallingUid(), userId)) { + @Override + public @Nullable ComponentName getInstantAppResolverComponent() { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } + return getInstantAppResolver(); + } + + @Override + public ComponentName getInstantAppResolverSettingsComponent() { + return mInstantAppResolverSettingsComponent; + } + + @Override + public ParceledListSlice<InstantAppInfo> getInstantApps(int userId) { + if (PackageManagerService.HIDE_EPHEMERAL_APIS) { + return null; + } + if (!canViewInstantApps(Binder.getCallingUid(), userId)) { mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS, "getEphemeralApplications"); } - snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, + enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, false /* checkShell */, "getEphemeralApplications"); - List<InstantAppInfo> instantApps = mInstantAppRegistry.getInstantApps(snapshot, userId); + Computer computer = snapshotComputer(); + List<InstantAppInfo> instantApps = mInstantAppRegistry.getInstantApps(computer, userId); if (instantApps != null) { return new ParceledListSlice<>(instantApps); } return null; } + @Nullable + @Override + public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) { + return mComputer.getInstrumentationInfo(component, flags); + } + + @Deprecated + @Override + public @NonNull ParceledListSlice<IntentFilterVerificationInfo> getIntentFilterVerifications( + String packageName) { + return ParceledListSlice.emptyList(); + } + + @Deprecated + @Override + public int getIntentVerificationStatus(String packageName, int userId) { + return mDomainVerificationManager.getLegacyState(packageName, userId); + } + + @Nullable + @Override + public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) { + return mComputer.getKeySetByAlias(packageName, alias); + } + @Override public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) { - return mPreferredActivityHelper.getLastChosenActivity(snapshotComputer(), intent, - resolvedType, flags); + return mPreferredActivityHelper.getLastChosenActivity(intent, resolvedType, flags); } @Override @@ -4967,9 +5516,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public List<String> getMimeGroup(String packageName, String mimeGroup) { - final Computer snapshot = snapshotComputer(); - enforceOwnerRights(snapshot, packageName, Binder.getCallingUid()); - return getMimeGroupInternal(snapshot, packageName, mimeGroup); + enforceOwnerRights(packageName, Binder.getCallingUid()); + return getMimeGroupInternal(packageName, mimeGroup); + } + + @Override + public ModuleInfo getModuleInfo(String packageName, @PackageManager.ModuleInfoFlags int flags) { + return PackageManagerService.this.getModuleInfo(packageName, flags); } @Override @@ -4979,11 +5532,99 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mMoveCallbacks.mLastStatus.get(moveId); } + @Nullable + @Override + public String getNameForUid(int uid) { + return mComputer.getNameForUid(uid); + } + + @Nullable + @Override + public String[] getNamesForUids(@NonNull int[] uids) { + return mComputer.getNamesForUids(uids); + } + + @Override + public int[] getPackageGids(String packageName, @PackageManager.PackageInfoFlagsBits long flags, + int userId) { + return mComputer.getPackageGids(packageName, flags, userId); + } + + @Override + public PackageInfo getPackageInfo(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return mComputer.getPackageInfo(packageName, flags, userId); + } + + @Override + public PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return mComputer.getPackageInfoInternal(versionedPackage.getPackageName(), + versionedPackage.getLongVersionCode(), flags, Binder.getCallingUid(), userId); + } + + @Override + public IPackageInstaller getPackageInstaller() { + // Return installer service for internal calls. + if (PackageManagerServiceUtils.isSystemOrRoot()) { + return mInstallerService; + } + // Return null for InstantApps. + if (snapshotComputer().getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } + return mInstallerService; + } + + @Override + public void getPackageSizeInfo(final String packageName, int userId, + final IPackageStatsObserver observer) { + throw new UnsupportedOperationException( + "Shame on you for calling the hidden API getPackageSizeInfo(). Shame!"); + } + + @Override + public int getPackageUid(@NonNull String packageName, + @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) { + return mComputer.getPackageUid(packageName, flags, userId); + } + + /** + * <em>IMPORTANT:</em> Not all packages returned by this method may be known + * to the system. There are two conditions in which this may occur: + * <ol> + * <li>The package is on adoptable storage and the device has been removed</li> + * <li>The package is being removed and the internal structures are partially updated</li> + * </ol> + * The second is an artifact of the current data structures and should be fixed. See + * b/111075456 for one such instance. + * This binder API is cached. If the algorithm in this method changes, + * or if the underlying objecs (as returned by getSettingLPr()) change + * then the logic that invalidates the cache must be revisited. See + * calls to invalidateGetPackagesForUidCache() to locate the points at + * which the cache is invalidated. + */ + @Override + public String[] getPackagesForUid(int uid) { + final int callingUid = Binder.getCallingUid(); + final int userId = UserHandle.getUserId(uid); + mComputer.enforceCrossUserOrProfilePermission(callingUid, userId, + /* requireFullPermission */ false, + /* checkShell */ false, "getPackagesForUid"); + return mComputer.getPackagesForUid(uid); + } + + @Override + public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions( + @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags, + @UserIdInt int userId) { + return mComputer.getPackagesHoldingPermissions(permissions, flags, userId); + } + @Override public String getPermissionControllerPackageName() { final int callingUid = Binder.getCallingUid(); - final Computer snapshot = snapshotComputer(); - if (snapshot.getPackageStateFiltered(mRequiredPermissionControllerPackage, + if (mComputer.getPackageStateFiltered(mRequiredPermissionControllerPackage, callingUid, UserHandle.getUserId(callingUid)) != null) { return mRequiredPermissionControllerPackage; } @@ -4991,6 +5632,73 @@ public class PackageManagerService implements PackageSender, TestUtilityService throw new IllegalStateException("PermissionController is not found"); } + // NOTE: Can't remove due to unsupported app usage + @Override + public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) { + return PackageManagerService.this.getPermissionGroupInfo(groupName, flags); + } + + @Override + public @NonNull ParceledListSlice<ApplicationInfo> getPersistentApplications(int flags) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return ParceledListSlice.emptyList(); + } + return new ParceledListSlice<>(mComputer.getPersistentApplications(mSafeMode, flags)); + } + + @Override + public int getPreferredActivities(List<IntentFilter> outFilters, + List<ComponentName> outActivities, String packageName) { + return mPreferredActivityHelper.getPreferredActivities(outFilters, outActivities, + packageName, snapshotComputer()); + } + + /** + * Non-Binder method, support for the backup/restore mechanism: write the + * full set of preferred activities in its canonical XML format. Returns the + * XML output as a byte array, or null if there is none. + */ + @Override + public byte[] getPreferredActivityBackup(int userId) { + return mPreferredActivityHelper.getPreferredActivityBackup(userId); + } + + @Override + public int getPrivateFlagsForUid(int uid) { + return mComputer.getPrivateFlagsForUid(uid); + } + + @Override + public PackageManager.Property getProperty(String propertyName, String packageName, String className) { + Objects.requireNonNull(propertyName); + Objects.requireNonNull(packageName); + PackageStateInternal packageState = mComputer.getPackageStateFiltered(packageName, + Binder.getCallingUid(), UserHandle.getCallingUserId()); + if (packageState == null) { + return null; + } + return mPackageProperty.getProperty(propertyName, packageName, className); + } + + @Nullable + @Override + public ProviderInfo getProviderInfo(@NonNull ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { + return mComputer.getProviderInfo(component, flags, userId); + } + + @Override + public ActivityInfo getReceiverInfo(ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, int userId) { + return mComputer.getReceiverInfo(component, flags, userId); + } + + @Override + public @Nullable String getRotationResolverPackageName() { + return ensureSystemPackageName( + getPackageFromComponentString(R.string.config_defaultRotationResolverService)); + } + @Override public int getRuntimePermissionsVersion(@UserIdInt int userId) { Preconditions.checkArgumentNonnegative(userId); @@ -4999,25 +5707,65 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mSettings.getDefaultRuntimePermissionsVersion(userId); } + @Nullable + @Override + public ServiceInfo getServiceInfo(@NonNull ComponentName component, + @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) { + return mComputer.getServiceInfo(component, flags, userId); + } + + @Override + public @NonNull String getServicesSystemSharedLibraryPackageName() { + return mServicesExtensionPackageName; + } + + @Override + public String getSetupWizardPackageName() { + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + throw new SecurityException("Non-system caller"); + } + return mPmInternal.getSetupWizardPackageName(); + } + + @Override + public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return mComputer.getSharedLibraries(packageName, flags, userId); + } + + @Override + public @NonNull String getSharedSystemSharedLibraryPackageName() { + return mSharedSystemSharedLibraryPackageName; + } + + @Nullable + @Override + public KeySet getSigningKeySet(@NonNull String packageName) { + return mComputer.getSigningKeySet(packageName); + } + @Override public String getSplashScreenTheme(@NonNull String packageName, int userId) { - final Computer snapshot = snapshotComputer(); - PackageStateInternal packageState = filterPackageStateForInstalledAndFiltered(snapshot, - packageName, Binder.getCallingUid(), userId); + PackageStateInternal packageState = + getPackageStateInstalledFiltered(packageName, Binder.getCallingUid(), userId); return packageState == null ? null : packageState.getUserStateOrDefault(userId).getSplashScreenTheme(); } @Override + public String getSdkSandboxPackageName() { + return mRequiredSdkSandboxPackage; + } + + @Override public Bundle getSuspendedPackageAppExtras(String packageName, int userId) { final int callingUid = Binder.getCallingUid(); - final Computer snapshot = snapshot(); - if (snapshot.getPackageUid(packageName, 0, userId) != callingUid) { + if (getPackageUid(packageName, 0, userId) != callingUid) { throw new SecurityException("Calling package " + packageName + " does not belong to calling uid " + callingUid); } - return mSuspendPackageHelper - .getSuspendedPackageAppExtras(snapshot, packageName, userId, callingUid); + return mSuspendPackageHelper.getSuspendedPackageAppExtras( + packageName, userId, callingUid); } @Override @@ -5037,6 +5785,34 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public String getSystemCaptionsServicePackageName() { + return ensureSystemPackageName( + getPackageFromComponentString(R.string.config_defaultSystemCaptionsService)); + } + + @Nullable + @Override + public String[] getSystemSharedLibraryNames() { + return mComputer.getSystemSharedLibraryNames(); + } + + @Override + public String getSystemTextClassifierPackageName() { + return ensureSystemPackageName( + mContext.getString(R.string.config_defaultTextClassifierPackage)); + } + + @Override + public int getTargetSdkVersion(@NonNull String packageName) { + return mComputer.getTargetSdkVersion(packageName); + } + + @Override + public int getUidForSharedUser(@NonNull String sharedUserName) { + return mComputer.getUidForSharedUser(sharedUserName); + } + + @Override public String[] getUnsuspendablePackagesForUser(String[] packageNames, int userId) { Objects.requireNonNull(packageNames, "packageNames cannot be null"); mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, @@ -5062,6 +5838,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public String getWellbeingPackageName() { + final long identity = Binder.clearCallingIdentity(); + try { + return CollectionUtils.firstOrNull( + mContext.getSystemService(RoleManager.class).getRoleHolders( + RoleManager.ROLE_SYSTEM_WELLBEING)); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override public void grantImplicitAccess(int recipientUid, @NonNull String visibleAuthority) { final Computer snapshot = snapshotComputer(); final int recipientUserId = UserHandle.getUserId(recipientUid); @@ -5076,6 +5864,38 @@ public class PackageManagerService implements PackageSender, TestUtilityService false /*direct*/, false /* retainOnUpdate */); } + // NOTE: Can't remove due to unsupported app usage + @Override + public void grantRuntimePermission(String packageName, String permName, final int userId) { + // Because this is accessed via the package manager service AIDL, + // go through the permission manager service AIDL + mContext.getSystemService(PermissionManager.class) + .grantRuntimePermission(packageName, permName, UserHandle.of(userId)); + } + + @Override + public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate, + @PackageManager.CertificateInputType int type) { + return mComputer.hasSigningCertificate(packageName, certificate, type); + } + + @Override + public boolean hasSystemFeature(String name, int version) { + return PackageManagerService.this.hasSystemFeature(name, version); + } + + @Override + public boolean hasSystemUidErrors() { + // allow instant applications + return false; + } + + @Override + public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, + @PackageManager.CertificateInputType int type) { + return mComputer.hasUidSigningCertificate(uid, certificate, type); + } + @Override public void holdLock(IBinder token, int durationMs) { mTestUtilityService.verifyHoldLockToken(token); @@ -5104,17 +5924,55 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public boolean isDeviceUpgrading() { + return PackageManagerService.this.isDeviceUpgrading(); + } + + @Override + public boolean isFirstBoot() { + return PackageManagerService.this.isFirstBoot(); + } + + @Override + public boolean isInstantApp(String packageName, int userId) { + return mComputer.isInstantApp(packageName, userId); + } + + @Override + public boolean isOnlyCoreApps() { + return PackageManagerService.this.isOnlyCoreApps(); + } + + @Override + public boolean isPackageAvailable(String packageName, int userId) { + return mComputer.isPackageAvailable(packageName, userId); + } + + @Override + public boolean isPackageDeviceAdminOnAnyUser(String packageName) { + return PackageManagerService.this.isPackageDeviceAdminOnAnyUser(packageName); + } + + @Override + public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) { + return mComputer.isPackageSignedByKeySet(packageName, ks); + } + + @Override + public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) { + return mComputer.isPackageSignedByKeySetExactly(packageName, ks); + } + + @Override public boolean isPackageStateProtected(@NonNull String packageName, @UserIdInt int userId) { final int callingUid = Binder.getCallingUid(); final int callingAppId = UserHandle.getAppId(callingUid); - final Computer snapshot = snapshotComputer(); - snapshot.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, + enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, true /*checkShell*/, "isPackageStateProtected"); if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID - && snapshot.checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid) - != PERMISSION_GRANTED) { + && checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid) != PERMISSION_GRANTED) { throw new SecurityException("Caller must have the " + MANAGE_DEVICE_ADMINS + " permission."); } @@ -5123,6 +5981,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) { + return mComputer.isPackageSuspendedForUser(packageName, userId); + } + + @Override public boolean isProtectedBroadcast(String actionName) { if (actionName != null) { // TODO: remove these terrible hacks @@ -5139,6 +6002,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } + @Override + public boolean isSafeMode() { + // allow instant applications + return mSafeMode; + } + + @Override + public boolean isStorageLow() { + return PackageManagerService.this.isStorageLow(); + } + + @Override + public boolean isUidPrivileged(int uid) { + return mComputer.isUidPrivileged(uid); + } + /** * Logs process start information (including base APK hash) to the security log. * @hide @@ -5146,15 +6025,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public void logAppProcessStartIfNeeded(String packageName, String processName, int uid, String seinfo, String apkFile, int pid) { - final Computer snapshot = snapshotComputer(); - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return; } if (!SecurityLog.isLoggingEnabled()) { return; } - mProcessLoggingHandler.logAppProcessStart(mContext, - LocalServices.getService(PackageManagerInternal.class), apkFile, packageName, + mProcessLoggingHandler.logAppProcessStart(mContext, mPmInternal, apkFile, packageName, processName, uid, seinfo, pid); } @@ -5206,29 +6083,25 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public void notifyDexLoad(String loadingPackageName, - Map<String, String> classLoaderContextMap, + public void notifyDexLoad(String loadingPackageName, Map<String, String> classLoaderContextMap, String loaderIsa) { int callingUid = Binder.getCallingUid(); - if (PackageManagerService.PLATFORM_PACKAGE_NAME.equals(loadingPackageName) - && callingUid != Process.SYSTEM_UID) { - Slog.w(PackageManagerService.TAG, - "Non System Server process reporting dex loads as system server. uid=" - + callingUid); + if (PackageManagerService.PLATFORM_PACKAGE_NAME.equals(loadingPackageName) && callingUid != Process.SYSTEM_UID) { + Slog.w(PackageManagerService.TAG, "Non System Server process reporting dex loads as system server. uid=" + + callingUid); // Do not record dex loads from processes pretending to be system server. // Only the system server should be assigned the package "android", so reject calls // that don't satisfy the constraint. // // notifyDexLoad is a PM API callable from the app process. So in theory, apps could - // craft calls to this API and pretend to be system server. Doing so poses no - // particular danger for dex load reporting or later dexopt, however it is a - // sensible check to do in order to verify the expectations. + // craft calls to this API and pretend to be system server. Doing so poses no particular + // danger for dex load reporting or later dexopt, however it is a sensible check to do + // in order to verify the expectations. return; } int userId = UserHandle.getCallingUserId(); - ApplicationInfo ai = snapshot().getApplicationInfo(loadingPackageName, /*flags*/ 0, - userId); + ApplicationInfo ai = getApplicationInfo(loadingPackageName, /*flags*/ 0, userId); if (ai == null) { Slog.w(PackageManagerService.TAG, "Loading a package that does not exist for the calling user. package=" + loadingPackageName + ", user=" + userId); @@ -5242,13 +6115,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService public void notifyPackageUse(String packageName, int reason) { final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getUserId(callingUid); - Computer snapshot = snapshotComputer(); final boolean notify; - if (snapshot.getInstantAppPackageName(callingUid) != null) { - notify = snapshot.isCallerSameApp(packageName, callingUid); + if (getInstantAppPackageName(callingUid) != null) { + notify = isCallerSameApp(packageName, callingUid); } else { - notify = !snapshot.isInstantAppInternal(packageName, callingUserId, - Process.SYSTEM_UID); + notify = !isInstantAppInternal(packageName, callingUserId, Process.SYSTEM_UID); } if (!notify) { return; @@ -5266,18 +6137,102 @@ public class PackageManagerService implements PackageSender, TestUtilityService updateComponentLabelIcon(componentName, nonLocalizedLabel, icon, userId); } + /** + * Ask the package manager to perform a dex-opt with the given compiler filter. + * + * Note: exposed only for the shell command to allow moving packages explicitly to a + * definite state. + */ + @Override + public boolean performDexOptMode(String packageName, + boolean checkProfiles, String targetCompilerFilter, boolean force, + boolean bootComplete, String splitName) { + return mDexOptHelper.performDexOptMode(packageName, checkProfiles, targetCompilerFilter, + force, bootComplete, splitName); + } + + /** + * Ask the package manager to perform a dex-opt with the given compiler filter on the + * secondary dex files belonging to the given package. + * + * Note: exposed only for the shell command to allow moving packages explicitly to a + * definite state. + */ + @Override + public boolean performDexOptSecondary(String packageName, String compilerFilter, + boolean force) { + return mDexOptHelper.performDexOptSecondary(packageName, compilerFilter, force); + } + + @NonNull + @Override + public ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName, + int uid, @PackageManager.ComponentInfoFlagsBits long flags, + @Nullable String metaDataKey) { + return mComputer.queryContentProviders(processName, uid, flags, metaDataKey); + } + + @NonNull + @Override + public ParceledListSlice<InstrumentationInfo> queryInstrumentation( + @NonNull String targetPackage, int flags) { + return mComputer.queryInstrumentation(targetPackage, flags); + } + + @Override + public @NonNull ParceledListSlice<ResolveInfo> queryIntentActivities(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + try { + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities"); + + return new ParceledListSlice<>(snapshotComputer().queryIntentActivitiesInternal(intent, + resolvedType, flags, userId)); + } finally { + Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); + } + } + + @Override + public @NonNull ParceledListSlice<ResolveInfo> queryIntentActivityOptions(ComponentName caller, + Intent[] specifics, String[] specificTypes, Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return new ParceledListSlice<>(mResolveIntentHelper.queryIntentActivityOptionsInternal( + snapshotComputer(), caller, specifics, specificTypes, intent, resolvedType, flags, + userId)); + } + + @Override + public @NonNull ParceledListSlice<ResolveInfo> queryIntentContentProviders(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return new ParceledListSlice<>(mResolveIntentHelper.queryIntentContentProvidersInternal( + snapshotComputer(), intent, resolvedType, flags, userId)); + } + + @Override + public @NonNull ParceledListSlice<ResolveInfo> queryIntentReceivers(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return new ParceledListSlice<>(mResolveIntentHelper.queryIntentReceiversInternal( + snapshotComputer(), intent, resolvedType, flags, userId, Binder.getCallingUid())); + } + + @Override + public @NonNull ParceledListSlice<ResolveInfo> queryIntentServices(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + final int callingUid = Binder.getCallingUid(); + return new ParceledListSlice<>(snapshotComputer().queryIntentServicesInternal( + intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/)); + } + @Override public ParceledListSlice<PackageManager.Property> queryProperty( String propertyName, @PackageManager.PropertyLocation int componentType) { Objects.requireNonNull(propertyName); final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getCallingUserId(); - final Computer snapshot = snapshotComputer(); final List<PackageManager.Property> result = mPackageProperty.queryProperty(propertyName, componentType, packageName -> { - final PackageStateInternal ps = - snapshot.getPackageStateInternal(packageName); - return snapshot.shouldFilterApplication(ps, callingUid, callingUserId); + final PackageStateInternal ps = getPackageStateInternal(packageName); + return shouldFilterApplication(ps, callingUid, callingUserId); }); if (result == null) { return ParceledListSlice.emptyList(); @@ -5285,6 +6240,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService return new ParceledListSlice<>(result); } + @Deprecated + public void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) { + mComputer.querySyncProviders(mSafeMode, outNames, outInfo); + } + /** * Reconcile the information we have about the secondary dex files belonging to * {@code packageName} and the actual dex files. For all dex files that were @@ -5292,10 +6252,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService */ @Override public void reconcileSecondaryDexFiles(String packageName) { - final Computer snapshot = snapshotComputer(); - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return; - } else if (snapshot.isInstantAppInternal( + } else if (isInstantAppInternal( packageName, UserHandle.getCallingUserId(), Process.SYSTEM_UID)) { return; } @@ -5303,16 +6262,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public void registerDexModule(String packageName, String dexModulePath, - boolean isSharedModule, + public void registerDexModule(String packageName, String dexModulePath, boolean isSharedModule, IDexModuleRegisterCallback callback) { int userId = UserHandle.getCallingUserId(); - ApplicationInfo ai = snapshot().getApplicationInfo(packageName, /*flags*/ 0, userId); + ApplicationInfo ai = getApplicationInfo(packageName, /*flags*/ 0, userId); DexManager.RegisterDexModuleResult result; if (ai == null) { - Slog.w(PackageManagerService.TAG, - "Registering a dex module for a package that does not exist for the" + - " calling user. package=" + packageName + ", user=" + userId); + Slog.w(PackageManagerService.TAG, "Registering a dex module for a package that does not exist for the" + + " calling user. package=" + packageName + ", user=" + userId); result = new DexManager.RegisterDexModuleResult(false, "Package not installed"); } else { result = mDexManager.registerDexModule(ai, dexModulePath, isSharedModule, userId); @@ -5321,11 +6278,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (callback != null) { mHandler.post(() -> { try { - callback.onDexModuleRegistered(dexModulePath, result.success, - result.message); + callback.onDexModuleRegistered(dexModulePath, result.success, result.message); } catch (RemoteException e) { - Slog.w(PackageManagerService.TAG, - "Failed to callback after module registration " + dexModulePath, e); + Slog.w(PackageManagerService.TAG, "Failed to callback after module registration " + dexModulePath, e); } }); } @@ -5338,6 +6293,52 @@ public class PackageManagerService implements PackageSender, TestUtilityService mMoveCallbacks.register(callback); } + // NOTE: Can't remove due to unsupported app usage + @Override + public void removePermission(String permName) { + // Because this is accessed via the package manager service AIDL, + // go through the permission manager service AIDL + mContext.getSystemService(PermissionManager.class).removePermission(permName); + } + + @Override + public void replacePreferredActivity(IntentFilter filter, int match, + ComponentName[] set, ComponentName activity, int userId) { + mPreferredActivityHelper.replacePreferredActivity(new WatchedIntentFilter(filter), + match, set, activity, userId); + } + + @Override + public void resetApplicationPreferences(int userId) { + mPreferredActivityHelper.resetApplicationPreferences(userId); + } + + @Override + public ProviderInfo resolveContentProvider(String name, + @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return mComputer.resolveContentProvider(name, flags, userId, Binder.getCallingUid()); + } + + @Override + public ResolveInfo resolveIntent(Intent intent, String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + return mResolveIntentHelper.resolveIntentInternal(snapshotComputer(), intent, resolvedType, + flags, 0 /*privateResolveFlags*/, userId, false, Binder.getCallingUid()); + } + + @Override + public ResolveInfo resolveService(Intent intent, String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, int userId) { + final int callingUid = Binder.getCallingUid(); + return mResolveIntentHelper.resolveServiceInternal(snapshotComputer(), intent, resolvedType, + flags, userId, callingUid); + } + + @Override + public void restoreDefaultApps(byte[] backup, int userId) { + mPreferredActivityHelper.restoreDefaultApps(backup, userId); + } + @Override public void restoreDomainVerification(byte[] backup, int userId) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { @@ -5365,6 +6366,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public void restorePreferredActivities(byte[] backup, int userId) { + mPreferredActivityHelper.restorePreferredActivities(backup, userId); + } + + @Override public void sendDeviceCustomizationReadyBroadcast() { mContext.enforceCallingPermission(Manifest.permission.SEND_DEVICE_CUSTOMIZATION_READY, "sendDeviceCustomizationReadyBroadcast"); @@ -5380,17 +6386,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public void setApplicationCategoryHint(String packageName, int categoryHint, String callerPackageName) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + throw new SecurityException("Instant applications don't have access to this method"); + } + mInjector.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(), + callerPackageName); + final PackageStateMutator.InitialState initialState = recordInitialState(); final FunctionalUtils.ThrowingFunction<Computer, PackageStateMutator.Result> implementation = computer -> { - if (computer.getInstantAppPackageName(Binder.getCallingUid()) != null) { - throw new SecurityException( - "Instant applications don't have access to this method"); - } - mInjector.getSystemService(AppOpsManager.class) - .checkPackage(Binder.getCallingUid(), callerPackageName); - PackageStateInternal packageState = computer.getPackageStateFiltered(packageName, Binder.getCallingUid(), UserHandle.getCallingUserId()); if (packageState == null) { @@ -5442,8 +6447,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService int userId) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null); final int callingUid = Binder.getCallingUid(); - final Computer snapshot = snapshotComputer(); - snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, + enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, true /* checkShell */, "setApplicationHiddenSetting for user " + userId); if (hidden && isPackageDeviceAdmin(packageName, userId)) { @@ -5460,7 +6464,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final long callingId = Binder.clearCallingIdentity(); try { final PackageStateInternal packageState = - snapshot.getPackageStateFiltered(packageName, callingUid, userId); + mComputer.getPackageStateFiltered(packageName, callingUid, userId); if (packageState == null) { return false; } @@ -5501,16 +6505,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService commitPackageStateMutation(null, packageName, packageState1 -> packageState1.userState(userId).setHidden(hidden)); - final Computer newSnapshot = snapshotComputer(); - final PackageStateInternal newPackageState = - newSnapshot.getPackageStateInternal(packageName); + final PackageStateInternal newPackageState = getPackageStateInternal(packageName); if (hidden) { killApplication(packageName, newPackageState.getAppId(), userId, "hiding pkg"); sendApplicationHiddenForUser(packageName, newPackageState, userId); } else { - sendPackageAddedForUser(newSnapshot, packageName, newPackageState, userId, - DataLoaderType.NONE); + sendPackageAddedForUser(packageName, newPackageState, userId, DataLoaderType.NONE); } scheduleWritePackageRestrictions(userId); @@ -5525,8 +6526,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService int userId) { mContext.enforceCallingOrSelfPermission( Manifest.permission.DELETE_PACKAGES, null); - final Computer snapshot = snapshotComputer(); - PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + PackageStateInternal packageState = getPackageStateInternal(packageName); if (packageState != null && packageState.getPkg() != null) { AndroidPackage pkg = packageState.getPkg(); // Cannot block uninstall SDK libs as they are controlled by SDK manager. @@ -5584,10 +6584,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService + userId); } Objects.requireNonNull(packageNames, "packageNames cannot be null"); - final Computer snapshot = snapshotComputer(); if (restrictionFlags != 0 - && !mSuspendPackageHelper.isSuspendAllowedForUser(snapshot, userId, - callingUid)) { + && !mSuspendPackageHelper.isSuspendAllowedForUser(userId, callingUid)) { Slog.w(PackageManagerService.TAG, "Cannot restrict packages due to restrictions on user " + userId); return packageNames; } @@ -5597,15 +6595,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService final List<String> unactionedPackages = new ArrayList<>(packageNames.length); ArraySet<String> changesToCommit = new ArraySet<>(); + Computer computer = snapshotComputer(); final boolean[] canRestrict = (restrictionFlags != 0) - ? mSuspendPackageHelper.canSuspendPackageForUser(snapshot, packageNames, userId, + ? mSuspendPackageHelper.canSuspendPackageForUser(computer, packageNames, userId, callingUid) : null; for (int i = 0; i < packageNames.length; i++) { final String packageName = packageNames[i]; final PackageStateInternal packageState = - snapshot.getPackageStateInternal(packageName); + computer.getPackageStateInternal(packageName); if (packageState == null - || snapshot.shouldFilterApplication(packageState, callingUid, userId)) { + || computer.shouldFilterApplication(packageState, callingUid, userId)) { Slog.w(PackageManagerService.TAG, "Could not find package setting for package: " + packageName + ". Skipping..."); unactionedPackages.add(packageName); @@ -5649,13 +6648,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int callingUid = Binder.getCallingUid(); final int callingAppId = UserHandle.getAppId(callingUid); - final Computer snapshot = snapshotComputer(); - snapshot.enforceCrossUserPermission(callingUid, userId, true /*requireFullPermission*/, + enforceCrossUserPermission(callingUid, userId, true /*requireFullPermission*/, true /*checkShell*/, "setHarmfulAppInfo"); if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID && - snapshot.checkUidPermission(SET_HARMFUL_APP_WARNINGS, callingUid) - != PERMISSION_GRANTED) { + checkUidPermission(SET_HARMFUL_APP_WARNINGS, callingUid) != PERMISSION_GRANTED) { throw new SecurityException("Caller must have the " + SET_HARMFUL_APP_WARNINGS + " permission."); } @@ -5670,6 +6667,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public void setHomeActivity(ComponentName comp, int userId) { + mPreferredActivityHelper.setHomeActivity(comp, userId); + } + + @Override public boolean setInstallLocation(int loc) { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS, null); @@ -5691,24 +6693,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getUserId(callingUid); final FunctionalUtils.ThrowingCheckedFunction<Computer, Boolean, RuntimeException> - implementation = snapshot -> { - if (snapshot.getInstantAppPackageName(callingUid) != null) { + implementation = computer -> { + if (computer.getInstantAppPackageName(callingUid) != null) { return false; } PackageStateInternal targetPackageState = - snapshot.getPackageStateInternal(targetPackage); + computer.getPackageStateInternal(targetPackage); if (targetPackageState == null - || snapshot.shouldFilterApplication(targetPackageState, callingUid, + || computer.shouldFilterApplication(targetPackageState, callingUid, callingUserId)) { throw new IllegalArgumentException("Unknown target package: " + targetPackage); } PackageStateInternal installerPackageState = null; if (installerPackageName != null) { - installerPackageState = snapshot.getPackageStateInternal(installerPackageName); + installerPackageState = computer.getPackageStateInternal(installerPackageName); if (installerPackageState == null - || snapshot.shouldFilterApplication( + || shouldFilterApplication( installerPackageState, callingUid, callingUserId)) { throw new IllegalArgumentException("Unknown installer package: " + installerPackageName); @@ -5718,7 +6720,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService Signature[] callerSignature; final int appId = UserHandle.getAppId(callingUid); Pair<PackageStateInternal, SharedUserApi> either = - snapshot.getPackageOrSharedUser(appId); + computer.getPackageOrSharedUser(appId); if (either != null) { if (either.first != null) { callerSignature = either.first.getSigningDetails().getSignatures(); @@ -5746,7 +6748,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService String targetInstallerPackageName = targetPackageState.getInstallSource().installerPackageName; PackageStateInternal targetInstallerPkgSetting = targetInstallerPackageName == null - ? null : snapshot.getPackageStateInternal(targetInstallerPackageName); + ? null : computer.getPackageStateInternal(targetInstallerPackageName); if (targetInstallerPkgSetting != null) { if (compareSignatures(callerSignature, @@ -5802,7 +6804,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } } - targetPackageState = snapshotComputer().getPackageStateInternal(targetPackage); + targetPackageState = getPackageStateInternal(targetPackage); mSettings.addInstallerPackageNames(targetPackageState.getInstallSource()); } mAppsFilter.addPackage(targetPackageState); @@ -5816,15 +6818,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService return true; } - final Computer snapshot = snapshotComputer(); - snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, + enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, true /* checkShell */, "setInstantAppCookie"); - if (!snapshot.isCallerSameApp(packageName, Binder.getCallingUid())) { + if (!isCallerSameApp(packageName, Binder.getCallingUid())) { return false; } - PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + PackageStateInternal packageState = getPackageStateInternal(packageName); if (packageState == null || packageState.getPkg() == null) { return false; } @@ -5839,15 +6840,21 @@ public class PackageManagerService implements PackageSender, TestUtilityService "setKeepUninstalledPackages requires KEEP_UNINSTALLED_PACKAGES permission"); Objects.requireNonNull(packageList); - setKeepUninstalledPackagesInternal(snapshot(), packageList); + setKeepUninstalledPackagesInternal(packageList); + } + + @Override + public void setLastChosenActivity(Intent intent, String resolvedType, int flags, + IntentFilter filter, int match, ComponentName activity) { + mPreferredActivityHelper.setLastChosenActivity(intent, resolvedType, flags, + new WatchedIntentFilter(filter), match, activity); } @Override public void setMimeGroup(String packageName, String mimeGroup, List<String> mimeTypes) { - final Computer snapshot = snapshotComputer(); - enforceOwnerRights(snapshot, packageName, Binder.getCallingUid()); + enforceOwnerRights(packageName, Binder.getCallingUid()); mimeTypes = CollectionUtils.emptyIfNull(mimeTypes); - final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + final PackageStateInternal packageState = getPackageStateInternal(packageName); Set<String> existingMimeTypes = packageState.getMimeGroups().get(mimeGroup); if (existingMimeTypes == null) { throw new IllegalArgumentException("Unknown MIME group " + mimeGroup @@ -5882,11 +6889,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService PersistableBundle appExtras, PersistableBundle launcherExtras, SuspendDialogInfo dialogInfo, String callingPackage, int userId) { final int callingUid = Binder.getCallingUid(); - final Computer snapshot = snapshotComputer(); - enforceCanSetPackagesSuspendedAsUser(snapshot, callingPackage, callingUid, userId, + enforceCanSetPackagesSuspendedAsUser(callingPackage, callingUid, userId, "setPackagesSuspendedAsUser"); - return mSuspendPackageHelper.setPackagesSuspended(snapshot, packageNames, suspended, - appExtras, launcherExtras, dialogInfo, callingPackage, userId, callingUid); + return mSuspendPackageHelper.setPackagesSuspended(snapshotComputer(), packageNames, + suspended, appExtras, launcherExtras, dialogInfo, callingPackage, userId, + callingUid); } @Override @@ -5917,13 +6924,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService public void setSplashScreenTheme(@NonNull String packageName, @Nullable String themeId, int userId) { final int callingUid = Binder.getCallingUid(); - final Computer snapshot = snapshotComputer(); - snapshot.enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, + enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, false /* checkShell */, "setSplashScreenTheme"); - enforceOwnerRights(snapshot, packageName, callingUid); + enforceOwnerRights(packageName, callingUid); - PackageStateInternal packageState = filterPackageStateForInstalledAndFiltered(snapshot, - packageName, callingUid, userId); + PackageStateInternal packageState = getPackageStateInstalledFiltered(packageName, + callingUid, userId); if (packageState == null) { return; } @@ -5933,6 +6939,80 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden) { + final int callingUid = Binder.getCallingUid(); + final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID + || callingUid == Process.SYSTEM_UID; + if (!calledFromSystemOrPhone) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, + "setSystemAppHiddenUntilInstalled"); + } + + final PackageStateInternal stateRead = getPackageStateInternal(packageName); + if (stateRead == null || !stateRead.isSystem() || stateRead.getPkg() == null) { + return; + } + if (stateRead.getPkg().isCoreApp() && !calledFromSystemOrPhone) { + throw new SecurityException("Only system or phone callers can modify core apps"); + } + + commitPackageStateMutation(null, mutator -> { + mutator.forPackage(packageName) + .setHiddenUntilInstalled(hidden); + mutator.forDisabledSystemPackage(packageName) + .setHiddenUntilInstalled(hidden); + }); + } + + @Override + public boolean setSystemAppInstallState(String packageName, boolean installed, int userId) { + final int callingUid = Binder.getCallingUid(); + final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID + || callingUid == Process.SYSTEM_UID; + if (!calledFromSystemOrPhone) { + mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, + "setSystemAppHiddenUntilInstalled"); + } + + final PackageStateInternal packageState = getPackageStateInternal(packageName); + // The target app should always be in system + if (packageState == null || !packageState.isSystem() || packageState.getPkg() == null) { + return false; + } + if (packageState.getPkg().isCoreApp() && !calledFromSystemOrPhone) { + throw new SecurityException("Only system or phone callers can modify core apps"); + } + // Check if the install state is the same + if (packageState.getUserStateOrDefault(userId).isInstalled() == installed) { + return false; + } + + final long callingId = Binder.clearCallingIdentity(); + try { + if (installed) { + // install the app from uninstalled state + installExistingPackageAsUser( + packageName, + userId, + PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS, + PackageManager.INSTALL_REASON_DEVICE_SETUP, + null); + return true; + } + + // uninstall the app from installed state + deletePackageVersioned( + new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST), + new PackageManager.LegacyPackageDeleteObserver(null).getBinder(), + userId, + PackageManager.DELETE_SYSTEM_APP); + return true; + } finally { + Binder.restoreCallingIdentity(callingId); + } + } + + @Override public void setUpdateAvailable(String packageName, boolean updateAvailable) { mContext.enforceCallingOrSelfPermission(Manifest.permission.INSTALL_PACKAGES, null); commitPackageStateMutation(null, packageName, state -> @@ -5946,6 +7026,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService mMoveCallbacks.unregister(callback); } + @Deprecated + @Override + public boolean updateIntentVerificationStatus(String packageName, int status, int userId) { + return mDomainVerificationManager.setLegacyUserState(packageName, userId, status); + } + + @Deprecated + @Override + public void verifyIntentFilter(int id, int verificationCode, List<String> failedDomains) { + DomainVerificationProxyV1.queueLegacyVerifyResult(mContext, mDomainVerificationConnection, + id, verificationCode, failedDomains, Binder.getCallingUid()); + } + @Override public void verifyPendingInstall(int id, int verificationCode) throws RemoteException { mContext.enforceCallingOrSelfPermission( @@ -5966,9 +7059,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Checksum.TypeMask int optional, @Checksum.TypeMask int required, @Nullable List trustedInstallers, @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId) { - requestChecksumsInternal(snapshotComputer(), packageName, includeSplits, optional, - required, trustedInstallers, onChecksumsReadyListener, userId, - mInjector.getBackgroundExecutor(), mInjector.getBackgroundHandler()); + requestChecksumsInternal(packageName, includeSplits, optional, required, trustedInstallers, + onChecksumsReadyListener, userId, mInjector.getBackgroundExecutor(), + mInjector.getBackgroundHandler()); } @Override @@ -5981,6 +7074,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public boolean canPackageQuery(@NonNull String sourcePackageName, + @NonNull String targetPackageName, @UserIdInt int userId) { + return mComputer.canPackageQuery(sourcePackageName, targetPackageName, userId); + } + + @Override public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { try { @@ -5998,8 +7097,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService public void onShellCommand(FileDescriptor in, FileDescriptor out, FileDescriptor err, String[] args, ShellCallback callback, ResultReceiver resultReceiver) { - (new PackageManagerShellCommand(this, mContext, - mDomainVerificationManager.getShell())) + (new PackageManagerShellCommand(mIPackageManager, + mContext,mDomainVerificationManager.getShell())) .exec(this, in, out, err, args, callback, resultReceiver); } @@ -6014,126 +7113,143 @@ public class PackageManagerService implements PackageSender, TestUtilityService private class PackageManagerLocalImpl implements PackageManagerLocal { } - private class PackageManagerInternalImpl extends PackageManagerInternalBase { + private class PackageManagerInternalImpl extends PackageManagerInternal { + @Override + public List<ApplicationInfo> getInstalledApplications( + @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) { + return PackageManagerService.this.mComputer.getInstalledApplications(flags, userId, + callingUid); + } - public PackageManagerInternalImpl() { - super(PackageManagerService.this); + @Override + public boolean isPlatformSigned(String packageName) { + PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState == null) { + return false; + } + SigningDetails signingDetails = packageState.getSigningDetails(); + return signingDetails.hasAncestorOrSelf(mPlatformPackage.getSigningDetails()) + || mPlatformPackage.getSigningDetails().checkCapability(signingDetails, + SigningDetails.CertCapabilities.PERMISSION); } - @NonNull @Override - protected Context getContext() { - return mContext; + public boolean isDataRestoreSafe(byte[] restoringFromSigHash, String packageName) { + SigningDetails sd = getSigningDetails(packageName); + if (sd == null) { + return false; + } + return sd.hasSha256Certificate(restoringFromSigHash, + SigningDetails.CertCapabilities.INSTALLED_DATA); } - @NonNull @Override - protected PermissionManagerServiceInternal getPermissionManager() { - return mPermissionManager; + public boolean isDataRestoreSafe(Signature restoringFromSig, String packageName) { + SigningDetails sd = getSigningDetails(packageName); + if (sd == null) { + return false; + } + return sd.hasCertificate(restoringFromSig, + SigningDetails.CertCapabilities.INSTALLED_DATA); } - @NonNull @Override - protected AppDataHelper getAppDataHelper() { - return mAppDataHelper; + public boolean hasSignatureCapability(int serverUid, int clientUid, + @SigningDetails.CertCapabilities int capability) { + SigningDetails serverSigningDetails = getSigningDetails(serverUid); + SigningDetails clientSigningDetails = getSigningDetails(clientUid); + return serverSigningDetails.checkCapability(clientSigningDetails, capability) + || clientSigningDetails.hasAncestorOrSelf(serverSigningDetails); + + } + + private SigningDetails getSigningDetails(@NonNull String packageName) { + return PackageManagerService.this.getSigningDetails(packageName); + } + + private SigningDetails getSigningDetails(int uid) { + return PackageManagerService.this.getSigningDetails(uid); } - @NonNull @Override - protected PackageObserverHelper getPackageObserverHelper() { - return mPackageObserverHelper; + public boolean isInstantApp(String packageName, int userId) { + return PackageManagerService.this.mIPackageManager.isInstantApp(packageName, userId); } - @NonNull @Override - protected ResolveIntentHelper getResolveIntentHelper() { - return mResolveIntentHelper; + public String getInstantAppPackageName(int uid) { + return PackageManagerService.this.getInstantAppPackageName(uid); } - @NonNull @Override - protected SuspendPackageHelper getSuspendPackageHelper() { - return mSuspendPackageHelper; + public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) { + return PackageManagerService.this.filterAppAccess(pkg, callingUid, userId); } - @NonNull @Override - protected ProtectedPackages getProtectedPackages() { - return mProtectedPackages; + public boolean filterAppAccess(String packageName, int callingUid, int userId) { + return PackageManagerService.this.filterAppAccess(packageName, callingUid, userId); } - @NonNull @Override - protected UserNeedsBadgingCache getUserNeedsBadging() { - return mUserNeedsBadging; + public boolean filterAppAccess(int uid, int callingUid) { + return PackageManagerService.this.filterAppAccess(uid, callingUid); } - @NonNull + @Nullable @Override - protected InstantAppRegistry getInstantAppRegistry() { - return mInstantAppRegistry; + public int[] getVisibilityAllowList(@NonNull String packageName, int userId) { + return PackageManagerService.this.getVisibilityAllowList(packageName, userId); } - @NonNull @Override - protected ApexManager getApexManager() { - return mApexManager; + public boolean canQueryPackage(int callingUid, @Nullable String packageName) { + return PackageManagerService.this.canQueryPackage(callingUid, packageName); } - @NonNull @Override - protected DexManager getDexManager() { - return mDexManager; + public AndroidPackage getPackage(String packageName) { + return PackageManagerService.this.getPackage(packageName); } + @Nullable @Override - public boolean isPlatformSigned(String packageName) { - PackageStateInternal packageState = snapshot().getPackageStateInternal(packageName); - if (packageState == null) { - return false; - } - SigningDetails signingDetails = packageState.getSigningDetails(); - return signingDetails.hasAncestorOrSelf(mPlatformPackage.getSigningDetails()) - || mPlatformPackage.getSigningDetails().checkCapability(signingDetails, - SigningDetails.CertCapabilities.PERMISSION); + public AndroidPackageApi getAndroidPackage(@NonNull String packageName) { + return PackageManagerService.this.getPackage(packageName); } @Override - public boolean isDataRestoreSafe(byte[] restoringFromSigHash, String packageName) { - final Computer snapshot = snapshot(); - SigningDetails sd = snapshot.getSigningDetails(packageName); - if (sd == null) { - return false; - } - return sd.hasSha256Certificate(restoringFromSigHash, - SigningDetails.CertCapabilities.INSTALLED_DATA); + public AndroidPackage getPackage(int uid) { + return PackageManagerService.this.getPackage(uid); } @Override - public boolean isDataRestoreSafe(Signature restoringFromSig, String packageName) { - final Computer snapshot = snapshot(); - SigningDetails sd = snapshot.getSigningDetails(packageName); - if (sd == null) { - return false; - } - return sd.hasCertificate(restoringFromSig, - SigningDetails.CertCapabilities.INSTALLED_DATA); + public List<AndroidPackage> getPackagesForAppId(int appId) { + return mComputer.getPackagesForAppId(appId); } + @Nullable @Override - public boolean hasSignatureCapability(int serverUid, int clientUid, - @SigningDetails.CertCapabilities int capability) { - final Computer snapshot = snapshot(); - SigningDetails serverSigningDetails = snapshot.getSigningDetails(serverUid); - SigningDetails clientSigningDetails = snapshot.getSigningDetails(clientUid); - return serverSigningDetails.checkCapability(clientSigningDetails, capability) - || clientSigningDetails.hasAncestorOrSelf(serverSigningDetails); + public PackageStateInternal getPackageStateInternal(String packageName) { + return PackageManagerService.this.getPackageStateInternal(packageName); + } + + @Nullable + @Override + public PackageState getPackageState(@NonNull String packageName) { + return PackageManagerService.this.getPackageState(packageName); + } + + @NonNull + @Override + public ArrayMap<String, ? extends PackageStateInternal> getPackageStates() { + return PackageManagerService.this.getPackageStates(); } @Override public PackageList getPackageList(@Nullable PackageListObserver observer) { final ArrayList<String> list = new ArrayList<>(); - PackageManagerService.this.forEachPackageState(snapshot(), packageState -> { + forEachPackageState(packageState -> { AndroidPackage pkg = packageState.getPkg(); if (pkg != null) { list.add(pkg.getPackageName()); @@ -6147,9 +7263,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public void removePackageListObserver(PackageListObserver observer) { + mPackageObserverHelper.removeObserver(observer); + } + + @Override + public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) { + return snapshotComputer().getDisabledSystemPackage(packageName); + } + + @Override public @Nullable String getDisabledSystemPackageName(@NonNull String packageName) { - PackageStateInternal disabledPkgSetting = snapshot().getDisabledSystemPackage( + PackageStateInternal disabledPkgSetting = getDisabledSystemPackage( packageName); AndroidPackage disabledPkg = disabledPkgSetting == null ? null : disabledPkgSetting.getPkg(); @@ -6157,15 +7283,51 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public @NonNull String[] getKnownPackageNames(int knownPackage, int userId) { + return PackageManagerService.this.getKnownPackageNamesInternal(knownPackage, userId); + } + + @Override + public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) { + if (packageName == null) { + return false; + } + + if (Process.isSdkSandboxUid(callingUid)) { + return packageName.equals(getSdkSandboxPackageName()); + } + int uid = getPackageUid(packageName, 0, userId); + return UserHandle.isSameApp(uid, callingUid); + } + + @Override public boolean isResolveActivityComponent(ComponentInfo component) { return mResolveActivity.packageName.equals(component.packageName) && mResolveActivity.name.equals(component.name); } @Override + public void setKeepUninstalledPackages(final List<String> packageList) { + PackageManagerService.this.setKeepUninstalledPackagesInternal(packageList); + } + + @Override + public boolean isPermissionsReviewRequired(String packageName, int userId) { + return mPermissionManager.isPermissionsReviewRequired(packageName, userId); + } + + @Override + public PackageInfo getPackageInfo( + String packageName, @PackageManager.PackageInfoFlagsBits long flags, + int filterCallingUid, int userId) { + return PackageManagerService.this.mComputer + .getPackageInfoInternal(packageName, PackageManager.VERSION_CODE_HIGHEST, + flags, filterCallingUid, userId); + } + + @Override public long getCeDataInode(String packageName, int userId) { - final PackageStateInternal packageState = - snapshot().getPackageStateInternal(packageName); + final PackageStateInternal packageState = getPackageStateInternal(packageName); if (packageState == null) { return 0; } else { @@ -6174,6 +7336,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public Bundle getSuspendedPackageLauncherExtras(String packageName, int userId) { + return mSuspendPackageHelper.getSuspendedPackageLauncherExtras( + packageName, userId, Binder.getCallingUid()); + } + + @Override + public boolean isPackageSuspended(String packageName, int userId) { + return mSuspendPackageHelper.isPackageSuspended( + packageName, userId, Binder.getCallingUid()); + } + + @Override public void removeAllNonSystemPackageSuspensions(int userId) { final Computer computer = snapshotComputer(); final String[] allPackages = computer.getAllAvailablePackageNames(); @@ -6183,6 +7357,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public void removeNonSystemPackageSuspensions(String packageName, int userId) { + mSuspendPackageHelper.removeSuspensionsBySuspendingPackage(snapshotComputer(), + new String[]{packageName}, + (suspendingPackage) -> !PLATFORM_PACKAGE_NAME.equals(suspendingPackage), + userId); + } + + @Override public void flushPackageRestrictions(int userId) { synchronized (mLock) { PackageManagerService.this.flushPackageRestrictionsAsUserInternalLocked(userId); @@ -6190,6 +7372,103 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public void removeDistractingPackageRestrictions(String packageName, int userId) { + PackageManagerService.this.removeDistractingPackageRestrictions( + new String[]{packageName}, userId); + } + + @Override + public void removeAllDistractingPackageRestrictions(int userId) { + PackageManagerService.this.removeAllDistractingPackageRestrictions(userId); + } + + @Override + public String getSuspendingPackage(String suspendedPackage, int userId) { + return mSuspendPackageHelper.getSuspendingPackage( + suspendedPackage, userId, Binder.getCallingUid()); + } + + @Override + public SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage, + String suspendingPackage, int userId) { + return mSuspendPackageHelper.getSuspendedDialogInfo( + suspendedPackage, suspendingPackage, userId, Binder.getCallingUid()); + } + + @Override + public int getDistractingPackageRestrictions(String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + return (packageState == null) ? RESTRICTION_NONE + : packageState.getUserStateOrDefault(userId).getDistractionFlags(); + } + + @Override + public int getPackageUid(String packageName, + @PackageManager.PackageInfoFlagsBits long flags, int userId) { + return PackageManagerService.this + .getPackageUidInternal(packageName, flags, userId, Process.SYSTEM_UID); + } + + @Override + public ApplicationInfo getApplicationInfo( + String packageName, @PackageManager.ApplicationInfoFlagsBits long flags, + int filterCallingUid, int userId) { + return PackageManagerService.this + .getApplicationInfoInternal(packageName, flags, filterCallingUid, userId); + } + + @Override + public ActivityInfo getActivityInfo( + ComponentName component, @PackageManager.ComponentInfoFlagsBits long flags, + int filterCallingUid, int userId) { + return PackageManagerService.this + .getActivityInfoInternal(component, flags, filterCallingUid, userId); + } + + @Override + public List<ResolveInfo> queryIntentActivities( + Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + int filterCallingUid, int userId) { + return snapshotComputer().queryIntentActivitiesInternal(intent, resolvedType, flags, + userId); + } + + @Override + public List<ResolveInfo> queryIntentReceivers(Intent intent, + String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, + int filterCallingUid, int userId) { + return PackageManagerService.this.mResolveIntentHelper.queryIntentReceiversInternal( + snapshotComputer(), intent, resolvedType, flags, userId, filterCallingUid); + } + + @Override + public List<ResolveInfo> queryIntentServices( + Intent intent, @PackageManager.ResolveInfoFlagsBits long flags, int callingUid, + int userId) { + final String resolvedType = intent.resolveTypeIfNeeded(mContext.getContentResolver()); + return PackageManagerService.this + .queryIntentServicesInternal(intent, resolvedType, flags, userId, callingUid, + false); + } + + @Override + public ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates, + int userId) { + return PackageManagerService.this.getHomeActivitiesAsUser(allHomeCandidates, userId); + } + + @Override + public ComponentName getDefaultHomeActivity(int userId) { + return PackageManagerService.this.getDefaultHomeActivity(userId); + } + + @Override + public ComponentName getSystemUiServiceComponent() { + return ComponentName.unflattenFromString(mContext.getResources().getString( + com.android.internal.R.string.config_systemUIServiceComponent)); + } + + @Override public void setDeviceAndProfileOwnerPackages( int deviceOwnerUserId, String deviceOwnerPackage, SparseArray<String> profileOwnerPackages) { @@ -6208,6 +7487,118 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public void setDeviceOwnerProtectedPackages( + String deviceOwnerPackageName, List<String> packageNames) { + mProtectedPackages.setDeviceOwnerProtectedPackages( + deviceOwnerPackageName, packageNames); + } + + @Override + public boolean isPackageDataProtected(int userId, String packageName) { + return mProtectedPackages.isPackageDataProtected(userId, packageName); + } + + @Override + public boolean isPackageStateProtected(String packageName, int userId) { + return mProtectedPackages.isPackageStateProtected(userId, packageName); + } + + @Override + public boolean isPackageEphemeral(int userId, String packageName) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + return packageState != null + && packageState.getUserStateOrDefault(userId).isInstantApp(); + } + + @Override + public boolean wasPackageEverLaunched(String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState == null) { + throw new IllegalArgumentException("Unknown package: " + packageName); + } + return !packageState.getUserStateOrDefault(userId).isNotLaunched(); + } + + @Override + public boolean isEnabledAndMatches(ParsedMainComponent component, long flags, int userId) { + return PackageStateUtils.isEnabledAndMatches( + getPackageStateInternal(component.getPackageName()), component, flags, userId); + } + + @Override + public boolean userNeedsBadging(int userId) { + synchronized (mLock) { + return PackageManagerService.this.userNeedsBadging(userId); + } + } + + @Override + public String getNameForUid(int uid) { + return mIPackageManager.getNameForUid(uid); + } + + @Override + public void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj, + Intent origIntent, String resolvedType, String callingPackage, + @Nullable String callingFeatureId, boolean isRequesterInstantApp, + Bundle verificationBundle, int userId) { + PackageManagerService.this.requestInstantAppResolutionPhaseTwo(responseObj, origIntent, + resolvedType, callingPackage, callingFeatureId, isRequesterInstantApp, + verificationBundle, userId); + } + + @Override + public void grantImplicitAccess(int userId, Intent intent, + int recipientAppId, int visibleUid, boolean direct) { + grantImplicitAccess(userId, intent, recipientAppId, visibleUid, direct, + false /* retainOnUpdate */); + } + + @Override + public void grantImplicitAccess(int userId, Intent intent, + int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) { + Computer computer = snapshotComputer(); + final AndroidPackage visiblePackage = computer.getPackage(visibleUid); + final int recipientUid = UserHandle.getUid(userId, recipientAppId); + if (visiblePackage == null || computer.getPackage(recipientUid) == null) { + return; + } + + final boolean instantApp = computer.isInstantAppInternal( + visiblePackage.getPackageName(), userId, visibleUid); + final boolean accessGranted; + if (instantApp) { + if (!direct) { + // if the interaction that lead to this granting access to an instant app + // was indirect (i.e.: URI permission grant), do not actually execute the + // grant. + return; + } + accessGranted = mInstantAppRegistry.grantInstantAccess(userId, intent, + recipientAppId, UserHandle.getAppId(visibleUid) /*instantAppId*/); + } else { + accessGranted = mAppsFilter.grantImplicitAccess(recipientUid, visibleUid, + retainOnUpdate); + } + + if (accessGranted) { + ApplicationPackageManager.invalidateGetPackagesForUidCache(); + } + } + + @Override + public boolean isInstantAppInstallerComponent(ComponentName component) { + final ActivityInfo instantAppInstallerActivity = mInstantAppInstallerActivity; + return instantAppInstallerActivity != null + && instantAppInstallerActivity.getComponentName().equals(component); + } + + @Override + public void pruneInstantApps() { + mInstantAppRegistry.pruneInstantApps(snapshotComputer()); + } + + @Override public void pruneCachedApksInApex(@NonNull List<PackageInfo> apexPackages) { if (mCacheDir == null) { return; @@ -6215,12 +7606,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService final PackageCacher cacher = new PackageCacher(mCacheDir); synchronized (mLock) { - final Computer snapshot = snapshot(); for (int i = 0, size = apexPackages.size(); i < size; i++) { final List<String> apkNames = mApexManager.getApksInApex(apexPackages.get(i).packageName); for (int j = 0, apksInApex = apkNames.size(); j < apksInApex; j++) { - final AndroidPackage pkg = snapshot.getPackage(apkNames.get(j)); + final AndroidPackage pkg = getPackage(apkNames.get(j)); cacher.cleanCachedResult(new File(pkg.getPath())); } } @@ -6228,6 +7618,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public String getSetupWizardPackageName() { + return mSetupWizardPackage; + } + public void setExternalSourcesPolicy(ExternalSourcesPolicy policy) { if (policy != null) { mExternalSourcesPolicy = policy; @@ -6236,8 +7630,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public boolean isPackagePersistent(String packageName) { - final PackageStateInternal packageState = - snapshot().getPackageStateInternal(packageName); + final PackageStateInternal packageState = getPackageStateInternal(packageName); if (packageState == null) { return false; } @@ -6248,20 +7641,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public List<PackageInfo> getOverlayPackages(int userId) { - final Computer snapshot = snapshotComputer(); final ArrayList<PackageInfo> overlayPackages = new ArrayList<>(); - final ArrayMap<String, ? extends PackageStateInternal> packageStates = - snapshot.getPackageStates(); - for (int index = 0; index < packageStates.size(); index++) { - final PackageStateInternal packageState = packageStates.valueAt(index); + forEachPackageState(packageState -> { final AndroidPackage pkg = packageState.getPkg(); if (pkg != null && pkg.getOverlayTarget() != null) { - PackageInfo pkgInfo = snapshot.generatePackageInfo(packageState, 0, userId); + PackageInfo pkgInfo = generatePackageInfo(packageState, 0, userId); if (pkgInfo != null) { overlayPackages.add(pkgInfo); } } - } + }); return overlayPackages; } @@ -6269,7 +7658,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public List<String> getTargetPackageNames(int userId) { List<String> targetPackages = new ArrayList<>(); - PackageManagerService.this.forEachPackageState(snapshot(), packageState -> { + forEachPackageState(packageState -> { final AndroidPackage pkg = packageState.getPkg(); if (pkg != null && !pkg.isOverlay()) { targetPackages.add(pkg.getPackageName()); @@ -6287,6 +7676,30 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public ResolveInfo resolveIntent(Intent intent, String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, + @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int userId, + boolean resolveForStart, int filterCallingUid) { + return mResolveIntentHelper.resolveIntentInternal(snapshotComputer(), + intent, resolvedType, flags, privateResolveFlags, userId, resolveForStart, + filterCallingUid); + } + + @Override + public ResolveInfo resolveService(Intent intent, String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) { + return mResolveIntentHelper.resolveServiceInternal(snapshotComputer(), intent, + resolvedType, flags, userId, callingUid); + } + + @Override + public ProviderInfo resolveContentProvider(String name, + @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) { + return PackageManagerService.this.mComputer + .resolveContentProvider(name, flags, userId,callingUid); + } + + @Override public void addIsolatedUid(int isolatedUid, int ownerUid) { synchronized (mLock) { mIsolatedOwners.put(isolatedUid, ownerUid); @@ -6301,12 +7714,146 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public int getUidTargetSdkVersion(int uid) { + return PackageManagerService.this.getUidTargetSdkVersion(uid); + } + + @Override + public int getPackageTargetSdkVersion(String packageName) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState != null && packageState.getPkg() != null) { + return packageState.getPkg().getTargetSdkVersion(); + } + return Build.VERSION_CODES.CUR_DEVELOPMENT; + } + + @Override + public boolean canAccessInstantApps(int callingUid, int userId) { + return PackageManagerService.this.canViewInstantApps(callingUid, userId); + } + + @Override + public boolean canAccessComponent(int callingUid, @NonNull ComponentName component, + @UserIdInt int userId) { + return mComputer.canAccessComponent(callingUid, component, userId); + } + + @Override + public boolean hasInstantApplicationMetadata(String packageName, int userId) { + return mInstantAppRegistry.hasInstantApplicationMetadata(packageName, userId); + } + + @Override public void notifyPackageUse(String packageName, int reason) { synchronized (mLock) { PackageManagerService.this.notifyPackageUseInternal(packageName, reason); } } + @Override + public void onPackageProcessKilledForUninstall(String packageName) { + mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName, + true /* killApp */)); + } + + @Override + public SparseArray<String> getAppsWithSharedUserIds() { + return mComputer.getAppsWithSharedUserIds(); + } + + @Override + @NonNull + public String[] getSharedUserPackagesForPackage(String packageName, int userId) { + return mComputer.getSharedUserPackagesForPackage(packageName, userId); + } + + @Override + public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) { + return mComputer.getProcessesForUid(uid); + } + + @Override + public int[] getPermissionGids(String permissionName, int userId) { + return mPermissionManager.getPermissionGids(permissionName, userId); + } + + @Override + public boolean isOnlyCoreApps() { + return mIPackageManager.isOnlyCoreApps(); + } + + @Override + public void freeStorage(String volumeUuid, long bytes, + @StorageManager.AllocateFlags int flags) throws IOException { + PackageManagerService.this.freeStorage(volumeUuid, bytes, flags); + } + + @Override + public void freeAllAppCacheAboveQuota(@NonNull String volumeUuid) throws IOException { + PackageManagerService.this.freeAllAppCacheAboveQuota(volumeUuid); + } + + @Override + public void forEachPackageSetting(Consumer<PackageSetting> actionLocked) { + PackageManagerService.this.forEachPackageSetting(actionLocked); + } + + @Override + public void forEachPackageState(Consumer<PackageStateInternal> action) { + PackageManagerService.this.forEachPackageState(action); + } + + @Override + public void forEachPackage(Consumer<AndroidPackage> action) { + PackageManagerService.this.forEachPackage(action); + } + + @Override + public void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action, + @UserIdInt int userId) { + PackageManagerService.this.forEachInstalledPackage(action, userId); + } + + @Override + public ArraySet<String> getEnabledComponents(String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState == null) { + return new ArraySet<>(); + } + return packageState.getUserStateOrDefault(userId).getEnabledComponents(); + } + + @Override + public ArraySet<String> getDisabledComponents(String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState == null) { + return new ArraySet<>(); + } + return packageState.getUserStateOrDefault(userId).getDisabledComponents(); + } + + @Override + public @PackageManager.EnabledState int getApplicationEnabledState( + String packageName, int userId) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); + if (packageState == null) { + return COMPONENT_ENABLED_STATE_DEFAULT; + } + return packageState.getUserStateOrDefault(userId).getEnabledState(); + } + + @Override + public @PackageManager.EnabledState int getComponentEnabledSetting( + @NonNull ComponentName componentName, int callingUid, int userId) { + return PackageManagerService.this.mComputer.getComponentEnabledSettingInternal( + componentName, callingUid, userId); + } + + @Override + public void setEnableRollbackCode(int token, int enableRollbackCode) { + PackageManagerService.this.setEnableRollbackCode(token, enableRollbackCode); + } + /** * Ask the package manager to compile layouts in the given package. */ @@ -6322,6 +7869,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mArtManagerService.compileLayouts(pkg); } + @Override + public void finishPackageInstall(int token, boolean didLaunch) { + mIPackageManager.finishPackageInstall(token, didLaunch); + } + @Nullable @Override public String removeLegacyDefaultBrowserPackageName(int userId) { @@ -6331,6 +7883,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public boolean isApexPackage(String packageName) { + return PackageManagerService.this.mApexManager.isApexPackage(packageName); + } + + @Override + public List<String> getApksInApex(String apexPackageName) { + return PackageManagerService.this.mApexManager.getApksInApex(apexPackageName); + } + + @Override public void uninstallApex(String packageName, long versionCode, int userId, IntentSender intentSender, int flags) { final int callerUid = Binder.getCallingUid(); @@ -6405,6 +7967,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) { + return mComputer.isCallerInstallerOfRecord(pkg, callingUid); + } + + @Override public boolean isPermissionUpgradeNeeded(int userId) { return mSettings.isPermissionUpgradeNeeded(userId); } @@ -6418,9 +7985,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public List<String> getMimeGroup(String packageName, String mimeGroup) { + return PackageManagerService.this.getMimeGroupInternal(packageName, mimeGroup); + } + + @Override public void setVisibilityLogging(String packageName, boolean enable) { - final PackageStateInternal packageState = - snapshot().getPackageStateInternal(packageName); + final PackageStateInternal packageState = getPackageStateInternal(packageName); if (packageState == null) { throw new IllegalStateException("No package found for " + packageName); } @@ -6428,6 +7999,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public boolean isSystemPackage(@NonNull String packageName) { + return packageName.equals( + PackageManagerService.this.ensureSystemPackageName(packageName)); + } + + @Override public void clearBlockUninstallForUser(@UserIdInt int userId) { synchronized (mLock) { mSettings.clearBlockUninstallLPw(userId); @@ -6436,11 +8013,21 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override + public void unsuspendForSuspendingPackage(final String packageName, int affectedUser) { + PackageManagerService.this.unsuspendForSuspendingPackage(snapshotComputer(), + packageName, affectedUser); + } + + @Override + public boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { + return PackageManagerService.this.isSuspendingAnyPackages(suspendingPackage, userId); + } + + @Override public boolean registerInstalledLoadingProgressCallback(String packageName, PackageManagerInternal.InstalledLoadingProgressCallback callback, int userId) { - final Computer snapshot = snapshotComputer(); - final PackageStateInternal ps = filterPackageStateForInstalledAndFiltered(snapshot, - packageName, Binder.getCallingUid(), userId); + final PackageStateInternal ps = + getPackageStateInstalledFiltered(packageName, Binder.getCallingUid(), userId); if (ps == null) { return false; } @@ -6461,9 +8048,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public IncrementalStatesInfo getIncrementalStatesInfo( @NonNull String packageName, int filterCallingUid, int userId) { - final Computer snapshot = snapshotComputer(); - final PackageStateInternal ps = filterPackageStateForInstalledAndFiltered(snapshot, - packageName, filterCallingUid, userId); + final PackageStateInternal ps = + getPackageStateInstalledFiltered(packageName, filterCallingUid, userId); if (ps == null) { return null; } @@ -6471,23 +8057,74 @@ public class PackageManagerService implements PackageSender, TestUtilityService } @Override - public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) { - if (packageName == null) { - return false; - } + public void requestChecksums(@NonNull String packageName, boolean includeSplits, + @Checksum.TypeMask int optional, @Checksum.TypeMask int required, + @Nullable List trustedInstallers, + @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId, + @NonNull Executor executor, @NonNull Handler handler) { + requestChecksumsInternal(packageName, includeSplits, optional, required, + trustedInstallers, onChecksumsReadyListener, userId, executor, handler); + } - if (Process.isSdkSandboxUid(callingUid)) { - return packageName.equals(mRequiredSdkSandboxPackage); - } - Computer snapshot = snapshot(); - int uid = snapshot.getPackageUid(packageName, 0, userId); - return UserHandle.isSameApp(uid, callingUid); + @Override + public boolean isPackageFrozen(@NonNull String packageName, + int callingUid, int userId) { + return PackageManagerService.this.getPackageStartability( + packageName, callingUid, userId) == PACKAGE_STARTABILITY_FROZEN; } @Override - public void onPackageProcessKilledForUninstall(String packageName) { - mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName, - true /* killApp */)); + public long deleteOatArtifactsOfPackage(String packageName) { + return PackageManagerService.this.deleteOatArtifactsOfPackage(packageName); + } + + @Override + public void reconcileAppsData(int userId, @StorageManager.StorageFlags int flags, + boolean migrateAppsData) { + PackageManagerService.this.mAppDataHelper.reconcileAppsData(userId, flags, + migrateAppsData); + } + + @Override + @NonNull + public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) { + return PackageManagerService.this.mComputer.getSharedUserPackages(sharedUserAppId); + } + + @Override + @Nullable + public SharedUserApi getSharedUserApi(int sharedUserAppId) { + return mComputer.getSharedUser(sharedUserAppId); + } + + @NonNull + @Override + public PackageStateMutator.InitialState recordInitialState() { + return PackageManagerService.this.recordInitialState(); + } + + @Nullable + @Override + public PackageStateMutator.Result commitPackageStateMutation( + @Nullable PackageStateMutator.InitialState state, + @NonNull Consumer<PackageStateMutator> consumer) { + return PackageManagerService.this.commitPackageStateMutation(state, consumer); + } + + @NonNull + @Override + public Computer snapshot() { + return snapshotComputer(); + } + + @Override + public void shutdown() { + PackageManagerService.this.shutdown(); + } + + @Override + public DynamicCodeLogger getDynamicCodeLogger() { + return PackageManagerService.this.getDexManager().getDynamicCodeLogger(); } } @@ -6602,6 +8239,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mSettings.getDisabledSystemPkgLPr(packageName); } + @VisibleForTesting(visibility = Visibility.PRIVATE) + @Nullable + PackageStateInternal getPackageStateInternal(String packageName) { + return mComputer.getPackageStateInternal(packageName); + } + + @Nullable + PackageStateInternal getPackageStateInternal(String packageName, int callingUid) { + return mComputer.getPackageStateInternal(packageName, callingUid); + } + + @Nullable + PackageStateInternal getPackageStateInstalledFiltered(@NonNull String packageName, + int callingUid, @UserIdInt int userId) { + return filterPackageStateForInstalledAndFiltered(mComputer, packageName, callingUid, + userId); + } + @Nullable private PackageStateInternal filterPackageStateForInstalledAndFiltered( @NonNull Computer computer, @NonNull String packageName, int callingUid, @@ -6617,8 +8272,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - @Deprecated - void forEachPackageSetting(Consumer<PackageSetting> actionLocked) { + @Nullable + private PackageState getPackageState(String packageName) { + return mComputer.getPackageStateCopied(packageName); + } + + @NonNull + ArrayMap<String, ? extends PackageStateInternal> getPackageStates() { + Computer computer = snapshotComputer(); + if (computer == mLiveComputer) { + return new ArrayMap<>(computer.getPackageStates()); + } else { + return computer.getPackageStates(); + } + } + + private void forEachPackageSetting(Consumer<PackageSetting> actionLocked) { synchronized (mLock) { int size = mSettings.getPackagesLocked().size(); for (int index = 0; index < size; index++) { @@ -6627,13 +8296,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - void forEachPackageState(@NonNull Computer snapshot, Consumer<PackageStateInternal> consumer) { - forEachPackageState(snapshot.getPackageStates(), consumer); + void forEachPackageState(Consumer<PackageStateInternal> consumer) { + forEachPackageState(mComputer.getPackageStates(), consumer); } - void forEachPackage(@NonNull Computer snapshot, Consumer<AndroidPackage> consumer) { + void forEachPackage(Consumer<AndroidPackage> consumer) { final ArrayMap<String, ? extends PackageStateInternal> packageStates = - snapshot.getPackageStates(); + mComputer.getPackageStates(); int size = packageStates.size(); for (int index = 0; index < size; index++) { PackageStateInternal packageState = packageStates.valueAt(index); @@ -6653,7 +8322,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - void forEachInstalledPackage(@NonNull Computer snapshot, @NonNull Consumer<AndroidPackage> action, + void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action, @UserIdInt int userId) { Consumer<PackageStateInternal> actionWrapped = packageState -> { if (packageState.getPkg() != null @@ -6661,7 +8330,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService action.accept(packageState.getPkg()); } }; - forEachPackageState(snapshot.getPackageStates(), actionWrapped); + forEachPackageState(mComputer.getPackageStates(), actionWrapped); } boolean isHistoricalPackageUsageAvailable() { @@ -6676,7 +8345,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService return mCompilerStats.getOrCreatePackageStats(pkgName); } - void grantImplicitAccess(@NonNull Computer snapshot, @UserIdInt int userId, + /** + * Returns true if the system or user is explicitly preventing an otherwise valid installer to + * complete an install. This includes checks like unknown sources and user restrictions. + */ + public boolean isInstallDisabledForPackage(String packageName, int uid, int userId) { + return mComputer.isInstallDisabledForPackage(packageName, uid, userId); + } + + private void grantImplicitAccess(@NonNull Computer snapshot, @UserIdInt int userId, Intent intent, @AppIdInt int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) { final AndroidPackage visiblePackage = snapshot.getPackage(visibleUid); @@ -6707,8 +8384,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - boolean canHaveOatDir(@NonNull Computer snapshot, String packageName) { - final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + boolean canHaveOatDir(String packageName) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); if (packageState == null || packageState.getPkg() == null) { return false; } @@ -6716,8 +8393,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService packageState.getTransientState().isUpdatedSystemApp()); } - long deleteOatArtifactsOfPackage(@NonNull Computer snapshot, String packageName) { - PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + long deleteOatArtifactsOfPackage(String packageName) { + PackageStateInternal packageState = getPackageStateInternal(packageName); if (packageState == null || packageState.getPkg() == null) { return -1; // error code of deleteOptimizedFiles } @@ -6725,9 +8402,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService ArtUtils.createArtPackageInfo(packageState.getPkg(), packageState)); } - List<String> getMimeGroupInternal(@NonNull Computer snapshot, String packageName, - String mimeGroup) { - final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + @NonNull + Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) { + return mComputer.getUnusedPackages(downgradeTimeThresholdMillis); + } + + private List<String> getMimeGroupInternal(String packageName, String mimeGroup) { + final PackageStateInternal packageState = getPackageStateInternal(packageName); if (packageState == null) { return Collections.emptyList(); } @@ -6792,16 +8473,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService * Returns the array containing per-uid timeout configuration. * This is derived from DeviceConfig flags. */ - public @NonNull PerUidReadTimeouts[] getPerUidReadTimeouts(@NonNull Computer snapshot) { + public @NonNull PerUidReadTimeouts[] getPerUidReadTimeouts() { PerUidReadTimeouts[] result = mPerUidReadTimeoutsCache; if (result == null) { - result = parsePerUidReadTimeouts(snapshot); + result = parsePerUidReadTimeouts(); mPerUidReadTimeoutsCache = result; } return result; } - private @NonNull PerUidReadTimeouts[] parsePerUidReadTimeouts(@NonNull Computer snapshot) { + private @NonNull PerUidReadTimeouts[] parsePerUidReadTimeouts() { final String defaultTimeouts = getDefaultTimeouts(); final String knownDigestersList = getKnownDigestersList(); final List<PerPackageReadTimeouts> perPackageReadTimeouts = @@ -6815,8 +8496,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final List<PerUidReadTimeouts> result = new ArrayList<>(perPackageReadTimeouts.size()); for (int i = 0, size = perPackageReadTimeouts.size(); i < size; ++i) { final PerPackageReadTimeouts perPackage = perPackageReadTimeouts.get(i); - final PackageStateInternal ps = - snapshot.getPackageStateInternal(perPackage.packageName); + final PackageStateInternal ps = getPackageStateInternal(perPackage.packageName); if (ps == null) { if (DEBUG_PER_UID_READ_TIMEOUTS) { Slog.i(TAG, "PerUidReadTimeouts: package not found = " @@ -6866,7 +8546,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService return result.toArray(new PerUidReadTimeouts[result.size()]); } - void setKeepUninstalledPackagesInternal(@NonNull Computer snapshot, List<String> packageList) { + private void setKeepUninstalledPackagesInternal(List<String> packageList) { Preconditions.checkNotNull(packageList); synchronized (mKeepUninstalledPackages) { List<String> toRemove = new ArrayList<>(mKeepUninstalledPackages); @@ -6876,7 +8556,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService mKeepUninstalledPackages.addAll(packageList); for (int i = 0; i < toRemove.size(); i++) { - deletePackageIfUnused(snapshot, toRemove.get(i)); + deletePackageIfUnused(toRemove.get(i)); } } } @@ -6923,44 +8603,43 @@ public class PackageManagerService implements PackageSender, TestUtilityService mInstrumentation.put(name, instrumentation); } - String[] getKnownPackageNamesInternal(@NonNull Computer snapshot, int knownPackage, - int userId) { + String[] getKnownPackageNamesInternal(int knownPackage, int userId) { switch (knownPackage) { case PackageManagerInternal.PACKAGE_BROWSER: return new String[] { mDefaultAppProvider.getDefaultBrowser(userId) }; case PackageManagerInternal.PACKAGE_INSTALLER: - return snapshot.filterOnlySystemPackages(mRequiredInstallerPackage); + return mComputer.filterOnlySystemPackages(mRequiredInstallerPackage); case PackageManagerInternal.PACKAGE_UNINSTALLER: - return snapshot.filterOnlySystemPackages(mRequiredUninstallerPackage); + return mComputer.filterOnlySystemPackages(mRequiredUninstallerPackage); case PackageManagerInternal.PACKAGE_SETUP_WIZARD: - return snapshot.filterOnlySystemPackages(mSetupWizardPackage); + return mComputer.filterOnlySystemPackages(mSetupWizardPackage); case PackageManagerInternal.PACKAGE_SYSTEM: return new String[]{"android"}; case PackageManagerInternal.PACKAGE_VERIFIER: - return snapshot.filterOnlySystemPackages(mRequiredVerifierPackage); + return mComputer.filterOnlySystemPackages(mRequiredVerifierPackage); case PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER: - return snapshot.filterOnlySystemPackages( + return mComputer.filterOnlySystemPackages( mDefaultTextClassifierPackage, mSystemTextClassifierPackageName); case PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER: - return snapshot.filterOnlySystemPackages(mRequiredPermissionControllerPackage); + return mComputer.filterOnlySystemPackages(mRequiredPermissionControllerPackage); case PackageManagerInternal.PACKAGE_CONFIGURATOR: - return snapshot.filterOnlySystemPackages(mConfiguratorPackage); + return mComputer.filterOnlySystemPackages(mConfiguratorPackage); case PackageManagerInternal.PACKAGE_INCIDENT_REPORT_APPROVER: - return snapshot.filterOnlySystemPackages(mIncidentReportApproverPackage); + return mComputer.filterOnlySystemPackages(mIncidentReportApproverPackage); case PackageManagerInternal.PACKAGE_AMBIENT_CONTEXT_DETECTION: - return snapshot.filterOnlySystemPackages(mAmbientContextDetectionPackage); + return mComputer.filterOnlySystemPackages(mAmbientContextDetectionPackage); case PackageManagerInternal.PACKAGE_APP_PREDICTOR: - return snapshot.filterOnlySystemPackages(mAppPredictionServicePackage); + return mComputer.filterOnlySystemPackages(mAppPredictionServicePackage); case PackageManagerInternal.PACKAGE_COMPANION: - return snapshot.filterOnlySystemPackages(COMPANION_PACKAGE_NAME); + return mComputer.filterOnlySystemPackages(COMPANION_PACKAGE_NAME); case PackageManagerInternal.PACKAGE_RETAIL_DEMO: return TextUtils.isEmpty(mRetailDemoPackage) ? ArrayUtils.emptyArray(String.class) : new String[] {mRetailDemoPackage}; case PackageManagerInternal.PACKAGE_OVERLAY_CONFIG_SIGNATURE: - return snapshot.filterOnlySystemPackages(mOverlayConfigSignaturePackage); + return mComputer.filterOnlySystemPackages(getOverlayConfigSignaturePackageName()); case PackageManagerInternal.PACKAGE_RECENTS: - return snapshot.filterOnlySystemPackages(mRecentsPackage); + return mComputer.filterOnlySystemPackages(mRecentsPackage); default: return ArrayUtils.emptyArray(String.class); } @@ -6980,6 +8659,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService mDefaultAppProvider.setDefaultBrowser(packageName, async, userId); } + ResolveInfo getInstantAppInstallerInfo() { + return mInstantAppInstallerInfo; + } + PackageUsage getPackageUsage() { return mPackageUsage; } @@ -7071,6 +8754,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } + ResolveInfo getResolveInfo() { + return mResolveInfo; + } + ApplicationInfo getCoreAndroidApplication() { return mAndroidApplication; } diff --git a/services/core/java/com/android/server/pm/PackageSender.java b/services/core/java/com/android/server/pm/PackageSender.java index 656d5962e1a9..d380098d44b3 100644 --- a/services/core/java/com/android/server/pm/PackageSender.java +++ b/services/core/java/com/android/server/pm/PackageSender.java @@ -16,7 +16,6 @@ package com.android.server.pm; -import android.annotation.NonNull; import android.annotation.Nullable; import android.content.IIntentReceiver; import android.os.Bundle; @@ -31,9 +30,9 @@ interface PackageSender { Bundle extras, int flags, String targetPkg, IIntentReceiver finishedReceiver, int[] userIds, int[] instantUserIds, @Nullable SparseArray<int[]> broadcastAllowList, @Nullable Bundle bOptions); - void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName, - boolean sendBootCompleted, boolean includeStopped, int appId, int[] userIds, - int[] instantUserIds, int dataLoaderType); + void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted, + boolean includeStopped, int appId, int[] userIds, int[] instantUserIds, + int dataLoaderType); void notifyPackageAdded(String packageName, int uid); void notifyPackageChanged(String packageName, int uid); void notifyPackageRemoved(String packageName, int uid); diff --git a/services/core/java/com/android/server/pm/PreferredActivityHelper.java b/services/core/java/com/android/server/pm/PreferredActivityHelper.java index 9befd6e09eb4..7253ae4e7cb0 100644 --- a/services/core/java/com/android/server/pm/PreferredActivityHelper.java +++ b/services/core/java/com/android/server/pm/PreferredActivityHelper.java @@ -25,7 +25,6 @@ import static com.android.server.pm.PackageManagerService.DEBUG_PREFERRED; import static com.android.server.pm.PackageManagerService.TAG; import android.annotation.NonNull; -import android.annotation.UserIdInt; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; @@ -75,18 +74,17 @@ final class PreferredActivityHelper { mPm = pm; } - private ResolveInfo findPreferredActivityNotLocked(@NonNull Computer snapshot, Intent intent, - String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, - List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug, - @UserIdInt int userId) { - return findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, always, - removeMatches, debug, userId, + private ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType, + @PackageManager.ResolveInfoFlagsBits long flags, List<ResolveInfo> query, + boolean always, boolean removeMatches, boolean debug, int userId) { + return findPreferredActivityNotLocked( + intent, resolvedType, flags, query, always, removeMatches, debug, userId, UserHandle.getAppId(Binder.getCallingUid()) >= Process.FIRST_APPLICATION_UID); } // TODO: handle preferred activities missing while user has amnesia /** <b>must not hold {@link PackageManagerService.mLock}</b> */ - public ResolveInfo findPreferredActivityNotLocked(@NonNull Computer snapshot, + public ResolveInfo findPreferredActivityNotLocked( Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered) { @@ -97,7 +95,7 @@ final class PreferredActivityHelper { if (!mPm.mUserManager.exists(userId)) return null; PackageManagerService.FindPreferredActivityBodyResult body = - snapshot.findPreferredActivityInternal( + mPm.findPreferredActivityInternal( intent, resolvedType, flags, query, always, removeMatches, debug, userId, queryMayBeFiltered); if (body.mChanged) { @@ -119,7 +117,7 @@ final class PreferredActivityHelper { mPm.clearPackagePreferredActivitiesLPw(packageName, changedUsers, userId); } if (changedUsers.size() > 0) { - updateDefaultHomeNotLocked(mPm.snapshotComputer(), changedUsers); + updateDefaultHomeNotLocked(changedUsers); mPm.postPreferredActivityChangedBroadcast(userId); mPm.scheduleWritePackageRestrictions(userId); } @@ -130,7 +128,7 @@ final class PreferredActivityHelper { * * @return Whether the ACTION_PREFERRED_ACTIVITY_CHANGED broadcast has been scheduled. */ - public boolean updateDefaultHomeNotLocked(@NonNull Computer snapshot, @UserIdInt int userId) { + public boolean updateDefaultHomeNotLocked(int userId) { if (Thread.holdsLock(mPm.mLock)) { Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName() + " is holding mLock", new Throwable()); @@ -141,10 +139,10 @@ final class PreferredActivityHelper { // before that. return false; } - final Intent intent = snapshot.getHomeIntent(); - final List<ResolveInfo> resolveInfos = snapshot.queryIntentActivitiesInternal( + final Intent intent = mPm.getHomeIntent(); + final List<ResolveInfo> resolveInfos = mPm.snapshotComputer().queryIntentActivitiesInternal( intent, null, MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, userId); - final ResolveInfo preferredResolveInfo = findPreferredActivityNotLocked(snapshot, + final ResolveInfo preferredResolveInfo = findPreferredActivityNotLocked( intent, null, 0, resolveInfos, true, false, false, userId); final String packageName = preferredResolveInfo != null && preferredResolveInfo.activityInfo != null @@ -153,7 +151,8 @@ final class PreferredActivityHelper { if (TextUtils.equals(currentPackageName, packageName)) { return false; } - final String[] callingPackages = snapshot.getPackagesForUid(Binder.getCallingUid()); + final String[] callingPackages = mPm.mIPackageManager + .getPackagesForUid(Binder.getCallingUid()); if (callingPackages != null && ArrayUtils.contains(callingPackages, mPm.mRequiredPermissionControllerPackage)) { // PermissionController manages default home directly. @@ -175,21 +174,23 @@ final class PreferredActivityHelper { /** * Variant that takes a {@link WatchedIntentFilter} */ - public void addPreferredActivity(@NonNull Computer snapshot, WatchedIntentFilter filter, - int match, ComponentName[] set, ComponentName activity, boolean always, int userId, + public void addPreferredActivity(WatchedIntentFilter filter, int match, + ComponentName[] set, ComponentName activity, boolean always, int userId, String opname, boolean removeExisting) { // writer int callingUid = Binder.getCallingUid(); - snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, + mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, false /* checkShell */, "add preferred activity"); if (mPm.mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { - if (snapshot.getUidTargetSdkVersion(callingUid) - < Build.VERSION_CODES.FROYO) { - Slog.w(TAG, "Ignoring addPreferredActivity() from uid " - + callingUid); - return; + synchronized (mPm.mLock) { + if (mPm.getUidTargetSdkVersion(callingUid) + < Build.VERSION_CODES.FROYO) { + Slog.w(TAG, "Ignoring addPreferredActivity() from uid " + + callingUid); + return; + } } mPm.mContext.enforceCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); @@ -213,8 +214,7 @@ final class PreferredActivityHelper { new PreferredActivity(filter, match, set, activity, always)); mPm.scheduleWritePackageRestrictions(userId); } - // Re-snapshot after mLock - if (!(isHomeFilter(filter) && updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId))) { + if (!(isHomeFilter(filter) && updateDefaultHomeNotLocked(userId))) { mPm.postPreferredActivityChangedBroadcast(userId); } } @@ -222,8 +222,8 @@ final class PreferredActivityHelper { /** * Variant that takes a {@link WatchedIntentFilter} */ - public void replacePreferredActivity(@NonNull Computer snapshot, WatchedIntentFilter filter, - int match, ComponentName[] set, ComponentName activity, int userId) { + public void replacePreferredActivity(WatchedIntentFilter filter, int match, + ComponentName[] set, ComponentName activity, int userId) { if (filter.countActions() != 1) { throw new IllegalArgumentException( "replacePreferredActivity expects filter to have only 1 action."); @@ -238,14 +238,13 @@ final class PreferredActivityHelper { } final int callingUid = Binder.getCallingUid(); - snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, + mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, false /* checkShell */, "replace preferred activity"); if (mPm.mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { synchronized (mPm.mLock) { - // TODO: Remove lock? - if (mPm.snapshotComputer().getUidTargetSdkVersion(callingUid) + if (mPm.getUidTargetSdkVersion(callingUid) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring replacePreferredActivity() from uid " + Binder.getCallingUid()); @@ -297,23 +296,21 @@ final class PreferredActivityHelper { } } } - - // Retake a snapshot after editing with lock held - addPreferredActivity(mPm.snapshotComputer(), filter, match, set, activity, true, userId, + addPreferredActivity(filter, match, set, activity, true, userId, "Replacing preferred", false); } - public void clearPackagePreferredActivities(@NonNull Computer snapshot, String packageName) { + public void clearPackagePreferredActivities(String packageName) { final int callingUid = Binder.getCallingUid(); - if (snapshot.getInstantAppPackageName(callingUid) != null) { + if (mPm.getInstantAppPackageName(callingUid) != null) { return; } - final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); - if (packageState == null || !snapshot.isCallerSameApp(packageName, callingUid)) { + final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName); + if (packageState == null || !mPm.isCallerSameApp(packageName, callingUid)) { if (mPm.mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { - if (snapshot.getUidTargetSdkVersion(callingUid) + if (mPm.getUidTargetSdkVersion(callingUid) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring clearPackagePreferredActivities() from uid " + callingUid); @@ -323,7 +320,7 @@ final class PreferredActivityHelper { android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); } } - if (packageState != null && snapshot.shouldFilterApplication(packageState, callingUid, + if (packageState != null && mPm.shouldFilterApplication(packageState, callingUid, UserHandle.getUserId(callingUid))) { return; } @@ -332,23 +329,23 @@ final class PreferredActivityHelper { } /** <b>must not hold {@link #PackageManagerService.mLock}</b> */ - void updateDefaultHomeNotLocked(@NonNull Computer snapshot, SparseBooleanArray userIds) { + void updateDefaultHomeNotLocked(SparseBooleanArray userIds) { if (Thread.holdsLock(mPm.mLock)) { Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName() + " is holding mLock", new Throwable()); } for (int i = userIds.size() - 1; i >= 0; --i) { final int userId = userIds.keyAt(i); - updateDefaultHomeNotLocked(snapshot, userId); + updateDefaultHomeNotLocked(userId); } } - public void setHomeActivity(@NonNull Computer snapshot, ComponentName comp, int userId) { - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + public void setHomeActivity(ComponentName comp, int userId) { + if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) { return; } ArrayList<ResolveInfo> homeActivities = new ArrayList<>(); - snapshot.getHomeActivitiesAsUser(homeActivities, userId); + mPm.getHomeActivitiesAsUser(homeActivities, userId); boolean found = false; @@ -367,7 +364,7 @@ final class PreferredActivityHelper { throw new IllegalArgumentException("Component " + comp + " cannot be home on user " + userId); } - replacePreferredActivity(snapshot, getHomeFilter(), IntentFilter.MATCH_CATEGORY_EMPTY, + replacePreferredActivity(getHomeFilter(), IntentFilter.MATCH_CATEGORY_EMPTY, set, comp, userId); } @@ -404,7 +401,7 @@ final class PreferredActivityHelper { mPm.scheduleWritePackageRestrictions(userId); } if (isHomeFilter(filter)) { - updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId); + updateDefaultHomeNotLocked(userId); } mPm.postPreferredActivityChangedBroadcast(userId); } @@ -420,7 +417,7 @@ final class PreferredActivityHelper { changed = mPm.mSettings.clearPackagePersistentPreferredActivities(packageName, userId); } if (changed) { - updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId); + updateDefaultHomeNotLocked(userId); mPm.postPreferredActivityChangedBroadcast(userId); mPm.scheduleWritePackageRestrictions(userId); } @@ -509,7 +506,7 @@ final class PreferredActivityHelper { synchronized (mPm.mLock) { mPm.mSettings.readPreferredActivitiesLPw(readParser, readUserId); } - updateDefaultHomeNotLocked(mPm.snapshotComputer(), readUserId); + updateDefaultHomeNotLocked(readUserId); }); } catch (Exception e) { if (DEBUG_BACKUP) { @@ -601,7 +598,7 @@ final class PreferredActivityHelper { mPm.mPermissionManager.resetRuntimePermissions(pkg, userId); } } - updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId); + updateDefaultHomeNotLocked(userId); resetNetworkPolicies(userId); mPm.scheduleWritePackageRestrictions(userId); } finally { @@ -613,11 +610,12 @@ final class PreferredActivityHelper { mPm.mInjector.getLocalService(NetworkPolicyManagerInternal.class).resetUserState(userId); } - public int getPreferredActivities(@NonNull Computer snapshot, List<IntentFilter> outFilters, - List<ComponentName> outActivities, String packageName) { + // TODO: This method should not touch the Computer directly + public int getPreferredActivities(List<IntentFilter> outFilters, + List<ComponentName> outActivities, String packageName, Computer computer) { List<WatchedIntentFilter> temp = WatchedIntentFilter.toWatchedIntentFilterList(outFilters); - int result = getPreferredActivitiesInternal(snapshot, temp, outActivities, packageName); + int result = getPreferredActivitiesInternal(temp, outActivities, packageName, computer); outFilters.clear(); for (int i = 0; i < temp.size(); i++) { outFilters.add(temp.get(i).getIntentFilter()); @@ -628,17 +626,16 @@ final class PreferredActivityHelper { /** * Variant that takes a {@link WatchedIntentFilter} */ - private int getPreferredActivitiesInternal(@NonNull Computer snapshot, - List<WatchedIntentFilter> outFilters, List<ComponentName> outActivities, - String packageName) { + private int getPreferredActivitiesInternal(List<WatchedIntentFilter> outFilters, + List<ComponentName> outActivities, String packageName, Computer computer) { final int callingUid = Binder.getCallingUid(); - if (snapshot.getInstantAppPackageName(callingUid) != null) { + if (mPm.getInstantAppPackageName(callingUid) != null) { return 0; } int num = 0; final int userId = UserHandle.getCallingUserId(); - PreferredIntentResolver pir = snapshot.getPreferredActivities(userId); + PreferredIntentResolver pir = computer.getPreferredActivities(userId); if (pir != null) { final Iterator<PreferredActivity> it = pir.filterIterator(); while (it.hasNext()) { @@ -646,9 +643,8 @@ final class PreferredActivityHelper { final String prefPackageName = pa.mPref.mComponent.getPackageName(); if (packageName == null || (prefPackageName.equals(packageName) && pa.mPref.mAlways)) { - if (snapshot.shouldFilterApplication( - snapshot.getPackageStateInternal(prefPackageName), callingUid, - userId)) { + if (mPm.shouldFilterApplication( + mPm.getPackageStateInternal(prefPackageName), callingUid, userId)) { continue; } if (outFilters != null) { @@ -664,8 +660,7 @@ final class PreferredActivityHelper { return num; } - public ResolveInfo findPersistentPreferredActivity(@NonNull Computer snapshot, Intent intent, - int userId) { + public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) { if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.SYSTEM_UID)) { throw new SecurityException( "findPersistentPreferredActivity can only be run by the system"); @@ -676,23 +671,24 @@ final class PreferredActivityHelper { final int callingUid = Binder.getCallingUid(); intent = PackageManagerServiceUtils.updateIntentForResolve(intent); final String resolvedType = intent.resolveTypeIfNeeded(mPm.mContext.getContentResolver()); - final long flags = snapshot.updateFlagsForResolve( + final long flags = mPm.updateFlagsForResolve( 0, userId, callingUid, false /*includeInstantApps*/, - snapshot.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType, + mPm.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, 0)); - final List<ResolveInfo> query = snapshot.queryIntentActivitiesInternal(intent, + final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent, resolvedType, flags, userId); - return snapshot.findPersistentPreferredActivity(intent, resolvedType, flags, query, false, - userId); + synchronized (mPm.mLock) { + return mPm.findPersistentPreferredActivityLP(intent, resolvedType, flags, query, false, + userId); + } } /** * Variant that takes a {@link WatchedIntentFilter} */ - public void setLastChosenActivity(@NonNull Computer snapshot, Intent intent, - String resolvedType, int flags, WatchedIntentFilter filter, int match, - ComponentName activity) { - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + public void setLastChosenActivity(Intent intent, String resolvedType, int flags, + WatchedIntentFilter filter, int match, ComponentName activity) { + if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) { return; } final int userId = UserHandle.getCallingUserId(); @@ -706,26 +702,25 @@ final class PreferredActivityHelper { filter.dump(new PrintStreamPrinter(System.out), " "); } intent.setComponent(null); - final List<ResolveInfo> query = snapshot.queryIntentActivitiesInternal(intent, + final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent, resolvedType, flags, userId); // Find any earlier preferred or last chosen entries and nuke them - findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, false, true, - false, userId); + findPreferredActivityNotLocked( + intent, resolvedType, flags, query, false, true, false, userId); // Add the new activity as the last chosen for this filter - addPreferredActivity(snapshot, filter, match, null, activity, false, userId, + addPreferredActivity(filter, match, null, activity, false, userId, "Setting last chosen", false); } - public ResolveInfo getLastChosenActivity(@NonNull Computer snapshot, Intent intent, - String resolvedType, int flags) { - if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) { + public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) { + if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) { return null; } final int userId = UserHandle.getCallingUserId(); if (DEBUG_PREFERRED) Log.v(TAG, "Querying last chosen activity for " + intent); - final List<ResolveInfo> query = snapshot.queryIntentActivitiesInternal(intent, + final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent, resolvedType, flags, userId); - return findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, false, - false, false, userId); + return findPreferredActivityNotLocked( + intent, resolvedType, flags, query, false, false, false, userId); } } diff --git a/services/core/java/com/android/server/pm/PreferredComponent.java b/services/core/java/com/android/server/pm/PreferredComponent.java index 2a1ca2c41e64..4ec042f79052 100644 --- a/services/core/java/com/android/server/pm/PreferredComponent.java +++ b/services/core/java/com/android/server/pm/PreferredComponent.java @@ -57,6 +57,7 @@ public class PreferredComponent { private String mParseError; private final Callbacks mCallbacks; + private final String mSetupWizardPackageName; public interface Callbacks { public boolean onReadTag(String tagName, TypedXmlPullParser parser) @@ -71,6 +72,7 @@ public class PreferredComponent { mAlways = always; mShortComponent = component.flattenToShortString(); mParseError = null; + mSetupWizardPackageName = null; if (set != null) { final int N = set.length; String[] myPackages = new String[N]; @@ -172,6 +174,8 @@ public class PreferredComponent { mSetPackages = myPackages; mSetClasses = myClasses; mSetComponents = myComponents; + final PackageManagerInternal packageManagerInternal = LocalServices.getService(PackageManagerInternal.class); + mSetupWizardPackageName = packageManagerInternal.getSetupWizardPackageName(); } public String getParseError() { @@ -205,7 +209,6 @@ public class PreferredComponent { final int NQ = query.size(); final int NS = mSetPackages.length; final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); - String setupWizardPackageName = pmi.getSetupWizardPackageName(); int numMatch = 0; for (int i=0; i<NQ; i++) { ResolveInfo ri = query.get(i); @@ -214,7 +217,7 @@ public class PreferredComponent { // ignore SetupWizard package's launcher capability because it is only existed // during SetupWizard is running - if (excludeSetupWizardPackage && ai.packageName.equals(setupWizardPackageName)) { + if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) { continue; } @@ -304,8 +307,6 @@ public class PreferredComponent { if (!excludeSetupWizardPackage && NS < NQ) { return false; } - final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class); - String setupWizardPackageName = pmi.getSetupWizardPackageName(); for (int i=0; i<NQ; i++) { ResolveInfo ri = query.get(i); ActivityInfo ai = ri.activityInfo; @@ -313,7 +314,7 @@ public class PreferredComponent { // ignore SetupWizard package's launcher capability because it is only existed // during SetupWizard is running - if (excludeSetupWizardPackage && ai.packageName.equals(setupWizardPackageName)) { + if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) { continue; } diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java index b181cdd92379..88df843ec8c5 100644 --- a/services/core/java/com/android/server/pm/RemovePackageHelper.java +++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java @@ -118,8 +118,7 @@ final class RemovePackageHelper { public void removePackageLI(AndroidPackage pkg, boolean chatty) { // Remove the parent package setting - PackageStateInternal ps = mPm.snapshotComputer() - .getPackageStateInternal(pkg.getPackageName()); + PackageStateInternal ps = mPm.getPackageStateInternal(pkg.getPackageName()); if (ps != null) { removePackageLI(ps.getPackageName(), chatty); } else if (DEBUG_REMOVE && chatty) { @@ -272,8 +271,8 @@ final class RemovePackageHelper { synchronized (mPm.mLock) { mPm.mDomainVerificationManager.clearPackage(deletedPs.getPackageName()); mPm.mSettings.getKeySetManagerService().removeAppKeySetDataLPw(packageName); - mPm.mAppsFilter.removePackage(mPm.snapshotComputer() - .getPackageStateInternal(packageName), false /* isReplace */); + mPm.mAppsFilter.removePackage(mPm.getPackageStateInternal(packageName), + false /* isReplace */); removedAppId = mPm.mSettings.removePackageLPw(packageName); if (outInfo != null) { outInfo.mRemovedAppId = removedAppId; @@ -299,8 +298,7 @@ final class RemovePackageHelper { if (changedUsers.size() > 0) { final PreferredActivityHelper preferredActivityHelper = new PreferredActivityHelper(mPm); - preferredActivityHelper.updateDefaultHomeNotLocked(mPm.snapshotComputer(), - changedUsers); + preferredActivityHelper.updateDefaultHomeNotLocked(changedUsers); mPm.postPreferredActivityChangedBroadcast(UserHandle.USER_ALL); } } diff --git a/services/core/java/com/android/server/pm/ResolveIntentHelper.java b/services/core/java/com/android/server/pm/ResolveIntentHelper.java index b74670b77a11..25356a489217 100644 --- a/services/core/java/com/android/server/pm/ResolveIntentHelper.java +++ b/services/core/java/com/android/server/pm/ResolveIntentHelper.java @@ -115,7 +115,7 @@ final class ResolveIntentHelper { if (!mUserManager.exists(userId)) return null; final int callingUid = Binder.getCallingUid(); flags = computer.updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart, - computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, + computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, flags)); computer.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, false /*checkShell*/, "resolve intent"); @@ -170,9 +170,9 @@ final class ResolveIntentHelper { } // If we have saved a preference for a preferred activity for // this Intent, use that. - ResolveInfo ri = mPreferredActivityHelper.findPreferredActivityNotLocked(computer, - intent, resolvedType, flags, query, true, false, debug, - userId, queryMayBeFiltered); + ResolveInfo ri = mPreferredActivityHelper.findPreferredActivityNotLocked(intent, + resolvedType, flags, query, true, false, debug, userId, + queryMayBeFiltered); if (ri != null) { return ri; } @@ -317,7 +317,7 @@ final class ResolveIntentHelper { final String instantAppPkgName = computer.getInstantAppPackageName(filterCallingUid); flags = computer.updateFlagsForResolve(flags, userId, filterCallingUid, false /*includeInstantApps*/, - computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, + computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, flags)); Intent originalIntent = null; ComponentName comp = intent.getComponent(); @@ -562,7 +562,7 @@ final class ResolveIntentHelper { final int callingUid = Binder.getCallingUid(); flags = computer.updateFlagsForResolve(flags, userId, callingUid, false /*includeInstantApps*/, - computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, + computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType, flags)); computer.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/, false /*checkShell*/, "query intent activity options"); diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java index 479a404c88bf..3fe079034cf2 100644 --- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java +++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java @@ -741,11 +741,9 @@ public final class SharedLibrariesImpl implements SharedLibrariesRead, Watchable } SharedLibraryInfo libraryInfo = versionedLib.valueAt(libIdx); - final Computer snapshot = mPm.snapshotComputer(); - // Remove the shared library overlays from its dependent packages. for (int currentUserId : mPm.mUserManager.getUserIds()) { - final List<VersionedPackage> dependents = snapshot.getPackagesUsingSharedLibrary( + final List<VersionedPackage> dependents = mPm.getPackagesUsingSharedLibrary( libraryInfo, 0, Process.SYSTEM_UID, currentUserId); if (dependents == null) { continue; diff --git a/services/core/java/com/android/server/pm/StorageEventHelper.java b/services/core/java/com/android/server/pm/StorageEventHelper.java index df19d3e58bfd..bb7e55a4bf40 100644 --- a/services/core/java/com/android/server/pm/StorageEventHelper.java +++ b/services/core/java/com/android/server/pm/StorageEventHelper.java @@ -26,13 +26,13 @@ import static com.android.server.pm.PackageManagerService.SCAN_INITIAL; import static com.android.server.pm.PackageManagerService.TAG; import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo; -import android.annotation.NonNull; import android.app.ResourcesManager; import android.content.IIntentReceiver; import android.content.pm.PackageManager; import android.content.pm.PackagePartitions; import android.content.pm.UserInfo; import android.content.pm.VersionedPackage; +import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import android.os.Environment; import android.os.FileUtils; import android.os.UserHandle; @@ -48,7 +48,6 @@ import android.util.Slog; import com.android.internal.policy.AttributeCache; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.PackageStateInternal; -import com.android.server.pm.pkg.parsing.ParsingPackageUtils; import java.io.File; import java.util.ArrayList; @@ -79,7 +78,7 @@ public final class StorageEventHelper extends StorageEventListener { // Clean up any users or apps that were removed or recreated // while this volume was missing mPm.mUserManager.reconcileUsers(volumeUuid); - reconcileApps(mPm.snapshotComputer(), volumeUuid); + reconcileApps(volumeUuid); // Clean up any install sessions that expired or were // cancelled while this volume was missing @@ -300,8 +299,8 @@ public final class StorageEventHelper extends StorageEventListener { * aren't expected, either due to uninstallation or reinstallation on * another volume. */ - public void reconcileApps(@NonNull Computer snapshot, String volumeUuid) { - List<String> absoluteCodePaths = collectAbsoluteCodePaths(snapshot); + public void reconcileApps(String volumeUuid) { + List<String> absoluteCodePaths = collectAbsoluteCodePaths(); List<File> filesToDelete = null; final File[] files = FileUtils.listFilesOrEmpty( @@ -346,10 +345,10 @@ public final class StorageEventHelper extends StorageEventListener { } } - private List<String> collectAbsoluteCodePaths(@NonNull Computer snapshot) { + private List<String> collectAbsoluteCodePaths() { List<String> codePaths = new ArrayList<>(); final ArrayMap<String, ? extends PackageStateInternal> packageStates = - snapshot.getPackageStates(); + mPm.getPackageStates(); final int packageCount = packageStates.size(); for (int i = 0; i < packageCount; i++) { final PackageStateInternal ps = packageStates.valueAt(i); diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java index 588dfaf6db78..3ef5599385ce 100644 --- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java +++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java @@ -100,14 +100,14 @@ public final class SuspendPackageHelper { * @return The names of failed packages. */ @Nullable - String[] setPackagesSuspended(@NonNull Computer snapshot, @Nullable String[] packageNames, + String[] setPackagesSuspended(@NonNull Computer computer, @Nullable String[] packageNames, boolean suspended, @Nullable PersistableBundle appExtras, @Nullable PersistableBundle launcherExtras, @Nullable SuspendDialogInfo dialogInfo, @NonNull String callingPackage, @UserIdInt int userId, int callingUid) { if (ArrayUtils.isEmpty(packageNames)) { return packageNames; } - if (suspended && !isSuspendAllowedForUser(snapshot, userId, callingUid)) { + if (suspended && !isSuspendAllowedForUser(userId, callingUid)) { Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId); return packageNames; } @@ -123,7 +123,7 @@ public final class SuspendPackageHelper { ArraySet<String> modifiedPackages = new ArraySet<>(); final boolean[] canSuspend = suspended - ? canSuspendPackageForUser(snapshot, packageNames, userId, callingUid) : null; + ? canSuspendPackageForUser(computer, packageNames, userId, callingUid) : null; for (int i = 0; i < packageNames.length; i++) { final String packageName = packageNames[i]; if (callingPackage.equals(packageName)) { @@ -133,9 +133,9 @@ public final class SuspendPackageHelper { continue; } final PackageStateInternal packageState = - snapshot.getPackageStateInternal(packageName); + computer.getPackageStateInternal(packageName); if (packageState == null - || snapshot.shouldFilterApplication(packageState, callingUid, userId)) { + || computer.shouldFilterApplication(packageState, callingUid, userId)) { Slog.w(TAG, "Could not find package setting for package: " + packageName + ". Skipping suspending/un-suspending."); unmodifiablePackages.add(packageName); @@ -191,11 +191,9 @@ public final class SuspendPackageHelper { } }); - final Computer newSnapshot = mPm.snapshotComputer(); - if (!changedPackagesList.isEmpty()) { final String[] changedPackages = changedPackagesList.toArray(new String[0]); - sendPackagesSuspendedForUser(newSnapshot, + sendPackagesSuspendedForUser( suspended ? Intent.ACTION_PACKAGES_SUSPENDED : Intent.ACTION_PACKAGES_UNSUSPENDED, changedPackages, changedUids.toArray(), userId); @@ -204,7 +202,7 @@ public final class SuspendPackageHelper { } // Send the suspension changed broadcast to ensure suspension state is not stale. if (!modifiedPackages.isEmpty()) { - sendPackagesSuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, + sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, modifiedPackages.toArray(new String[0]), modifiedUids.toArray(), userId); } return unmodifiablePackages.toArray(new String[0]); @@ -219,14 +217,14 @@ public final class SuspendPackageHelper { * @return The names of packages which are Unsuspendable. */ @NonNull - String[] getUnsuspendablePackagesForUser(@NonNull Computer snapshot, + String[] getUnsuspendablePackagesForUser(@NonNull Computer computer, @NonNull String[] packageNames, @UserIdInt int userId, int callingUid) { - if (!isSuspendAllowedForUser(snapshot, userId, callingUid)) { + if (!isSuspendAllowedForUser(userId, callingUid)) { Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId); return packageNames; } final ArraySet<String> unactionablePackages = new ArraySet<>(); - final boolean[] canSuspend = canSuspendPackageForUser(snapshot, packageNames, userId, + final boolean[] canSuspend = canSuspendPackageForUser(computer, packageNames, userId, callingUid); for (int i = 0; i < packageNames.length; i++) { if (!canSuspend[i]) { @@ -234,7 +232,7 @@ public final class SuspendPackageHelper { continue; } final PackageStateInternal packageState = - snapshot.getPackageStateFiltered(packageNames[i], callingUid, userId); + computer.getPackageStateFiltered(packageNames[i], callingUid, userId); if (packageState == null) { Slog.w(TAG, "Could not find package setting for package: " + packageNames[i]); unactionablePackages.add(packageNames[i]); @@ -252,9 +250,8 @@ public final class SuspendPackageHelper { * @return The app extras of the suspended package. */ @Nullable - Bundle getSuspendedPackageAppExtras(@NonNull Computer snapshot, @NonNull String packageName, - int userId, int callingUid) { - final PackageStateInternal ps = snapshot.getPackageStateInternal(packageName, callingUid); + Bundle getSuspendedPackageAppExtras(@NonNull String packageName, int userId, int callingUid) { + final PackageStateInternal ps = mPm.getPackageStateInternal(packageName, callingUid); if (ps == null) { return null; } @@ -332,14 +329,12 @@ public final class SuspendPackageHelper { } }); - final Computer newSnapshot = mPm.snapshotComputer(); - mPm.scheduleWritePackageRestrictions(userId); if (!unsuspendedPackages.isEmpty()) { final String[] packageArray = unsuspendedPackages.toArray( new String[unsuspendedPackages.size()]); sendMyPackageSuspendedOrUnsuspended(packageArray, false, userId); - sendPackagesSuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_UNSUSPENDED, + sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_UNSUSPENDED, packageArray, unsuspendedUids.toArray(), userId); } } @@ -353,10 +348,10 @@ public final class SuspendPackageHelper { * @return The launcher extras. */ @Nullable - Bundle getSuspendedPackageLauncherExtras(@NonNull Computer snapshot, - @NonNull String packageName, int userId, int callingUid) { - final PackageStateInternal packageState = - snapshot.getPackageStateInternal(packageName, callingUid); + Bundle getSuspendedPackageLauncherExtras(@NonNull String packageName, int userId, + int callingUid) { + final PackageStateInternal packageState = mPm.getPackageStateInternal( + packageName, callingUid); if (packageState == null) { return null; } @@ -381,10 +376,9 @@ public final class SuspendPackageHelper { * @param callingUid The caller's uid. * @return {@code true}, if the given package is suspended. */ - boolean isPackageSuspended(@NonNull Computer snapshot, @NonNull String packageName, int userId, - int callingUid) { - final PackageStateInternal packageState = - snapshot.getPackageStateInternal(packageName, callingUid); + boolean isPackageSuspended(@NonNull String packageName, int userId, int callingUid) { + final PackageStateInternal packageState = mPm.getPackageStateInternal( + packageName, callingUid); return packageState != null && packageState.getUserStateOrDefault(userId) .isSuspended(); } @@ -398,9 +392,8 @@ public final class SuspendPackageHelper { * @return The name of suspending package. */ @Nullable - String getSuspendingPackage(@NonNull Computer snapshot, @NonNull String suspendedPackage, - int userId, int callingUid) { - final PackageStateInternal packageState = snapshot.getPackageStateInternal( + String getSuspendingPackage(@NonNull String suspendedPackage, int userId, int callingUid) { + final PackageStateInternal packageState = mPm.getPackageStateInternal( suspendedPackage, callingUid); if (packageState == null) { return null; @@ -431,10 +424,9 @@ public final class SuspendPackageHelper { * @return The dialog info. */ @Nullable - SuspendDialogInfo getSuspendedDialogInfo(@NonNull Computer snapshot, - @NonNull String suspendedPackage, @NonNull String suspendingPackage, int userId, - int callingUid) { - final PackageStateInternal packageState = snapshot.getPackageStateInternal( + SuspendDialogInfo getSuspendedDialogInfo(@NonNull String suspendedPackage, + @NonNull String suspendingPackage, int userId, int callingUid) { + final PackageStateInternal packageState = mPm.getPackageStateInternal( suspendedPackage, callingUid); if (packageState == null) { return null; @@ -462,9 +454,9 @@ public final class SuspendPackageHelper { * @param callingUid The caller's uid. * @return {@code true} if the user is allowed to suspend packages by the caller. */ - boolean isSuspendAllowedForUser(@NonNull Computer snapshot, int userId, int callingUid) { + boolean isSuspendAllowedForUser(int userId, int callingUid) { final UserManagerService userManager = mInjector.getUserManagerService(); - return isCallerDeviceOrProfileOwner(snapshot, userId, callingUid) + return isCallerDeviceOrProfileOwner(userId, callingUid) || (!userManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL, userId) && !userManager.hasUserRestriction(UserManager.DISALLOW_UNINSTALL_APPS, userId)); } @@ -479,23 +471,21 @@ public final class SuspendPackageHelper { * @return An array containing results of the checks */ @NonNull - boolean[] canSuspendPackageForUser(@NonNull Computer snapshot, @NonNull String[] packageNames, + boolean[] canSuspendPackageForUser(@NonNull Computer computer, @NonNull String[] packageNames, int userId, int callingUid) { final boolean[] canSuspend = new boolean[packageNames.length]; - final boolean isCallerOwner = isCallerDeviceOrProfileOwner(snapshot, userId, callingUid); + final boolean isCallerOwner = isCallerDeviceOrProfileOwner(userId, callingUid); final long token = Binder.clearCallingIdentity(); try { final DefaultAppProvider defaultAppProvider = mInjector.getDefaultAppProvider(); final String activeLauncherPackageName = defaultAppProvider.getDefaultHome(userId); final String dialerPackageName = defaultAppProvider.getDefaultDialer(userId); - final String requiredInstallerPackage = - getKnownPackageName(snapshot, PACKAGE_INSTALLER, userId); + final String requiredInstallerPackage = getKnownPackageName(PACKAGE_INSTALLER, userId); final String requiredUninstallerPackage = - getKnownPackageName(snapshot, PACKAGE_UNINSTALLER, userId); - final String requiredVerifierPackage = - getKnownPackageName(snapshot, PACKAGE_VERIFIER, userId); + getKnownPackageName(PACKAGE_UNINSTALLER, userId); + final String requiredVerifierPackage = getKnownPackageName(PACKAGE_VERIFIER, userId); final String requiredPermissionControllerPackage = - getKnownPackageName(snapshot, PACKAGE_PERMISSION_CONTROLLER, userId); + getKnownPackageName(PACKAGE_PERMISSION_CONTROLLER, userId); for (int i = 0; i < packageNames.length; i++) { canSuspend[i] = false; final String packageName = packageNames[i]; @@ -540,7 +530,7 @@ public final class SuspendPackageHelper { + "\": protected package"); continue; } - if (!isCallerOwner && snapshot.getBlockUninstall(userId, packageName)) { + if (!isCallerOwner && computer.getBlockUninstall(userId, packageName)) { Slog.w(TAG, "Cannot suspend package \"" + packageName + "\": blocked by admin"); continue; @@ -549,7 +539,7 @@ public final class SuspendPackageHelper { // Cannot suspend static shared libs as they are considered // a part of the using app (emulating static linking). Also // static libs are installed always on internal storage. - PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); + PackageStateInternal packageState = computer.getPackageStateInternal(packageName); AndroidPackage pkg = packageState == null ? null : packageState.getPkg(); if (pkg != null) { // Cannot suspend SDK libs as they are controlled by SDK manager. @@ -590,8 +580,8 @@ public final class SuspendPackageHelper { * @param userId The user where packages reside. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) - void sendPackagesSuspendedForUser(@NonNull Computer snapshot, @NonNull String intent, - @NonNull String[] pkgList, @NonNull int[] uidList, int userId) { + void sendPackagesSuspendedForUser(@NonNull String intent, @NonNull String[] pkgList, + @NonNull int[] uidList, int userId) { final List<List<String>> pkgsToSend = new ArrayList(pkgList.length); final List<IntArray> uidsToSend = new ArrayList(pkgList.length); final List<SparseArray<int[]>> allowListsToSend = new ArrayList(pkgList.length); @@ -602,8 +592,8 @@ public final class SuspendPackageHelper { final String pkgName = pkgList[i]; final int uid = uidList[i]; SparseArray<int[]> allowList = mInjector.getAppsFilter().getVisibilityAllowList( - snapshot.getPackageStateInternal(pkgName, SYSTEM_UID), - userIds, snapshot.getPackageStates()); + mPm.getPackageStateInternal(pkgName, SYSTEM_UID), + userIds, mPm.getPackageStates()); if (allowList == null) { allowList = new SparseArray<>(0); } @@ -638,22 +628,19 @@ public final class SuspendPackageHelper { } } - private String getKnownPackageName(@NonNull Computer snapshot, @KnownPackage int knownPackage, - int userId) { - final String[] knownPackages = - mPm.getKnownPackageNamesInternal(snapshot, knownPackage, userId); + private String getKnownPackageName(@KnownPackage int knownPackage, int userId) { + final String[] knownPackages = mPm.getKnownPackageNamesInternal(knownPackage, userId); return knownPackages.length > 0 ? knownPackages[0] : null; } - private boolean isCallerDeviceOrProfileOwner(@NonNull Computer snapshot, int userId, - int callingUid) { + private boolean isCallerDeviceOrProfileOwner(int userId, int callingUid) { if (callingUid == SYSTEM_UID) { return true; } final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId); if (ownerPackage != null) { - return callingUid == snapshot.getPackageUidInternal(ownerPackage, 0, userId, - callingUid); + return callingUid == mPm.getPackageUidInternal( + ownerPackage, 0, userId, callingUid); } return false; } @@ -672,10 +659,9 @@ public final class SuspendPackageHelper { return; } final int[] targetUserIds = new int[] {userId}; - final Computer snapshot = mPm.snapshotComputer(); for (String packageName : affectedPackages) { final Bundle appExtras = suspended - ? getSuspendedPackageAppExtras(snapshot, packageName, userId, SYSTEM_UID) + ? getSuspendedPackageAppExtras(packageName, userId, SYSTEM_UID) : null; final Bundle intentExtras; if (appExtras != null) { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index eae7658587f7..33476ed2678e 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -4148,11 +4148,11 @@ public class UserManagerService extends IUserManager.Stub { continue; } if (filter.direction == DefaultCrossProfileIntentFilter.Direction.TO_PARENT) { - mPm.addCrossProfileIntentFilter(mPm.snapshotComputer(), + mPm.addCrossProfileIntentFilter( filter.filter, mContext.getOpPackageName(), profileUserId, parentUserId, filter.flags); } else { - mPm.addCrossProfileIntentFilter(mPm.snapshotComputer(), + mPm.addCrossProfileIntentFilter( filter.filter, mContext.getOpPackageName(), parentUserId, profileUserId, filter.flags); } diff --git a/services/core/java/com/android/server/pm/WatchedIntentFilter.java b/services/core/java/com/android/server/pm/WatchedIntentFilter.java index 5d7a2a3bd426..30f276e8386a 100644 --- a/services/core/java/com/android/server/pm/WatchedIntentFilter.java +++ b/services/core/java/com/android/server/pm/WatchedIntentFilter.java @@ -84,7 +84,7 @@ public class WatchedIntentFilter } // Convert an {@link IntentFilter} to a {@link WatchedIntentFilter} - public WatchedIntentFilter(IntentFilter f) { + protected WatchedIntentFilter(IntentFilter f) { mFilter = new IntentFilter(f); } diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java index 7e4da945709b..e28a6ea8ea6b 100644 --- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java +++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java @@ -31,13 +31,13 @@ import android.content.pm.dex.ArtManagerInternal; import android.content.pm.dex.DexMetadataHelper; import android.content.pm.dex.ISnapshotRuntimeProfileCallback; import android.content.pm.dex.PackageOptimizationInfo; +import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import android.os.Binder; import android.os.Build; import android.os.Handler; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.system.Os; @@ -55,7 +55,6 @@ import com.android.server.pm.Installer; import com.android.server.pm.Installer.InstallerException; import com.android.server.pm.PackageManagerServiceCompilerMapping; import com.android.server.pm.parsing.pkg.AndroidPackage; -import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils; import dalvik.system.DexFile; import dalvik.system.VMRuntime; @@ -93,7 +92,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { private static final String BOOT_IMAGE_PROFILE_NAME = "android.prof"; private final Context mContext; - private IPackageManager mPackageManager; + private final IPackageManager mPackageManager; private final Object mInstallLock; @GuardedBy("mInstallLock") private final Installer mInstaller; @@ -104,9 +103,10 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { verifyTronLoggingConstants(); } - public ArtManagerService(Context context, Installer installer, + public ArtManagerService(Context context, IPackageManager pm, Installer installer, Object installLock) { mContext = context; + mPackageManager = pm; mInstaller = installer; mInstallLock = installLock; mHandler = new Handler(BackgroundThread.getHandler().getLooper()); @@ -114,15 +114,6 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { LocalServices.addService(ArtManagerInternal.class, new ArtManagerInternalImpl()); } - @NonNull - private IPackageManager getPackageManager() { - if (mPackageManager == null) { - mPackageManager = IPackageManager.Stub.asInterface( - ServiceManager.getService("package")); - } - return mPackageManager; - } - private boolean checkAndroidPermissions(int callingUid, String callingPackage) { // Callers always need this permission mContext.enforceCallingOrSelfPermission( @@ -166,7 +157,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { } PackageInfo info = null; try { - info = getPackageManager().getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0); + info = mPackageManager.getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0); } catch (RemoteException ignored) { // Should not happen. } @@ -230,7 +221,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { // TODO(calin): consider adding an API to PMS which can retrieve the // PackageParser.Package. - info = getPackageManager().getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0); + info = mPackageManager.getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0); } catch (RemoteException ignored) { // Should not happen. } diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java index 17109e97ddf1..5371454db43c 100644 --- a/services/core/java/com/android/server/pm/dex/DexManager.java +++ b/services/core/java/com/android/server/pm/dex/DexManager.java @@ -23,8 +23,6 @@ import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo; import static java.util.function.Function.identity; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; @@ -35,7 +33,6 @@ import android.os.BatteryManager; import android.os.FileUtils; import android.os.PowerManager; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserHandle; import android.os.storage.StorageManager; @@ -112,7 +109,7 @@ public class DexManager { // record class loaders or ISAs.) private final DynamicCodeLogger mDynamicCodeLogger; - private IPackageManager mPackageManager; + private final IPackageManager mPackageManager; private final PackageDexOptimizer mPackageDexOptimizer; private final Object mInstallLock; @GuardedBy("mInstallLock") @@ -131,22 +128,16 @@ public class DexManager { private static int DEX_SEARCH_FOUND_SPLIT = 2; // dex file is a split apk private static int DEX_SEARCH_FOUND_SECONDARY = 3; // dex file is a secondary dex - public DexManager(Context context, PackageDexOptimizer pdo, Installer installer, - Object installLock) { - this(context, pdo, installer, installLock, null); - } - - @VisibleForTesting - public DexManager(Context context, PackageDexOptimizer pdo, Installer installer, - Object installLock, @Nullable IPackageManager packageManager) { + public DexManager(Context context, IPackageManager pms, PackageDexOptimizer pdo, + Installer installer, Object installLock) { mContext = context; mPackageCodeLocationsCache = new HashMap<>(); mPackageDexUsage = new PackageDexUsage(); + mPackageManager = pms; mPackageDexOptimizer = pdo; mInstaller = installer; mInstallLock = installLock; - mDynamicCodeLogger = new DynamicCodeLogger(installer); - mPackageManager = packageManager; + mDynamicCodeLogger = new DynamicCodeLogger(pms, installer); // This is currently checked to handle tests that pass in a null context. // TODO(b/174783329): Modify the tests to pass in a mocked Context, PowerManager, @@ -166,15 +157,6 @@ public class DexManager { } } - @NonNull - private IPackageManager getPackageManager() { - if (mPackageManager == null) { - mPackageManager = IPackageManager.Stub.asInterface( - ServiceManager.getService("package")); - } - return mPackageManager; - } - public DynamicCodeLogger getDynamicCodeLogger() { return mDynamicCodeLogger; } @@ -547,7 +529,7 @@ public class DexManager { PackageInfo pkg; try { - pkg = getPackageManager().getPackageInfo(packageName, /*flags*/0, + pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0, dexUseInfo.getOwnerUserId()); } catch (RemoteException e) { throw new AssertionError(e); @@ -691,7 +673,7 @@ public class DexManager { // to get back the real app uid and its storage kind. These are only used // to perform extra validation in installd. // TODO(calin): maybe a bit overkill. - pkg = getPackageManager().getPackageInfo(packageName, /*flags*/0, + pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0, dexUseInfo.getOwnerUserId()); } catch (RemoteException ignore) { // Can't happen, DexManager is local. diff --git a/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java b/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java index 9b94e993f967..75b4e38e42f5 100644 --- a/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java +++ b/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java @@ -19,13 +19,11 @@ package com.android.server.pm.dex; import static com.android.server.pm.dex.PackageDynamicCodeLoading.FILE_TYPE_DEX; import static com.android.server.pm.dex.PackageDynamicCodeLoading.FILE_TYPE_NATIVE; -import android.annotation.NonNull; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.os.FileUtils; import android.os.RemoteException; -import android.os.ServiceManager; import android.os.UserHandle; import android.os.storage.StorageManager; import android.util.EventLog; @@ -60,30 +58,20 @@ public class DynamicCodeLogger { private static final String DCL_DEX_SUBTAG = "dcl"; private static final String DCL_NATIVE_SUBTAG = "dcln"; - private IPackageManager mPackageManager; + private final IPackageManager mPackageManager; private final PackageDynamicCodeLoading mPackageDynamicCodeLoading; private final Installer mInstaller; - DynamicCodeLogger(Installer installer) { - mInstaller = installer; - mPackageDynamicCodeLoading = new PackageDynamicCodeLoading(); + DynamicCodeLogger(IPackageManager pms, Installer installer) { + this(pms, installer, new PackageDynamicCodeLoading()); } @VisibleForTesting - DynamicCodeLogger(@NonNull IPackageManager packageManager, @NonNull Installer installer, - @NonNull PackageDynamicCodeLoading packageDynamicCodeLoading) { - mPackageManager = packageManager; - mInstaller = installer; + DynamicCodeLogger(IPackageManager pms, Installer installer, + PackageDynamicCodeLoading packageDynamicCodeLoading) { + mPackageManager = pms; mPackageDynamicCodeLoading = packageDynamicCodeLoading; - } - - @NonNull - private IPackageManager getPackageManager() { - if (mPackageManager == null) { - mPackageManager = IPackageManager.Stub.asInterface( - ServiceManager.getService("package")); - } - return mPackageManager; + mInstaller = installer; } public Set<String> getAllPackagesWithDynamicCodeLoading() { @@ -116,7 +104,7 @@ public class DynamicCodeLogger { try { PackageInfo ownerInfo = - getPackageManager().getPackageInfo(packageName, /*flags*/ 0, userId); + mPackageManager.getPackageInfo(packageName, /*flags*/ 0, userId); appInfo = ownerInfo == null ? null : ownerInfo.applicationInfo; } catch (RemoteException ignored) { // Can't happen, we're local. @@ -179,7 +167,7 @@ public class DynamicCodeLogger { loadingUid = appInfo.uid; } else { try { - loadingUid = getPackageManager().getPackageUid(loadingPackageName, /*flags*/ 0, + loadingUid = mPackageManager.getPackageUid(loadingPackageName, /*flags*/ 0, userId); } catch (RemoteException ignored) { // Can't happen, we're local. @@ -235,7 +223,7 @@ public class DynamicCodeLogger { public void recordNative(int loadingUid, String path) { String[] packages; try { - packages = getPackageManager().getPackagesForUid(loadingUid); + packages = mPackageManager.getPackagesForUid(loadingUid); if (packages == null || packages.length == 0) { return; } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 59b9daf709d8..60ede3bcda4d 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -36,6 +36,7 @@ import android.app.Notification; import android.app.StatusBarManager; import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; +import android.compat.annotation.EnabledAfter; import android.compat.annotation.EnabledSince; import android.content.ComponentName; import android.content.Context; @@ -135,6 +136,17 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @EnabledSince(targetSdkVersion = Build.VERSION_CODES.S) private static final long LOCK_DOWN_COLLAPSE_STATUS_BAR = 173031413L; + /** + * In apps targeting {@link android.os.Build.VERSION_CODES#TIRAMISU} or higher, calling + * {@link android.service.quicksettings.TileService#requestListeningState} will check that the + * calling package (uid) and the package of the target {@link android.content.ComponentName} + * match. It'll also make sure that the context used can take actions on behalf of the current + * user. + */ + @ChangeId + @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.S_V2) + static final long REQUEST_LISTENING_MUST_MATCH_PACKAGE = 172251878L; + private final Context mContext; private final Handler mHandler = new Handler(); @@ -1776,6 +1788,42 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override + public void requestTileServiceListeningState( + @NonNull ComponentName componentName, + int userId + ) { + int callingUid = Binder.getCallingUid(); + String packageName = componentName.getPackageName(); + + boolean mustPerformChecks = CompatChanges.isChangeEnabled( + REQUEST_LISTENING_MUST_MATCH_PACKAGE, callingUid); + + if (mustPerformChecks) { + // Check calling user can act on behalf of current user + userId = mActivityManagerInternal.handleIncomingUser(Binder.getCallingPid(), callingUid, + userId, false, ActivityManagerInternal.ALLOW_NON_FULL, + "requestTileServiceListeningState", packageName); + + // Check calling uid matches package + checkCallingUidPackage(packageName, callingUid, userId); + + int currentUser = mActivityManagerInternal.getCurrentUserId(); + + // Check current user + if (userId != currentUser) { + throw new IllegalArgumentException("User " + userId + " is not the current user."); + } + } + if (mBar != null) { + try { + mBar.requestTileServiceListeningState(componentName); + } catch (RemoteException e) { + Slog.e(TAG, "requestTileServiceListeningState", e); + } + } + } + + @Override public void requestAddTile( @NonNull ComponentName componentName, @NonNull CharSequence label, diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java index bd4b8d15f453..cc1d0e2ea6c8 100644 --- a/services/core/java/com/android/server/trust/TrustManagerService.java +++ b/services/core/java/com/android/server/trust/TrustManagerService.java @@ -715,7 +715,7 @@ public class TrustManagerService extends SystemService { (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0; List<ComponentName> enabledAgents = lockPatternUtils.getEnabledTrustAgents(userInfo.id); - if (enabledAgents == null) { + if (enabledAgents.isEmpty()) { if (DEBUG) Slog.d(TAG, "refreshAgentList: skipping user " + userInfo.id + ": no agents enabled by user"); continue; @@ -1080,9 +1080,7 @@ public class TrustManagerService extends SystemService { } List<ComponentName> previouslyEnabledAgents = utils.getEnabledTrustAgents(userId); - if (previouslyEnabledAgents != null) { - discoveredAgents.addAll(previouslyEnabledAgents); - } + discoveredAgents.addAll(previouslyEnabledAgents); utils.setEnabledTrustAgents(discoveredAgents, userId); Settings.Secure.putIntForUser(mContext.getContentResolver(), Settings.Secure.TRUST_AGENTS_INITIALIZED, 1, userId); diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 235533341433..94fc51dc94d2 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -3376,11 +3376,17 @@ class RootWindowContainer extends WindowContainer<DisplayContent> return new ArrayList<>(); } } else { + final RecentTasks recentTasks = mWindowManager.mAtmService.getRecentTasks(); + final int recentsComponentUid = recentTasks != null + ? recentTasks.getRecentsComponentUid() + : -1; final ArrayList<ActivityRecord> activities = new ArrayList<>(); - forAllRootTasks(rootTask -> { - if (!dumpVisibleRootTasksOnly || rootTask.shouldBeVisible(null)) { - activities.addAll(rootTask.getDumpActivitiesLocked(name, userId)); + forAllLeafTasks(task -> { + final boolean isRecents = (task.effectiveUid == recentsComponentUid); + if (!dumpVisibleRootTasksOnly || task.shouldBeVisible(null) || isRecents) { + activities.addAll(task.getDumpActivitiesLocked(name, userId)); } + return false; }); return activities; } diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java index 1cf4c1b0fbb2..5a2f28f4a365 100644 --- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java +++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java @@ -566,9 +566,14 @@ public class WindowManagerShellCommand extends ShellCommand { try (ZipOutputStream out = new ZipOutputStream(getRawOutputStream())) { ArrayList<Pair<String, ByteTransferPipe>> requestList = new ArrayList<>(); synchronized (mInternal.mGlobalLock) { + final RecentTasks recentTasks = mInternal.mAtmService.getRecentTasks(); + final int recentsComponentUid = recentTasks != null + ? recentTasks.getRecentsComponentUid() + : -1; // Request dump from all windows parallelly before writing to disk. mInternal.mRoot.forAllWindows(w -> { - if (w.isVisible()) { + final boolean isRecents = (w.getUid() == recentsComponentUid); + if (w.isVisible() || isRecents) { ByteTransferPipe pipe = null; try { pipe = new ByteTransferPipe(); diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp index 1c6a3b5eb03f..0cd949457cd1 100644 --- a/services/core/jni/onload.cpp +++ b/services/core/jni/onload.cpp @@ -106,7 +106,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) register_android_server_HardwarePropertiesManagerService(env); register_android_server_storage_AppFuse(env); register_android_server_SyntheticPasswordManager(env); - register_android_graphics_GraphicsStatsService(env); register_android_hardware_display_DisplayViewport(env); register_android_server_am_CachedAppOptimizer(env); register_android_server_am_LowMemDetector(env); diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java index 6f503c7dd941..8223b8c86c5b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java @@ -116,7 +116,7 @@ public final class BackgroundDexOptServiceUnitTest { when(mInjector.getDataDirStorageLowBytes()).thenReturn(STORAGE_LOW_BYTES); when(mInjector.getDexOptThermalCutoff()).thenReturn(PowerManager.THERMAL_STATUS_CRITICAL); when(mInjector.getCurrentThermalStatus()).thenReturn(PowerManager.THERMAL_STATUS_NONE); - when(mDexOptHelper.getOptimizablePackages(any())).thenReturn(DEFAULT_PACKAGE_LIST); + when(mDexOptHelper.getOptimizablePackages()).thenReturn(DEFAULT_PACKAGE_LIST); when(mDexOptHelper.performDexOptWithStatus(any())).thenReturn( PackageDexOptimizer.DEX_OPT_PERFORMED); @@ -158,7 +158,7 @@ public final class BackgroundDexOptServiceUnitTest { @Test public void testNoExecutionForNoOptimizablePackages() { initUntilBootCompleted(); - when(mDexOptHelper.getOptimizablePackages(any())).thenReturn(EMPTY_PACKAGE_LIST); + when(mDexOptHelper.getOptimizablePackages()).thenReturn(EMPTY_PACKAGE_LIST); assertThat(mService.onStartJob(mJobServiceForPostBoot, mJobParametersForPostBoot)).isFalse(); diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt index 537a0280e24b..13199032a223 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt @@ -157,7 +157,7 @@ class PackageManagerServiceHibernationTests { rule.system().validateFinalState() whenever(appHibernationManager.isHibernatingGlobally(TEST_PACKAGE_2_NAME)).thenReturn(true) - val optimizablePkgs = DexOptHelper(pm).getOptimizablePackages(pm.snapshotComputer()) + val optimizablePkgs = DexOptHelper(pm).optimizablePackages assertTrue(optimizablePkgs.contains(TEST_PACKAGE_NAME)) assertFalse(optimizablePkgs.contains(TEST_PACKAGE_2_NAME)) diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt index 1515282812c2..b063d22de2bb 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt @@ -85,7 +85,6 @@ class SharedLibrariesImplTest { private lateinit var mSharedLibrariesImpl: SharedLibrariesImpl private lateinit var mPms: PackageManagerService private lateinit var mSettings: Settings - private lateinit var mComputer: Computer @Mock private lateinit var mDeletePackageHelper: DeletePackageHelper @@ -115,16 +114,22 @@ class SharedLibrariesImplTest { mSharedLibrariesImpl.setDeletePackageHelper(mDeletePackageHelper) addExistingSharedLibraries() - mComputer = mock { - whenever(sharedLibraries) { mSharedLibrariesImpl.sharedLibraries } - whenever(resolveInternalPackageName(anyString(), anyLong())) { arguments[0] } - } - whenever(mSettings.getPackageLPr(any())) { mExistingSettings[arguments[0]] } whenever(mRule.mocks().injector.getSystemService(StorageManager::class.java)) .thenReturn(mStorageManager) whenever(mStorageManager.findPathForUuid(nullable())).thenReturn(mFile) - doAnswer { mComputer }.`when`(mPms).snapshotComputer() + doAnswer { it.arguments[0] }.`when`(mPms).resolveInternalPackageName(any(), any()) + doAnswer { + mockThrowOnUnmocked<Computer> { + whenever(sharedLibraries) { mSharedLibrariesImpl.sharedLibraries } + whenever(resolveInternalPackageName(anyString(), anyLong())) { + mPms.resolveInternalPackageName(getArgument(0), getArgument(1)) + } + whenever(getPackageStateInternal(anyString())) { + mPms.getPackageStateInternal(getArgument(0)) + } + } + }.`when`(mPms).snapshotComputer() whenever(mDeletePackageHelper.deletePackageX(any(), any(), any(), any(), any())) .thenReturn(PackageManager.DELETE_SUCCEEDED) whenever(mRule.mocks().injector.compatibility).thenReturn(mPlatformCompat) @@ -184,8 +189,7 @@ class SharedLibrariesImplTest { @Test fun removeSharedLibrary() { - doAnswer { mutableListOf(VersionedPackage(CONSUMER_PACKAGE_NAME, 1L)) } - .`when`(mComputer) + doAnswer { mutableListOf(VersionedPackage(CONSUMER_PACKAGE_NAME, 1L)) }.`when`(mPms) .getPackagesUsingSharedLibrary(any(), any(), any(), any()) val staticInfo = mSharedLibrariesImpl .getSharedLibraryInfo(STATIC_LIB_NAME, STATIC_LIB_VERSION)!! diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt index 4818573e9ae5..5230ea7304c8 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt @@ -104,9 +104,9 @@ class SuspendPackageHelperTest { pms, rule.mocks().injector, broadcastHelper, protectedPackages) defaultAppProvider = rule.mocks().defaultAppProvider testHandler = rule.mocks().handler - packageSetting1 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_1)!! - packageSetting2 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_2)!! - ownerSetting = pms.snapshotComputer().getPackageStateInternal(DEVICE_OWNER_PACKAGE)!! + packageSetting1 = pms.getPackageStateInternal(TEST_PACKAGE_1)!! + packageSetting2 = pms.getPackageStateInternal(TEST_PACKAGE_2)!! + ownerSetting = pms.getPackageStateInternal(DEVICE_OWNER_PACKAGE)!! deviceOwnerUid = UserHandle.getUid(TEST_USER_ID, ownerSetting.appId) packagesToSuspend = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2) uidsToSuspend = intArrayOf(packageSetting1.appId, packageSetting2.appId) @@ -270,7 +270,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - val result = suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), + val result = suspendPackageHelper.getSuspendedPackageAppExtras( TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)!! assertThat(result.getString(TEST_PACKAGE_1)).isEqualTo(TEST_PACKAGE_1) @@ -286,13 +286,13 @@ class SuspendPackageHelperTest { null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid) testHandler.flush() assertThat(failedNames).isEmpty() - assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), + assertThat(suspendPackageHelper.getSuspendingPackage( TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) - assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), + assertThat(suspendPackageHelper.getSuspendingPackage( TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) - assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), + assertThat(suspendPackageHelper.getSuspendedPackageAppExtras( TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNotNull() - assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), + assertThat(suspendPackageHelper.getSuspendedPackageAppExtras( TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNotNull() suspendPackageHelper.removeSuspensionsBySuspendingPackage(pms.snapshotComputer(), @@ -311,13 +311,13 @@ class SuspendPackageHelperTest { nullable(), nullable(), any(), eq(TEST_PACKAGE_2), nullable(), any(), any(), nullable(), nullable()) - assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), + assertThat(suspendPackageHelper.getSuspendingPackage( TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNull() - assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), + assertThat(suspendPackageHelper.getSuspendingPackage( TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNull() - assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), + assertThat(suspendPackageHelper.getSuspendedPackageAppExtras( TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNull() - assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), + assertThat(suspendPackageHelper.getSuspendedPackageAppExtras( TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNull() } @@ -331,7 +331,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - val result = suspendPackageHelper.getSuspendedPackageLauncherExtras(pms.snapshotComputer(), + val result = suspendPackageHelper.getSuspendedPackageLauncherExtras( TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)!! assertThat(result.getString(TEST_PACKAGE_2)).isEqualTo(TEST_PACKAGE_2) @@ -346,7 +346,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - assertThat(suspendPackageHelper.isPackageSuspended(pms.snapshotComputer(), + assertThat(suspendPackageHelper.isPackageSuspended( TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isTrue() } @@ -360,7 +360,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), + assertThat(suspendPackageHelper.getSuspendingPackage( TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) } @@ -375,7 +375,7 @@ class SuspendPackageHelperTest { testHandler.flush() assertThat(failedNames).isEmpty() - val result = suspendPackageHelper.getSuspendedDialogInfo(pms.snapshotComputer(), + val result = suspendPackageHelper.getSuspendedDialogInfo( TEST_PACKAGE_1, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)!! assertThat(result.title).isEqualTo(TEST_PACKAGE_1) @@ -387,8 +387,8 @@ class SuspendPackageHelperTest { mockAllowList(packageSetting1, allowList(10001, 10002, 10003)) mockAllowList(packageSetting2, allowList(10001, 10002, 10003)) - suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(), - Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID) + suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED, + packagesToSuspend, uidsToSuspend, TEST_USER_ID) testHandler.flush() verify(broadcastHelper).sendPackageBroadcast(any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(), nullable(), any(), nullable()) @@ -406,8 +406,8 @@ class SuspendPackageHelperTest { mockAllowList(packageSetting1, allowList(10001, 10002, 10003)) mockAllowList(packageSetting2, allowList(10001, 10002, 10007)) - suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(), - Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID) + suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED, + packagesToSuspend, uidsToSuspend, TEST_USER_ID) testHandler.flush() verify(broadcastHelper, times(2)).sendPackageBroadcast( any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(), @@ -429,8 +429,8 @@ class SuspendPackageHelperTest { mockAllowList(packageSetting1, allowList(10001, 10002, 10003)) mockAllowList(packageSetting2, null) - suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(), - Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID) + suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED, + packagesToSuspend, uidsToSuspend, TEST_USER_ID) testHandler.flush() verify(broadcastHelper, times(2)).sendPackageBroadcast( any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(), @@ -449,9 +449,8 @@ class SuspendPackageHelperTest { @Test @Throws(Exception::class) fun sendPackagesSuspendModifiedForUser() { - suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(), - Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, packagesToSuspend, uidsToSuspend, - TEST_USER_ID) + suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, + packagesToSuspend, uidsToSuspend, TEST_USER_ID) testHandler.flush() verify(broadcastHelper).sendPackageBroadcast( eq(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED), nullable(), bundleCaptor.capture(), @@ -484,13 +483,13 @@ class SuspendPackageHelperTest { Mockito.doReturn(DIALER_PACKAGE).`when`(defaultAppProvider) .getDefaultDialer(eq(TEST_USER_ID)) Mockito.doReturn(arrayOf(INSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( - any(), eq(PackageManagerInternal.PACKAGE_INSTALLER), eq(TEST_USER_ID)) + eq(PackageManagerInternal.PACKAGE_INSTALLER), eq(TEST_USER_ID)) Mockito.doReturn(arrayOf(UNINSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( - any(), eq(PackageManagerInternal.PACKAGE_UNINSTALLER), eq(TEST_USER_ID)) + eq(PackageManagerInternal.PACKAGE_UNINSTALLER), eq(TEST_USER_ID)) Mockito.doReturn(arrayOf(VERIFIER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal( - any(), eq(PackageManagerInternal.PACKAGE_VERIFIER), eq(TEST_USER_ID)) + eq(PackageManagerInternal.PACKAGE_VERIFIER), eq(TEST_USER_ID)) Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms) - .getKnownPackageNamesInternal(any(), + .getKnownPackageNamesInternal( eq(PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID)) } diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java b/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java index 9d269719db64..8abe46fab1d6 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java @@ -159,8 +159,8 @@ public class DexManagerTests { .when(mockContext) .getSystemService(PowerManager.class); - mDexManager = new DexManager(mockContext, /*PackageDexOptimizer*/ null, - mInstaller, mInstallLock, mPM); + mDexManager = new DexManager(mockContext, mPM, /*PackageDexOptimizer*/ null, + mInstaller, mInstallLock); // Foo and Bar are available to user0. // Only Bar is available to user1; diff --git a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java index 4de15c87dcc1..928c76d07d7c 100644 --- a/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java +++ b/services/tests/servicestests/src/com/android/server/job/JobStoreTest.java @@ -330,11 +330,12 @@ public class JobStoreTest { @Test public void testPriorityPersisted() throws Exception { - final JobInfo.Builder b = new Builder(92, mComponent) + final JobInfo job = new Builder(92, mComponent) .setOverrideDeadline(5000) .setPriority(JobInfo.PRIORITY_MIN) - .setPersisted(true); - final JobStatus js = JobStatus.createFromJobInfo(b.build(), SOME_UID, null, -1, null); + .setPersisted(true) + .build(); + final JobStatus js = JobStatus.createFromJobInfo(job, SOME_UID, null, -1, null); mTaskStoreUnderTest.add(js); waitForPendingIo(); @@ -342,7 +343,7 @@ public class JobStoreTest { mTaskStoreUnderTest.readJobMapFromDisk(jobStatusSet, true); final JobStatus loaded = jobStatusSet.getAllJobs().iterator().next(); assertEquals("Priority not correctly persisted.", - JobInfo.PRIORITY_MIN, loaded.getEffectivePriority()); + JobInfo.PRIORITY_MIN, job.getPriority()); } /** diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java index 946108d607db..050b224bf7f7 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java @@ -23,10 +23,11 @@ import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.fail; import static java.lang.reflect.Modifier.isFinal; +import static java.lang.reflect.Modifier.isPrivate; +import static java.lang.reflect.Modifier.isProtected; import static java.lang.reflect.Modifier.isPublic; import static java.lang.reflect.Modifier.isStatic; -import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppGlobals; import android.content.IIntentReceiver; @@ -62,6 +63,7 @@ import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.regex.Pattern; @@ -99,7 +101,7 @@ public class PackageManagerServiceTest { @Nullable Bundle bOptions) { } - public void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName, + public void sendPackageAddedForNewUsers(String packageName, boolean sendBootComplete, boolean includeStopped, int appId, int[] userIds, int[] instantUserIds, int dataLoaderType) { } @@ -454,6 +456,147 @@ public class PackageManagerServiceTest { return null; } + // Return the boolean locked value. A null return means the annotation was not + // found. This method will fail if the annotation is found but is not one of the + // known constants. + private Boolean getOverride(Method m) { + final String name = "Computer." + displayName(m); + final Computer.LiveImplementation annotation = + m.getAnnotation(Computer.LiveImplementation.class); + if (annotation == null) { + return null; + } + final int override = annotation.override(); + if (override == Computer.LiveImplementation.MANDATORY) { + return true; + } else if (override == Computer.LiveImplementation.NOT_ALLOWED) { + return false; + } else { + flag(name, "invalid Live value: " + override); + return null; + } + } + + @Test + public void testComputerStructure() { + // Verify that Copmuter methods are properly annotated and that ComputerLocked is + // properly populated per annotations. + // Call PackageManagerService.validateComputer(); + Class base = Computer.class; + + HashMap<Method, Boolean> methodType = new HashMap<>(); + + // Verify that all Computer methods are annotated and that the annotation + // parameter locked() is valid. + for (Method m : base.getDeclaredMethods()) { + final String name = "Computer." + displayName(m); + Boolean override = getOverride(m); + if (override == null) { + flag(name, "missing required Live annotation"); + } + methodType.put(m, override); + } + + Class coreClass = ComputerEngine.class; + final Method[] coreMethods = coreClass.getDeclaredMethods(); + + // Examine every method in the core. If it inherits from a base method it must be + // "public final" if the base is NOT_ALLOWED or "public" if the base is MANDATORY. + // If the core method does not inherit from the base then it must be either + // private or protected. + for (Method m : base.getDeclaredMethods()) { + String name = "Computer." + displayName(m); + final boolean locked = methodType.get(m); + final Method core = matchMethod(m, coreMethods); + if (core == null) { + flag(name, "not overridden in ComputerEngine"); + continue; + } + name = "ComputerEngine." + displayName(m); + final int modifiers = core.getModifiers(); + if (!locked) { + if (!isPublic(modifiers)) { + flag(name, "is not public"); + } + if (!isFinal(modifiers)) { + flag(name, "is not final"); + } + } + } + // Any methods left in the coreMethods array must be private or protected. + // Protected methods must be overridden (and final) in the live list. + Method[] coreHelpers = new Method[coreMethods.length]; + int coreIndex = 0; + for (Method m : coreMethods) { + if (m != null) { + final String name = "ComputerEngine." + displayName(m); + if (name.contains(".lambda$static")) { + // skip static lambda function + continue; + } + + final int modifiers = m.getModifiers(); + if (isPrivate(modifiers)) { + // Okay + } else if (isProtected(modifiers)) { + coreHelpers[coreIndex++] = m; + } else { + flag(name, "is neither private nor protected"); + } + } + } + + Class liveClass = ComputerLocked.class; + final Method[] liveMethods = liveClass.getDeclaredMethods(); + + // Examine every method in the live list. Every method must be final and must + // inherit either from base or core. If the method inherits from a base method + // then the base must be MANDATORY. + for (Method m : base.getDeclaredMethods()) { + String name = "Computer." + displayName(m); + final boolean locked = methodType.get(m); + final Method live = matchMethod(m, liveMethods); + if (live == null) { + if (locked) { + flag(name, "not overridden in ComputerLocked"); + } + continue; + } + if (!locked) { + flag(name, "improperly overridden in ComputerLocked"); + continue; + } + + name = "ComputerLocked." + displayName(m); + final int modifiers = live.getModifiers(); + if (!locked) { + if (!isPublic(modifiers)) { + flag(name, "is not public"); + } + if (!isFinal(modifiers)) { + flag(name, "is not final"); + } + } + } + for (Method m : coreHelpers) { + if (m == null) { + continue; + } + String name = "ComputerLocked." + displayName(m); + final Method live = matchMethod(m, liveMethods); + if (live == null) { + flag(name, "is not overridden in ComputerLocked"); + continue; + } + } + for (Method m : liveMethods) { + if (m != null) { + String name = "ComputerLocked." + displayName(m); + flag(name, "illegal local method"); + } + } + } + private static PerPackageReadTimeouts[] getPerPackageReadTimeouts(String knownDigestersList) { final String defaultTimeouts = "3600000001:3600000002:3600000003"; List<PerPackageReadTimeouts> result = PerPackageReadTimeouts.parseDigestersList( diff --git a/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java index 1442f1c82d42..d76a1de1b1b0 100644 --- a/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java @@ -23,9 +23,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertThrows; import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.argThat; import static org.mockito.Mockito.eq; @@ -37,6 +39,7 @@ import static org.mockito.Mockito.when; import android.Manifest; import android.app.ActivityManagerInternal; import android.app.StatusBarManager; +import android.compat.testing.PlatformCompatChangeRule; import android.content.ComponentName; import android.content.Intent; import android.content.om.IOverlayManager; @@ -62,10 +65,13 @@ import com.android.server.LocalServices; import com.android.server.policy.GlobalActionsProvider; import com.android.server.wm.ActivityTaskManagerInternal; +import libcore.junit.util.compat.CoreCompatChangeRule; + import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.ArgumentCaptor; @@ -73,6 +79,7 @@ import org.mockito.ArgumentMatcher; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; @RunWith(JUnit4.class) public class StatusBarManagerServiceTest { @@ -88,6 +95,9 @@ public class StatusBarManagerServiceTest { public final TestableContext mContext = new NoBroadcastContextWrapper(InstrumentationRegistry.getContext()); + @Rule + public TestRule mCompatChangeRule = new PlatformCompatChangeRule(); + @Mock private ActivityTaskManagerInternal mActivityTaskManagerInternal; @Mock @@ -127,6 +137,7 @@ public class StatusBarManagerServiceTest { when(mMockStatusBar.asBinder()).thenReturn(mMockStatusBar); when(mApplicationInfo.loadLabel(any())).thenReturn(APP_NAME); + mockHandleIncomingUser(); mStatusBarManagerService = new StatusBarManagerService(mContext); LocalServices.removeServiceForTest(StatusBarManagerInternal.class); @@ -142,6 +153,80 @@ public class StatusBarManagerServiceTest { } @Test + @CoreCompatChangeRule.EnableCompatChanges( + {StatusBarManagerService.REQUEST_LISTENING_MUST_MATCH_PACKAGE}) + public void testRequestActive_changeEnabled_OKCall() throws RemoteException { + int user = 0; + mockEverything(user); + mStatusBarManagerService.requestTileServiceListeningState(TEST_COMPONENT, user); + + verify(mMockStatusBar).requestTileServiceListeningState(TEST_COMPONENT); + } + + @Test + @CoreCompatChangeRule.EnableCompatChanges( + {StatusBarManagerService.REQUEST_LISTENING_MUST_MATCH_PACKAGE}) + public void testRequestActive_changeEnabled_differentPackage_fail() throws RemoteException { + when(mPackageManagerInternal.getPackageUid(TEST_PACKAGE, 0L, mContext.getUserId())) + .thenReturn(Binder.getCallingUid() + 1); + try { + mStatusBarManagerService.requestTileServiceListeningState(TEST_COMPONENT, 0); + fail("Should cause security exception"); + } catch (SecurityException e) { } + verify(mMockStatusBar, never()).requestTileServiceListeningState(TEST_COMPONENT); + } + + @Test + @CoreCompatChangeRule.EnableCompatChanges( + {StatusBarManagerService.REQUEST_LISTENING_MUST_MATCH_PACKAGE}) + public void testRequestActive_changeEnabled_notCurrentUser_fail() throws RemoteException { + mockUidCheck(); + int user = 0; + mockCurrentUserCheck(user); + try { + mStatusBarManagerService.requestTileServiceListeningState(TEST_COMPONENT, user + 1); + fail("Should cause illegal argument exception"); + } catch (IllegalArgumentException e) { } + + // Do not call into SystemUI + verify(mMockStatusBar, never()).requestTileServiceListeningState(TEST_COMPONENT); + } + + @Test + @CoreCompatChangeRule.DisableCompatChanges( + {StatusBarManagerService.REQUEST_LISTENING_MUST_MATCH_PACKAGE}) + public void testRequestActive_changeDisabled_pass() throws RemoteException { + int user = 0; + mockEverything(user); + mStatusBarManagerService.requestTileServiceListeningState(TEST_COMPONENT, user); + + verify(mMockStatusBar).requestTileServiceListeningState(TEST_COMPONENT); + } + + @Test + @CoreCompatChangeRule.DisableCompatChanges( + {StatusBarManagerService.REQUEST_LISTENING_MUST_MATCH_PACKAGE}) + public void testRequestActive_changeDisabled_differentPackage_pass() throws RemoteException { + when(mPackageManagerInternal.getPackageUid(TEST_PACKAGE, 0L, mContext.getUserId())) + .thenReturn(Binder.getCallingUid() + 1); + mStatusBarManagerService.requestTileServiceListeningState(TEST_COMPONENT, 0); + + verify(mMockStatusBar).requestTileServiceListeningState(TEST_COMPONENT); + } + + @Test + @CoreCompatChangeRule.DisableCompatChanges( + {StatusBarManagerService.REQUEST_LISTENING_MUST_MATCH_PACKAGE}) + public void testRequestActive_changeDisabled_notCurrentUser_pass() throws RemoteException { + mockUidCheck(); + int user = 0; + mockCurrentUserCheck(user); + mStatusBarManagerService.requestTileServiceListeningState(TEST_COMPONENT, user + 1); + + verify(mMockStatusBar).requestTileServiceListeningState(TEST_COMPONENT); + } + + @Test public void testHandleIncomingUserCalled() { int fakeUser = 17; try { @@ -252,7 +337,7 @@ public class StatusBarManagerServiceTest { mockCurrentUserCheck(user); IntentMatcher im = new IntentMatcher( new Intent(TileService.ACTION_QS_TILE).setComponent(TEST_COMPONENT)); - when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0), + when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0L), eq(user), anyInt())).thenReturn(null); Callback callback = new Callback(); @@ -272,7 +357,7 @@ public class StatusBarManagerServiceTest { IntentMatcher im = new IntentMatcher( new Intent(TileService.ACTION_QS_TILE).setComponent(TEST_COMPONENT)); - when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0), + when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0L), eq(user), anyInt())).thenReturn(r); when(mPackageManagerInternal.getComponentEnabledSetting(TEST_COMPONENT, Binder.getCallingUid(), user)).thenReturn( @@ -294,7 +379,7 @@ public class StatusBarManagerServiceTest { IntentMatcher im = new IntentMatcher( new Intent(TileService.ACTION_QS_TILE).setComponent(TEST_COMPONENT)); - when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0), + when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0L), eq(user), anyInt())).thenReturn(r); when(mPackageManagerInternal.getComponentEnabledSetting(TEST_COMPONENT, Binder.getCallingUid(), user)).thenReturn( @@ -318,7 +403,7 @@ public class StatusBarManagerServiceTest { IntentMatcher im = new IntentMatcher( new Intent(TileService.ACTION_QS_TILE).setComponent(TEST_COMPONENT)); - when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0), + when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0L), eq(user), anyInt())).thenReturn(r); when(mPackageManagerInternal.getComponentEnabledSetting(TEST_COMPONENT, Binder.getCallingUid(), user)).thenReturn( @@ -342,7 +427,7 @@ public class StatusBarManagerServiceTest { IntentMatcher im = new IntentMatcher( new Intent(TileService.ACTION_QS_TILE).setComponent(TEST_COMPONENT)); - when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0), + when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0L), eq(user), anyInt())).thenReturn(r); when(mPackageManagerInternal.getComponentEnabledSetting(TEST_COMPONENT, Binder.getCallingUid(), user)).thenReturn( @@ -641,7 +726,7 @@ public class StatusBarManagerServiceTest { } private void mockUidCheck(String packageName) { - when(mPackageManagerInternal.getPackageUid(eq(packageName), anyInt(), anyInt())) + when(mPackageManagerInternal.getPackageUid(eq(packageName), anyLong(), anyInt())) .thenReturn(Binder.getCallingUid()); } @@ -667,7 +752,7 @@ public class StatusBarManagerServiceTest { IntentMatcher im = new IntentMatcher( new Intent(TileService.ACTION_QS_TILE).setComponent(componentName)); - when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0), + when(mPackageManagerInternal.resolveService(argThat(im), nullable(String.class), eq(0L), eq(user), anyInt())).thenReturn(r); when(mPackageManagerInternal.getComponentEnabledSetting(componentName, Binder.getCallingUid(), user)).thenReturn( @@ -679,6 +764,15 @@ public class StatusBarManagerServiceTest { PROCESS_STATE_TOP); } + private void mockHandleIncomingUser() { + when(mActivityManagerInternal.handleIncomingUser(anyInt(), anyInt(), anyInt(), anyBoolean(), + anyInt(), anyString(), anyString())).thenAnswer( + (Answer<Integer>) invocation -> { + return invocation.getArgument(2); // same user + } + ); + } + private void mockEverything(int user) { mockUidCheck(); mockCurrentUserCheck(user); diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java index 1ce957d1e768..210d2faf44d6 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -62,7 +62,10 @@ import static org.mockito.AdditionalMatchers.not; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.intThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; @@ -76,11 +79,13 @@ import android.app.usage.UsageStatsManagerInternal; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.ContextWrapper; +import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; +import android.content.pm.ResolveInfo; import android.hardware.display.DisplayManager; import android.os.Handler; import android.os.Looper; @@ -118,6 +123,7 @@ import java.util.Random; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * Unit test for AppStandbyController. @@ -421,8 +427,31 @@ public class AppStandbyControllerTests { pib.packageName = PACKAGE_BACKGROUND_LOCATION; packages.add(pib); - doReturn(packages).when(mockPm).getInstalledPackagesAsUser(anyInt(), anyInt()); + // Set up getInstalledPackagesAsUser(). + doReturn(packages).when(mockPm).getInstalledPackagesAsUser(anyInt(), + anyInt()); + + // Set up getInstalledPackagesAsUser() for "MATCH_ONLY_SYSTEM" + doReturn( + packages.stream().filter(pinfo -> pinfo.applicationInfo.isSystemApp()) + .collect(Collectors.toList()) + ).when(mockPm).getInstalledPackagesAsUser( + intThat(i -> (i & PackageManager.MATCH_SYSTEM_ONLY) != 0), + anyInt()); + + // Set up queryIntentActivitiesAsUser() + final ArrayList<ResolveInfo> systemFrontDoorActivities = new ArrayList<>(); + final ResolveInfo frontDoorActivity = new ResolveInfo(); + frontDoorActivity.activityInfo = new ActivityInfo(); + frontDoorActivity.activityInfo.packageName = pis.packageName; + systemFrontDoorActivities.add(frontDoorActivity); + doReturn(systemFrontDoorActivities).when(mockPm) + .queryIntentActivitiesAsUser(any(Intent.class), + intThat(i -> (i & PackageManager.MATCH_SYSTEM_ONLY) != 0), + anyInt()); + + // Set up other APIs. try { for (int i = 0; i < packages.size(); ++i) { PackageInfo pkg = packages.get(i); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java index 50151bfb7191..46b47f4dcfdd 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java @@ -88,7 +88,7 @@ public class PermissionHelperTest extends UiServiceTestCase { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mPermissionHelper = new PermissionHelper(mPmi, mPackageManager, mPermManager, true); + mPermissionHelper = new PermissionHelper(mPmi, mPackageManager, mPermManager, true, false); PackageInfo testPkgInfo = new PackageInfo(); testPkgInfo.requestedPermissions = new String[]{ Manifest.permission.POST_NOTIFICATIONS }; when(mPackageManager.getPackageInfo(anyString(), anyLong(), anyInt())) @@ -100,7 +100,7 @@ public class PermissionHelperTest extends UiServiceTestCase { public void testMethodsThrowIfMigrationDisabled() throws IllegalAccessException, InvocationTargetException { PermissionHelper permHelper = - new PermissionHelper(mPmi, mPackageManager, mPermManager, false); + new PermissionHelper(mPmi, mPackageManager, mPermManager, false, false); Method[] allMethods = PermissionHelper.class.getDeclaredMethods(); for (Method method : allMethods) { @@ -302,6 +302,26 @@ public class PermissionHelperTest extends UiServiceTestCase { } @Test + public void testSetNotificationPermission_pkgPerm_grantedByDefaultPermSet_allUserSet() + throws Exception { + mPermissionHelper = new PermissionHelper(mPmi, mPackageManager, mPermManager, true, true); + when(mPmi.checkPermission(anyString(), anyString(), anyInt())) + .thenReturn(PERMISSION_DENIED); + when(mPermManager.getPermissionFlags(anyString(), + eq(Manifest.permission.POST_NOTIFICATIONS), + anyInt())).thenReturn(FLAG_PERMISSION_GRANTED_BY_DEFAULT); + PermissionHelper.PackagePermission pkgPerm = new PermissionHelper.PackagePermission( + "pkg", 10, true, false); + + mPermissionHelper.setNotificationPermission(pkgPerm); + verify(mPermManager).grantRuntimePermission( + "pkg", Manifest.permission.POST_NOTIFICATIONS, 10); + verify(mPermManager).updatePermissionFlags("pkg", Manifest.permission.POST_NOTIFICATIONS, + FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_REVIEW_REQUIRED, + FLAG_PERMISSION_USER_SET, true, 10); + } + + @Test public void testSetNotificationPermission_revokeUserSet() throws Exception { when(mPmi.checkPermission(anyString(), anyString(), anyInt())) .thenReturn(PERMISSION_GRANTED); diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt index b0e53e9f85bf..c3a4769bc573 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt @@ -74,7 +74,7 @@ open class OpenAppNonResizeableTest(testSpec: FlickerTestParameter) * Checks that the nav bar layer starts invisible, becomes visible during unlocking animation * and remains visible at the end */ - @Postsubmit + @Presubmit @Test fun navBarLayerVisibilityChanges() { testSpec.assertLayers { |