diff --git a/api/current.txt b/api/current.txt index 02190f8802b89..b49d687af4641 100644 --- a/api/current.txt +++ b/api/current.txt @@ -9346,6 +9346,7 @@ package android.content { field public static final java.lang.String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED"; field public static final java.lang.String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED"; field public static final java.lang.String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED"; + field public static final java.lang.String ACTION_PACKAGE_FIRST_ADDED = "android.intent.action.PACKAGE_FIRST_ADDED"; field public static final java.lang.String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH"; field public static final java.lang.String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED"; field public static final deprecated java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL"; diff --git a/api/system-current.txt b/api/system-current.txt index f946adbe3b490..0a39992a41a18 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -9874,6 +9874,7 @@ package android.content { field public static final java.lang.String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED"; field public static final java.lang.String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED"; field public static final java.lang.String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED"; + field public static final java.lang.String ACTION_PACKAGE_FIRST_ADDED = "android.intent.action.PACKAGE_FIRST_ADDED"; field public static final java.lang.String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH"; field public static final java.lang.String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED"; field public static final deprecated java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL"; diff --git a/api/test-current.txt b/api/test-current.txt index 19380b8ecd12d..b4058234132f9 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -9380,6 +9380,7 @@ package android.content { field public static final java.lang.String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED"; field public static final java.lang.String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED"; field public static final java.lang.String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED"; + field public static final java.lang.String ACTION_PACKAGE_FIRST_ADDED = "android.intent.action.PACKAGE_FIRST_ADDED"; field public static final java.lang.String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH"; field public static final java.lang.String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED"; field public static final deprecated java.lang.String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL"; diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index a6e6ceb029fa1..af04c1af937b9 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2062,13 +2062,13 @@ public class Intent implements Parcelable, Cloneable { @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL"; /** - * Broadcast Action: A new application package has been installed on the + * Broadcast Action: An application package has been installed or updated on the * device. The data contains the name of the package. Note that the * newly installed package does not receive this broadcast. *

May include the following extras: *

* @@ -2077,6 +2077,22 @@ public class Intent implements Parcelable, Cloneable { */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_PACKAGE_ADDED = "android.intent.action.PACKAGE_ADDED"; + /** + * Broadcast Action: A new application package has been installed on the + * device. The data contains the name of the package. Note that the + * newly installed package does not receive this broadcast. + *

Unlike {@link #ACTION_PACKAGE_ADDED}, this broadcast is delivered + * to manifest receivers as well as those registered at runtime. + *

May include the following extras: + *

+ * + *

This is a protected intent that can only be sent + * by the system. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_PACKAGE_FIRST_ADDED = "android.intent.action.PACKAGE_FIRST_ADDED"; /** * Broadcast Action: A new version of an application package has been * installed, replacing an existing version that was previously installed. diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 3360e33863331..5bc1e58d0f26a 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 2db240d512167..9210dd8fbeb20 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1834,6 +1834,10 @@ public class PackageManagerService extends IPackageManager.Stub extras.putInt(Intent.EXTRA_UID, res.uid); if (update) { extras.putBoolean(Intent.EXTRA_REPLACING, true); + } else { + sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_ADDED, packageName, + extras, Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, + null /*targetPackage*/, null /*finishedReceiver*/, updateUsers); } sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, extras, 0 /*flags*/, null /*targetPackage*/, @@ -13271,8 +13275,10 @@ public class PackageManagerService extends IPackageManager.Stub // Set to UID of the first user, EXTRA_UID is automatically updated in sendPackageBroadcast extras.putInt(Intent.EXTRA_UID, UserHandle.getUid(userIds[0], appId)); - sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, - packageName, extras, 0, null, null, userIds); + sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_ADDED, packageName, + extras, Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, null, null, userIds); + sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, + extras, 0, null, null, userIds); if (isSystem) { mHandler.post(() -> { for (int userId : userIds) {