am af26ac31: am 398a6713: Merge "Fix bug #7367429 Popup window should get its direction from it Anchor View if it can" into jb-mr1-dev

* commit 'af26ac3130c0e956e28443d6e42212b02d4da611':
  Fix bug #7367429 Popup window should get its direction from it Anchor View if it can
This commit is contained in:
Fabrice Di Meglio
2012-10-19 11:38:18 -07:00
committed by Android Git Automerger
2 changed files with 27 additions and 4 deletions

View File

@@ -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);

View File

@@ -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);
}