diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 0c1b1929418a1..119239035530d 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6976,6 +6976,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @hide */ public boolean includeForAccessibility() { + //noinspection SimplifiableIfStatement if (mAttachInfo != null) { return (mAttachInfo.mAccessibilityFetchFlags & AccessibilityNodeInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS) != 0 @@ -7564,8 +7565,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @return True if the event was handled by the view, false otherwise. */ protected boolean dispatchHoverEvent(MotionEvent event) { - //noinspection SimplifiableIfStatement ListenerInfo li = mListenerInfo; + //noinspection SimplifiableIfStatement if (li != null && li.mOnHoverListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnHoverListener.onHover(this, event)) { @@ -12625,7 +12626,15 @@ public class View implements Drawable.Callback, KeyEvent.Callback, attachInfo.mHardwareRenderer.isEnabled() && attachInfo.mHardwareRenderer.validate()) { getHardwareLayer(); - attachInfo.mViewRootImpl.dispatchFlushHardwareLayerUpdates(); + // TODO: We need a better way to handle this case + // If views have registered pre-draw listeners they need + // to be notified before we build the layer. Those listeners + // may however rely on other events to happen first so we + // cannot just invoke them here until they don't cancel the + // current frame + if (!attachInfo.mTreeObserver.hasOnPreDrawListeners()) { + attachInfo.mViewRootImpl.dispatchFlushHardwareLayerUpdates(); + } } break; case LAYER_TYPE_SOFTWARE: @@ -15251,6 +15260,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param selected true if the view must be selected, false otherwise */ public void setSelected(boolean selected) { + //noinspection DoubleNegation if (((mPrivateFlags & PFLAG_SELECTED) != 0) != selected) { mPrivateFlags = (mPrivateFlags & ~PFLAG_SELECTED) | (selected ? PFLAG_SELECTED : 0); if (!selected) resetPressedState(); @@ -15295,6 +15305,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param activated true if the view must be activated, false otherwise */ public void setActivated(boolean activated) { + //noinspection DoubleNegation if (((mPrivateFlags & PFLAG_ACTIVATED) != 0) != activated) { mPrivateFlags = (mPrivateFlags & ~PFLAG_ACTIVATED) | (activated ? PFLAG_ACTIVATED : 0); invalidate(true); @@ -16804,8 +16815,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, *

*/ public boolean dispatchDragEvent(DragEvent event) { - //noinspection SimplifiableIfStatement ListenerInfo li = mListenerInfo; + //noinspection SimplifiableIfStatement if (li != null && li.mOnDragListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnDragListener.onDrag(this, event)) { return true; diff --git a/core/java/android/view/ViewTreeObserver.java b/core/java/android/view/ViewTreeObserver.java index 072c95f491f77..730c4eb01cd0c 100644 --- a/core/java/android/view/ViewTreeObserver.java +++ b/core/java/android/view/ViewTreeObserver.java @@ -243,9 +243,9 @@ public final class ViewTreeObserver { @Override public int hashCode() { - int result = contentInsets != null ? contentInsets.hashCode() : 0; - result = 31 * result + (visibleInsets != null ? visibleInsets.hashCode() : 0); - result = 31 * result + (touchableRegion != null ? touchableRegion.hashCode() : 0); + int result = contentInsets.hashCode(); + result = 31 * result + visibleInsets.hashCode(); + result = 31 * result + touchableRegion.hashCode(); result = 31 * result + mTouchableInsets; return result; } @@ -813,6 +813,13 @@ public final class ViewTreeObserver { } } + /** + * Returns whether there are listeners for on pre-draw events. + */ + final boolean hasOnPreDrawListeners() { + return mOnPreDrawListeners != null && mOnPreDrawListeners.size() > 0; + } + /** * Notifies registered listeners that the drawing pass is about to start. If a * listener returns true, then the drawing pass is canceled and rescheduled. This can