From afb45bba8379df530182dae882ec70329423dcfe Mon Sep 17 00:00:00 2001 From: Bryce Lee Date: Thu, 27 Apr 2017 13:42:23 -0700 Subject: [PATCH] Coordinate configuration changes and window frame size. Previously, it was possible for the view hierarchy to be measured, laid out, and drawn around a window frame size that did not match the current configuration. This stems from new configurations not always propagating back from WindowSession#relayout, which is called from ViewRootImpl. This changelist makes WindowManagerService#relayoutWindow always return the latest configuration. It also adds rotation to the configuration. Fixes: 32839232 Test: go/wm-smoke Test: Open Camera while rotating phone to landscape. Added temporary logs to detect inconsistencies between measurements and reported rotation on draw. Change-Id: I39daca338b4f87eff1a509eb99493f01e710ced1 --- .../android/content/res/Configuration.java | 85 ++++++++++++++++++- core/java/android/view/IWindowSession.aidl | 2 +- core/java/android/view/Surface.java | 8 +- core/java/android/view/ViewRootImpl.java | 20 ++++- .../com/android/server/wm/DisplayContent.java | 2 + .../com/android/server/wm/WindowState.java | 17 ++-- 6 files changed, 117 insertions(+), 17 deletions(-) diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 88c1627f955bc..417a95fbc4170 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -16,10 +16,7 @@ package android.content.res; -import android.graphics.Point; import android.graphics.Rect; -import android.util.DisplayMetrics; -import android.view.Display; import android.view.DisplayInfo; import com.android.internal.util.XmlUtils; @@ -45,6 +42,12 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Locale; +import static android.view.Surface.ROTATION_UNDEFINED; +import static android.view.Surface.ROTATION_0; +import static android.view.Surface.ROTATION_90; +import static android.view.Surface.ROTATION_180; +import static android.view.Surface.ROTATION_270; + /** * This class describes all device configuration information that can * impact the resources the application retrieves. This includes both @@ -600,6 +603,13 @@ public final class Configuration implements Parcelable, Comparable>>>>> CALLING relayout"); if (params != null && mOrigWindowType != params.type) { // For compatibility with old apps, don't crash here. @@ -6102,6 +6112,10 @@ public final class ViewRootImpl implements ViewParent, mPendingStableInsets, mPendingOutsets, mPendingBackDropFrame, mPendingMergedConfiguration, mSurface); + if (initialConfigSeq == mPendingMergedConfiguration.getMergedConfiguration().seq) { + mPendingMergedConfiguration.getMergedConfiguration().seq = 0; + } + mPendingAlwaysConsumeNavBar = (relayoutResult & WindowManagerGlobal.RELAYOUT_RES_CONSUME_ALWAYS_NAV_BAR) != 0; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index b5476d7e056b4..eef4c9b0f4a07 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1162,6 +1162,8 @@ class DisplayContent extends WindowContainer implements WindowManagerP mWinAnimator.applyEnterAnimationLocked(); } - if (isConfigChanged()) { - final Configuration globalConfig = mService.mRoot.getConfiguration(); - final Configuration overrideConfig = getMergedOverrideConfiguration(); - mergedConfiguration.setConfiguration(globalConfig, overrideConfig); - if (DEBUG_CONFIGURATION) Slog.i(TAG, "Window " + this - + " visible with new global config: " + globalConfig - + " merged override config: " + overrideConfig); - mLastReportedConfiguration.setTo(getConfiguration()); - } + // always report back the new configuration + final Configuration globalConfig = mService.mRoot.getConfiguration(); + final Configuration overrideConfig = getMergedOverrideConfiguration(); + mergedConfiguration.setConfiguration(globalConfig, overrideConfig); + if (DEBUG_CONFIGURATION) Slog.i(TAG, "Window " + this + + " reporting new global config: " + globalConfig + + " merged override config: " + overrideConfig); + mLastReportedConfiguration.setTo(getConfiguration()); } void adjustStartingWindowFlags() {