Loading core/java/android/app/ActivityThread.java +47 −37 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.app; import static android.view.DisplayAdjustments.DEVELOPMENT_RESOURCES_DEPEND_ON_ACTIVITY_TOKEN; import android.app.backup.BackupAgent; import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; Loading Loading @@ -75,7 +77,7 @@ import android.util.Log; import android.util.LogPrinter; import android.util.PrintWriterPrinter; import android.util.Slog; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.Display; import android.view.HardwareRenderer; import android.view.View; Loading Loading @@ -209,8 +211,8 @@ public final class ActivityThread { = new HashMap<String, WeakReference<LoadedApk>>(); final HashMap<String, WeakReference<LoadedApk>> mResourcePackages = new HashMap<String, WeakReference<LoadedApk>>(); final HashMap<CompatibilityInfo, DisplayMetrics> mDefaultDisplayMetrics = new HashMap<CompatibilityInfo, DisplayMetrics>(); final HashMap<DisplayAdjustments, DisplayMetrics> mDefaultDisplayMetrics = new HashMap<DisplayAdjustments, DisplayMetrics>(); final HashMap<ResourcesKey, WeakReference<Resources> > mActiveResources = new HashMap<ResourcesKey, WeakReference<Resources> >(); final ArrayList<ActivityClientRecord> mRelaunchingActivities Loading Loading @@ -1554,6 +1556,7 @@ public final class ActivityThread { } private class Idler implements MessageQueue.IdleHandler { @Override public final boolean queueIdle() { ActivityClientRecord a = mNewActivities; boolean stopProfiling = false; Loading Loading @@ -1592,6 +1595,7 @@ public final class ActivityThread { } final class GcIdler implements MessageQueue.IdleHandler { @Override public final boolean queueIdle() { doGcIfNeeded(); return false; Loading @@ -1604,8 +1608,10 @@ public final class ActivityThread { final private Configuration mOverrideConfiguration; final private float mScale; final private int mHash; final private IBinder mToken; ResourcesKey(String resDir, int displayId, Configuration overrideConfiguration, float scale) { ResourcesKey(String resDir, int displayId, Configuration overrideConfiguration, float scale, IBinder token) { mResDir = resDir; mDisplayId = displayId; if (overrideConfiguration != null) { Loading @@ -1621,6 +1627,12 @@ public final class ActivityThread { hash = 31 * hash + (mOverrideConfiguration != null ? mOverrideConfiguration.hashCode() : 0); hash = 31 * hash + Float.floatToIntBits(mScale); if (DEVELOPMENT_RESOURCES_DEPEND_ON_ACTIVITY_TOKEN) { mToken = token; hash = 31 * hash + (mToken == null ? 0 : mToken.hashCode()); } else { mToken = null; } mHash = hash; } Loading Loading @@ -1693,9 +1705,13 @@ public final class ActivityThread { mDefaultDisplayMetrics.clear(); } DisplayMetrics getDisplayMetricsLocked(int displayId, CompatibilityInfo ci) { DisplayMetrics getDisplayMetricsLocked(int displayId) { return getDisplayMetricsLocked(displayId, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS); } DisplayMetrics getDisplayMetricsLocked(int displayId, DisplayAdjustments daj) { boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); DisplayMetrics dm = isDefaultDisplay ? mDefaultDisplayMetrics.get(ci) : null; DisplayMetrics dm = isDefaultDisplay ? mDefaultDisplayMetrics.get(daj) : null; if (dm != null) { return dm; } Loading @@ -1709,12 +1725,10 @@ public final class ActivityThread { } if (isDefaultDisplay) { mDefaultDisplayMetrics.put(ci, dm); mDefaultDisplayMetrics.put(daj, dm); } CompatibilityInfoHolder cih = new CompatibilityInfoHolder(); cih.set(ci); Display d = displayManager.getCompatibleDisplay(displayId, cih); Display d = displayManager.getCompatibleDisplay(displayId, daj); if (d != null) { d.getMetrics(dm); } else { Loading @@ -1736,7 +1750,7 @@ public final class ActivityThread { if (config == null) { return null; } if (compat != null && !compat.supportsScreen()) { if (!compat.supportsScreen()) { mMainThreadConfig.setTo(config); config = mMainThreadConfig; compat.applyToConfiguration(displayDensity, config); Loading @@ -1748,21 +1762,19 @@ public final class ActivityThread { * Creates the top level Resources for applications with the given compatibility info. * * @param resDir the resource directory. * @param compInfo the compability info. It will use the default compatibility info when it's * null. * @param compatInfo the compability info. Must not be null. * @param token the application token for determining stack bounds. */ Resources getTopLevelResources(String resDir, int displayId, Configuration overrideConfiguration, CompatibilityInfo compInfo) { ResourcesKey key = new ResourcesKey(resDir, displayId, overrideConfiguration, compInfo.applicationScale); Resources getTopLevelResources(String resDir, int displayId, Configuration overrideConfiguration, CompatibilityInfo compatInfo, IBinder token) { final float scale = compatInfo.applicationScale; ResourcesKey key = new ResourcesKey(resDir, displayId, overrideConfiguration, scale, token); Resources r; synchronized (mPackages) { // Resources is app scale dependent. if (false) { Slog.w(TAG, "getTopLevelResources: " + resDir + " / " + compInfo.applicationScale); Slog.w(TAG, "getTopLevelResources: " + resDir + " / " + scale); } WeakReference<Resources> wr = mActiveResources.get(key); r = wr != null ? wr.get() : null; Loading @@ -1787,7 +1799,7 @@ public final class ActivityThread { } //Slog.i(TAG, "Resource: key=" + key + ", display metrics=" + metrics); DisplayMetrics dm = getDisplayMetricsLocked(displayId, null); DisplayMetrics dm = getDisplayMetricsLocked(displayId); Configuration config; boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); if (!isDefaultDisplay || key.mOverrideConfiguration != null) { Loading @@ -1801,7 +1813,7 @@ public final class ActivityThread { } else { config = getConfiguration(); } r = new Resources(assets, dm, config, compInfo); r = new Resources(assets, dm, config, compatInfo, token); if (false) { Slog.i(TAG, "Created app resources " + resDir + " " + r + ": " + r.getConfiguration() + " appScale=" Loading Loading @@ -1831,7 +1843,7 @@ public final class ActivityThread { int displayId, Configuration overrideConfiguration, LoadedApk pkgInfo) { return getTopLevelResources(resDir, displayId, overrideConfiguration, pkgInfo.mCompatibilityInfo.get()); pkgInfo.getCompatibilityInfo(), null); } final Handler getHandler() { Loading Loading @@ -2005,10 +2017,8 @@ public final class ActivityThread { LoadedApk info = new LoadedApk(this, "android", context, null, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO); context.init(info, null, this); context.getResources().updateConfiguration( getConfiguration(), getDisplayMetricsLocked( Display.DEFAULT_DISPLAY, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO)); context.getResources().updateConfiguration(getConfiguration(), getDisplayMetricsLocked(Display.DEFAULT_DISPLAY)); mSystemContext = context; //Slog.i(TAG, "Created system resources " + context.getResources() // + ": " + context.getResources().getConfiguration()); Loading Loading @@ -2301,7 +2311,7 @@ public final class ActivityThread { DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); for (int displayId : dm.getDisplayIds()) { if (displayId != Display.DEFAULT_DISPLAY) { Display display = dm.getRealDisplay(displayId); Display display = dm.getRealDisplay(displayId, r.token); baseContext = appContext.createDisplayContext(display); break; } Loading Loading @@ -3408,11 +3418,11 @@ public final class ActivityThread { private void handleUpdatePackageCompatibilityInfo(UpdateCompatibilityData data) { LoadedApk apk = peekPackageInfo(data.pkg, false); if (apk != null) { apk.mCompatibilityInfo.set(data.info); apk.setCompatibilityInfo(data.info); } apk = peekPackageInfo(data.pkg, true); if (apk != null) { apk.mCompatibilityInfo.set(data.info); apk.setCompatibilityInfo(data.info); } handleConfigurationChanged(mConfiguration, data.info); WindowManagerGlobal.getInstance().reportNewConfiguration(mConfiguration); Loading Loading @@ -3844,8 +3854,9 @@ public final class ActivityThread { for (ActivityClientRecord ar : mActivities.values()) { Activity a = ar.activity; if (a != null) { Configuration thisConfig = applyConfigCompatMainThread(mCurDefaultDisplayDpi, newConfig, ar.packageInfo.mCompatibilityInfo.getIfNeeded()); Configuration thisConfig = applyConfigCompatMainThread( mCurDefaultDisplayDpi, newConfig, ar.packageInfo.getCompatibilityInfo()); if (!ar.activity.mFinished && (allActivities || !ar.paused)) { // If the activity is currently resumed, its configuration // needs to change right now. Loading Loading @@ -3945,8 +3956,7 @@ public final class ActivityThread { } int changes = mResConfiguration.updateFrom(config); flushDisplayMetricsLocked(); DisplayMetrics defaultDisplayMetrics = getDisplayMetricsLocked( Display.DEFAULT_DISPLAY, null); DisplayMetrics defaultDisplayMetrics = getDisplayMetricsLocked(Display.DEFAULT_DISPLAY); if (compat != null && (mResCompatibilityInfo == null || !mResCompatibilityInfo.equals(compat))) { Loading Loading @@ -3986,7 +3996,7 @@ public final class ActivityThread { } tmpConfig.setTo(config); if (!isDefaultDisplay) { dm = getDisplayMetricsLocked(displayId, null); dm = getDisplayMetricsLocked(displayId); applyNonDefaultDisplayMetricsToConfigurationLocked(dm, tmpConfig); } if (overrideConfig != null) { Loading core/java/android/app/ContextImpl.java +27 −20 Original line number Diff line number Diff line Loading @@ -99,7 +99,7 @@ import android.util.AndroidRuntimeException; import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.ContextThemeWrapper; import android.view.Display; import android.view.WindowManagerImpl; Loading Loading @@ -205,6 +205,8 @@ class ContextImpl extends Context { private static final String[] EMPTY_FILE_LIST = {}; final private DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); /** * Override this class when the system service constructor needs a * ContextImpl. Else, use StaticServiceFetcher below. Loading Loading @@ -1830,10 +1832,8 @@ class ContextImpl extends Context { ContextImpl c = new ContextImpl(); c.init(mPackageInfo, null, mMainThread); c.mResources = mMainThread.getTopLevelResources( mPackageInfo.getResDir(), getDisplayId(), overrideConfiguration, mResources.getCompatibilityInfo()); c.mResources = mMainThread.getTopLevelResources(mPackageInfo.getResDir(), getDisplayId(), overrideConfiguration, mResources.getCompatibilityInfo(), mActivityToken); return c; } Loading @@ -1844,17 +1844,13 @@ class ContextImpl extends Context { } int displayId = display.getDisplayId(); CompatibilityInfo ci = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; CompatibilityInfoHolder cih = getCompatibilityInfo(displayId); if (cih != null) { ci = cih.get(); } ContextImpl context = new ContextImpl(); context.init(mPackageInfo, null, mMainThread); context.mDisplay = display; context.mResources = mMainThread.getTopLevelResources( mPackageInfo.getResDir(), displayId, null, ci); DisplayAdjustments daj = getDisplayAdjustments(displayId); context.mResources = mMainThread.getTopLevelResources(mPackageInfo.getResDir(), displayId, null, daj.getCompatibilityInfo(), null); return context; } Loading @@ -1868,8 +1864,8 @@ class ContextImpl extends Context { } @Override public CompatibilityInfoHolder getCompatibilityInfo(int displayId) { return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null; public DisplayAdjustments getDisplayAdjustments(int displayId) { return mDisplayAdjustments; } private File getDataDirFile() { Loading Loading @@ -1921,6 +1917,7 @@ class ContextImpl extends Context { mUser = context.mUser; mDisplay = context.mDisplay; mOuterContext = this; mDisplayAdjustments.setCompatibilityInfo(mPackageInfo.getCompatibilityInfo()); } final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) { Loading @@ -1933,16 +1930,26 @@ class ContextImpl extends Context { mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName; mResources = mPackageInfo.getResources(mainThread); if (mResources != null && container != null && container.getCompatibilityInfo().applicationScale != mResources.getCompatibilityInfo().applicationScale) { CompatibilityInfo compatInfo = container == null ? null : container.getCompatibilityInfo(); if (mResources != null && ((compatInfo != null && compatInfo.applicationScale != mResources.getCompatibilityInfo().applicationScale) || activityToken != null)) { if (DEBUG) { Log.d(TAG, "loaded context has different scaling. Using container's" + " compatiblity info:" + container.getDisplayMetrics()); } mResources = mainThread.getTopLevelResources( mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY, null, container.getCompatibilityInfo()); if (compatInfo == null) { compatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; } mDisplayAdjustments.setCompatibilityInfo(compatInfo); mDisplayAdjustments.setActivityToken(activityToken); mResources = mainThread.getTopLevelResources(mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY, null, compatInfo, activityToken); } else { mDisplayAdjustments.setCompatibilityInfo(packageInfo.getCompatibilityInfo()); mDisplayAdjustments.setActivityToken(activityToken); } mMainThread = mainThread; mActivityToken = activityToken; Loading core/java/android/app/LoadedApk.java +13 −5 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ import android.os.Trace; import android.os.UserHandle; import android.util.AndroidRuntimeException; import android.util.Slog; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.Display; import java.io.File; Loading Loading @@ -84,7 +84,7 @@ public final class LoadedApk { private final ClassLoader mBaseClassLoader; private final boolean mSecurityViolation; private final boolean mIncludeCode; public final CompatibilityInfoHolder mCompatibilityInfo = new CompatibilityInfoHolder(); private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); Resources mResources; private ClassLoader mClassLoader; private Application mApplication; Loading Loading @@ -132,7 +132,7 @@ public final class LoadedApk { mBaseClassLoader = baseLoader; mSecurityViolation = securityViolation; mIncludeCode = includeCode; mCompatibilityInfo.set(compatInfo); mDisplayAdjustments.setCompatibilityInfo(compatInfo); if (mAppDir == null) { if (ActivityThread.mSystemContext == null) { Loading @@ -141,7 +141,7 @@ public final class LoadedApk { ActivityThread.mSystemContext.getResources().updateConfiguration( mainThread.getConfiguration(), mainThread.getDisplayMetricsLocked( Display.DEFAULT_DISPLAY, compatInfo), Display.DEFAULT_DISPLAY, mDisplayAdjustments), compatInfo); //Slog.i(TAG, "Created system resources " // + mSystemContext.getResources() + ": " Loading Loading @@ -169,7 +169,7 @@ public final class LoadedApk { mIncludeCode = true; mClassLoader = systemContext.getClassLoader(); mResources = systemContext.getResources(); mCompatibilityInfo.set(compatInfo); mDisplayAdjustments.setCompatibilityInfo(compatInfo); } public String getPackageName() { Loading @@ -184,6 +184,14 @@ public final class LoadedApk { return mSecurityViolation; } public CompatibilityInfo getCompatibilityInfo() { return mDisplayAdjustments.getCompatibilityInfo(); } public void setCompatibilityInfo(CompatibilityInfo compatInfo) { mDisplayAdjustments.setCompatibilityInfo(compatInfo); } /** * Gets the array of shared libraries that are listed as * used by the given package. Loading core/java/android/content/Context.java +5 −5 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ import android.os.Looper; import android.os.UserHandle; import android.os.UserManager; import android.util.AttributeSet; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.Display; import android.view.WindowManager; Loading Loading @@ -2760,15 +2760,15 @@ public abstract class Context { public abstract Context createDisplayContext(Display display); /** * Gets the compatibility info holder for this context. This information * is provided on a per-application basis and is used to simulate lower density * display metrics for legacy applications. * Gets the display adjustments holder for this context. This information * is provided on a per-application or activity basis and is used to simulate lower density * display metrics for legacy applications and restricted screen sizes. * * @param displayId The display id for which to get compatibility info. * @return The compatibility info holder, or null if not required by the application. * @hide */ public abstract CompatibilityInfoHolder getCompatibilityInfo(int displayId); public abstract DisplayAdjustments getDisplayAdjustments(int displayId); /** * Indicates whether this Context is restricted. Loading core/java/android/content/ContextWrapper.java +3 −3 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.Display; import java.io.File; Loading Loading @@ -646,7 +646,7 @@ public class ContextWrapper extends Context { /** @hide */ @Override public CompatibilityInfoHolder getCompatibilityInfo(int displayId) { return mBase.getCompatibilityInfo(displayId); public DisplayAdjustments getDisplayAdjustments(int displayId) { return mBase.getDisplayAdjustments(displayId); } } Loading
core/java/android/app/ActivityThread.java +47 −37 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.app; import static android.view.DisplayAdjustments.DEVELOPMENT_RESOURCES_DEPEND_ON_ACTIVITY_TOKEN; import android.app.backup.BackupAgent; import android.content.BroadcastReceiver; import android.content.ComponentCallbacks2; Loading Loading @@ -75,7 +77,7 @@ import android.util.Log; import android.util.LogPrinter; import android.util.PrintWriterPrinter; import android.util.Slog; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.Display; import android.view.HardwareRenderer; import android.view.View; Loading Loading @@ -209,8 +211,8 @@ public final class ActivityThread { = new HashMap<String, WeakReference<LoadedApk>>(); final HashMap<String, WeakReference<LoadedApk>> mResourcePackages = new HashMap<String, WeakReference<LoadedApk>>(); final HashMap<CompatibilityInfo, DisplayMetrics> mDefaultDisplayMetrics = new HashMap<CompatibilityInfo, DisplayMetrics>(); final HashMap<DisplayAdjustments, DisplayMetrics> mDefaultDisplayMetrics = new HashMap<DisplayAdjustments, DisplayMetrics>(); final HashMap<ResourcesKey, WeakReference<Resources> > mActiveResources = new HashMap<ResourcesKey, WeakReference<Resources> >(); final ArrayList<ActivityClientRecord> mRelaunchingActivities Loading Loading @@ -1554,6 +1556,7 @@ public final class ActivityThread { } private class Idler implements MessageQueue.IdleHandler { @Override public final boolean queueIdle() { ActivityClientRecord a = mNewActivities; boolean stopProfiling = false; Loading Loading @@ -1592,6 +1595,7 @@ public final class ActivityThread { } final class GcIdler implements MessageQueue.IdleHandler { @Override public final boolean queueIdle() { doGcIfNeeded(); return false; Loading @@ -1604,8 +1608,10 @@ public final class ActivityThread { final private Configuration mOverrideConfiguration; final private float mScale; final private int mHash; final private IBinder mToken; ResourcesKey(String resDir, int displayId, Configuration overrideConfiguration, float scale) { ResourcesKey(String resDir, int displayId, Configuration overrideConfiguration, float scale, IBinder token) { mResDir = resDir; mDisplayId = displayId; if (overrideConfiguration != null) { Loading @@ -1621,6 +1627,12 @@ public final class ActivityThread { hash = 31 * hash + (mOverrideConfiguration != null ? mOverrideConfiguration.hashCode() : 0); hash = 31 * hash + Float.floatToIntBits(mScale); if (DEVELOPMENT_RESOURCES_DEPEND_ON_ACTIVITY_TOKEN) { mToken = token; hash = 31 * hash + (mToken == null ? 0 : mToken.hashCode()); } else { mToken = null; } mHash = hash; } Loading Loading @@ -1693,9 +1705,13 @@ public final class ActivityThread { mDefaultDisplayMetrics.clear(); } DisplayMetrics getDisplayMetricsLocked(int displayId, CompatibilityInfo ci) { DisplayMetrics getDisplayMetricsLocked(int displayId) { return getDisplayMetricsLocked(displayId, DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS); } DisplayMetrics getDisplayMetricsLocked(int displayId, DisplayAdjustments daj) { boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); DisplayMetrics dm = isDefaultDisplay ? mDefaultDisplayMetrics.get(ci) : null; DisplayMetrics dm = isDefaultDisplay ? mDefaultDisplayMetrics.get(daj) : null; if (dm != null) { return dm; } Loading @@ -1709,12 +1725,10 @@ public final class ActivityThread { } if (isDefaultDisplay) { mDefaultDisplayMetrics.put(ci, dm); mDefaultDisplayMetrics.put(daj, dm); } CompatibilityInfoHolder cih = new CompatibilityInfoHolder(); cih.set(ci); Display d = displayManager.getCompatibleDisplay(displayId, cih); Display d = displayManager.getCompatibleDisplay(displayId, daj); if (d != null) { d.getMetrics(dm); } else { Loading @@ -1736,7 +1750,7 @@ public final class ActivityThread { if (config == null) { return null; } if (compat != null && !compat.supportsScreen()) { if (!compat.supportsScreen()) { mMainThreadConfig.setTo(config); config = mMainThreadConfig; compat.applyToConfiguration(displayDensity, config); Loading @@ -1748,21 +1762,19 @@ public final class ActivityThread { * Creates the top level Resources for applications with the given compatibility info. * * @param resDir the resource directory. * @param compInfo the compability info. It will use the default compatibility info when it's * null. * @param compatInfo the compability info. Must not be null. * @param token the application token for determining stack bounds. */ Resources getTopLevelResources(String resDir, int displayId, Configuration overrideConfiguration, CompatibilityInfo compInfo) { ResourcesKey key = new ResourcesKey(resDir, displayId, overrideConfiguration, compInfo.applicationScale); Resources getTopLevelResources(String resDir, int displayId, Configuration overrideConfiguration, CompatibilityInfo compatInfo, IBinder token) { final float scale = compatInfo.applicationScale; ResourcesKey key = new ResourcesKey(resDir, displayId, overrideConfiguration, scale, token); Resources r; synchronized (mPackages) { // Resources is app scale dependent. if (false) { Slog.w(TAG, "getTopLevelResources: " + resDir + " / " + compInfo.applicationScale); Slog.w(TAG, "getTopLevelResources: " + resDir + " / " + scale); } WeakReference<Resources> wr = mActiveResources.get(key); r = wr != null ? wr.get() : null; Loading @@ -1787,7 +1799,7 @@ public final class ActivityThread { } //Slog.i(TAG, "Resource: key=" + key + ", display metrics=" + metrics); DisplayMetrics dm = getDisplayMetricsLocked(displayId, null); DisplayMetrics dm = getDisplayMetricsLocked(displayId); Configuration config; boolean isDefaultDisplay = (displayId == Display.DEFAULT_DISPLAY); if (!isDefaultDisplay || key.mOverrideConfiguration != null) { Loading @@ -1801,7 +1813,7 @@ public final class ActivityThread { } else { config = getConfiguration(); } r = new Resources(assets, dm, config, compInfo); r = new Resources(assets, dm, config, compatInfo, token); if (false) { Slog.i(TAG, "Created app resources " + resDir + " " + r + ": " + r.getConfiguration() + " appScale=" Loading Loading @@ -1831,7 +1843,7 @@ public final class ActivityThread { int displayId, Configuration overrideConfiguration, LoadedApk pkgInfo) { return getTopLevelResources(resDir, displayId, overrideConfiguration, pkgInfo.mCompatibilityInfo.get()); pkgInfo.getCompatibilityInfo(), null); } final Handler getHandler() { Loading Loading @@ -2005,10 +2017,8 @@ public final class ActivityThread { LoadedApk info = new LoadedApk(this, "android", context, null, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO); context.init(info, null, this); context.getResources().updateConfiguration( getConfiguration(), getDisplayMetricsLocked( Display.DEFAULT_DISPLAY, CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO)); context.getResources().updateConfiguration(getConfiguration(), getDisplayMetricsLocked(Display.DEFAULT_DISPLAY)); mSystemContext = context; //Slog.i(TAG, "Created system resources " + context.getResources() // + ": " + context.getResources().getConfiguration()); Loading Loading @@ -2301,7 +2311,7 @@ public final class ActivityThread { DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); for (int displayId : dm.getDisplayIds()) { if (displayId != Display.DEFAULT_DISPLAY) { Display display = dm.getRealDisplay(displayId); Display display = dm.getRealDisplay(displayId, r.token); baseContext = appContext.createDisplayContext(display); break; } Loading Loading @@ -3408,11 +3418,11 @@ public final class ActivityThread { private void handleUpdatePackageCompatibilityInfo(UpdateCompatibilityData data) { LoadedApk apk = peekPackageInfo(data.pkg, false); if (apk != null) { apk.mCompatibilityInfo.set(data.info); apk.setCompatibilityInfo(data.info); } apk = peekPackageInfo(data.pkg, true); if (apk != null) { apk.mCompatibilityInfo.set(data.info); apk.setCompatibilityInfo(data.info); } handleConfigurationChanged(mConfiguration, data.info); WindowManagerGlobal.getInstance().reportNewConfiguration(mConfiguration); Loading Loading @@ -3844,8 +3854,9 @@ public final class ActivityThread { for (ActivityClientRecord ar : mActivities.values()) { Activity a = ar.activity; if (a != null) { Configuration thisConfig = applyConfigCompatMainThread(mCurDefaultDisplayDpi, newConfig, ar.packageInfo.mCompatibilityInfo.getIfNeeded()); Configuration thisConfig = applyConfigCompatMainThread( mCurDefaultDisplayDpi, newConfig, ar.packageInfo.getCompatibilityInfo()); if (!ar.activity.mFinished && (allActivities || !ar.paused)) { // If the activity is currently resumed, its configuration // needs to change right now. Loading Loading @@ -3945,8 +3956,7 @@ public final class ActivityThread { } int changes = mResConfiguration.updateFrom(config); flushDisplayMetricsLocked(); DisplayMetrics defaultDisplayMetrics = getDisplayMetricsLocked( Display.DEFAULT_DISPLAY, null); DisplayMetrics defaultDisplayMetrics = getDisplayMetricsLocked(Display.DEFAULT_DISPLAY); if (compat != null && (mResCompatibilityInfo == null || !mResCompatibilityInfo.equals(compat))) { Loading Loading @@ -3986,7 +3996,7 @@ public final class ActivityThread { } tmpConfig.setTo(config); if (!isDefaultDisplay) { dm = getDisplayMetricsLocked(displayId, null); dm = getDisplayMetricsLocked(displayId); applyNonDefaultDisplayMetricsToConfigurationLocked(dm, tmpConfig); } if (overrideConfig != null) { Loading
core/java/android/app/ContextImpl.java +27 −20 Original line number Diff line number Diff line Loading @@ -99,7 +99,7 @@ import android.util.AndroidRuntimeException; import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.ContextThemeWrapper; import android.view.Display; import android.view.WindowManagerImpl; Loading Loading @@ -205,6 +205,8 @@ class ContextImpl extends Context { private static final String[] EMPTY_FILE_LIST = {}; final private DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); /** * Override this class when the system service constructor needs a * ContextImpl. Else, use StaticServiceFetcher below. Loading Loading @@ -1830,10 +1832,8 @@ class ContextImpl extends Context { ContextImpl c = new ContextImpl(); c.init(mPackageInfo, null, mMainThread); c.mResources = mMainThread.getTopLevelResources( mPackageInfo.getResDir(), getDisplayId(), overrideConfiguration, mResources.getCompatibilityInfo()); c.mResources = mMainThread.getTopLevelResources(mPackageInfo.getResDir(), getDisplayId(), overrideConfiguration, mResources.getCompatibilityInfo(), mActivityToken); return c; } Loading @@ -1844,17 +1844,13 @@ class ContextImpl extends Context { } int displayId = display.getDisplayId(); CompatibilityInfo ci = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; CompatibilityInfoHolder cih = getCompatibilityInfo(displayId); if (cih != null) { ci = cih.get(); } ContextImpl context = new ContextImpl(); context.init(mPackageInfo, null, mMainThread); context.mDisplay = display; context.mResources = mMainThread.getTopLevelResources( mPackageInfo.getResDir(), displayId, null, ci); DisplayAdjustments daj = getDisplayAdjustments(displayId); context.mResources = mMainThread.getTopLevelResources(mPackageInfo.getResDir(), displayId, null, daj.getCompatibilityInfo(), null); return context; } Loading @@ -1868,8 +1864,8 @@ class ContextImpl extends Context { } @Override public CompatibilityInfoHolder getCompatibilityInfo(int displayId) { return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null; public DisplayAdjustments getDisplayAdjustments(int displayId) { return mDisplayAdjustments; } private File getDataDirFile() { Loading Loading @@ -1921,6 +1917,7 @@ class ContextImpl extends Context { mUser = context.mUser; mDisplay = context.mDisplay; mOuterContext = this; mDisplayAdjustments.setCompatibilityInfo(mPackageInfo.getCompatibilityInfo()); } final void init(LoadedApk packageInfo, IBinder activityToken, ActivityThread mainThread) { Loading @@ -1933,16 +1930,26 @@ class ContextImpl extends Context { mBasePackageName = basePackageName != null ? basePackageName : packageInfo.mPackageName; mResources = mPackageInfo.getResources(mainThread); if (mResources != null && container != null && container.getCompatibilityInfo().applicationScale != mResources.getCompatibilityInfo().applicationScale) { CompatibilityInfo compatInfo = container == null ? null : container.getCompatibilityInfo(); if (mResources != null && ((compatInfo != null && compatInfo.applicationScale != mResources.getCompatibilityInfo().applicationScale) || activityToken != null)) { if (DEBUG) { Log.d(TAG, "loaded context has different scaling. Using container's" + " compatiblity info:" + container.getDisplayMetrics()); } mResources = mainThread.getTopLevelResources( mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY, null, container.getCompatibilityInfo()); if (compatInfo == null) { compatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; } mDisplayAdjustments.setCompatibilityInfo(compatInfo); mDisplayAdjustments.setActivityToken(activityToken); mResources = mainThread.getTopLevelResources(mPackageInfo.getResDir(), Display.DEFAULT_DISPLAY, null, compatInfo, activityToken); } else { mDisplayAdjustments.setCompatibilityInfo(packageInfo.getCompatibilityInfo()); mDisplayAdjustments.setActivityToken(activityToken); } mMainThread = mainThread; mActivityToken = activityToken; Loading
core/java/android/app/LoadedApk.java +13 −5 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ import android.os.Trace; import android.os.UserHandle; import android.util.AndroidRuntimeException; import android.util.Slog; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.Display; import java.io.File; Loading Loading @@ -84,7 +84,7 @@ public final class LoadedApk { private final ClassLoader mBaseClassLoader; private final boolean mSecurityViolation; private final boolean mIncludeCode; public final CompatibilityInfoHolder mCompatibilityInfo = new CompatibilityInfoHolder(); private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); Resources mResources; private ClassLoader mClassLoader; private Application mApplication; Loading Loading @@ -132,7 +132,7 @@ public final class LoadedApk { mBaseClassLoader = baseLoader; mSecurityViolation = securityViolation; mIncludeCode = includeCode; mCompatibilityInfo.set(compatInfo); mDisplayAdjustments.setCompatibilityInfo(compatInfo); if (mAppDir == null) { if (ActivityThread.mSystemContext == null) { Loading @@ -141,7 +141,7 @@ public final class LoadedApk { ActivityThread.mSystemContext.getResources().updateConfiguration( mainThread.getConfiguration(), mainThread.getDisplayMetricsLocked( Display.DEFAULT_DISPLAY, compatInfo), Display.DEFAULT_DISPLAY, mDisplayAdjustments), compatInfo); //Slog.i(TAG, "Created system resources " // + mSystemContext.getResources() + ": " Loading Loading @@ -169,7 +169,7 @@ public final class LoadedApk { mIncludeCode = true; mClassLoader = systemContext.getClassLoader(); mResources = systemContext.getResources(); mCompatibilityInfo.set(compatInfo); mDisplayAdjustments.setCompatibilityInfo(compatInfo); } public String getPackageName() { Loading @@ -184,6 +184,14 @@ public final class LoadedApk { return mSecurityViolation; } public CompatibilityInfo getCompatibilityInfo() { return mDisplayAdjustments.getCompatibilityInfo(); } public void setCompatibilityInfo(CompatibilityInfo compatInfo) { mDisplayAdjustments.setCompatibilityInfo(compatInfo); } /** * Gets the array of shared libraries that are listed as * used by the given package. Loading
core/java/android/content/Context.java +5 −5 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ import android.os.Looper; import android.os.UserHandle; import android.os.UserManager; import android.util.AttributeSet; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.Display; import android.view.WindowManager; Loading Loading @@ -2760,15 +2760,15 @@ public abstract class Context { public abstract Context createDisplayContext(Display display); /** * Gets the compatibility info holder for this context. This information * is provided on a per-application basis and is used to simulate lower density * display metrics for legacy applications. * Gets the display adjustments holder for this context. This information * is provided on a per-application or activity basis and is used to simulate lower density * display metrics for legacy applications and restricted screen sizes. * * @param displayId The display id for which to get compatibility info. * @return The compatibility info holder, or null if not required by the application. * @hide */ public abstract CompatibilityInfoHolder getCompatibilityInfo(int displayId); public abstract DisplayAdjustments getDisplayAdjustments(int displayId); /** * Indicates whether this Context is restricted. Loading
core/java/android/content/ContextWrapper.java +3 −3 Original line number Diff line number Diff line Loading @@ -35,7 +35,7 @@ import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; import android.view.CompatibilityInfoHolder; import android.view.DisplayAdjustments; import android.view.Display; import java.io.File; Loading Loading @@ -646,7 +646,7 @@ public class ContextWrapper extends Context { /** @hide */ @Override public CompatibilityInfoHolder getCompatibilityInfo(int displayId) { return mBase.getCompatibilityInfo(displayId); public DisplayAdjustments getDisplayAdjustments(int displayId) { return mBase.getDisplayAdjustments(displayId); } }