/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.utils;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityEvent;
/**
* This class contains utility methods.
*/
public class AccessibilityEventUtils {
private AccessibilityEventUtils() {
// This class is not instantiable.
}
/**
* Determines if an accessibility event is of a type defined by a mask of
* qualifying event types.
*
* @param event The event to evaluate
* @param typeMask A mask of event types that will cause this method to
* accept the event as matching
* @return {@code true} if {@code event}'s type is one of types defined in
* {@code typeMask}, {@code false} otherwise
*/
public static boolean eventMatchesAnyType(AccessibilityEvent event, int typeMask) {
return event != null && (event.getEventType() & typeMask) != 0;
}
/**
* Gets the text of an <code>event</code> by returning the content description
* (if available) or by concatenating the text members (regardless of their
* priority) using space as a delimiter.
*
* @param event The event.
* @return The event text.
*/
public static CharSequence getEventTextOrDescription(AccessibilityEvent event) {
if (event == null) {
return null;
}
final CharSequence contentDescription = event.getContentDescription();
if (!TextUtils.isEmpty(contentDescription)) {
return contentDescription;
}
return getEventAggregateText(event);
}
/**
* Gets the text of an <code>event</code> by concatenating the text members
* (regardless of their priority) using space as a delimiter.
*
* @param event The event.
* @return The event text.
*/
public static CharSequence getEventAggregateText(AccessibilityEvent event) {
if (event == null) {
return null;
}
final SpannableStringBuilder aggregator = new SpannableStringBuilder();
for (CharSequence text : event.getText()) {
StringBuilderUtils.appendWithSeparator(aggregator, text);
}
return aggregator;
}
public static boolean isCharacterTraversalEvent(AccessibilityEvent event) {
return (event.getEventType() ==
AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY &&
event.getMovementGranularity() ==
AccessibilityNodeInfoCompat.MOVEMENT_GRANULARITY_CHARACTER);
}
public static int[] getAllEventTypes() {
return new int[]{
AccessibilityEvent.TYPE_ANNOUNCEMENT,
AccessibilityEvent.TYPE_ASSIST_READING_CONTEXT,
AccessibilityEvent.TYPE_GESTURE_DETECTION_END,
AccessibilityEvent.TYPE_GESTURE_DETECTION_START,
AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED,
AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END,
AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START,
AccessibilityEvent.TYPE_TOUCH_INTERACTION_END,
AccessibilityEvent.TYPE_TOUCH_INTERACTION_START,
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED,
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED,
AccessibilityEvent.TYPE_VIEW_CLICKED,
AccessibilityEvent.TYPE_VIEW_CONTEXT_CLICKED,
AccessibilityEvent.TYPE_VIEW_FOCUSED,
AccessibilityEvent.TYPE_VIEW_HOVER_ENTER,
AccessibilityEvent.TYPE_VIEW_HOVER_EXIT,
AccessibilityEvent.TYPE_VIEW_LONG_CLICKED,
AccessibilityEvent.TYPE_VIEW_SCROLLED,
AccessibilityEvent.TYPE_VIEW_SELECTED,
AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED,
AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED,
AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY,
AccessibilityEvent.TYPE_WINDOWS_CHANGED,
AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,
AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
};
}
}