Merge "Fix bug #6427629 Clean up layout direction APIs" into jb-mr1-dev

This commit is contained in:
Fabrice Di Meglio
2012-09-23 15:05:55 -07:00
committed by Android (Google) Code Review
10 changed files with 127 additions and 176 deletions

View File

@ -28704,8 +28704,6 @@ package android.widget {
method protected void onTextChanged(java.lang.CharSequence, int, int, int);
method public boolean onTextContextMenuItem(int);
method public void removeTextChangedListener(android.text.TextWatcher);
method protected void resetResolvedDrawables();
method protected void resolveDrawables();
method public void setAllCaps(boolean);
method public final void setAutoLinkMask(int);
method public void setCompoundDrawablePadding(int);

View File

@ -24830,9 +24830,6 @@ package android.view {
method public void buildDrawingCache(boolean);
method public void buildLayer();
method public boolean callOnClick();
method public boolean canResolveLayoutDirection();
method public boolean canResolveTextAlignment();
method public boolean canResolveTextDirection();
method public boolean canScrollHorizontally(int);
method public boolean canScrollVertically(int);
method public void cancelLongPress();
@ -25033,7 +25030,6 @@ package android.view {
method public boolean isHovered();
method public boolean isInEditMode();
method public boolean isInTouchMode();
method protected static boolean isLayoutDirectionRtl(java.util.Locale);
method public boolean isLayoutRequested();
method public boolean isLayoutRtl();
method public boolean isLongClickable();
@ -25089,14 +25085,8 @@ package android.view {
method protected void onOverScrolled(int, int, boolean, boolean);
method public void onPaddingChanged(int);
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public void onResolveDrawables(int);
method public void onResolvedLayoutDirectionChanged();
method public void onResolvedLayoutDirectionReset();
method public void onResolvedTextAlignmentChanged();
method public void onResolvedTextAlignmentReset();
method public void onResolvedTextDirectionChanged();
method public void onResolvedTextDirectionReset();
method protected void onRestoreInstanceState(android.os.Parcelable);
method public void onRtlPropertiesChanged();
method protected android.os.Parcelable onSaveInstanceState();
method public void onScreenStateChanged(int);
method protected void onScrollChanged(int, int, int, int);
@ -25138,16 +25128,8 @@ package android.view {
method public void requestLayout();
method public boolean requestRectangleOnScreen(android.graphics.Rect);
method public boolean requestRectangleOnScreen(android.graphics.Rect, boolean);
method public void resetResolvedLayoutDirection();
method public void resetResolvedTextAlignment();
method public void resetResolvedTextDirection();
method public void resolveDrawables();
method public void resolveLayoutDirection();
method public void resolvePadding();
method public static int resolveSize(int, int);
method public static int resolveSizeAndState(int, int, int);
method public void resolveTextAlignment();
method public void resolveTextDirection();
method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable>);
method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable>);
method public void scheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable, long);

View File

@ -5799,13 +5799,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
if (getLayoutDirection() != layoutDirection) {
// Reset the current layout direction and the resolved one
mPrivateFlags2 &= ~PFLAG2_LAYOUT_DIRECTION_MASK;
resetResolvedLayoutDirection();
// Reset padding resolution
mPrivateFlags2 &= ~PFLAG2_PADDING_RESOLVED;
resetRtlProperties();
// Set the new layout direction (filtered)
mPrivateFlags2 |=
((layoutDirection << PFLAG2_LAYOUT_DIRECTION_MASK_SHIFT) & PFLAG2_LAYOUT_DIRECTION_MASK);
resolveRtlProperties();
// Notify changes
onRtlPropertiesChanged();
// ... and ask for a layout pass
requestLayout();
}
@ -11475,6 +11475,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
jumpDrawablesToCurrentState();
resolveRtlProperties();
// Notify changes
onRtlPropertiesChanged();
clearAccessibilityFocus();
if (isFocused()) {
@ -11487,17 +11489,28 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
}
/**
* Resolve all RTL related properties
*/
void resolveRtlProperties() {
// Order is important here: LayoutDirection MUST be resolved first...
resolveLayoutDirection();
// ... then we can resolve the others properties depending on the resolved LayoutDirection.
resolvePadding();
resolveLayoutParams();
resolveTextDirection();
resolveTextAlignment();
resolvePadding();
resolveLayoutParams();
resolveDrawables();
}
// Reset resolution of all RTL related properties
void resetRtlProperties() {
resetResolvedLayoutDirection();
resetResolvedTextDirection();
resetResolvedTextAlignment();
resetResolvedPadding();
}
/**
* @see #onScreenStateChanged(int)
*/
@ -11524,10 +11537,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
return mContext.getApplicationInfo().hasRtlSupport();
}
/**
* Called when any RTL property (layout direction or text direction or text alignment) has
* been changed.
*
* Subclasses need to override this method to take care of cached information that depends on the
* resolved layout direction, or to inform child views that inherit their layout direction.
*
* The default implementation does nothing.
*/
public void onRtlPropertiesChanged() {
}
/**
* Resolve and cache the layout direction. LTR is set initially. This is implicitly supposing
* that the parent directionality can and will be resolved before its children.
* Will call {@link View#onResolvedLayoutDirectionChanged} when resolution is done.
*
* @hide
*/
public void resolveLayoutDirection() {
// Clear any previous layout direction resolution
@ -11555,7 +11581,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mPrivateFlags2 |= PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL;
break;
case LAYOUT_DIRECTION_LOCALE:
if(isLayoutDirectionRtl(Locale.getDefault())) {
if((LAYOUT_DIRECTION_RTL ==
TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()))) {
mPrivateFlags2 |= PFLAG2_LAYOUT_DIRECTION_RESOLVED_RTL;
}
break;
@ -11566,19 +11593,38 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// Set to resolved
mPrivateFlags2 |= PFLAG2_LAYOUT_DIRECTION_RESOLVED;
onResolvedLayoutDirectionChanged();
}
/**
* Called when layout direction has been resolved.
* Check if layout direction resolution can be done.
*
* The default implementation does nothing.
* @return true if layout direction resolution can be done otherwise return false.
*
* @hide
*/
public void onResolvedLayoutDirectionChanged() {
public boolean canResolveLayoutDirection() {
switch (getLayoutDirection()) {
case LAYOUT_DIRECTION_INHERIT:
return (mParent != null) && (mParent instanceof ViewGroup);
default:
return true;
}
}
/**
* Reset the resolved layout direction.
*
* @hide
*/
public void resetResolvedLayoutDirection() {
// Reset the current resolved bits
mPrivateFlags2 &= ~PFLAG2_LAYOUT_DIRECTION_RESOLVED_MASK;
}
/**
* Return if padding has been resolved
*
* @hide
*/
boolean isPaddingResolved() {
return (mPrivateFlags2 & PFLAG2_PADDING_RESOLVED) != 0;
@ -11586,6 +11632,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
* Resolve padding depending on layout direction.
*
* @hide
*/
public void resolvePadding() {
final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
@ -11648,6 +11696,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mPrivateFlags2 |= PFLAG2_PADDING_RESOLVED;
}
/**
* Reset the resolved layout direction.
*
* @hide
*/
public void resetResolvedPadding() {
mPrivateFlags2 &= ~PFLAG2_PADDING_RESOLVED;
}
/**
* Resolve padding depending on the layout direction. Subclasses that care about
* padding resolution should override this method. The default implementation does
@ -11661,53 +11718,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
public void onPaddingChanged(int layoutDirection) {
}
/**
* Check if layout direction resolution can be done.
*
* @return true if layout direction resolution can be done otherwise return false.
*/
public boolean canResolveLayoutDirection() {
switch (getLayoutDirection()) {
case LAYOUT_DIRECTION_INHERIT:
return (mParent != null) && (mParent instanceof ViewGroup);
default:
return true;
}
}
/**
* Reset the resolved layout direction. Will call {@link View#onResolvedLayoutDirectionReset}
* when reset is done.
*/
public void resetResolvedLayoutDirection() {
// Reset the current resolved bits
mPrivateFlags2 &= ~PFLAG2_LAYOUT_DIRECTION_RESOLVED_MASK;
onResolvedLayoutDirectionReset();
// Reset also the text direction
resetResolvedTextDirection();
}
/**
* Called during reset of resolved layout direction.
*
* Subclasses need to override this method to clear cached information that depends on the
* resolved layout direction, or to inform child views that inherit their layout direction.
*
* The default implementation does nothing.
*/
public void onResolvedLayoutDirectionReset() {
}
/**
* Check if a Locale uses an RTL script.
*
* @param locale Locale to check
* @return true if the Locale uses an RTL script.
*/
protected static boolean isLayoutDirectionRtl(Locale locale) {
return (LAYOUT_DIRECTION_RTL == TextUtils.getLayoutDirectionFromLocale(locale));
}
/**
* This is called when the view is detached from a window. At this point it
* no longer has a surface for drawing.
@ -11738,10 +11748,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
mCurrentAnimation = null;
resetResolvedLayoutDirection();
resetResolvedTextAlignment();
resetRtlProperties();
onRtlPropertiesChanged();
resetAccessibilityStateChanged();
mPrivateFlags2 &= ~PFLAG2_PADDING_RESOLVED;
}
/**
@ -14091,6 +14100,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* that the View directionality can and will be resolved before its Drawables.
*
* Will call {@link View#onResolveDrawables} when resolution is done.
*
* @hide
*/
public void resolveDrawables() {
if (mBackground != null) {
@ -14108,6 +14119,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @see #LAYOUT_DIRECTION_LTR
* @see #LAYOUT_DIRECTION_RTL
*
* @hide
*/
public void onResolveDrawables(int layoutDirection) {
}
@ -14383,8 +14396,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
background.setLayoutDirection(getResolvedLayoutDirection());
if (background.getPadding(padding)) {
// Reset padding resolution
mPrivateFlags2 &= ~PFLAG2_PADDING_RESOLVED;
resetResolvedPadding();
switch (background.getLayoutDirection()) {
case LAYOUT_DIRECTION_RTL:
mUserPaddingLeftInitial = padding.right;
@ -14485,8 +14497,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param bottom the bottom padding in pixels
*/
public void setPadding(int left, int top, int right, int bottom) {
// Reset padding resolution
mPrivateFlags2 &= ~PFLAG2_PADDING_RESOLVED;
resetResolvedPadding();
mUserPaddingStart = UNDEFINED_PADDING;
mUserPaddingEnd = UNDEFINED_PADDING;
@ -14575,8 +14586,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
* @param bottom the bottom padding in pixels
*/
public void setPaddingRelative(int start, int top, int end, int bottom) {
// Reset padding resolution
mPrivateFlags2 &= ~PFLAG2_PADDING_RESOLVED;
resetResolvedPadding();
mUserPaddingStart = start;
mUserPaddingEnd = end;
@ -16513,6 +16523,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
resetResolvedTextDirection();
// Set the new text direction
mPrivateFlags2 |= ((textDirection << PFLAG2_TEXT_DIRECTION_MASK_SHIFT) & PFLAG2_TEXT_DIRECTION_MASK);
// Notify change
onRtlPropertiesChanged();
// Refresh
requestLayout();
invalidate(true);
@ -16544,8 +16556,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
* Resolve the text direction. Will call {@link View#onResolvedTextDirectionChanged} when
* resolution is done.
* Resolve the text direction.
*
* @hide
*/
public void resolveTextDirection() {
// Reset any previous text direction resolution
@ -16598,16 +16611,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// Set to resolved
mPrivateFlags2 |= PFLAG2_TEXT_DIRECTION_RESOLVED;
onResolvedTextDirectionChanged();
}
/**
* Called when text direction has been resolved. Subclasses that care about text direction
* resolution should override this method.
*
* The default implementation does nothing.
*/
public void onResolvedTextDirectionChanged() {
}
/**
@ -16615,7 +16618,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @return true if text direction resolution can be done otherwise return false.
*/
public boolean canResolveTextDirection() {
private boolean canResolveTextDirection() {
switch (getTextDirection()) {
case TEXT_DIRECTION_INHERIT:
return (mParent != null) && (mParent instanceof ViewGroup);
@ -16626,20 +16629,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
/**
* Reset resolved text direction. Text direction can be resolved with a call to
* getResolvedTextDirection(). Will call {@link View#onResolvedTextDirectionReset} when
* reset is done.
* getResolvedTextDirection().
*
* @hide
*/
public void resetResolvedTextDirection() {
mPrivateFlags2 &= ~(PFLAG2_TEXT_DIRECTION_RESOLVED | PFLAG2_TEXT_DIRECTION_RESOLVED_MASK);
onResolvedTextDirectionReset();
}
/**
* Called when text direction is reset. Subclasses that care about text direction reset should
* override this method and do a reset of the text direction of their children. The default
* implementation does nothing.
*/
public void onResolvedTextDirectionReset() {
}
/**
@ -16691,6 +16686,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
resetResolvedTextAlignment();
// Set the new text alignment
mPrivateFlags2 |= ((textAlignment << PFLAG2_TEXT_ALIGNMENT_MASK_SHIFT) & PFLAG2_TEXT_ALIGNMENT_MASK);
// Notify change
onRtlPropertiesChanged();
// Refresh
requestLayout();
invalidate(true);
@ -16731,8 +16728,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
* Resolve the text alignment. Will call {@link View#onResolvedTextAlignmentChanged} when
* resolution is done.
* Resolve the text alignment.
*
* @hide
*/
public void resolveTextAlignment() {
// Reset any previous text alignment resolution
@ -16744,7 +16742,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
switch (textAlignment) {
case TEXT_ALIGNMENT_INHERIT:
// Check if we can resolve the text alignment
if (canResolveLayoutDirection() && mParent instanceof View) {
if (canResolveTextAlignment() && mParent instanceof View) {
View view = (View) mParent;
final int parentResolvedTextAlignment = view.getResolvedTextAlignment();
@ -16790,7 +16788,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
// Set the resolved
mPrivateFlags2 |= PFLAG2_TEXT_ALIGNMENT_RESOLVED;
onResolvedTextAlignmentChanged();
}
/**
@ -16798,7 +16795,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*
* @return true if text alignment resolution can be done otherwise return false.
*/
public boolean canResolveTextAlignment() {
private boolean canResolveTextAlignment() {
switch (getTextAlignment()) {
case TEXT_DIRECTION_INHERIT:
return (mParent != null);
@ -16808,31 +16805,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
}
/**
* Called when text alignment has been resolved. Subclasses that care about text alignment
* resolution should override this method.
* Reset resolved text alignment.
*
* The default implementation does nothing.
*/
public void onResolvedTextAlignmentChanged() {
}
/**
* Reset resolved text alignment. Text alignment can be resolved with a call to
* getResolvedTextAlignment(). Will call {@link View#onResolvedTextAlignmentReset} when
* reset is done.
* @hide
*/
public void resetResolvedTextAlignment() {
// Reset any previous text alignment resolution
mPrivateFlags2 &= ~(PFLAG2_TEXT_ALIGNMENT_RESOLVED | PFLAG2_TEXT_ALIGNMENT_RESOLVED_MASK);
onResolvedTextAlignmentReset();
}
/**
* Called when text alignment is reset. Subclasses that care about text alignment reset should
* override this method and do a reset of the text alignment of their children. The default
* implementation does nothing.
*/
public void onResolvedTextAlignmentReset() {
}
/**

View File

@ -5257,36 +5257,23 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
}
}
/**
* @hide
*/
@Override
public void onResolvedLayoutDirectionReset() {
public void resetResolvedLayoutDirection() {
super.resetResolvedLayoutDirection();
// Take care of resetting the children resolution too
final int count = getChildCount();
int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.getLayoutDirection() == LAYOUT_DIRECTION_INHERIT) {
child.resetResolvedLayoutDirection();
}
}
}
@Override
public void onResolvedTextDirectionReset() {
// Take care of resetting the children resolution too
final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.getTextDirection() == TEXT_DIRECTION_INHERIT) {
child.resetResolvedTextDirection();
}
}
}
@Override
public void onResolvedTextAlignmentReset() {
// Take care of resetting the children resolution too
final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (child.getTextAlignment() == TEXT_ALIGNMENT_INHERIT) {
child.resetResolvedTextAlignment();
}

View File

@ -308,6 +308,9 @@ public abstract class AbsSeekBar extends ProgressBar {
thumb.setBounds(left, topBound, left + thumbWidth, bottomBound);
}
/**
* @hide
*/
@Override
public void onResolveDrawables(int layoutDirection) {
super.onResolveDrawables(layoutDirection);

View File

@ -680,7 +680,7 @@ public class ImageView extends View {
d.setState(getDrawableState());
}
d.setLevel(mLevel);
d.setLayoutDirection(getLayoutDirection());
d.setLayoutDirection(getResolvedLayoutDirection());
mDrawableWidth = d.getIntrinsicWidth();
mDrawableHeight = d.getIntrinsicHeight();
applyColorMod();

View File

@ -565,6 +565,9 @@ public class ProgressBar extends View {
if (mIndeterminateDrawable != null) mIndeterminateDrawable.jumpToCurrentState();
}
/**
* @hide
*/
@Override
public void onResolveDrawables(int layoutDirection) {
final Drawable d = mCurrentDrawable;

View File

@ -1354,7 +1354,7 @@ public class SearchView extends LinearLayout implements CollapsibleActionView {
};
@Override
public void onResolvedLayoutDirectionChanged() {
public void onRtlPropertiesChanged() {
mQueryTextView.setLayoutDirection(getResolvedLayoutDirection());
}

View File

@ -5635,7 +5635,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
@Override
public void onResolvedLayoutDirectionReset() {
public void onRtlPropertiesChanged() {
if (mLayoutAlignment != null) {
if (mResolvedTextAlignment == TEXT_ALIGNMENT_VIEW_START ||
mResolvedTextAlignment == TEXT_ALIGNMENT_VIEW_END) {
@ -5733,7 +5733,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
if (mTextDir == null) {
resolveTextDirection();
mTextDir = getTextDirectionHeuristic();
}
mLayout = makeSingleLayout(wantWidth, boring, ellipsisWidth, alignment, shouldEllipsize,
@ -5995,7 +5995,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
BoringLayout.Metrics hintBoring = UNKNOWN_BORING;
if (mTextDir == null) {
resolveTextDirection();
getTextDirectionHeuristic();
}
int des = -1;
@ -8181,13 +8181,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
return mEditor.mInBatchEditControllers;
}
@Override
public void onResolvedTextDirectionChanged() {
TextDirectionHeuristic getTextDirectionHeuristic() {
if (hasPasswordTransformationMethod()) {
// TODO: take care of the content direction to show the password text and dots justified
// to the left or to the right
mTextDir = TextDirectionHeuristics.LOCALE;
return;
return TextDirectionHeuristics.LOCALE;
}
// Always need to resolve layout direction first
@ -8198,24 +8196,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
switch (textDir) {
default:
case TEXT_DIRECTION_FIRST_STRONG:
mTextDir = (defaultIsRtl ? TextDirectionHeuristics.FIRSTSTRONG_RTL :
return (defaultIsRtl ? TextDirectionHeuristics.FIRSTSTRONG_RTL :
TextDirectionHeuristics.FIRSTSTRONG_LTR);
break;
case TEXT_DIRECTION_ANY_RTL:
mTextDir = TextDirectionHeuristics.ANYRTL_LTR;
break;
return TextDirectionHeuristics.ANYRTL_LTR;
case TEXT_DIRECTION_LTR:
mTextDir = TextDirectionHeuristics.LTR;
break;
return TextDirectionHeuristics.LTR;
case TEXT_DIRECTION_RTL:
mTextDir = TextDirectionHeuristics.RTL;
break;
return TextDirectionHeuristics.RTL;
case TEXT_DIRECTION_LOCALE:
mTextDir = TextDirectionHeuristics.LOCALE;
break;
return TextDirectionHeuristics.LOCALE;
}
}
/**
* @hide
*/
@Override
public void onResolveDrawables(int layoutDirection) {
// No need to resolve twice

View File

@ -161,6 +161,9 @@ public class ActionBarContainer extends FrameLayout {
}
}
/**
* @hide
*/
@Override
public void onResolveDrawables(int layoutDirection) {
super.onResolveDrawables(layoutDirection);