Loading core/java/android/view/View.java +88 −33 Original line number Diff line number Diff line Loading @@ -4778,7 +4778,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private CheckForTap mPendingCheckForTap = null; private PerformClick mPerformClick; private SendViewScrolledAccessibilityEvent mSendViewScrolledAccessibilityEvent; private SendAccessibilityEventThrottle mSendStateChangedAccessibilityEvent; private UnsetPressedState mUnsetPressedState; /** Loading Loading @@ -8148,13 +8148,46 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if ((event.getEventType() & POPULATING_ACCESSIBILITY_EVENT_TYPES) != 0) { dispatchPopulateAccessibilityEvent(event); } // In the beginning we called #isShown(), so we know that getParent() is not null. SendAccessibilityEventThrottle throttle = getThrottleForAccessibilityEvent(event); if (throttle != null) { throttle.post(event); } else { requestParentSendAccessibilityEvent(event); } } private void requestParentSendAccessibilityEvent(AccessibilityEvent event) { ViewParent parent = getParent(); if (parent != null) { getParent().requestSendAccessibilityEvent(this, event); } } private SendAccessibilityEventThrottle getThrottleForAccessibilityEvent( AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { if (mSendViewScrolledAccessibilityEvent == null) { mSendViewScrolledAccessibilityEvent = new SendViewScrolledAccessibilityEvent(); } return mSendViewScrolledAccessibilityEvent; } boolean isStateContentChanged = (event.getContentChangeTypes() & AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION) != 0; if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && isStateContentChanged) { if (mSendStateChangedAccessibilityEvent == null) { mSendStateChangedAccessibilityEvent = new SendAccessibilityEventThrottle(); } return mSendStateChangedAccessibilityEvent; } return null; } private void clearAccessibilityThrottles() { cancel(mSendViewScrolledAccessibilityEvent); cancel(mSendStateChangedAccessibilityEvent); } /** * Dispatches an {@link AccessibilityEvent} to the {@link View} first and then * to its children for adding their text content to the event. Note that the Loading Loading @@ -10375,8 +10408,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, && getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) { setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); } notifyViewAccessibilityStateChangedIfNeeded( AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION); if (AccessibilityManager.getInstance(mContext).isEnabled()) { AccessibilityEvent event = AccessibilityEvent.obtain(); event.setEventType(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION); sendAccessibilityEventUnchecked(event); } } /** Loading Loading @@ -15983,10 +16020,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ protected void onScrollChanged(int l, int t, int oldl, int oldt) { notifySubtreeAccessibilityStateChangedIfNeeded(); if (AccessibilityManager.getInstance(mContext).isEnabled()) { postSendViewScrolledAccessibilityEventCallback(l - oldl, t - oldt); } mBackgroundSizeChanged = true; mDefaultFocusHighlightSizeChanged = true; Loading Loading @@ -18709,10 +18743,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * {@link ViewConfiguration#getSendRecurringAccessibilityEventsInterval()}. */ private void postSendViewScrolledAccessibilityEventCallback(int dx, int dy) { if (mSendViewScrolledAccessibilityEvent == null) { mSendViewScrolledAccessibilityEvent = new SendViewScrolledAccessibilityEvent(); if (AccessibilityManager.getInstance(mContext).isEnabled()) { AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_SCROLLED); event.setScrollDeltaX(dx); event.setScrollDeltaY(dy); sendAccessibilityEventUnchecked(event); } mSendViewScrolledAccessibilityEvent.post(dx, dy); } /** Loading Loading @@ -20010,7 +20047,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, removeUnsetPressCallback(); removeLongPressCallback(); removePerformClickCallback(); cancel(mSendViewScrolledAccessibilityEvent); clearAccessibilityThrottles(); stopNestedScroll(); // Anything that started animating right before detach should already Loading Loading @@ -28994,49 +29031,67 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } /** * Resuable callback for sending * {@link AccessibilityEvent#TYPE_VIEW_SCROLLED} accessibility event. */ private class SendViewScrolledAccessibilityEvent implements Runnable { private class SendAccessibilityEventThrottle implements Runnable { public volatile boolean mIsPending; public int mDeltaX; public int mDeltaY; private AccessibilityEvent mAccessibilityEvent; public void post(int dx, int dy) { mDeltaX += dx; mDeltaY += dy; public void post(AccessibilityEvent accessibilityEvent) { updateWithAccessibilityEvent(accessibilityEvent); if (!mIsPending) { mIsPending = true; postDelayed(this, ViewConfiguration.getSendRecurringAccessibilityEventsInterval()); postDelayed(this, ViewConfiguration.getSendRecurringAccessibilityEventsInterval()); } } @Override public void run() { if (AccessibilityManager.getInstance(mContext).isEnabled()) { AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_VIEW_SCROLLED); event.setScrollDeltaX(mDeltaX); event.setScrollDeltaY(mDeltaY); sendAccessibilityEventUnchecked(event); requestParentSendAccessibilityEvent(mAccessibilityEvent); } reset(); } private void reset() { public void updateWithAccessibilityEvent(AccessibilityEvent accessibilityEvent) { mAccessibilityEvent = accessibilityEvent; } public void reset() { mIsPending = false; mDeltaX = 0; mDeltaY = 0; mAccessibilityEvent = null; } } /** * Remove the pending callback for sending a * Resuable callback for sending * {@link AccessibilityEvent#TYPE_VIEW_SCROLLED} accessibility event. */ private class SendViewScrolledAccessibilityEvent extends SendAccessibilityEventThrottle { public int mDeltaX; public int mDeltaY; @Override public void updateWithAccessibilityEvent(AccessibilityEvent accessibilityEvent) { super.updateWithAccessibilityEvent(accessibilityEvent); mDeltaX += accessibilityEvent.getScrollDeltaX(); mDeltaY += accessibilityEvent.getScrollDeltaY(); accessibilityEvent.setScrollDeltaX(mDeltaX); accessibilityEvent.setScrollDeltaY(mDeltaY); } @Override public void reset() { super.reset(); mDeltaX = 0; mDeltaY = 0; } } /** * Remove the pending callback for sending a throttled accessibility event. */ @UnsupportedAppUsage private void cancel(@Nullable SendViewScrolledAccessibilityEvent callback) { private void cancel(@Nullable SendAccessibilityEventThrottle callback) { if (callback == null || !callback.mIsPending) return; removeCallbacks(callback); callback.reset(); Loading
core/java/android/view/View.java +88 −33 Original line number Diff line number Diff line Loading @@ -4778,7 +4778,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private CheckForTap mPendingCheckForTap = null; private PerformClick mPerformClick; private SendViewScrolledAccessibilityEvent mSendViewScrolledAccessibilityEvent; private SendAccessibilityEventThrottle mSendStateChangedAccessibilityEvent; private UnsetPressedState mUnsetPressedState; /** Loading Loading @@ -8148,13 +8148,46 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if ((event.getEventType() & POPULATING_ACCESSIBILITY_EVENT_TYPES) != 0) { dispatchPopulateAccessibilityEvent(event); } // In the beginning we called #isShown(), so we know that getParent() is not null. SendAccessibilityEventThrottle throttle = getThrottleForAccessibilityEvent(event); if (throttle != null) { throttle.post(event); } else { requestParentSendAccessibilityEvent(event); } } private void requestParentSendAccessibilityEvent(AccessibilityEvent event) { ViewParent parent = getParent(); if (parent != null) { getParent().requestSendAccessibilityEvent(this, event); } } private SendAccessibilityEventThrottle getThrottleForAccessibilityEvent( AccessibilityEvent event) { if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { if (mSendViewScrolledAccessibilityEvent == null) { mSendViewScrolledAccessibilityEvent = new SendViewScrolledAccessibilityEvent(); } return mSendViewScrolledAccessibilityEvent; } boolean isStateContentChanged = (event.getContentChangeTypes() & AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION) != 0; if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED && isStateContentChanged) { if (mSendStateChangedAccessibilityEvent == null) { mSendStateChangedAccessibilityEvent = new SendAccessibilityEventThrottle(); } return mSendStateChangedAccessibilityEvent; } return null; } private void clearAccessibilityThrottles() { cancel(mSendViewScrolledAccessibilityEvent); cancel(mSendStateChangedAccessibilityEvent); } /** * Dispatches an {@link AccessibilityEvent} to the {@link View} first and then * to its children for adding their text content to the event. Note that the Loading Loading @@ -10375,8 +10408,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, && getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) { setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); } notifyViewAccessibilityStateChangedIfNeeded( AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION); if (AccessibilityManager.getInstance(mContext).isEnabled()) { AccessibilityEvent event = AccessibilityEvent.obtain(); event.setEventType(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION); sendAccessibilityEventUnchecked(event); } } /** Loading Loading @@ -15983,10 +16020,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ protected void onScrollChanged(int l, int t, int oldl, int oldt) { notifySubtreeAccessibilityStateChangedIfNeeded(); if (AccessibilityManager.getInstance(mContext).isEnabled()) { postSendViewScrolledAccessibilityEventCallback(l - oldl, t - oldt); } mBackgroundSizeChanged = true; mDefaultFocusHighlightSizeChanged = true; Loading Loading @@ -18709,10 +18743,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * {@link ViewConfiguration#getSendRecurringAccessibilityEventsInterval()}. */ private void postSendViewScrolledAccessibilityEventCallback(int dx, int dy) { if (mSendViewScrolledAccessibilityEvent == null) { mSendViewScrolledAccessibilityEvent = new SendViewScrolledAccessibilityEvent(); if (AccessibilityManager.getInstance(mContext).isEnabled()) { AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_SCROLLED); event.setScrollDeltaX(dx); event.setScrollDeltaY(dy); sendAccessibilityEventUnchecked(event); } mSendViewScrolledAccessibilityEvent.post(dx, dy); } /** Loading Loading @@ -20010,7 +20047,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, removeUnsetPressCallback(); removeLongPressCallback(); removePerformClickCallback(); cancel(mSendViewScrolledAccessibilityEvent); clearAccessibilityThrottles(); stopNestedScroll(); // Anything that started animating right before detach should already Loading Loading @@ -28994,49 +29031,67 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } /** * Resuable callback for sending * {@link AccessibilityEvent#TYPE_VIEW_SCROLLED} accessibility event. */ private class SendViewScrolledAccessibilityEvent implements Runnable { private class SendAccessibilityEventThrottle implements Runnable { public volatile boolean mIsPending; public int mDeltaX; public int mDeltaY; private AccessibilityEvent mAccessibilityEvent; public void post(int dx, int dy) { mDeltaX += dx; mDeltaY += dy; public void post(AccessibilityEvent accessibilityEvent) { updateWithAccessibilityEvent(accessibilityEvent); if (!mIsPending) { mIsPending = true; postDelayed(this, ViewConfiguration.getSendRecurringAccessibilityEventsInterval()); postDelayed(this, ViewConfiguration.getSendRecurringAccessibilityEventsInterval()); } } @Override public void run() { if (AccessibilityManager.getInstance(mContext).isEnabled()) { AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_VIEW_SCROLLED); event.setScrollDeltaX(mDeltaX); event.setScrollDeltaY(mDeltaY); sendAccessibilityEventUnchecked(event); requestParentSendAccessibilityEvent(mAccessibilityEvent); } reset(); } private void reset() { public void updateWithAccessibilityEvent(AccessibilityEvent accessibilityEvent) { mAccessibilityEvent = accessibilityEvent; } public void reset() { mIsPending = false; mDeltaX = 0; mDeltaY = 0; mAccessibilityEvent = null; } } /** * Remove the pending callback for sending a * Resuable callback for sending * {@link AccessibilityEvent#TYPE_VIEW_SCROLLED} accessibility event. */ private class SendViewScrolledAccessibilityEvent extends SendAccessibilityEventThrottle { public int mDeltaX; public int mDeltaY; @Override public void updateWithAccessibilityEvent(AccessibilityEvent accessibilityEvent) { super.updateWithAccessibilityEvent(accessibilityEvent); mDeltaX += accessibilityEvent.getScrollDeltaX(); mDeltaY += accessibilityEvent.getScrollDeltaY(); accessibilityEvent.setScrollDeltaX(mDeltaX); accessibilityEvent.setScrollDeltaY(mDeltaY); } @Override public void reset() { super.reset(); mDeltaX = 0; mDeltaY = 0; } } /** * Remove the pending callback for sending a throttled accessibility event. */ @UnsupportedAppUsage private void cancel(@Nullable SendViewScrolledAccessibilityEvent callback) { private void cancel(@Nullable SendAccessibilityEventThrottle callback) { if (callback == null || !callback.mIsPending) return; removeCallbacks(callback); callback.reset();