diff options
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 17 | ||||
| -rw-r--r-- | core/java/android/app/ContextImpl.java | 12 | ||||
| -rw-r--r-- | core/java/android/app/Notification.java | 7 | ||||
| -rw-r--r-- | core/java/android/appwidget/AppWidgetHostView.java | 8 | ||||
| -rw-r--r-- | core/java/android/content/Context.java | 26 | ||||
| -rw-r--r-- | core/java/android/content/ContextWrapper.java | 8 | ||||
| -rw-r--r-- | core/java/android/service/notification/StatusBarNotification.java | 7 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewFactory.java | 10 | ||||
| -rw-r--r-- | core/java/android/widget/RemoteViews.java | 5 | ||||
| -rw-r--r-- | packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java | 2 |
10 files changed, 79 insertions, 23 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 46233d7a0688..034ad8e83fd3 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -36,6 +36,7 @@ import static com.android.internal.annotations.VisibleForTesting.Visibility.PACK import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.UserIdInt; import android.app.assist.AssistContent; import android.app.assist.AssistStructure; import android.app.backup.BackupAgent; @@ -61,6 +62,7 @@ import android.content.ContentCaptureOptions; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Context; +import android.content.Context.CreatePackageOptions; import android.content.IContentProvider; import android.content.IIntentReceiver; import android.content.Intent; @@ -71,6 +73,7 @@ import android.content.pm.IPackageManager; import android.content.pm.InstrumentationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.ApplicationInfoFlags; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ParceledListSlice; import android.content.pm.PermissionInfo; @@ -2373,16 +2376,22 @@ public final class ActivityThread extends ClientTransactionHandler @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo, - int flags) { + @CreatePackageOptions int flags) { return getPackageInfo(packageName, compatInfo, flags, UserHandle.myUserId()); } public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo, - int flags, int userId) { + @CreatePackageOptions int flags, @UserIdInt int userId) { + return getPackageInfo(packageName, compatInfo, flags, userId, 0 /* packageFlags */); + } + + public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo, + @CreatePackageOptions int flags, @UserIdInt int userId, + @ApplicationInfoFlags int packageFlags) { final boolean differentUser = (UserHandle.myUserId() != userId); ApplicationInfo ai = PackageManager.getApplicationInfoAsUserCached( packageName, - PackageManager.GET_SHARED_LIBRARY_FILES + packageFlags | PackageManager.GET_SHARED_LIBRARY_FILES | PackageManager.MATCH_DEBUG_TRIAGED_MISSING, (userId < 0) ? UserHandle.myUserId() : userId); synchronized (mResourcesManager) { @@ -2425,7 +2434,7 @@ public final class ActivityThread extends ClientTransactionHandler @UnsupportedAppUsage(trackingBug = 171933273) public final LoadedApk getPackageInfo(ApplicationInfo ai, CompatibilityInfo compatInfo, - int flags) { + @CreatePackageOptions int flags) { boolean includeCode = (flags&Context.CONTEXT_INCLUDE_CODE) != 0; boolean securityViolation = includeCode && ai.uid != 0 && ai.uid != Process.SYSTEM_UID && (mBoundApplication != null diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 5e99c79a7497..16b6ea5bcf42 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -26,6 +26,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UiContext; import android.compat.annotation.UnsupportedAppUsage; +import android.content.AttributionSource; import android.content.AutofillOptions; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -47,6 +48,7 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.ApplicationInfoFlags; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.AssetManager; import android.content.res.CompatResources; @@ -60,7 +62,6 @@ import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; -import android.content.AttributionSource; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -2493,6 +2494,13 @@ class ContextImpl extends Context { @Override public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) throws NameNotFoundException { + return createPackageContextAsUser(packageName, flags, user, 0 /* packageFlags */); + } + + @Override + public Context createPackageContextAsUser( + @NonNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user, + @ApplicationInfoFlags int packageFlags) throws PackageManager.NameNotFoundException { if (packageName.equals("system") || packageName.equals("android")) { // The system resources are loaded in every application, so we can safely copy // the context without reloading Resources. @@ -2503,7 +2511,7 @@ class ContextImpl extends Context { } LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), - flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier()); + flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier(), packageFlags); if (pi != null) { ContextImpl c = new ContextImpl(this, mMainThread, pi, mParams, mAttributionSource.getAttributionTag(), diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 6454d2027f58..506dfe09f3fa 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -6344,10 +6344,11 @@ public class Notification implements Parcelable ApplicationInfo applicationInfo = n.extras.getParcelable( EXTRA_BUILDER_APPLICATION_INFO); Context builderContext; - if (applicationInfo != null) { + if (applicationInfo != null && applicationInfo.packageName != null) { try { - builderContext = context.createApplicationContext(applicationInfo, - Context.CONTEXT_RESTRICTED); + builderContext = context.createPackageContextAsUser(applicationInfo.packageName, + Context.CONTEXT_RESTRICTED, + UserHandle.getUserHandleForUid(applicationInfo.uid)); } catch (NameNotFoundException e) { Log.e(TAG, "ApplicationInfo " + applicationInfo + " not found"); builderContext = context; // try with our context diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index ba3fc1e55c54..3b11a19f9acc 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -37,6 +37,7 @@ import android.os.Build; import android.os.Bundle; import android.os.CancellationSignal; import android.os.Parcelable; +import android.os.UserHandle; import android.util.AttributeSet; import android.util.Log; import android.util.Pair; @@ -718,9 +719,10 @@ public class AppWidgetHostView extends FrameLayout { protected Context getRemoteContext() { try { // Return if cloned successfully, otherwise default - Context newContext = mContext.createApplicationContext( - mInfo.providerInfo.applicationInfo, - Context.CONTEXT_RESTRICTED); + final ApplicationInfo info = mInfo.providerInfo.applicationInfo; + Context newContext = mContext.createPackageContextAsUser(info.packageName, + Context.CONTEXT_RESTRICTED, + UserHandle.getUserHandleForUid(info.uid)); if (mColorResources != null) { mColorResources.apply(newContext); } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index c02dcfd3d681..9c60f431b06e 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -46,6 +46,7 @@ import android.app.time.TimeManager; import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.ApplicationInfoFlags; import android.content.res.AssetManager; import android.content.res.ColorStateList; import android.content.res.Configuration; @@ -6268,6 +6269,23 @@ public abstract class Context { } /** + * Similar to {@link #createPackageContextAsUser(String, int, UserHandle)}, but also allows + * specifying the flags used to retrieve the {@link ApplicationInfo} of the package. + * + * @hide + */ + @NonNull + public Context createPackageContextAsUser( + @NonNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user, + @ApplicationInfoFlags int packageFlags) + throws PackageManager.NameNotFoundException { + if (Build.IS_ENG) { + throw new IllegalStateException("createPackageContextAsUser not overridden!"); + } + return this; + } + + /** * Similar to {@link #createPackageContext(String, int)}, but for the own package with a * different {@link UserHandle}. For example, {@link #getContentResolver()} * will open any {@link Uri} as the given user. @@ -6286,10 +6304,18 @@ public abstract class Context { /** * Creates a context given an {@link android.content.pm.ApplicationInfo}. * + * @deprecated use {@link #createPackageContextAsUser(String, int, UserHandle, int)} + * If an application caches an ApplicationInfo and uses it to call this method, + * the app will not get the most recent version of Runtime Resource Overlays for + * that application. To make things worse, the LoadedApk stored in + * {@code ActivityThread#mResourcePackages} is updated using the old ApplicationInfo + * causing further uses of the cached LoadedApk to return outdated information. + * * @hide */ @SuppressWarnings("HiddenAbstractMethod") @UnsupportedAppUsage + @Deprecated public abstract Context createApplicationContext(ApplicationInfo application, @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException; diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 6324d0ecb0e0..cf0dc8c92ea1 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -1009,6 +1009,14 @@ public class ContextWrapper extends Context { /** @hide */ @Override + public Context createPackageContextAsUser(String packageName, int flags, UserHandle user, + int packageFlags) + throws PackageManager.NameNotFoundException { + return mBase.createPackageContextAsUser(packageName, flags, user, packageFlags); + } + + /** @hide */ + @Override public Context createContextAsUser(UserHandle user, @CreatePackageOptions int flags) { return mBase.createContextAsUser(user, flags); } diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java index 8e4a68e52697..863d71f6f793 100644 --- a/core/java/android/service/notification/StatusBarNotification.java +++ b/core/java/android/service/notification/StatusBarNotification.java @@ -434,11 +434,8 @@ public class StatusBarNotification implements Parcelable { public Context getPackageContext(Context context) { if (mContext == null) { try { - ApplicationInfo ai = context.getPackageManager() - .getApplicationInfoAsUser(pkg, PackageManager.MATCH_UNINSTALLED_PACKAGES, - getUserId()); - mContext = context.createApplicationContext(ai, - Context.CONTEXT_RESTRICTED); + mContext = context.createPackageContextAsUser(pkg, Context.CONTEXT_RESTRICTED, user, + PackageManager.MATCH_UNINSTALLED_PACKAGES); } catch (PackageManager.NameNotFoundException e) { mContext = null; } diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index cf6807e41e8a..8d27cded6338 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -33,6 +33,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.Trace; +import android.os.UserHandle; import android.util.AndroidRuntimeException; import android.util.ArraySet; import android.util.Log; @@ -467,9 +468,12 @@ public final class WebViewFactory { sTimestamps.mCreateContextStart = SystemClock.uptimeMillis(); try { // Construct an app context to load the Java code into the current app. - Context webViewContext = initialApplication.createApplicationContext( - ai, - Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); + Context webViewContext = initialApplication.createPackageContextAsUser( + ai.packageName, + Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY, + UserHandle.getUserHandleForUid(ai.uid), + PackageManager.MATCH_UNINSTALLED_PACKAGES + | PackageManager.MATCH_DEBUG_TRIAGED_MISSING); sPackageInfo = newPackageInfo; return webViewContext; } finally { diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index e827f0a31bfd..8a044fd06dd5 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -5831,8 +5831,9 @@ public class RemoteViews implements Parcelable, Filter { return context; } try { - return context.createApplicationContext(mApplication, - Context.CONTEXT_RESTRICTED); + return context.createPackageContextAsUser(mApplication.packageName, + Context.CONTEXT_RESTRICTED, + UserHandle.getUserHandleForUid(mApplication.uid)); } catch (NameNotFoundException e) { Log.e(LOG_TAG, "Package name " + mApplication.packageName + " not found"); } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java index 2b35bcd9a3ea..c90833c5b8f2 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java @@ -345,7 +345,7 @@ public class PluginInstanceManager<T extends Plugin> { // Create our own ClassLoader so we can use our own code as the parent. ClassLoader classLoader = mManager.getClassLoader(info); Context pluginContext = new PluginContextWrapper( - mContext.createApplicationContext(info, 0), classLoader); + mContext.createPackageContext(pkg, 0), classLoader); Class<?> pluginClass = Class.forName(cls, true, classLoader); // TODO: Only create the plugin before version check if we need it for // legacy version check. |