diff options
| author | 2016-06-22 19:11:34 +0000 | |
|---|---|---|
| committer | 2016-06-22 19:11:36 +0000 | |
| commit | 0bf31c3fa6263f595022d8f3addfd4d28f70db99 (patch) | |
| tree | 2145ad4c5cc6c7f49c460a99db07e86339396366 | |
| parent | 9802883bb318b5b47583c424270229ca1f246de9 (diff) | |
| parent | 4ece3d6bb18a609afcd0e82f0340b7d36ba24eea (diff) | |
Merge "ContextImpl: Keep DisplayAdjustments and Display in sync" into nyc-dev
| -rw-r--r-- | core/java/android/app/ContextImpl.java | 47 | ||||
| -rw-r--r-- | core/java/android/app/Presentation.java | 2 | ||||
| -rw-r--r-- | core/java/android/app/ResourcesManager.java | 9 | ||||
| -rw-r--r-- | core/java/android/app/SystemServiceRegistry.java | 2 | ||||
| -rw-r--r-- | core/java/android/content/Context.java | 5 | ||||
| -rw-r--r-- | core/java/android/content/ContextWrapper.java | 8 | ||||
| -rw-r--r-- | core/java/android/content/res/Resources.java | 6 | ||||
| -rw-r--r-- | core/java/android/content/res/ResourcesImpl.java | 39 | ||||
| -rw-r--r-- | core/java/android/view/DisplayAdjustments.java | 8 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 24 | ||||
| -rw-r--r-- | core/java/android/view/WindowManagerImpl.java | 20 | ||||
| -rw-r--r-- | test-runner/src/android/test/mock/MockContext.java | 6 |
12 files changed, 118 insertions, 58 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index cf663a32a072..e6ca52072079 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -16,6 +16,8 @@ package android.app; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentProvider; @@ -30,6 +32,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; @@ -155,10 +158,9 @@ class ContextImpl extends Context { private final String mBasePackageName; private final String mOpPackageName; - private final ResourcesManager mResourcesManager; - private final Resources mResources; - private final Display mDisplay; // may be null if default display - private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); + private final @NonNull ResourcesManager mResourcesManager; + private final @NonNull Resources mResources; + private @Nullable Display mDisplay; // may be null if default display private final int mFlags; @@ -1897,18 +1899,6 @@ class ContextImpl extends Context { mUser, mFlags, display, null, Display.INVALID_DISPLAY); } - Display getDisplay() { - if (mDisplay != null) { - return mDisplay; - } - return ResourcesManager.getInstance().getAdjustedDisplay( - Display.DEFAULT_DISPLAY, mDisplayAdjustments); - } - - private int getDisplayId() { - return mDisplay != null ? mDisplay.getDisplayId() : Display.DEFAULT_DISPLAY; - } - @Override public Context createDeviceProtectedStorageContext() { final int flags = (mFlags & ~Context.CONTEXT_CREDENTIAL_PROTECTED_STORAGE) @@ -1941,8 +1931,23 @@ class ContextImpl extends Context { } @Override + public Display getDisplay() { + final DisplayAdjustments displayAdjustments = mResources.getDisplayAdjustments(); + if (mDisplay == null) { + return mResourcesManager.getAdjustedDisplay(Display.DEFAULT_DISPLAY, + displayAdjustments); + } + + if (!mDisplay.getDisplayAdjustments().equals(displayAdjustments)) { + mDisplay = mResourcesManager.getAdjustedDisplay(mDisplay.getDisplayId(), + displayAdjustments); + } + return mDisplay; + } + + @Override public DisplayAdjustments getDisplayAdjustments(int displayId) { - return mDisplayAdjustments; + return mResources.getDisplayAdjustments(); } @Override @@ -2057,11 +2062,6 @@ class ContextImpl extends Context { ? packageInfo.getCompatibilityInfo() : CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; } - mDisplayAdjustments.setCompatibilityInfo(compatInfo); - mDisplayAdjustments.setConfiguration(overrideConfiguration); - - mDisplay = (createDisplayWithId == Display.INVALID_DISPLAY) ? display - : ResourcesManager.getInstance().getAdjustedDisplay(displayId, mDisplayAdjustments); Resources resources = packageInfo.getResources(mainThread); if (resources != null) { @@ -2101,6 +2101,9 @@ class ContextImpl extends Context { } mResources = resources; + mDisplay = (createDisplayWithId == Display.INVALID_DISPLAY) ? display + : mResourcesManager.getAdjustedDisplay(displayId, mResources.getDisplayAdjustments()); + if (container != null) { mBasePackageName = container.mBasePackageName; mOpPackageName = container.mOpPackageName; diff --git a/core/java/android/app/Presentation.java b/core/java/android/app/Presentation.java index e110dcbf1d2a..70007f584645 100644 --- a/core/java/android/app/Presentation.java +++ b/core/java/android/app/Presentation.java @@ -310,7 +310,7 @@ public class Presentation extends Dialog { final WindowManagerImpl outerWindowManager = (WindowManagerImpl)outerContext.getSystemService(Context.WINDOW_SERVICE); final WindowManagerImpl displayWindowManager = - outerWindowManager.createPresentationWindowManager(display); + outerWindowManager.createPresentationWindowManager(displayContext); return new ContextThemeWrapper(displayContext, theme) { @Override public Object getSystemService(String name) { diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index f56a6ad855d4..cc2f62101e6d 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -304,10 +304,11 @@ public class ResourcesManager { } private @NonNull ResourcesImpl createResourcesImpl(@NonNull ResourcesKey key) { - AssetManager assets = createAssetManager(key); - DisplayMetrics dm = getDisplayMetrics(key.mDisplayId); - Configuration config = generateConfig(key, dm); - ResourcesImpl impl = new ResourcesImpl(assets, dm, config, key.mCompatInfo); + final AssetManager assets = createAssetManager(key); + final DisplayMetrics dm = getDisplayMetrics(key.mDisplayId); + final Configuration config = generateConfig(key, dm); + final ResourcesImpl impl = new ResourcesImpl(assets, dm, config, key.mCompatInfo, + key.mOverrideConfiguration); if (DEBUG) { Slog.d(TAG, "- creating impl=" + impl + " with key: " + key); } diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 7cd13ea4ff9d..55744b935f51 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -559,7 +559,7 @@ final class SystemServiceRegistry { new CachedServiceFetcher<WindowManager>() { @Override public WindowManager createService(ContextImpl ctx) { - return new WindowManagerImpl(ctx.getDisplay()); + return new WindowManagerImpl(ctx); }}); registerService(Context.USER_SERVICE, UserManager.class, diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 0881c9cb2208..bdf888f59715 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4279,6 +4279,11 @@ public abstract class Context { public abstract DisplayAdjustments getDisplayAdjustments(int displayId); /** + * @hide + */ + public abstract Display getDisplay(); + + /** * Indicates whether this Context is restricted. * * @return {@code true} if this Context is restricted, {@code false} otherwise. diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 087ac4781803..60da63e9bc09 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -819,6 +819,14 @@ public class ContextWrapper extends Context { return mBase.getDisplayAdjustments(displayId); } + /** + * @hide + */ + @Override + public Display getDisplay() { + return mBase.getDisplay(); + } + @Override public Context createDeviceProtectedStorageContext() { return mBase.createDeviceProtectedStorageContext(); diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 54a59680fe4d..7820cbedacc7 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -51,6 +51,7 @@ import android.util.Log; import android.util.LongSparseArray; import android.util.Pools.SynchronizedPool; import android.util.TypedValue; +import android.view.DisplayAdjustments; import android.view.ViewDebug; import android.view.ViewHierarchyEncoder; @@ -1800,6 +1801,11 @@ public class Resources { return mResourcesImpl.getDisplayMetrics(); } + /** @hide */ + public DisplayAdjustments getDisplayAdjustments() { + return mResourcesImpl.getDisplayAdjustments(); + } + /** * Return the current configuration that is in effect for this resource * object. The returned object should be treated as read-only. diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index 000751e88639..0f140e945f7c 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -44,6 +44,8 @@ import android.util.LongSparseArray; import android.util.Slog; import android.util.TypedValue; import android.util.Xml; +import android.view.Display; +import android.view.DisplayAdjustments; import java.io.InputStream; import java.util.Arrays; @@ -111,7 +113,8 @@ public class ResourcesImpl { final AssetManager mAssets; - final DisplayMetrics mMetrics = new DisplayMetrics(); + private final DisplayMetrics mMetrics = new DisplayMetrics(); + private final DisplayAdjustments mDisplayAdjustments = new DisplayAdjustments(); private PluralRules mPluralRule; @@ -134,14 +137,42 @@ public class ResourcesImpl { * selecting/computing resource values (optional). * @param compatInfo this resource's compatibility info. Must not be null. */ - public ResourcesImpl(AssetManager assets, DisplayMetrics metrics, Configuration config, - CompatibilityInfo compatInfo) { + public ResourcesImpl(@NonNull AssetManager assets, @Nullable DisplayMetrics metrics, + @Nullable Configuration config, @NonNull CompatibilityInfo compatInfo) { + this(assets, metrics, config, compatInfo, null); + } + + /** + * Creates a new ResourcesImpl object with CompatibilityInfo and assigns a static overrideConfig + * that is reported with getDisplayAdjustments(). This is used for updating the Display + * when a new ResourcesImpl is created due to multi-window configuration changes. + * + * @param assets Previously created AssetManager. + * @param metrics Current display metrics to consider when selecting/computing resource values. + * @param fullConfig Desired device configuration to consider when selecting/computing + * resource values. + * @param compatInfo this resource's compatibility info. Must not be null. + * @param overrideConfig the overrides specific to this ResourcesImpl object. They must already + * be applied to the fullConfig and are mainly maintained in order to return a valid + * DisplayAdjustments object during configuration changes. + */ + public ResourcesImpl(@NonNull AssetManager assets, @Nullable DisplayMetrics metrics, + @Nullable Configuration fullConfig, @NonNull CompatibilityInfo compatInfo, + @Nullable Configuration overrideConfig) { mAssets = assets; mMetrics.setToDefaults(); - updateConfiguration(config, metrics, compatInfo); + mDisplayAdjustments.setCompatibilityInfo(compatInfo); + if (overrideConfig != null) { + mDisplayAdjustments.setConfiguration(overrideConfig); + } + updateConfiguration(fullConfig, metrics, compatInfo); mAssets.ensureStringBlocks(); } + public DisplayAdjustments getDisplayAdjustments() { + return mDisplayAdjustments; + } + public AssetManager getAssets() { return mAssets; } diff --git a/core/java/android/view/DisplayAdjustments.java b/core/java/android/view/DisplayAdjustments.java index 272740fb6c01..6cc0508b5832 100644 --- a/core/java/android/view/DisplayAdjustments.java +++ b/core/java/android/view/DisplayAdjustments.java @@ -23,8 +23,6 @@ import java.util.Objects; /** @hide */ public class DisplayAdjustments { - public static final boolean DEVELOPMENT_RESOURCES_DEPEND_ON_ACTIVITY_TOKEN = false; - public static final DisplayAdjustments DEFAULT_DISPLAY_ADJUSTMENTS = new DisplayAdjustments(); private volatile CompatibilityInfo mCompatInfo = CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO; @@ -74,10 +72,8 @@ public class DisplayAdjustments { @Override public int hashCode() { int hash = 17; - hash = hash * 31 + mCompatInfo.hashCode(); - if (DEVELOPMENT_RESOURCES_DEPEND_ON_ACTIVITY_TOKEN) { - hash = hash * 31 + (mConfiguration == null ? 0 : mConfiguration.hashCode()); - } + hash = hash * 31 + Objects.hashCode(mCompatInfo); + hash = hash * 31 + Objects.hashCode(mConfiguration); return hash; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 48bdcb2e6720..b3daa16dd86f 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -26,7 +26,9 @@ import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; import android.Manifest; import android.animation.LayoutTransition; +import android.annotation.NonNull; import android.app.ActivityManagerNative; +import android.app.ResourcesManager; import android.content.ClipDescription; import android.content.ComponentCallbacks; import android.content.Context; @@ -163,7 +165,7 @@ public final class ViewRootImpl implements ViewParent, final ArrayList<WindowCallbacks> mWindowCallbacks = new ArrayList<>(); final Context mContext; final IWindowSession mWindowSession; - final Display mDisplay; + @NonNull Display mDisplay; final DisplayManager mDisplayManager; final String mBasePackageName; @@ -307,8 +309,6 @@ public final class ViewRootImpl implements ViewParent, boolean mAdded; boolean mAddedTouchMode; - final DisplayAdjustments mDisplayAdjustments; - // These are accessed by multiple threads. final Rect mWinFrame; // frame given by window manager. @@ -412,9 +412,6 @@ public final class ViewRootImpl implements ViewParent, mWindowSession = WindowManagerGlobal.getWindowSession(); mDisplay = display; mBasePackageName = context.getBasePackageName(); - - mDisplayAdjustments = display.getDisplayAdjustments(); - mThread = Thread.currentThread(); mLocation = new WindowLeaked(null); mLocation.fillInStackTrace(); @@ -588,7 +585,8 @@ public final class ViewRootImpl implements ViewParent, attrs.setSurfaceInsets(view, false /*manual*/, true /*preservePrevious*/); } - CompatibilityInfo compatibilityInfo = mDisplayAdjustments.getCompatibilityInfo(); + CompatibilityInfo compatibilityInfo = + mDisplay.getDisplayAdjustments().getCompatibilityInfo(); mTranslator = compatibilityInfo.getTranslator(); // If the application owns the surface, don't enable hardware acceleration @@ -1468,7 +1466,8 @@ public final class ViewRootImpl implements ViewParent, surfaceChanged = true; params = lp; } - CompatibilityInfo compatibilityInfo = mDisplayAdjustments.getCompatibilityInfo(); + CompatibilityInfo compatibilityInfo = + mDisplay.getDisplayAdjustments().getCompatibilityInfo(); if (compatibilityInfo.supportsScreen() == mLastInCompatMode) { params = lp; mFullRedrawNeeded = true; @@ -3306,7 +3305,7 @@ public final class ViewRootImpl implements ViewParent, + mWindowAttributes.getTitle() + ": " + config); - CompatibilityInfo ci = mDisplayAdjustments.getCompatibilityInfo(); + CompatibilityInfo ci = mDisplay.getDisplayAdjustments().getCompatibilityInfo(); if (!ci.equals(CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO)) { config = new Configuration(config); ci.applyToConfiguration(mNoncompatDensity, config); @@ -3321,8 +3320,13 @@ public final class ViewRootImpl implements ViewParent, // At this point the resources have been updated to // have the most recent config, whatever that is. Use // the one in them which may be newer. - config = mView.getResources().getConfiguration(); + final Resources localResources = mView.getResources(); + config = localResources.getConfiguration(); if (force || mLastConfiguration.diff(config) != 0) { + // Update the display with new DisplayAdjustments. + mDisplay = ResourcesManager.getInstance().getAdjustedDisplay( + mDisplay.getDisplayId(), localResources.getDisplayAdjustments()); + final int lastLayoutDirection = mLastConfiguration.getLayoutDirection(); final int currentLayoutDirection = config.getLayoutDirection(); mLastConfiguration.setTo(config); diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index f8c7d68bd394..dd4e09685362 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -55,26 +55,26 @@ import java.util.List; */ public final class WindowManagerImpl implements WindowManager { private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance(); - private final Display mDisplay; + private final Context mContext; private final Window mParentWindow; private IBinder mDefaultToken; - public WindowManagerImpl(Display display) { - this(display, null); + public WindowManagerImpl(Context context) { + this(context, null); } - private WindowManagerImpl(Display display, Window parentWindow) { - mDisplay = display; + private WindowManagerImpl(Context context, Window parentWindow) { + mContext = context; mParentWindow = parentWindow; } public WindowManagerImpl createLocalWindowManager(Window parentWindow) { - return new WindowManagerImpl(mDisplay, parentWindow); + return new WindowManagerImpl(mContext, parentWindow); } - public WindowManagerImpl createPresentationWindowManager(Display display) { - return new WindowManagerImpl(display, mParentWindow); + public WindowManagerImpl createPresentationWindowManager(Context displayContext) { + return new WindowManagerImpl(displayContext, mParentWindow); } /** @@ -90,7 +90,7 @@ public final class WindowManagerImpl implements WindowManager { @Override public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) { applyDefaultToken(params); - mGlobal.addView(view, params, mDisplay, mParentWindow); + mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow); } @Override @@ -144,6 +144,6 @@ public final class WindowManagerImpl implements WindowManager { @Override public Display getDefaultDisplay() { - return mDisplay; + return mContext.getDisplay(); } } diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java index b14fc41632b3..9471326627a5 100644 --- a/test-runner/src/android/test/mock/MockContext.java +++ b/test-runner/src/android/test/mock/MockContext.java @@ -702,6 +702,12 @@ public class MockContext extends Context { throw new UnsupportedOperationException(); } + /** @hide */ + @Override + public Display getDisplay() { + throw new UnsupportedOperationException(); + } + @Override public File[] getExternalFilesDirs(String type) { throw new UnsupportedOperationException(); |