diff options
author | Ian Pedowitz <ijpedowitz@google.com> | 2016-11-22 21:29:57 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-11-22 21:30:01 +0000 |
commit | a53e2bc3c0647dba586ac10214b1027334f0f8b0 (patch) | |
tree | 9985ca5ec9926996fd724220d673d1051311424e | |
parent | 0cde53ea132f3ba49838df1fdc1ebb233a8124d0 (diff) | |
parent | 304321ed8d0a2c74b8ceb32a55dcaa2f2c01ea57 (diff) |
Merge "Revert "Move Resource creation out of ContextImpl constructor""
-rw-r--r-- | core/java/android/app/ContextImpl.java | 152 | ||||
-rw-r--r-- | core/java/android/app/ContextImplFlagContextWrapper.java | 43 |
2 files changed, 79 insertions, 116 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 496c05f5f1df..827e02696e2b 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -33,6 +33,7 @@ import android.content.IntentSender; import android.content.ReceiverCallNotAllowedException; import android.content.ServiceConnection; import android.content.SharedPreferences; +import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; @@ -159,7 +160,7 @@ class ContextImpl extends Context { private final String mOpPackageName; private final @NonNull ResourcesManager mResourcesManager; - private @NonNull Resources mResources; + private final @NonNull Resources mResources; private @Nullable Display mDisplay; // may be null if default display private final int mFlags; @@ -1834,19 +1835,6 @@ class ContextImpl extends Context { } } - private static Resources createResources(IBinder activityToken, LoadedApk pi, int displayId, - Configuration overrideConfig, CompatibilityInfo compatInfo) { - return ResourcesManager.getInstance().getResources(activityToken, - pi.getResDir(), - pi.getSplitResDirs(), - pi.getOverlayDirs(), - pi.getApplicationInfo().sharedLibraryFiles, - displayId, - overrideConfig, - compatInfo, - pi.getClassLoader()); - } - @Override public Context createApplicationContext(ApplicationInfo application, int flags) throws NameNotFoundException { @@ -1854,13 +1842,8 @@ class ContextImpl extends Context { flags | CONTEXT_REGISTER_PACKAGE); if (pi != null) { ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken, - new UserHandle(UserHandle.getUserId(application.uid)), flags); - - final int displayId = mDisplay != null - ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY; - - c.mResources = createResources(mActivityToken, pi, displayId, null, - getDisplayAdjustments(displayId).getCompatibilityInfo()); + new UserHandle(UserHandle.getUserId(application.uid)), flags, + mDisplay, null, Display.INVALID_DISPLAY); if (c.mResources != null) { return c; } @@ -1881,21 +1864,15 @@ class ContextImpl extends Context { public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) throws 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. - return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, user, flags); + return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, + user, flags, mDisplay, null, Display.INVALID_DISPLAY); } LoadedApk pi = mMainThread.getPackageInfo(packageName, mResources.getCompatibilityInfo(), flags | CONTEXT_REGISTER_PACKAGE, user.getIdentifier()); if (pi != null) { - ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken, user, flags); - - final int displayId = mDisplay != null - ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY; - - c.mResources = createResources(mActivityToken, pi, displayId, null, - getDisplayAdjustments(displayId).getCompatibilityInfo()); + ContextImpl c = new ContextImpl(this, mMainThread, pi, mActivityToken, + user, flags, mDisplay, null, Display.INVALID_DISPLAY); if (c.mResources != null) { return c; } @@ -1912,14 +1889,8 @@ class ContextImpl extends Context { throw new IllegalArgumentException("overrideConfiguration must not be null"); } - ContextImpl context = new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, - mUser, mFlags); - - final int displayId = mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY; - context.mResources = createResources(mActivityToken, mPackageInfo, displayId, - overrideConfiguration, getDisplayAdjustments(displayId).getCompatibilityInfo()); - context.mDisplay = mDisplay; - return context; + return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, + mUser, mFlags, mDisplay, overrideConfiguration, Display.INVALID_DISPLAY); } @Override @@ -1928,28 +1899,24 @@ class ContextImpl extends Context { throw new IllegalArgumentException("display must not be null"); } - ContextImpl context = new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, - mUser, mFlags); - - final int displayId = display.getDisplayId(); - context.mResources = createResources(mActivityToken, mPackageInfo, displayId, null, - getDisplayAdjustments(displayId).getCompatibilityInfo()); - context.mDisplay = display; - return context; + return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, + mUser, mFlags, display, null, Display.INVALID_DISPLAY); } @Override public Context createDeviceProtectedStorageContext() { final int flags = (mFlags & ~Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE) | Context.CONTEXT_DEVICE_PROTECTED_STORAGE; - return new ContextImplFlagContextWrapper(this, flags); + return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, + mUser, flags, mDisplay, null, Display.INVALID_DISPLAY); } @Override public Context createCredentialProtectedStorageContext() { final int flags = (mFlags & ~Context.CONTEXT_DEVICE_PROTECTED_STORAGE) | Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE; - return new ContextImplFlagContextWrapper(this, flags); + return new ContextImpl(this, mMainThread, mPackageInfo, mActivityToken, + mUser, flags, mDisplay, null, Display.INVALID_DISPLAY); } @Override @@ -2036,8 +2003,8 @@ class ContextImpl extends Context { static ContextImpl createSystemContext(ActivityThread mainThread) { LoadedApk packageInfo = new LoadedApk(mainThread); - ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, 0); - context.mResources = packageInfo.getResources(mainThread); + ContextImpl context = new ContextImpl(null, mainThread, + packageInfo, null, null, 0, null, null, Display.INVALID_DISPLAY); context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(), context.mResourcesManager.getDisplayMetrics()); return context; @@ -2045,35 +2012,21 @@ class ContextImpl extends Context { static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) { if (packageInfo == null) throw new IllegalArgumentException("packageInfo"); - ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, 0); - context.mResources = packageInfo.getResources(mainThread); - return context; + return new ContextImpl(null, mainThread, + packageInfo, null, null, 0, null, null, Display.INVALID_DISPLAY); } static ContextImpl createActivityContext(ActivityThread mainThread, LoadedApk packageInfo, IBinder activityToken, int displayId, Configuration overrideConfiguration) { if (packageInfo == null) throw new IllegalArgumentException("packageInfo"); - - ContextImpl context = new ContextImpl(null, mainThread, packageInfo, activityToken, null, - 0); - - // Clamp display ID to DEFAULT_DISPLAY if it is INVALID_DISPLAY. - displayId = (displayId != Display.INVALID_DISPLAY) ? displayId : Display.DEFAULT_DISPLAY; - - final CompatibilityInfo compatInfo = (displayId == Display.DEFAULT_DISPLAY) - ? packageInfo.getCompatibilityInfo() - : CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; - - context.mResources = createResources(activityToken, packageInfo, displayId, - overrideConfiguration, compatInfo); - context.mDisplay = ResourcesManager.getInstance().getAdjustedDisplay(displayId, - context.mResources.getDisplayAdjustments()); - return context; + return new ContextImpl(null, mainThread, packageInfo, activityToken, null, 0, + null, overrideConfiguration, displayId); } private ContextImpl(ContextImpl container, ActivityThread mainThread, - LoadedApk packageInfo, IBinder activityToken, UserHandle user, int flags) { + LoadedApk packageInfo, IBinder activityToken, UserHandle user, int flags, + Display display, Configuration overrideConfiguration, int createDisplayWithId) { mOuterContext = this; // If creator didn't specify which storage to use, use the default @@ -2100,11 +2053,64 @@ class ContextImpl extends Context { mPackageInfo = packageInfo; mResourcesManager = ResourcesManager.getInstance(); + final int displayId = (createDisplayWithId != Display.INVALID_DISPLAY) + ? createDisplayWithId + : (display != null) ? display.getDisplayId() : Display.DEFAULT_DISPLAY; + + CompatibilityInfo compatInfo = null; + if (container != null) { + compatInfo = container.getDisplayAdjustments(displayId).getCompatibilityInfo(); + } + if (compatInfo == null) { + compatInfo = (displayId == Display.DEFAULT_DISPLAY) + ? packageInfo.getCompatibilityInfo() + : CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; + } + + Resources resources = packageInfo.getResources(mainThread); + if (resources != null) { + if (displayId != Display.DEFAULT_DISPLAY + || overrideConfiguration != null + || (compatInfo != null && compatInfo.applicationScale + != resources.getCompatibilityInfo().applicationScale)) { + + if (container != null) { + // This is a nested Context, so it can't be a base Activity context. + // Just create a regular Resources object associated with the Activity. + resources = mResourcesManager.getResources( + activityToken, + packageInfo.getResDir(), + packageInfo.getSplitResDirs(), + packageInfo.getOverlayDirs(), + packageInfo.getApplicationInfo().sharedLibraryFiles, + displayId, + overrideConfiguration, + compatInfo, + packageInfo.getClassLoader()); + } else { + // This is not a nested Context, so it must be the root Activity context. + // All other nested Contexts will inherit the configuration set here. + resources = mResourcesManager.createBaseActivityResources( + activityToken, + packageInfo.getResDir(), + packageInfo.getSplitResDirs(), + packageInfo.getOverlayDirs(), + packageInfo.getApplicationInfo().sharedLibraryFiles, + displayId, + overrideConfiguration, + compatInfo, + packageInfo.getClassLoader()); + } + } + } + mResources = resources; + + mDisplay = (createDisplayWithId == Display.INVALID_DISPLAY) ? display + : mResourcesManager.getAdjustedDisplay(displayId, mResources.getDisplayAdjustments()); + if (container != null) { mBasePackageName = container.mBasePackageName; mOpPackageName = container.mOpPackageName; - mResources = container.getResources(); - mDisplay = container.getDisplay(); } else { mBasePackageName = packageInfo.mPackageName; ApplicationInfo ainfo = packageInfo.getApplicationInfo(); diff --git a/core/java/android/app/ContextImplFlagContextWrapper.java b/core/java/android/app/ContextImplFlagContextWrapper.java deleted file mode 100644 index a83f13020dd1..000000000000 --- a/core/java/android/app/ContextImplFlagContextWrapper.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package android.app; - -import android.content.Context; -import android.content.ContextWrapper; - -class ContextImplFlagContextWrapper extends ContextWrapper { - private final int mFlags; - - public ContextImplFlagContextWrapper(Context base, int flags) { - super(base); - mFlags = flags; - } - - @Override - public boolean isRestricted() { - return (mFlags & Context.CONTEXT_RESTRICTED) != 0; - } - - @Override - public boolean isDeviceProtectedStorage() { - return (mFlags & Context.CONTEXT_DEVICE_PROTECTED_STORAGE) != 0; - } - - @Override - public boolean isCredentialProtectedStorage() { - return (mFlags & Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE) != 0; - } -} |