[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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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*/,
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user