diff options
| author | Fabrice Di Meglio <fdimeglio@google.com> | 2013-02-08 18:15:07 -0800 |
|---|---|---|
| committer | Fabrice Di Meglio <fdimeglio@google.com> | 2013-02-11 14:41:04 -0800 |
| commit | 9dd4c5c6867f8b6de19096d2d68365dccb744c19 (patch) | |
| tree | 285d4aaeef56f027b3a69e1bf860f197a863fa6a /core/java/android/view | |
| parent | 981e60edc3ed91ea8b5e1dae98669b88b175e19b (diff) | |
Fix bug #7381967 Add RTL APIs to ViewParent
- add RTL apis to ViewParent
- remove awful and performance bottleneck casts in View during LayoutDirection,
TextDirection and TextAlignment resolutions.
Change-Id: I92a56b16382e13c28c1dad35f6f205620eb01bfe
Diffstat (limited to 'core/java/android/view')
| -rw-r--r-- | core/java/android/view/View.java | 67 | ||||
| -rw-r--r-- | core/java/android/view/ViewParent.java | 101 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 45 |
3 files changed, 190 insertions, 23 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index c3eae3a770ff..8b1863bf8cc2 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1868,6 +1868,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static final int LAYOUT_DIRECTION_DEFAULT = LAYOUT_DIRECTION_INHERIT; /** + * Default horizontal layout direction. + * @hide + */ + static final int LAYOUT_DIRECTION_RESOLVED_DEFAULT = LAYOUT_DIRECTION_LTR; + + /** * Indicates that the view is tracking some sort of transient state * that the app should not need to be aware of, but that the framework * should take special care to preserve. @@ -1916,6 +1922,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static final int TEXT_DIRECTION_DEFAULT = TEXT_DIRECTION_INHERIT; /** + * Default resolved text direction + * @hide + */ + static final int TEXT_DIRECTION_RESOLVED_DEFAULT = TEXT_DIRECTION_FIRST_STRONG; + + /** * Bit shift to get the horizontal layout direction. (bits after LAYOUT_DIRECTION_RESOLVED) * @hide */ @@ -1967,7 +1979,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @hide */ static final int PFLAG2_TEXT_DIRECTION_RESOLVED_DEFAULT = - TEXT_DIRECTION_FIRST_STRONG << PFLAG2_TEXT_DIRECTION_RESOLVED_MASK_SHIFT; + TEXT_DIRECTION_RESOLVED_DEFAULT << PFLAG2_TEXT_DIRECTION_RESOLVED_MASK_SHIFT; /* * Default text alignment. The text alignment of this View is inherited from its parent. @@ -2026,6 +2038,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static final int TEXT_ALIGNMENT_DEFAULT = TEXT_ALIGNMENT_GRAVITY; /** + * Default resolved text alignment + * @hide + */ + static final int TEXT_ALIGNMENT_RESOLVED_DEFAULT = TEXT_ALIGNMENT_GRAVITY; + + /** * Bit shift to get the horizontal layout direction. (bits after DRAG_HOVERED) * @hide */ @@ -2075,7 +2093,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * Indicates whether if the view text alignment has been resolved to gravity */ private static final int PFLAG2_TEXT_ALIGNMENT_RESOLVED_DEFAULT = - TEXT_ALIGNMENT_GRAVITY << PFLAG2_TEXT_ALIGNMENT_RESOLVED_MASK_SHIFT; + TEXT_ALIGNMENT_RESOLVED_DEFAULT << PFLAG2_TEXT_ALIGNMENT_RESOLVED_MASK_SHIFT; // Accessiblity constants for mPrivateFlags2 @@ -5979,7 +5997,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion; if (targetSdkVersion < JELLY_BEAN_MR1) { mPrivateFlags2 |= PFLAG2_LAYOUT_DIRECTION_RESOLVED; - return LAYOUT_DIRECTION_LTR; + return LAYOUT_DIRECTION_RESOLVED_DEFAULT; } return ((mPrivateFlags2 & PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL) == PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL) ? LAYOUT_DIRECTION_RTL : LAYOUT_DIRECTION_LTR; @@ -11805,11 +11823,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // later to get the correct resolved value if (!canResolveLayoutDirection()) return false; - View parent = ((View) mParent); // Parent has not yet resolved, LTR is still the default - if (!parent.isLayoutDirectionResolved()) return false; + if (!mParent.isLayoutDirectionResolved()) return false; - if (parent.getLayoutDirection() == LAYOUT_DIRECTION_RTL) { + if (mParent.getLayoutDirection() == LAYOUT_DIRECTION_RTL) { mPrivateFlags2 |= PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL; } break; @@ -11842,8 +11859,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public boolean canResolveLayoutDirection() { switch (getRawLayoutDirection()) { case LAYOUT_DIRECTION_INHERIT: - return (mParent != null) && (mParent instanceof ViewGroup) && - ((ViewGroup) mParent).canResolveLayoutDirection(); + return (mParent != null) && mParent.canResolveLayoutDirection(); default: return true; } @@ -11871,8 +11887,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * @return true if layout direction has been resolved. + * @hide */ - private boolean isLayoutDirectionResolved() { + public boolean isLayoutDirectionResolved() { return (mPrivateFlags2 & PFLAG2_LAYOUT_DIRECTION_RESOLVED) == PFLAG2_LAYOUT_DIRECTION_RESOLVED; } @@ -16905,16 +16922,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback, return false; } - View parent = ((View) mParent); // Parent has not yet resolved, so we still return the default - if (!parent.isTextDirectionResolved()) { + if (!mParent.isTextDirectionResolved()) { mPrivateFlags2 |= PFLAG2_TEXT_DIRECTION_RESOLVED_DEFAULT; // Resolution will need to happen again later return false; } // Set current resolved direction to the same value as the parent's one - final int parentResolvedDirection = parent.getTextDirection(); + final int parentResolvedDirection = mParent.getTextDirection(); switch (parentResolvedDirection) { case TEXT_DIRECTION_FIRST_STRONG: case TEXT_DIRECTION_ANY_RTL: @@ -16955,12 +16971,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * Check if text direction resolution can be done. * * @return true if text direction resolution can be done otherwise return false. + * + * @hide */ - private boolean canResolveTextDirection() { + public boolean canResolveTextDirection() { switch (getRawTextDirection()) { case TEXT_DIRECTION_INHERIT: - return (mParent != null) && (mParent instanceof View) && - ((View) mParent).canResolveTextDirection(); + return (mParent != null) && mParent.canResolveTextDirection(); default: return true; } @@ -16990,8 +17007,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * @return true if text direction is resolved. + * + * @hide */ - private boolean isTextDirectionResolved() { + public boolean isTextDirectionResolved() { return (mPrivateFlags2 & PFLAG2_TEXT_DIRECTION_RESOLVED) == PFLAG2_TEXT_DIRECTION_RESOLVED; } @@ -17114,16 +17133,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // Resolution will need to happen again later return false; } - View parent = (View) mParent; // Parent has not yet resolved, so we still return the default - if (!parent.isTextAlignmentResolved()) { + if (!mParent.isTextAlignmentResolved()) { mPrivateFlags2 |= PFLAG2_TEXT_ALIGNMENT_RESOLVED_DEFAULT; // Resolution will need to happen again later return false; } - final int parentResolvedTextAlignment = parent.getTextAlignment(); + final int parentResolvedTextAlignment = mParent.getTextAlignment(); switch (parentResolvedTextAlignment) { case TEXT_ALIGNMENT_GRAVITY: case TEXT_ALIGNMENT_TEXT_START: @@ -17168,12 +17186,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * Check if text alignment resolution can be done. * * @return true if text alignment resolution can be done otherwise return false. + * + * @hide */ - private boolean canResolveTextAlignment() { + public boolean canResolveTextAlignment() { switch (getRawTextAlignment()) { case TEXT_DIRECTION_INHERIT: - return (mParent != null) && (mParent instanceof View) && - ((View) mParent).canResolveTextAlignment(); + return (mParent != null) && mParent.canResolveTextAlignment(); default: return true; } @@ -17203,8 +17222,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * @return true if text alignment is resolved. + * + * @hide */ - private boolean isTextAlignmentResolved() { + public boolean isTextAlignmentResolved() { return (mPrivateFlags2 & PFLAG2_TEXT_ALIGNMENT_RESOLVED) == PFLAG2_TEXT_ALIGNMENT_RESOLVED; } diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java index ddff91de0ac9..4b70bc0c7e37 100644 --- a/core/java/android/view/ViewParent.java +++ b/core/java/android/view/ViewParent.java @@ -295,4 +295,105 @@ public interface ViewParent { * @hide */ public void childAccessibilityStateChanged(View child); + + /** + * Tells if this view parent can resolve the layout direction. + * See {@link View#setLayoutDirection(int)} + * + * @return True if this view parent can resolve the layout direction. + * + * @hide + */ + public boolean canResolveLayoutDirection(); + + /** + * Tells if this view parent layout direction is resolved. + * See {@link View#setLayoutDirection(int)} + * + * @return True if this view parent layout direction is resolved. + * + * @hide + */ + public boolean isLayoutDirectionResolved(); + + /** + * Return this view parent layout direction. See {@link View#getLayoutDirection()} + * + * @return {@link View#LAYOUT_DIRECTION_RTL} if the layout direction is RTL or returns + * {@link View#LAYOUT_DIRECTION_LTR} if the layout direction is not RTL. + * + * @hide + */ + public int getLayoutDirection(); + + /** + * Tells if this view parent can resolve the text direction. + * See {@link View#setTextDirection(int)} + * + * @return True if this view parent can resolve the text direction. + * + * @hide + */ + public boolean canResolveTextDirection(); + + /** + * Tells if this view parent text direction is resolved. + * See {@link View#setTextDirection(int)} + * + * @return True if this view parent text direction is resolved. + * + * @hide + */ + public boolean isTextDirectionResolved(); + + /** + * Return this view parent text direction. See {@link View#getTextDirection()} + * + * @return the resolved text direction. Returns one of: + * + * {@link View#TEXT_DIRECTION_FIRST_STRONG} + * {@link View#TEXT_DIRECTION_ANY_RTL}, + * {@link View#TEXT_DIRECTION_LTR}, + * {@link View#TEXT_DIRECTION_RTL}, + * {@link View#TEXT_DIRECTION_LOCALE} + * + * @hide + */ + public int getTextDirection(); + + /** + * Tells if this view parent can resolve the text alignment. + * See {@link View#setTextAlignment(int)} + * + * @return True if this view parent can resolve the text alignment. + * + * @hide + */ + public boolean canResolveTextAlignment(); + + /** + * Tells if this view parent text alignment is resolved. + * See {@link View#setTextAlignment(int)} + * + * @return True if this view parent text alignment is resolved. + * + * @hide + */ + public boolean isTextAlignmentResolved(); + + /** + * Return this view parent text alignment. See {@link android.view.View#getTextAlignment()} + * + * @return the resolved text alignment. Returns one of: + * + * {@link View#TEXT_ALIGNMENT_GRAVITY}, + * {@link View#TEXT_ALIGNMENT_CENTER}, + * {@link View#TEXT_ALIGNMENT_TEXT_START}, + * {@link View#TEXT_ALIGNMENT_TEXT_END}, + * {@link View#TEXT_ALIGNMENT_VIEW_START}, + * {@link View#TEXT_ALIGNMENT_VIEW_END} + * + * @hide + */ + public int getTextAlignment(); } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 2df56c3a50d9..1d86361d7f30 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -4829,6 +4829,51 @@ public final class ViewRootImpl implements ViewParent, postSendWindowContentChangedCallback(child); } + @Override + public boolean canResolveLayoutDirection() { + return true; + } + + @Override + public boolean isLayoutDirectionResolved() { + return true; + } + + @Override + public int getLayoutDirection() { + return View.LAYOUT_DIRECTION_RESOLVED_DEFAULT; + } + + @Override + public boolean canResolveTextDirection() { + return true; + } + + @Override + public boolean isTextDirectionResolved() { + return true; + } + + @Override + public int getTextDirection() { + return View.TEXT_DIRECTION_RESOLVED_DEFAULT; + } + + @Override + public boolean canResolveTextAlignment() { + return true; + } + + @Override + public boolean isTextAlignmentResolved() { + return true; + } + + @Override + public int getTextAlignment() { + return View.TEXT_ALIGNMENT_RESOLVED_DEFAULT; + } + private View getCommonPredecessor(View first, View second) { if (mAttachInfo != null) { if (mTempHashSet == null) { |
