// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:meta/meta.dart'; /// Class name constants which correspond to the class names used by the /// Android accessibility bridge. class AndroidClassName { /// The class name used for checkboxes. static const String checkBox = 'android.widget.CheckBox'; /// The default className if none is provided by flutter. static const String view = 'android.view.View'; /// The class name used for radio buttons. static const String radio = 'android.widget.RadioButton'; /// The class name used for editable text fields. static const String editText = 'android.widget.EditText'; /// The class name used for read only text fields. static const String textView = 'android.widget.TextView'; /// The class name used for toggle switches. static const String toggleSwitch = 'android.widget.Switch'; /// The default className for buttons. static const String button = 'android.widget.Button'; } /// Action constants which correspond to `AccessibilityAction` in Android. @immutable class AndroidSemanticsAction { const AndroidSemanticsAction._(this.id); /// The Android id of the action. final int id; static const int _kFocusIndex = 1 << 0; static const int _kClearFocusIndex = 1 << 1; static const int _kSelectIndex = 1 << 2; static const int _kClearSelectionIndex = 1 << 3; static const int _kClickIndex = 1 << 4; static const int _kLongClickIndex = 1 << 5; static const int _kAccessibilityFocusIndex = 1 << 6; static const int _kClearAccessibilityFocusIndex = 1 << 7; static const int _kNextAtMovementGranularityIndex = 1 << 8; static const int _kPreviousAtMovementGranularityIndex = 1 << 9; static const int _kNextHtmlElementIndex = 1 << 10; static const int _kPreviousHtmlElementIndex = 1 << 11; static const int _kScrollForwardIndex = 1 << 12; static const int _kScrollBackwardIndex = 1 << 13; static const int _kCutIndex = 1 << 14; static const int _kCopyIndex = 1 << 15; static const int _kPasteIndex = 1 << 16; static const int _kSetSelectionIndex = 1 << 17; static const int _kExpandIndex = 1 << 18; static const int _kCollapseIndex = 1 << 19; /// Matches `AccessibilityAction.ACTION_FOCUS`. static const AndroidSemanticsAction focus = AndroidSemanticsAction._(_kFocusIndex); /// Matches `AccessibilityAction.ACTION_CLEAR_FOCUS`. static const AndroidSemanticsAction clearFocus = AndroidSemanticsAction._(_kClearFocusIndex); /// Matches `AccessibilityAction.ACTION_SELECT`. static const AndroidSemanticsAction select = AndroidSemanticsAction._(_kSelectIndex); /// Matches `AccessibilityAction.ACTION_CLEAR_SELECTION`. static const AndroidSemanticsAction clearSelection = AndroidSemanticsAction._(_kClearSelectionIndex); /// Matches `AccessibilityAction.ACTION_CLICK`. static const AndroidSemanticsAction click = AndroidSemanticsAction._(_kClickIndex); /// Matches `AccessibilityAction.ACTION_LONG_CLICK`. static const AndroidSemanticsAction longClick = AndroidSemanticsAction._(_kLongClickIndex); /// Matches `AccessibilityAction.ACTION_ACCESSIBILITY_FOCUS`. static const AndroidSemanticsAction accessibilityFocus = AndroidSemanticsAction._(_kAccessibilityFocusIndex); /// Matches `AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS`. static const AndroidSemanticsAction clearAccessibilityFocus = AndroidSemanticsAction._(_kClearAccessibilityFocusIndex); /// Matches `AccessibilityAction.ACTION_NEXT_AT_MOVEMENT_GRANULARITY`. static const AndroidSemanticsAction nextAtMovementGranularity = AndroidSemanticsAction._(_kNextAtMovementGranularityIndex); /// Matches `AccessibilityAction.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY`. static const AndroidSemanticsAction previousAtMovementGranularity = AndroidSemanticsAction._(_kPreviousAtMovementGranularityIndex); /// Matches `AccessibilityAction.ACTION_NEXT_HTML_ELEMENT`. static const AndroidSemanticsAction nextHtmlElement = AndroidSemanticsAction._(_kNextHtmlElementIndex); /// Matches `AccessibilityAction.ACTION_PREVIOUS_HTML_ELEMENT`. static const AndroidSemanticsAction previousHtmlElement = AndroidSemanticsAction._(_kPreviousHtmlElementIndex); /// Matches `AccessibilityAction.ACTION_SCROLL_FORWARD`. static const AndroidSemanticsAction scrollForward = AndroidSemanticsAction._(_kScrollForwardIndex); /// Matches `AccessibilityAction.ACTION_SCROLL_BACKWARD`. static const AndroidSemanticsAction scrollBackward = AndroidSemanticsAction._(_kScrollBackwardIndex); /// Matches `AccessibilityAction.ACTION_CUT`. static const AndroidSemanticsAction cut = AndroidSemanticsAction._(_kCutIndex); /// Matches `AccessibilityAction.ACTION_COPY`. static const AndroidSemanticsAction copy = AndroidSemanticsAction._(_kCopyIndex); /// Matches `AccessibilityAction.ACTION_PASTE`. static const AndroidSemanticsAction paste = AndroidSemanticsAction._(_kPasteIndex); /// Matches `AccessibilityAction.ACTION_SET_SELECTION`. static const AndroidSemanticsAction setSelection = AndroidSemanticsAction._(_kSetSelectionIndex); /// Matches `AccessibilityAction.ACTION_EXPAND`. static const AndroidSemanticsAction expand = AndroidSemanticsAction._(_kExpandIndex); /// Matches `AccessibilityAction.ACTION_COLLAPSE`. static const AndroidSemanticsAction collapse = AndroidSemanticsAction._(_kCollapseIndex); @override String toString() { switch (id) { case _kFocusIndex: return 'AndroidSemanticsAction.focus'; case _kClearFocusIndex: return 'AndroidSemanticsAction.clearFocus'; case _kSelectIndex: return 'AndroidSemanticsAction.select'; case _kClearSelectionIndex: return 'AndroidSemanticsAction.clearSelection'; case _kClickIndex: return 'AndroidSemanticsAction.click'; case _kLongClickIndex: return 'AndroidSemanticsAction.longClick'; case _kAccessibilityFocusIndex: return 'AndroidSemanticsAction.accessibilityFocus'; case _kClearAccessibilityFocusIndex: return 'AndroidSemanticsAction.clearAccessibilityFocus'; case _kNextAtMovementGranularityIndex: return 'AndroidSemanticsAction.nextAtMovementGranularity'; case _kPreviousAtMovementGranularityIndex: return 'AndroidSemanticsAction.nextAtMovementGranularity'; case _kNextHtmlElementIndex: return 'AndroidSemanticsAction.nextHtmlElement'; case _kPreviousHtmlElementIndex: return 'AndroidSemanticsAction.previousHtmlElement'; case _kScrollForwardIndex: return 'AndroidSemanticsAction.scrollForward'; case _kScrollBackwardIndex: return 'AndroidSemanticsAction.scrollBackward'; case _kCutIndex: return 'AndroidSemanticsAction.cut'; case _kCopyIndex: return 'AndroidSemanticsAction.copy'; case _kPasteIndex: return 'AndroidSemanticsAction.paste'; case _kSetSelectionIndex: return 'AndroidSemanticsAction.setSelection'; case _kExpandIndex: return 'AndroidSemanticsAction.expand'; case _kCollapseIndex: return 'AndroidSemanticsAction.collapse'; default: return null; } } static const Map<int, AndroidSemanticsAction> _kactionById = <int, AndroidSemanticsAction>{ _kFocusIndex: focus, _kClearFocusIndex: clearFocus, _kSelectIndex: select, _kClearSelectionIndex: clearSelection, _kClickIndex: click, _kLongClickIndex: longClick, _kAccessibilityFocusIndex: accessibilityFocus, _kClearAccessibilityFocusIndex: clearAccessibilityFocus, _kNextAtMovementGranularityIndex: nextAtMovementGranularity, _kPreviousAtMovementGranularityIndex: nextAtMovementGranularity, _kNextHtmlElementIndex: nextHtmlElement, _kPreviousHtmlElementIndex: previousHtmlElement, _kScrollForwardIndex: scrollForward, _kScrollBackwardIndex: scrollBackward, _kCutIndex: cut, _kCopyIndex: copy, _kPasteIndex: paste, _kSetSelectionIndex: setSelection, _kExpandIndex: expand, _kCollapseIndex: collapse, }; @override int get hashCode => id.hashCode; @override bool operator ==(Object other) { if (other.runtimeType != runtimeType) return false; return other is AndroidSemanticsAction && other.id == id; } /// Creates a new [AndroidSemanticsAction] from an integer `value`. /// /// Returns `null` if the id is not a known Android accessibility action. static AndroidSemanticsAction deserialize(int value) { return _kactionById[value]; } }