From b003e28c1d65d06fcb5690ff2955d007d8f7a626 Mon Sep 17 00:00:00 2001 From: Fabrice Di Meglio Date: Wed, 17 Oct 2012 17:20:19 -0700 Subject: Fix bug #7367429 Popup window should get its direction from it Anchor View if it can - set the popup layout direction depending on the anchor view's layout direction (if not defined before) - make first pass of ViewRootImpl.performTraversals() and configuration update not override any layout direction that could have been set before Change-Id: I8e86ca805f0caf52c058d06aa7861df56fb862e6 --- core/java/android/widget/PopupWindow.java | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'core/java/android/widget/PopupWindow.java') diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index af3365e..b71649a 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -142,6 +142,8 @@ public class PopupWindow { }; private int mAnchorXoff, mAnchorYoff; + private boolean mPopupViewInitialLayoutDirectionInherited; + /** *

Create a new empty, non focusable popup window of dimension (0,0).

* @@ -968,6 +970,8 @@ public class PopupWindow { } else { mPopupView = mContentView; } + mPopupViewInitialLayoutDirectionInherited = + (mPopupView.getRawLayoutDirection() == View.LAYOUT_DIRECTION_INHERIT); mPopupWidth = p.width; mPopupHeight = p.height; } @@ -985,9 +989,19 @@ public class PopupWindow { p.packageName = mContext.getPackageName(); } mPopupView.setFitsSystemWindows(mLayoutInsetDecor); + setLayoutDirectionFromAnchor(); mWindowManager.addView(mPopupView, p); } + private void setLayoutDirectionFromAnchor() { + if (mAnchor != null) { + View anchor = mAnchor.get(); + if (anchor != null && mPopupViewInitialLayoutDirectionInherited) { + mPopupView.setLayoutDirection(anchor.getLayoutDirection()); + } + } + } + /** *

Generate the layout parameters for the popup window.

* @@ -1304,8 +1318,9 @@ public class PopupWindow { p.flags = newFlags; update = true; } - + if (update) { + setLayoutDirectionFromAnchor(); mWindowManager.updateViewLayout(mPopupView, p); } } @@ -1406,6 +1421,7 @@ public class PopupWindow { } if (update) { + setLayoutDirectionFromAnchor(); mWindowManager.updateViewLayout(mPopupView, p); } } @@ -1482,7 +1498,7 @@ public class PopupWindow { } else { updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff)); } - + update(p.x, p.y, width, height, x != p.x || y != p.y); } -- cgit v1.1