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
This commit is contained in:
@ -317,6 +317,8 @@ public final class ViewRootImpl implements ViewParent,
|
||||
private final int mDensity;
|
||||
private final int mNoncompatDensity;
|
||||
|
||||
private int mViewLayoutDirectionInitial;
|
||||
|
||||
/**
|
||||
* Consistency verifier for debugging purposes.
|
||||
*/
|
||||
@ -465,6 +467,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;
|
||||
@ -1184,7 +1187,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);
|
||||
@ -2680,7 +2686,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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user