diff options
| author | 2020-10-06 13:49:25 -0700 | |
|---|---|---|
| committer | 2020-10-14 20:18:08 +0000 | |
| commit | c6924e68614393caed13ae918038c8d67a026d74 (patch) | |
| tree | 81fc07abb012942eb399fa92eeb7bd307943cfcd | |
| parent | 3ab245432435da5d16843cde31237cd21b0f39c7 (diff) | |
[pm/incremental/api] exposing package state names and reasons
We would like to expose package states and unstartable reasons to public
APIs. Two main users will be:
1) sys UI, which will display alert windows on top of a foreground app
when the package becomes unstartable, with different contents in the alert
window based on the reason code.
2) Play Store, which will collect package state change information which
will be used to determine future package delivery strategies.
Test: will add CTS tests.
BUG: 162600626
CTS-Coverage-Bug: 168925819
Change-Id: I71bafb36b230ea93b34e8556b57563e4ba3b837d
| -rw-r--r-- | api/current.txt | 7 | ||||
| -rw-r--r-- | core/java/android/content/Intent.java | 13 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageManager.java | 15 | ||||
| -rw-r--r-- | non-updatable-api/current.txt | 7 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/IncrementalStates.java | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 2 | ||||
| -rw-r--r-- | services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java | 8 |
7 files changed, 36 insertions, 20 deletions
diff --git a/api/current.txt b/api/current.txt index a550bf879717..ac6970a6bf47 100644 --- a/api/current.txt +++ b/api/current.txt @@ -10667,12 +10667,15 @@ package android.content { field public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED"; field public static final String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED"; field public static final String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH"; + field public static final String ACTION_PACKAGE_FULLY_LOADED = "android.intent.action.PACKAGE_FULLY_LOADED"; field public static final String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED"; field @Deprecated public static final String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL"; field public static final String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION"; field public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED"; field public static final String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED"; field public static final String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED"; + field public static final String ACTION_PACKAGE_STARTABLE = "android.intent.action.PACKAGE_STARTABLE"; + field public static final String ACTION_PACKAGE_UNSTARTABLE = "android.intent.action.PACKAGE_UNSTARTABLE"; field public static final String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED"; field public static final String ACTION_PASTE = "android.intent.action.PASTE"; field public static final String ACTION_PICK = "android.intent.action.PICK"; @@ -10837,6 +10840,7 @@ package android.content { field public static final String EXTRA_TIMEZONE = "time-zone"; field public static final String EXTRA_TITLE = "android.intent.extra.TITLE"; field public static final String EXTRA_UID = "android.intent.extra.UID"; + field public static final String EXTRA_UNSTARTABLE_REASON = "android.intent.extra.UNSTARTABLE_REASON"; field public static final String EXTRA_USER = "android.intent.extra.USER"; field public static final int FILL_IN_ACTION = 1; // 0x1 field public static final int FILL_IN_CATEGORIES = 4; // 0x4 @@ -12296,6 +12300,9 @@ package android.content.pm { field public static final int SYNCHRONOUS = 2; // 0x2 field @Nullable public static final java.util.List<java.security.cert.Certificate> TRUST_ALL; field @NonNull public static final java.util.List<java.security.cert.Certificate> TRUST_NONE; + field public static final int UNSTARTABLE_REASON_CONNECTION_ERROR = 1; // 0x1 + field public static final int UNSTARTABLE_REASON_INSUFFICIENT_STORAGE = 2; // 0x2 + field public static final int UNSTARTABLE_REASON_UNKNOWN = 0; // 0x0 field public static final int VERIFICATION_ALLOW = 1; // 0x1 field public static final int VERIFICATION_REJECT = -1; // 0xffffffff field public static final int VERSION_CODE_HIGHEST = -1; // 0xffffffff diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 2f1254f90ccf..a14e21b36c51 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2744,7 +2744,6 @@ public class Intent implements Parcelable, Cloneable { * </ul> * * <p class="note">This is a protected intent that can only be sent by the system. - * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_PACKAGE_STARTABLE = "android.intent.action.PACKAGE_STARTABLE"; @@ -2755,13 +2754,13 @@ public class Intent implements Parcelable, Cloneable { * <ul> * <li> {@link #EXTRA_UID} containing the integer uid assigned to the package. </li> * <li> {@link #EXTRA_PACKAGE_NAME} containing the package name. </li> - * <li> {@link #EXTRA_REASON} containing the integer indicating the reason for the state change, + * <li> {@link #EXTRA_UNSTARTABLE_REASON} containing the integer indicating the reason for + * the state change, * @see PackageManager.UnstartableReason * </li> * </ul> * * <p class="note">This is a protected intent that can only be sent by the system. - * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_PACKAGE_UNSTARTABLE = @@ -2776,7 +2775,6 @@ public class Intent implements Parcelable, Cloneable { * </ul> * * <p class="note">This is a protected intent that can only be sent by the system. - * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_PACKAGE_FULLY_LOADED = @@ -6015,6 +6013,13 @@ public class Intent implements Parcelable, Cloneable { */ public static final String EXTRA_LOCUS_ID = "android.intent.extra.LOCUS_ID"; + /** + * Intent extra: the reason that the package associated with this intent has become unstartable. + * + * <p>Type: String + */ + public static final String EXTRA_UNSTARTABLE_REASON = "android.intent.extra.UNSTARTABLE_REASON"; + // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Intent flags (see mFlags variable). diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 1a992f519286..32ae105a0ff2 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3790,8 +3790,8 @@ public abstract class PackageManager { * @hide */ @IntDef({UNSTARTABLE_REASON_UNKNOWN, - UNSTARTABLE_REASON_DATALOADER_TRANSPORT, - UNSTARTABLE_REASON_DATALOADER_STORAGE + UNSTARTABLE_REASON_CONNECTION_ERROR, + UNSTARTABLE_REASON_INSUFFICIENT_STORAGE }) @Retention(RetentionPolicy.SOURCE) public @interface UnstartableReason {} @@ -3800,23 +3800,20 @@ public abstract class PackageManager { * Unstartable state with no root cause specified. E.g., data loader seeing missing pages but * unclear about the cause. This corresponds to a generic alert window shown to the user when * the user attempts to launch the app. - * @hide */ public static final int UNSTARTABLE_REASON_UNKNOWN = 0; /** - * Unstartable state after hint from dataloader of issues with the transport layer. - * This corresponds to an alert window shown to the user indicating network errors. - * @hide + * Unstartable state due to connection issues that interrupt package loading. + * This corresponds to an alert window shown to the user indicating connection errors. */ - public static final int UNSTARTABLE_REASON_DATALOADER_TRANSPORT = 1; + public static final int UNSTARTABLE_REASON_CONNECTION_ERROR = 1; /** * Unstartable state after encountering storage limitations. * This corresponds to an alert window indicating limited storage. - * @hide */ - public static final int UNSTARTABLE_REASON_DATALOADER_STORAGE = 2; + public static final int UNSTARTABLE_REASON_INSUFFICIENT_STORAGE = 2; /** {@hide} */ public int getUserId() { diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt index 58e4ccc17a67..648ad5630723 100644 --- a/non-updatable-api/current.txt +++ b/non-updatable-api/current.txt @@ -10667,12 +10667,15 @@ package android.content { field public static final String ACTION_PACKAGE_CHANGED = "android.intent.action.PACKAGE_CHANGED"; field public static final String ACTION_PACKAGE_DATA_CLEARED = "android.intent.action.PACKAGE_DATA_CLEARED"; field public static final String ACTION_PACKAGE_FIRST_LAUNCH = "android.intent.action.PACKAGE_FIRST_LAUNCH"; + field public static final String ACTION_PACKAGE_FULLY_LOADED = "android.intent.action.PACKAGE_FULLY_LOADED"; field public static final String ACTION_PACKAGE_FULLY_REMOVED = "android.intent.action.PACKAGE_FULLY_REMOVED"; field @Deprecated public static final String ACTION_PACKAGE_INSTALL = "android.intent.action.PACKAGE_INSTALL"; field public static final String ACTION_PACKAGE_NEEDS_VERIFICATION = "android.intent.action.PACKAGE_NEEDS_VERIFICATION"; field public static final String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED"; field public static final String ACTION_PACKAGE_REPLACED = "android.intent.action.PACKAGE_REPLACED"; field public static final String ACTION_PACKAGE_RESTARTED = "android.intent.action.PACKAGE_RESTARTED"; + field public static final String ACTION_PACKAGE_STARTABLE = "android.intent.action.PACKAGE_STARTABLE"; + field public static final String ACTION_PACKAGE_UNSTARTABLE = "android.intent.action.PACKAGE_UNSTARTABLE"; field public static final String ACTION_PACKAGE_VERIFIED = "android.intent.action.PACKAGE_VERIFIED"; field public static final String ACTION_PASTE = "android.intent.action.PASTE"; field public static final String ACTION_PICK = "android.intent.action.PICK"; @@ -10837,6 +10840,7 @@ package android.content { field public static final String EXTRA_TIMEZONE = "time-zone"; field public static final String EXTRA_TITLE = "android.intent.extra.TITLE"; field public static final String EXTRA_UID = "android.intent.extra.UID"; + field public static final String EXTRA_UNSTARTABLE_REASON = "android.intent.extra.UNSTARTABLE_REASON"; field public static final String EXTRA_USER = "android.intent.extra.USER"; field public static final int FILL_IN_ACTION = 1; // 0x1 field public static final int FILL_IN_CATEGORIES = 4; // 0x4 @@ -12296,6 +12300,9 @@ package android.content.pm { field public static final int SYNCHRONOUS = 2; // 0x2 field @Nullable public static final java.util.List<java.security.cert.Certificate> TRUST_ALL; field @NonNull public static final java.util.List<java.security.cert.Certificate> TRUST_NONE; + field public static final int UNSTARTABLE_REASON_CONNECTION_ERROR = 1; // 0x1 + field public static final int UNSTARTABLE_REASON_INSUFFICIENT_STORAGE = 2; // 0x2 + field public static final int UNSTARTABLE_REASON_UNKNOWN = 0; // 0x0 field public static final int VERIFICATION_ALLOW = 1; // 0x1 field public static final int VERIFICATION_REJECT = -1; // 0xffffffff field public static final int VERSION_CODE_HIGHEST = -1; // 0xffffffff diff --git a/services/core/java/com/android/server/pm/IncrementalStates.java b/services/core/java/com/android/server/pm/IncrementalStates.java index dda5fafb8cb1..ababb8365c4f 100644 --- a/services/core/java/com/android/server/pm/IncrementalStates.java +++ b/services/core/java/com/android/server/pm/IncrementalStates.java @@ -376,10 +376,10 @@ public final class IncrementalStates { case IDataLoaderStatusListener.STREAM_INTEGRITY_ERROR: // fall through case IDataLoaderStatusListener.STREAM_SOURCE_ERROR: { - return PackageManager.UNSTARTABLE_REASON_DATALOADER_TRANSPORT; + return PackageManager.UNSTARTABLE_REASON_CONNECTION_ERROR; } case IDataLoaderStatusListener.STREAM_STORAGE_ERROR: { - return PackageManager.UNSTARTABLE_REASON_DATALOADER_STORAGE; + return PackageManager.UNSTARTABLE_REASON_INSUFFICIENT_STORAGE; } default: return PackageManager.UNSTARTABLE_REASON_UNKNOWN; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 805fbbc75a87..bf6a136cf77c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -17333,7 +17333,7 @@ public class PackageManagerService extends IPackageManager.Stub Bundle extras = new Bundle(); extras.putInt(Intent.EXTRA_UID, mUid); extras.putString(Intent.EXTRA_PACKAGE_NAME, mPackageName); - extras.putInt(Intent.EXTRA_REASON, reason); + extras.putInt(Intent.EXTRA_UNSTARTABLE_REASON, reason); // send broadcast to users with this app installed sendPackageBroadcast(Intent.ACTION_PACKAGE_UNSTARTABLE, mPackageName, extras, 0 /*flags*/, diff --git a/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java b/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java index 62e135b09593..c4c2f68e8219 100644 --- a/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/IncrementalStatesTest.java @@ -146,7 +146,7 @@ public class IncrementalStatesTest { // Test that package is now unstartable assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); assertFalse(mIncrementalStates.isStartable()); - assertEquals(PackageManager.UNSTARTABLE_REASON_DATALOADER_TRANSPORT, + assertEquals(PackageManager.UNSTARTABLE_REASON_CONNECTION_ERROR, mUnstartableReason.get()); } @@ -160,7 +160,7 @@ public class IncrementalStatesTest { // Test that package is now unstartable assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); assertFalse(mIncrementalStates.isStartable()); - assertEquals(PackageManager.UNSTARTABLE_REASON_DATALOADER_TRANSPORT, + assertEquals(PackageManager.UNSTARTABLE_REASON_CONNECTION_ERROR, mUnstartableReason.get()); } @@ -181,7 +181,7 @@ public class IncrementalStatesTest { // Test that package is now unstartable assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); assertFalse(mIncrementalStates.isStartable()); - assertEquals(PackageManager.UNSTARTABLE_REASON_DATALOADER_STORAGE, + assertEquals(PackageManager.UNSTARTABLE_REASON_INSUFFICIENT_STORAGE, mUnstartableReason.get()); } @@ -202,7 +202,7 @@ public class IncrementalStatesTest { // Test that package is now unstartable assertTrue(mUnstartableCalled.block(WAIT_TIMEOUT_MILLIS)); assertFalse(mIncrementalStates.isStartable()); - assertEquals(PackageManager.UNSTARTABLE_REASON_DATALOADER_STORAGE, + assertEquals(PackageManager.UNSTARTABLE_REASON_INSUFFICIENT_STORAGE, mUnstartableReason.get()); } |