// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.android_webview; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.accessibility.AccessibilityEvent; /** * Helper used to post the VIEW_SCROLLED accessibility event. * * TODO(mkosiba): Investigate whether this is behavior we want to share with the chrome/ layer. * TODO(mkosiba): We currently don't handle JS-initiated scrolling for layers other than the root * layer. */ class ScrollAccessibilityHelper { // This is copied straight out of android.view.ViewConfiguration. private static final long SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS = 100; private class HandlerCallback implements Handler.Callback { public static final int MSG_VIEW_SCROLLED = 1; private View mEventSender; public HandlerCallback(View eventSender) { mEventSender = eventSender; } @Override public boolean handleMessage(Message msg) { switch(msg.what) { case MSG_VIEW_SCROLLED: mMsgViewScrolledQueued = false; mEventSender.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SCROLLED); break; default: throw new IllegalStateException( "AccessibilityInjector: unhandled message: " + msg.what); } return true; } } private Handler mHandler; private boolean mMsgViewScrolledQueued; public ScrollAccessibilityHelper(View eventSender) { mHandler = new Handler(new HandlerCallback(eventSender)); } /** * Post a callback to send a {@link AccessibilityEvent#TYPE_VIEW_SCROLLED} event. * This event is sent at most once every * {@link android.view.ViewConfiguration#getSendRecurringAccessibilityEventsInterval()} */ public void postViewScrolledAccessibilityEventCallback() { if (mMsgViewScrolledQueued) return; mMsgViewScrolledQueued = true; Message msg = mHandler.obtainMessage(HandlerCallback.MSG_VIEW_SCROLLED); mHandler.sendMessageDelayed(msg, SEND_RECURRING_ACCESSIBILITY_EVENTS_INTERVAL_MILLIS); } public void removePostedViewScrolledAccessibilityEventCallback() { if (!mMsgViewScrolledQueued) return; mMsgViewScrolledQueued = false; mHandler.removeMessages(HandlerCallback.MSG_VIEW_SCROLLED); } public void removePostedCallbacks() { removePostedViewScrolledAccessibilityEventCallback(); } }