From ec5f7d16253496258f04a16038b2e578532750a7 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 8 Aug 2018 09:15:04 -0600 Subject: [PATCH] Support more createPackageContextAsUser() users. We created this API to make it easy to pass a given UserHandle into all Managers obtained from a given Context, which works great for "normal" users, but we should also support special users like ALL and CURRENT. Also add an AutoCloseable marker to make try-with-resources easier. Bug: 112153259 Test: atest android.content.cts.ContextTest Change-Id: I261dfcc5cfdfc76bda5d70181785e11c2715a558 --- api/current.txt | 2 +- api/system-current.txt | 3 +++ api/test-current.txt | 3 +++ config/hiddenapi-light-greylist.txt | 2 -- core/java/android/app/ActivityThread.java | 2 +- core/java/android/content/Context.java | 1 + core/java/android/database/sqlite/SQLiteOpenHelper.java | 2 +- core/java/android/os/UserHandle.java | 5 +++++ 8 files changed, 15 insertions(+), 5 deletions(-) diff --git a/api/current.txt b/api/current.txt index b9e00f6fc0be2..866022d78895a 100755 --- a/api/current.txt +++ b/api/current.txt @@ -12652,7 +12652,7 @@ package android.database.sqlite { ctor public SQLiteMisuseException(java.lang.String); } - public abstract class SQLiteOpenHelper { + public abstract class SQLiteOpenHelper implements java.lang.AutoCloseable { ctor public SQLiteOpenHelper(android.content.Context, java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int); ctor public SQLiteOpenHelper(android.content.Context, java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int, android.database.DatabaseErrorHandler); ctor public SQLiteOpenHelper(android.content.Context, java.lang.String, int, android.database.sqlite.SQLiteDatabase.OpenParams); diff --git a/api/system-current.txt b/api/system-current.txt index 1e1c621a561d7..4514ca3862887 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4107,6 +4107,9 @@ package android.os { method public boolean isSystem(); method public static int myUserId(); method public static android.os.UserHandle of(int); + field public static final android.os.UserHandle ALL; + field public static final android.os.UserHandle CURRENT; + field public static final android.os.UserHandle SYSTEM; field public static final int USER_NULL = -10000; // 0xffffd8f0 } diff --git a/api/test-current.txt b/api/test-current.txt index 0f89dfd12c196..8326b6311fbec 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -259,6 +259,7 @@ package android.content { } public abstract class Context { + method public android.content.Context createPackageContextAsUser(java.lang.String, int, android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException; method public abstract java.lang.String getOpPackageName(); method public android.os.UserHandle getUser(); method public int getUserId(); @@ -765,6 +766,8 @@ package android.os { method public static int getAppId(int); method public int getIdentifier(); method public static boolean isApp(int); + field public static final android.os.UserHandle ALL; + field public static final android.os.UserHandle CURRENT; field public static final android.os.UserHandle SYSTEM; } diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index a4f13a0c5788a..776a5f5345ed7 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -1001,8 +1001,6 @@ Landroid/os/UserHandle;->AID_APP_START:I Landroid/os/UserHandle;->AID_CACHE_GID_START:I Landroid/os/UserHandle;->AID_ROOT:I Landroid/os/UserHandle;->AID_SHARED_GID_START:I -Landroid/os/UserHandle;->ALL:Landroid/os/UserHandle; -Landroid/os/UserHandle;->CURRENT:Landroid/os/UserHandle; Landroid/os/UserHandle;->CURRENT_OR_SELF:Landroid/os/UserHandle; Landroid/os/UserHandle;->ERR_GID:I Landroid/os/UserHandle;->formatUid(Ljava/io/PrintWriter;I)V diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 9120701449867..0e884d67d011f 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -2131,7 +2131,7 @@ public final class ActivityThread extends ClientTransactionHandler { ai = getPackageManager().getApplicationInfo(packageName, PackageManager.GET_SHARED_LIBRARY_FILES | PackageManager.MATCH_DEBUG_TRIAGED_MISSING, - userId); + (userId < 0) ? UserHandle.myUserId() : userId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index ddd12a546650b..80e79a305f97a 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4792,6 +4792,7 @@ public abstract class Context { * @hide */ @SystemApi + @TestApi public Context createPackageContextAsUser( String packageName, @CreatePackageOptions int flags, UserHandle user) throws PackageManager.NameNotFoundException { diff --git a/core/java/android/database/sqlite/SQLiteOpenHelper.java b/core/java/android/database/sqlite/SQLiteOpenHelper.java index 1377806cb2131..19c6745ef8d46 100644 --- a/core/java/android/database/sqlite/SQLiteOpenHelper.java +++ b/core/java/android/database/sqlite/SQLiteOpenHelper.java @@ -49,7 +49,7 @@ import java.io.File; *

Note: this class assumes * monotonically increasing version numbers for upgrades.

*/ -public abstract class SQLiteOpenHelper { +public abstract class SQLiteOpenHelper implements AutoCloseable { private static final String TAG = SQLiteOpenHelper.class.getSimpleName(); private final Context mContext; diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index 995156a5a6c5a..4fe2d58ff75f1 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -38,12 +38,16 @@ public final class UserHandle implements Parcelable { public static final @UserIdInt int USER_ALL = -1; /** @hide A user handle to indicate all users on the device */ + @SystemApi + @TestApi public static final UserHandle ALL = new UserHandle(USER_ALL); /** @hide A user id to indicate the currently active user */ public static final @UserIdInt int USER_CURRENT = -2; /** @hide A user handle to indicate the current user of the device */ + @SystemApi + @TestApi public static final UserHandle CURRENT = new UserHandle(USER_CURRENT); /** @hide A user id to indicate that we would like to send to the current @@ -83,6 +87,7 @@ public final class UserHandle implements Parcelable { public static final int USER_SERIAL_SYSTEM = 0; /** @hide A user handle to indicate the "system" user of the device */ + @SystemApi @TestApi public static final UserHandle SYSTEM = new UserHandle(USER_SYSTEM);