diff options
| author | Guang Zhu <guangzhu@google.com> | 2012-05-11 19:34:56 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-05-12 19:09:34 -0700 |
| commit | 0d607fbe546ac943de38dad33ae681b09efec6ea (patch) | |
| tree | 7236772a5bff5388c5425c5291b6793a53b9a13a /core/java/android | |
| parent | 15e8439905cfae4605d101ae96a2694e69fb5017 (diff) | |
| download | frameworks_base-0d607fbe546ac943de38dad33ae681b09efec6ea.zip frameworks_base-0d607fbe546ac943de38dad33ae681b09efec6ea.tar.gz frameworks_base-0d607fbe546ac943de38dad33ae681b09efec6ea.tar.bz2 | |
accessibility bug fix in NumberPicker
* moved View#isVisibleToUser to protected with @hide
* added a new View#isVisibleToUser(Rect), so that a portion of
the view can be tested for visibility
* NumberPicker will report its concrete class name
* code to append virtual children was at wrong place
* boundInScreen for increment and decrement buttons are reported
wrong
Change-Id: Ic5d644b3e1efa15b1f0537907c8cdd4ce43a97c1
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/view/View.java | 43 | ||||
| -rw-r--r-- | core/java/android/widget/NumberPicker.java | 12 |
2 files changed, 42 insertions, 13 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 4d13e8a..35a6879 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -666,7 +666,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal protected static final String VIEW_LOG_TAG = "View"; /** - * When set to true, apps will draw debugging information about their layouts. + * When set to true, apps will draw debugging information about their layouts. * * @hide */ @@ -4801,17 +4801,46 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal * entirely by its predecessors, and has an alpha greater than zero. * * @return Whether the view is visible on the screen. + * + * @hide */ - private boolean isVisibleToUser() { + protected boolean isVisibleToUser() { + return isVisibleToUser(null); + } + + /** + * Computes whether the given portion of this view is visible to the user. Such a view is + * attached, visible, all its predecessors are visible, has an alpha greater than zero, and + * the specified portion is not clipped entirely by its predecessors. + * + * @param boundInView the portion of the view to test; coordinates should be relative; may be + * <code>null</code>, and the entire view will be tested in this case. + * When <code>true</code> is returned by the function, the actual visible + * region will be stored in this parameter; that is, if boundInView is fully + * contained within the view, no modification will be made, otherwise regions + * outside of the visible area of the view will be clipped. + * + * @return Whether the specified portion of the view is visible on the screen. + * + * @hide + */ + protected boolean isVisibleToUser(Rect boundInView) { + Rect visibleRect = mAttachInfo.mTmpInvalRect; + Point offset = mAttachInfo.mPoint; // The first two checks are made also made by isShown() which // however traverses the tree up to the parent to catch that. // Therefore, we do some fail fast check to minimize the up // tree traversal. - return (mAttachInfo != null - && mAttachInfo.mWindowVisibility == View.VISIBLE - && getAlpha() > 0 - && isShown() - && getGlobalVisibleRect(mAttachInfo.mTmpInvalRect)); + boolean isVisible = mAttachInfo != null + && mAttachInfo.mWindowVisibility == View.VISIBLE + && getAlpha() > 0 + && isShown() + && getGlobalVisibleRect(visibleRect, offset); + if (isVisible && boundInView != null) { + visibleRect.offset(-offset.x, -offset.y); + isVisible &= boundInView.intersect(visibleRect); + } + return isVisible; } /** diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 6ff924b..7c809b3 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -2239,20 +2239,17 @@ public class NumberPicker extends LinearLayout { info.setPackageName(mContext.getPackageName()); info.setSource(NumberPicker.this, virtualViewId); info.setParent(NumberPicker.this); - info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_DECREMENT); - info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INPUT); - info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INCREMENT); info.setText(text); info.setClickable(true); info.setLongClickable(true); info.setEnabled(NumberPicker.this.isEnabled()); Rect boundsInParent = mTempRect; boundsInParent.set(left, top, right, bottom); + info.setVisibleToUser(isVisibleToUser(boundsInParent)); info.setBoundsInParent(boundsInParent); Rect boundsInScreen = boundsInParent; int[] locationOnScreen = mTempArray; getLocationOnScreen(locationOnScreen); - boundsInScreen.offsetTo(0, 0); boundsInScreen.offset(locationOnScreen[0], locationOnScreen[1]); info.setBoundsInScreen(boundsInScreen); return info; @@ -2261,19 +2258,22 @@ public class NumberPicker extends LinearLayout { private AccessibilityNodeInfo createAccessibilityNodeInfoForNumberPicker(int left, int top, int right, int bottom) { AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); - info.setClassName(Button.class.getName()); + info.setClassName(NumberPicker.class.getName()); info.setPackageName(mContext.getPackageName()); info.setSource(NumberPicker.this); + info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_DECREMENT); + info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INPUT); + info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INCREMENT); info.setParent((View) getParent()); info.setEnabled(NumberPicker.this.isEnabled()); info.setScrollable(true); Rect boundsInParent = mTempRect; boundsInParent.set(left, top, right, bottom); info.setBoundsInParent(boundsInParent); + info.setVisibleToUser(isVisibleToUser()); Rect boundsInScreen = boundsInParent; int[] locationOnScreen = mTempArray; getLocationOnScreen(locationOnScreen); - boundsInScreen.offsetTo(0, 0); boundsInScreen.offset(locationOnScreen[0], locationOnScreen[1]); info.setBoundsInScreen(boundsInScreen); return info; |
