diff options
Diffstat (limited to 'core/java/android/content')
-rw-r--r-- | core/java/android/content/Intent.java | 12 | ||||
-rw-r--r-- | core/java/android/content/pm/ApplicationInfo.java | 9 | ||||
-rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 3 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageManager.java | 17 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageParser.java | 29 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageUserState.java | 3 |
6 files changed, 63 insertions, 10 deletions
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 897e6fe..bda7112 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2440,6 +2440,18 @@ public class Intent implements Parcelable, Cloneable { "android.intent.action.GET_RESTRICTION_ENTRIES"; /** + * Activity to challenge the user for a PIN that was configured when setting up + * restrictions. Launch the activity using + * {@link android.app.Activity#startActivityForResult(Intent, int)} and check if the + * result is {@link android.app.Activity#RESULT_OK} for a successful response to the + * challenge.<p/> + * Before launching this activity, make sure that there is a PIN in effect, by calling + * {@link android.os.UserManager#hasRestrictionsPin()}. + */ + public static final String ACTION_RESTRICTIONS_PIN_CHALLENGE = + "android.intent.action.RESTRICTIONS_PIN_CHALLENGE"; + + /** * Sent the first time a user is starting, to allow system apps to * perform one time initialization. (This will not be seen by third * party applications because a newly initialized user does not have any diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 870610b..9c46d96 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -346,6 +346,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public static final int FLAG_CANT_SAVE_STATE = 1<<28; /** + * Value for {@link #flags}: true if the application is blocked via restrictions and for + * most purposes is considered as not installed. + * {@hide} + */ + public static final int FLAG_BLOCKED = 1<<27; + + /** * Flags associated with the application. Any combination of * {@link #FLAG_SYSTEM}, {@link #FLAG_DEBUGGABLE}, {@link #FLAG_HAS_CODE}, * {@link #FLAG_PERSISTENT}, {@link #FLAG_FACTORY_TEST}, and @@ -359,7 +366,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { * {@link #FLAG_INSTALLED}. */ public int flags = 0; - + /** * The required smallest screen width the application can run on. If 0, * nothing has been specified. Comes from diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index a0e1555..eaff7b2 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -399,4 +399,7 @@ interface IPackageManager { /** Reflects current DeviceStorageMonitorService state */ boolean isStorageLow(); + + boolean setApplicationBlockedSettingAsUser(String packageName, boolean blocked, int userId); + boolean getApplicationBlockedSettingAsUser(String packageName, int userId); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 4266d85..8a8751e 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3083,6 +3083,23 @@ public abstract class PackageManager { public abstract int getApplicationEnabledSetting(String packageName); /** + * Puts the package in a blocked state, which is almost like an uninstalled state, + * making the package unavailable, but it doesn't remove the data or the actual + * package file. + * @hide + */ + public abstract boolean setApplicationBlockedSettingAsUser(String packageName, boolean blocked, + UserHandle userHandle); + + /** + * Returns the blocked state of a package. + * @see #setApplicationBlockedSettingAsUser(String, boolean, UserHandle) + * @hide + */ + public abstract boolean getApplicationBlockedSettingAsUser(String packageName, + UserHandle userHandle); + + /** * Return whether the device has been booted into safe mode. */ public abstract boolean isSafeMode(); diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 883516e..8f0c62d 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -159,7 +159,8 @@ public class PackageParser { private static WeakReference<byte[]> mReadBuffer; private static boolean sCompatibilityModeEnabled = true; - private static final int PARSE_DEFAULT_INSTALL_LOCATION = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; + private static final int PARSE_DEFAULT_INSTALL_LOCATION = + PackageInfo.INSTALL_LOCATION_UNSPECIFIED; static class ParsePackageItemArgs { final Package owner; @@ -274,15 +275,20 @@ public class PackageParser { grantedPermissions, state, UserHandle.getCallingUserId()); } - private static boolean checkUseInstalled(int flags, PackageUserState state) { - return state.installed || ((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0); + /** + * Returns true if the package is installed and not blocked, or if the caller + * explicitly wanted all uninstalled and blocked packages as well. + */ + private static boolean checkUseInstalledOrBlocked(int flags, PackageUserState state) { + return (state.installed && !state.blocked) + || (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0; } public static PackageInfo generatePackageInfo(PackageParser.Package p, int gids[], int flags, long firstInstallTime, long lastUpdateTime, HashSet<String> grantedPermissions, PackageUserState state, int userId) { - if (!checkUseInstalled(flags, state)) { + if (!checkUseInstalledOrBlocked(flags, state)) { return null; } PackageInfo pi = new PackageInfo(); @@ -3724,7 +3730,7 @@ public class PackageParser { return true; } } - if (!state.installed) { + if (!state.installed || state.blocked) { return true; } if (state.stopped) { @@ -3757,6 +3763,11 @@ public class PackageParser { } else { ai.flags &= ~ApplicationInfo.FLAG_INSTALLED; } + if (state.blocked) { + ai.flags |= ApplicationInfo.FLAG_BLOCKED; + } else { + ai.flags &= ~ApplicationInfo.FLAG_BLOCKED; + } if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { ai.enabled = true; } else if (state.enabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { @@ -3771,7 +3782,7 @@ public class PackageParser { public static ApplicationInfo generateApplicationInfo(Package p, int flags, PackageUserState state, int userId) { if (p == null) return null; - if (!checkUseInstalled(flags, state)) { + if (!checkUseInstalledOrBlocked(flags, state)) { return null; } if (!copyNeeded(flags, p, state, null, userId) @@ -3855,7 +3866,7 @@ public class PackageParser { public static final ActivityInfo generateActivityInfo(Activity a, int flags, PackageUserState state, int userId) { if (a == null) return null; - if (!checkUseInstalled(flags, state)) { + if (!checkUseInstalledOrBlocked(flags, state)) { return null; } if (!copyNeeded(flags, a.owner, state, a.metaData, userId)) { @@ -3892,7 +3903,7 @@ public class PackageParser { public static final ServiceInfo generateServiceInfo(Service s, int flags, PackageUserState state, int userId) { if (s == null) return null; - if (!checkUseInstalled(flags, state)) { + if (!checkUseInstalledOrBlocked(flags, state)) { return null; } if (!copyNeeded(flags, s.owner, state, s.metaData, userId)) { @@ -3937,7 +3948,7 @@ public class PackageParser { public static final ProviderInfo generateProviderInfo(Provider p, int flags, PackageUserState state, int userId) { if (p == null) return null; - if (!checkUseInstalled(flags, state)) { + if (!checkUseInstalledOrBlocked(flags, state)) { return null; } if (!copyNeeded(flags, p.owner, state, p.metaData, userId) diff --git a/core/java/android/content/pm/PackageUserState.java b/core/java/android/content/pm/PackageUserState.java index dcd54fc..94e3f79 100644 --- a/core/java/android/content/pm/PackageUserState.java +++ b/core/java/android/content/pm/PackageUserState.java @@ -28,6 +28,7 @@ public class PackageUserState { public boolean stopped; public boolean notLaunched; public boolean installed; + public boolean blocked; // Is the app restricted by owner / admin public int enabled; public String lastDisableAppCaller; @@ -37,6 +38,7 @@ public class PackageUserState { public PackageUserState() { installed = true; + blocked = false; enabled = COMPONENT_ENABLED_STATE_DEFAULT; } @@ -45,6 +47,7 @@ public class PackageUserState { stopped = o.stopped; notLaunched = o.notLaunched; enabled = o.enabled; + blocked = o.blocked; lastDisableAppCaller = o.lastDisableAppCaller; disabledComponents = o.disabledComponents != null ? new HashSet<String>(o.disabledComponents) : null; |