summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobStore.java2
-rw-r--r--apex/jobscheduler/service/java/com/android/server/usage/AppStandbyController.java65
-rw-r--r--core/api/current.txt2
-rw-r--r--core/api/system-current.txt7
-rw-r--r--core/java/android/app/ActivityThread.java11
-rw-r--r--core/java/android/app/AppOpsManager.java2
-rw-r--r--core/java/android/app/ContextImpl.java2
-rw-r--r--core/java/android/app/IApplicationThread.aidl1
-rw-r--r--core/java/android/app/LoadedApk.java21
-rw-r--r--core/java/android/app/StatusBarManager.java18
-rw-r--r--core/java/android/app/cloudsearch/SearchResult.java20
-rw-r--r--core/java/android/content/pm/Signature.java4
-rw-r--r--core/java/android/os/BatteryStats.java1
-rw-r--r--core/java/android/os/BatteryUsageStatsQuery.java12
-rw-r--r--core/java/android/os/Environment.java10
-rw-r--r--core/java/android/os/UidBatteryConsumer.java18
-rw-r--r--core/java/android/provider/DeviceConfig.java7
-rw-r--r--core/java/android/service/quicksettings/TileService.java34
-rw-r--r--core/java/android/view/ViewRootImpl.java2
-rw-r--r--core/java/com/android/internal/graphics/SfVsyncFrameCallbackProvider.java1
-rw-r--r--core/java/com/android/internal/os/AudioPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java24
-rw-r--r--core/java/com/android/internal/os/BatteryUsageStatsProvider.java7
-rw-r--r--core/java/com/android/internal/os/BluetoothPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/CpuPowerCalculator.java4
-rw-r--r--core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java4
-rw-r--r--core/java/com/android/internal/os/GnssPowerCalculator.java5
-rw-r--r--core/java/com/android/internal/os/MobileRadioPowerCalculator.java8
-rw-r--r--core/java/com/android/internal/os/ScreenPowerCalculator.java13
-rw-r--r--core/java/com/android/internal/os/SensorPowerCalculator.java4
-rw-r--r--core/java/com/android/internal/os/UserPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/VideoPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/WakelockPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/WifiPowerCalculator.java7
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBar.aidl5
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBarService.aidl7
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java2
-rw-r--r--core/jni/AndroidRuntime.cpp1
-rw-r--r--core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp24
-rw-r--r--core/res/AndroidManifest.xml6
-rw-r--r--core/res/res/values/config.xml8
-rw-r--r--core/res/res/values/strings.xml4
-rw-r--r--core/res/res/values/symbols.xml1
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java1
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java2
-rw-r--r--core/tests/utiltests/src/com/android/internal/util/LockPatternUtilsTest.java17
-rw-r--r--data/etc/platform.xml2
-rw-r--r--graphics/java/android/graphics/drawable/RippleDrawable.java17
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipInputConsumer.java1
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipMotionHelper.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java1
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipBoundsAlgorithm.java96
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java150
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java101
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java61
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipNotificationController.java14
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleFromLockScreen.kt15
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/bubble/LaunchBubbleScreen.kt13
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPatternViewController.java2
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputViewController.java1
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java6
-rw-r--r--packages/SystemUI/src/com/android/keyguard/LockIconViewController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/charging/WirelessChargingAnimation.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/qrcodescanner/controller/QRCodeScannerController.java20
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java45
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt13
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinator.kt19
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/legacy/NotificationGroupManagerLegacy.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfaces.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java19
-rw-r--r--packages/SystemUI/tests/src/com/android/keyguard/KeyguardPatternViewControllerTest.kt2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java53
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/external/TileServicesTest.java76
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorControllerTest.kt15
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorTest.kt31
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java18
-rw-r--r--services/api/current.txt2
-rw-r--r--services/core/java/android/content/pm/PackageManagerInternal.java3
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java20
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerLocal.java5
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java47
-rw-r--r--services/core/java/com/android/server/am/AppProfiler.java3
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java3
-rw-r--r--services/core/java/com/android/server/am/ProcessList.java7
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java8
-rw-r--r--services/core/java/com/android/server/am/ServiceRecord.java10
-rwxr-xr-xservices/core/java/com/android/server/notification/NotificationManagerService.java9
-rw-r--r--services/core/java/com/android/server/notification/PermissionHelper.java19
-rw-r--r--services/core/java/com/android/server/pm/ApkChecksums.java2
-rw-r--r--services/core/java/com/android/server/pm/AppsFilter.java9
-rw-r--r--services/core/java/com/android/server/pm/BackgroundDexOptService.java29
-rw-r--r--services/core/java/com/android/server/pm/Computer.java240
-rw-r--r--services/core/java/com/android/server/pm/ComputerEngine.java34
-rw-r--r--services/core/java/com/android/server/pm/ComputerLocked.java853
-rw-r--r--services/core/java/com/android/server/pm/ComputerTracker.java1327
-rw-r--r--services/core/java/com/android/server/pm/DeletePackageHelper.java49
-rw-r--r--services/core/java/com/android/server/pm/DexOptHelper.java38
-rw-r--r--services/core/java/com/android/server/pm/DomainVerificationConnection.java12
-rw-r--r--services/core/java/com/android/server/pm/DumpHelper.java27
-rw-r--r--services/core/java/com/android/server/pm/IPackageManagerBase.java1189
-rw-r--r--services/core/java/com/android/server/pm/IncrementalProgressListener.java3
-rw-r--r--services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java2
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java33
-rw-r--r--services/core/java/com/android/server/pm/ModuleInfoProvider.java21
-rw-r--r--services/core/java/com/android/server/pm/MovePackageHelper.java129
-rw-r--r--services/core/java/com/android/server/pm/OtaDexoptService.java5
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java54
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java6
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerInternalBase.java751
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java2825
-rw-r--r--services/core/java/com/android/server/pm/PackageSender.java7
-rw-r--r--services/core/java/com/android/server/pm/PreferredActivityHelper.java157
-rw-r--r--services/core/java/com/android/server/pm/PreferredComponent.java11
-rw-r--r--services/core/java/com/android/server/pm/RemovePackageHelper.java10
-rw-r--r--services/core/java/com/android/server/pm/ResolveIntentHelper.java12
-rw-r--r--services/core/java/com/android/server/pm/SharedLibrariesImpl.java4
-rw-r--r--services/core/java/com/android/server/pm/StorageEventHelper.java13
-rw-r--r--services/core/java/com/android/server/pm/SuspendPackageHelper.java106
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java4
-rw-r--r--services/core/java/com/android/server/pm/WatchedIntentFilter.java2
-rw-r--r--services/core/java/com/android/server/pm/dex/ArtManagerService.java21
-rw-r--r--services/core/java/com/android/server/pm/dex/DexManager.java32
-rw-r--r--services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java32
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java48
-rw-r--r--services/core/java/com/android/server/trust/TrustManagerService.java6
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java12
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerShellCommand.java7
-rw-r--r--services/core/jni/onload.cpp1
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java4
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt2
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt22
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt57
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/job/JobStoreTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java147
-rw-r--r--services/tests/servicestests/src/com/android/server/statusbar/StatusBarManagerServiceTest.java108
-rw-r--r--services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java31
-rw-r--r--services/tests/uiservicestests/src/com/android/server/notification/PermissionHelperTest.java24
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppNonResizeableTest.kt2
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 {