From a301b04be3de90df44ea95e414cd78cf728dc76a Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Thu, 12 Jun 2014 14:15:39 +0200 Subject: [PATCH] Update PhoneWindow to new window inset dispatching PhoneWindow was relying on an implementation detail of the old fitSystemWindow mechanism to consume only the top inset. In the new mechanism, the contract changed an consuming the inset did no longer work, leading to the insets being applied twice in some cases. Bug: 15388544 Change-Id: Ife8361f2b1e5caf8c3ed90646344d653876e8e7d --- .../internal/policy/impl/PhoneWindow.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index a8645bc9ea48e..ef096e0ea6de5 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -93,6 +93,7 @@ import android.view.ViewParent; import android.view.ViewRootImpl; import android.view.ViewStub; import android.view.Window; +import android.view.WindowInsets; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; @@ -2627,15 +2628,15 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } @Override - protected boolean fitSystemWindows(Rect insets) { - mFrameOffsets.set(insets); + public WindowInsets onApplyWindowInsets(WindowInsets insets) { + mFrameOffsets.set(insets.getSystemWindowInsets()); updateColorViews(insets); - updateStatusGuard(insets); + insets = updateStatusGuard(insets); updateNavigationGuard(insets); if (getForeground() != null) { drawableChanged(); } - return super.fitSystemWindows(insets); + return insets; } @Override @@ -2643,14 +2644,14 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { return false; } - private void updateColorViews(Rect insets) { + private void updateColorViews(WindowInsets insets) { if (mIsFloating || !ActivityManager.isHighEndGfx()) { // No colors on floating windows or low end devices :( return; } if (insets != null) { - mLastTopInset = insets.top; - mLastBottomInset = insets.bottom; + mLastTopInset = insets.getSystemWindowInsetTop(); + mLastBottomInset = insets.getSystemWindowInsetBottom(); } mStatusColorView = updateColorViewInt(mStatusColorView, SYSTEM_UI_FLAG_FULLSCREEN, FLAG_TRANSLUCENT_STATUS, @@ -2689,7 +2690,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { return view; } - private void updateStatusGuard(Rect insets) { + private WindowInsets updateStatusGuard(WindowInsets insets) { boolean showStatusGuard = false; // Show the status guard when the non-overlay contextual action bar is showing if (mActionModeView != null) { @@ -2701,9 +2702,9 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { && mActionModeView.isShown(); if (nonOverlayShown) { // set top margin to top insets, show status guard - if (mlp.topMargin != insets.top) { + if (mlp.topMargin != insets.getSystemWindowInsetTop()) { mlpChanged = true; - mlp.topMargin = insets.top; + mlp.topMargin = insets.getSystemWindowInsetTop(); if (mStatusGuard == null) { mStatusGuard = new View(mContext); mStatusGuard.setBackgroundColor(mContext.getResources() @@ -2719,7 +2720,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } } - insets.top = 0; // consume top insets + insets = insets.consumeSystemWindowInsets( + false, true /* top */, false, false); showStatusGuard = true; } else { // reset top margin @@ -2736,9 +2738,10 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (mStatusGuard != null) { mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE); } + return insets; } - private void updateNavigationGuard(Rect insets) { + private void updateNavigationGuard(WindowInsets insets) { // IMEs lay out below the nav bar, but the content view must not (for back compat) if (getAttributes().type == WindowManager.LayoutParams.TYPE_INPUT_METHOD) { // prevent the content view from including the nav bar height @@ -2746,7 +2749,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (mContentParent.getLayoutParams() instanceof MarginLayoutParams) { MarginLayoutParams mlp = (MarginLayoutParams) mContentParent.getLayoutParams(); - mlp.bottomMargin = insets.bottom; + mlp.bottomMargin = insets.getSystemWindowInsetBottom(); mContentParent.setLayoutParams(mlp); } } @@ -2756,11 +2759,11 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { mNavigationGuard.setBackgroundColor(mContext.getResources() .getColor(R.color.input_method_navigation_guard)); addView(mNavigationGuard, indexOfChild(mNavigationColorView), new LayoutParams( - LayoutParams.MATCH_PARENT, insets.bottom, + LayoutParams.MATCH_PARENT, insets.getSystemWindowInsetBottom(), Gravity.START | Gravity.BOTTOM)); } else { LayoutParams lp = (LayoutParams) mNavigationGuard.getLayoutParams(); - lp.height = insets.bottom; + lp.height = insets.getSystemWindowInsetBottom(); mNavigationGuard.setLayoutParams(lp); } }