summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt1
-rw-r--r--core/java/android/content/pm/PackageManager.java13
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java21
3 files changed, 27 insertions, 8 deletions
diff --git a/api/current.txt b/api/current.txt
index 231495fa02c1..807de3cc2154 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11908,6 +11908,7 @@ package android.content.pm {
field public static final int SIGNATURE_NO_MATCH = -3; // 0xfffffffd
field public static final int SIGNATURE_SECOND_NOT_SIGNED = -2; // 0xfffffffe
field public static final int SIGNATURE_UNKNOWN_PACKAGE = -4; // 0xfffffffc
+ field public static final int SYNCHRONOUS = 2; // 0x2
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/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index fafb56d20ba0..fd14d235a044 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -917,8 +917,9 @@ public abstract class PackageManager {
public static final int INSTALL_DRY_RUN = 0x00800000;
/** @hide */
- @IntDef(flag = true, prefix = { "DONT_KILL_APP" }, value = {
- DONT_KILL_APP
+ @IntDef(flag = true, value = {
+ DONT_KILL_APP,
+ SYNCHRONOUS
})
@Retention(RetentionPolicy.SOURCE)
public @interface EnabledFlags {}
@@ -931,6 +932,14 @@ public abstract class PackageManager {
*/
public static final int DONT_KILL_APP = 0x00000001;
+ /**
+ * Flag parameter for
+ * {@link #setComponentEnabledSetting(android.content.ComponentName, int, int)} to indicate
+ * that the given user's package restrictions state will be serialised to disk after the
+ * component state has been updated.
+ */
+ public static final int SYNCHRONOUS = 0x00000002;
+
/** @hide */
@IntDef(prefix = { "INSTALL_REASON_" }, value = {
INSTALL_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 f15391a1f1cd..86340d40e3c9 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -19980,7 +19980,11 @@ public class PackageManagerService extends IPackageManager.Stub
}
}
synchronized (mLock) {
- scheduleWritePackageRestrictionsLocked(userId);
+ if ((flags & PackageManager.SYNCHRONOUS) != 0) {
+ flushPackageRestrictionsAsUserInternalLocked(userId);
+ } else {
+ scheduleWritePackageRestrictionsLocked(userId);
+ }
updateSequenceNumberLP(pkgSetting, new int[] { userId });
final long callingId = Binder.clearCallingIdentity();
try {
@@ -20041,11 +20045,16 @@ public class PackageManagerService extends IPackageManager.Stub
mPermissionManager.enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission*/,
false /* checkShell */, "flushPackageRestrictions");
synchronized (mLock) {
- mSettings.writePackageRestrictionsLPr(userId);
- mDirtyUsers.remove(userId);
- if (mDirtyUsers.isEmpty()) {
- mHandler.removeMessages(WRITE_PACKAGE_RESTRICTIONS);
- }
+ flushPackageRestrictionsAsUserInternalLocked(userId);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void flushPackageRestrictionsAsUserInternalLocked(int userId) {
+ mSettings.writePackageRestrictionsLPr(userId);
+ mDirtyUsers.remove(userId);
+ if (mDirtyUsers.isEmpty()) {
+ mHandler.removeMessages(WRITE_PACKAGE_RESTRICTIONS);
}
}