diff options
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 11 | ||||
-rw-r--r-- | core/java/android/widget/PopupWindow.java | 20 |
2 files changed, 27 insertions, 4 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 62bf691..3e2cdba 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -319,6 +319,8 @@ public final class ViewRootImpl implements ViewParent, private final int mDensity; private final int mNoncompatDensity; + private int mViewLayoutDirectionInitial; + /** * Consistency verifier for debugging purposes. */ @@ -467,6 +469,7 @@ public final class ViewRootImpl implements ViewParent, synchronized (this) { if (mView == null) { mView = view; + mViewLayoutDirectionInitial = mView.getRawLayoutDirection(); mFallbackEventHandler.setView(view); mWindowAttributes.copyFrom(attrs); attrs = mWindowAttributes; @@ -1188,7 +1191,10 @@ public final class ViewRootImpl implements ViewParent, viewVisibilityChanged = false; mLastConfiguration.setTo(host.getResources().getConfiguration()); mLastSystemUiVisibility = mAttachInfo.mSystemUiVisibility; - host.setLayoutDirection(mLastConfiguration.getLayoutDirection()); + // Set the layout direction if it has not been set before (inherit is the default) + if (mViewLayoutDirectionInitial == View.LAYOUT_DIRECTION_INHERIT) { + host.setLayoutDirection(mLastConfiguration.getLayoutDirection()); + } host.dispatchAttachedToWindow(attachInfo, 0); mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets); host.fitSystemWindows(mFitSystemWindowsInsets); @@ -2684,7 +2690,8 @@ public final class ViewRootImpl implements ViewParent, final int lastLayoutDirection = mLastConfiguration.getLayoutDirection(); final int currentLayoutDirection = config.getLayoutDirection(); mLastConfiguration.setTo(config); - if (lastLayoutDirection != currentLayoutDirection) { + if (lastLayoutDirection != currentLayoutDirection && + mViewLayoutDirectionInitial == View.LAYOUT_DIRECTION_INHERIT) { mView.setLayoutDirection(currentLayoutDirection); } mView.dispatchConfigurationChanged(config); 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; + /** * <p>Create a new empty, non focusable popup window of dimension (0,0).</p> * @@ -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()); + } + } + } + /** * <p>Generate the layout parameters for the popup window.</p> * @@ -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); } |