summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorSvetoslav Ganov <svetoslavganov@google.com>2012-11-05 17:03:36 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-11-05 17:03:37 -0800
commit0f4d5df5d815466398dba5f2d07aa98f18c35aaa (patch)
treed13943957db194bda9f924c325acde9bd2fd81f0 /core/java/android
parentc87f198b8cd3b3cb5b3daf63df419b9377b9c7b8 (diff)
parent11f19f15ea474edde07bf34877d2531fff6c26f0 (diff)
downloadframeworks_base-0f4d5df5d815466398dba5f2d07aa98f18c35aaa.zip
frameworks_base-0f4d5df5d815466398dba5f2d07aa98f18c35aaa.tar.gz
frameworks_base-0f4d5df5d815466398dba5f2d07aa98f18c35aaa.tar.bz2
Merge "View's visibility to the user not checking predecessor alpha." into jb-mr1-dev
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/view/View.java37
1 files changed, 24 insertions, 13 deletions
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index d5e1ed3..ff44475 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -5088,24 +5088,35 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
*/
protected boolean isVisibleToUser(Rect boundInView) {
if (mAttachInfo != null) {
+ // Attached to invisible window means this view is not visible.
+ if (mAttachInfo.mWindowVisibility != View.VISIBLE) {
+ return false;
+ }
+ // An invisible predecessor or one with alpha zero means
+ // that this view is not visible to the user.
+ Object current = this;
+ while (current instanceof View) {
+ View view = (View) current;
+ // We have attach info so this view is attached and there is no
+ // need to check whether we reach to ViewRootImpl on the way up.
+ if (view.getAlpha() <= 0 || view.getVisibility() != VISIBLE) {
+ return false;
+ }
+ current = view.mParent;
+ }
+ // Check if the view is entirely covered by its predecessors.
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.
- boolean isVisible = mAttachInfo.mWindowVisibility == View.VISIBLE
- && getAlpha() > 0
- && isShown()
- && getGlobalVisibleRect(visibleRect, offset);
- if (isVisible && boundInView != null) {
+ if (!getGlobalVisibleRect(visibleRect, offset)) {
+ return false;
+ }
+ // Check if the visible portion intersects the rectangle of interest.
+ if (boundInView != null) {
visibleRect.offset(-offset.x, -offset.y);
- // isVisible is always true here, use a simple assignment
- isVisible = boundInView.intersect(visibleRect);
+ return boundInView.intersect(visibleRect);
}
- return isVisible;
+ return true;
}
-
return false;
}