diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 823c142818184..aa86af92df87c 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2205,6 +2205,13 @@ public abstract class PackageManager { */ public static final int INSTALL_ACTIVATION_FAILED = -128; + /** + * Installation failed return code: requesting user pre-approval is currently unavailable. + * + * @hide + */ + public static final int INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE = -129; + /** @hide */ @IntDef(flag = true, prefix = { "DELETE_" }, value = { DELETE_KEEP_DATA, @@ -9643,6 +9650,7 @@ public abstract class PackageManager { case INSTALL_FAILED_NO_MATCHING_ABIS: return PackageInstaller.STATUS_FAILURE_INCOMPATIBLE; case INSTALL_FAILED_ABORTED: return PackageInstaller.STATUS_FAILURE_ABORTED; case INSTALL_FAILED_MISSING_SPLIT: return PackageInstaller.STATUS_FAILURE_INCOMPATIBLE; + case INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE: return PackageInstaller.STATUS_FAILURE_BLOCKED; default: return PackageInstaller.STATUS_FAILURE; } } diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 022bf3cb3a471..e2add4704912b 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -29,6 +29,7 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR; import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK; import static android.content.pm.PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE; import static android.content.pm.PackageManager.INSTALL_FAILED_MISSING_SPLIT; +import static android.content.pm.PackageManager.INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE; import static android.content.pm.PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; import static android.content.pm.PackageManager.INSTALL_STAGED; import static android.content.pm.PackageManager.INSTALL_SUCCEEDED; @@ -4243,6 +4244,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { public void requestUserPreapproval(@NonNull PreapprovalDetails details, @NonNull IntentSender statusReceiver) { validatePreapprovalRequest(details, statusReceiver); + + if (!mPm.isPreapprovalRequestAvailable()) { + sendUpdateToRemoteStatusReceiver(INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE, + "Request user pre-approval is currently not available.", null /* extras */); + return; + } + dispatchPreapprovalRequest(); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6e54d0bbd6567..9d43710b35ffa 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -494,6 +494,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService */ private static final String PROPERTY_KNOWN_DIGESTERS_LIST = "known_digesters_list"; + /** + * Whether of not requesting the approval before committing sessions is available. + * + * Flag type: {@code boolean} + * Namespace: NAMESPACE_PACKAGE_MANAGER_SERVICE + */ + private static final String PROPERTY_IS_PRE_APPROVAL_REQUEST_AVAILABLE = + "is_preapproval_available"; + /** * The default response for package verification timeout. * @@ -6894,6 +6903,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } + static boolean isPreapprovalRequestAvailable() { + final long token = Binder.clearCallingIdentity(); + try { + return DeviceConfig.getBoolean(NAMESPACE_PACKAGE_MANAGER_SERVICE, + PROPERTY_IS_PRE_APPROVAL_REQUEST_AVAILABLE, true /* defaultValue */); + } finally { + Binder.restoreCallingIdentity(token); + } + } + /** * Returns the array containing per-uid timeout configuration. * This is derived from DeviceConfig flags.