Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion lib/ui/semantics.dart
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@ class SemanticsFlag {
static const int _kIsMultilineIndex = 1 << 19;
static const int _kIsReadOnlyIndex = 1 << 20;
static const int _kIsFocusableIndex = 1 << 21;
static const int _kIsLinkIndex = 1 << 22;

const SemanticsFlag._(this.index);

Expand Down Expand Up @@ -333,7 +334,7 @@ class SemanticsFlag {

/// Whether the semantic node represents a button.
///
/// Platforms has special handling for buttons, for example Android's TalkBack
/// Platforms have special handling for buttons, for example Android's TalkBack
/// and iOS's VoiceOver provides an additional hint when the focused object is
/// a button.
static const SemanticsFlag isButton = SemanticsFlag._(_kIsButtonIndex);
Expand All @@ -349,6 +350,13 @@ class SemanticsFlag {
/// Only applicable when [isTextField] is true.
static const SemanticsFlag isReadOnly = SemanticsFlag._(_kIsReadOnlyIndex);

/// Whether the semantic node is an interactive link.
///
/// Platforms have special handling for links, for example iOS's VoiceOver
/// provides an additional hint when the focused object is a link, as well as
/// the ability to parse the links through another navigation menu.
static const SemanticsFlag isLink = SemanticsFlag._(_kIsLinkIndex);

/// Whether the semantic node is able to hold the user's focus.
///
/// The focused element is usually the current receiver of keyboard inputs.
Expand Down Expand Up @@ -528,6 +536,7 @@ class SemanticsFlag {
_kHasImplicitScrollingIndex: hasImplicitScrolling,
_kIsMultilineIndex: isMultiline,
_kIsReadOnlyIndex: isReadOnly,
_kIsLinkIndex: isLink,
};

@override
Expand Down Expand Up @@ -575,6 +584,8 @@ class SemanticsFlag {
return 'SemanticsFlag.isMultiline';
case _kIsReadOnlyIndex:
return 'SemanticsFlag.isReadOnly';
case _kIsLinkIndex:
return 'SemanticsFlag.isLink';
}
return null;
}
Expand Down
1 change: 1 addition & 0 deletions lib/ui/semantics/semantics_node.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ enum class SemanticsFlags : int32_t {
// kIsMultiline = 1 << 19,
kIsReadOnly = 1 << 20,
kIsFocusable = 1 << 21,
kIsLink = 1 << 22,
};

const int kScrollableSemanticsFlags =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,7 @@ public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) {
}
}

if (semanticsNode.hasFlag(Flag.IS_BUTTON)) {
if (semanticsNode.hasFlag(Flag.IS_BUTTON) || semanticsNode.hasFlag(Flag.IS_LINK)) {
result.setClassName("android.widget.Button");
}
if (semanticsNode.hasFlag(Flag.IS_IMAGE)) {
Expand Down Expand Up @@ -1648,7 +1648,8 @@ private enum Flag {
// The Dart API defines the following flag but it isn't used in Android.
// IS_MULTILINE(1 << 19);
IS_READ_ONLY(1 << 20),
IS_FOCUSABLE(1 << 21);
IS_FOCUSABLE(1 << 21),
IS_LINK(1 << 22);

final int value;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,9 @@ - (UIAccessibilityTraits)accessibilityTraits {
if ([self node].HasFlag(flutter::SemanticsFlags::kIsLiveRegion)) {
traits |= UIAccessibilityTraitUpdatesFrequently;
}
if ([self node].HasFlag(flutter::SemanticsFlags::kIsLink)) {
traits |= UIAccessibilityTraitLink;
}
return traits;
}

Expand Down
5 changes: 3 additions & 2 deletions shell/platform/embedder/embedder.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,7 @@ typedef enum {
/// Must match the `SemanticsAction` enum in semantics.dart.
typedef enum {
/// The equivalent of a user briefly tapping the screen with the finger
/// without
/// moving it.
/// without moving it.
kFlutterSemanticsActionTap = 1 << 0,
/// The equivalent of a user pressing and holding the screen with the finger
/// for a few seconds without moving it.
Expand Down Expand Up @@ -172,6 +171,8 @@ typedef enum {
kFlutterSemanticsFlagIsReadOnly = 1 << 20,
/// Whether the semantic node can hold the user's focus.
kFlutterSemanticsFlagIsFocusable = 1 << 21,
/// Whether the semantics node represents a link.
kFlutterSemanticsFlagIsLink = 1 << 22,
} FlutterSemanticsFlag;

typedef enum {
Expand Down