diff --git a/src/Controls/src/Core/Platform/Android/Extensions/ToolbarExtensions.cs b/src/Controls/src/Core/Platform/Android/Extensions/ToolbarExtensions.cs index f341b1a5f049..f0a47d3398c3 100644 --- a/src/Controls/src/Core/Platform/Android/Extensions/ToolbarExtensions.cs +++ b/src/Controls/src/Core/Platform/Android/Extensions/ToolbarExtensions.cs @@ -10,6 +10,8 @@ using Android.Views; using AndroidX.AppCompat.Graphics.Drawable; using AndroidX.AppCompat.Widget; +using AndroidX.Core.View; +using AndroidX.Core.View.Accessibility; using Microsoft.Maui.Graphics; using Microsoft.Maui.Primitives; using AGraphics = Android.Graphics; @@ -348,6 +350,56 @@ static void UpdateMenuItem(AToolbar toolbar, textView.SetTextColor(tintColor.MultiplyAlpha(0.302f).ToPlatform()); } } + + SetSemanticProperties(item, toolbar.FindViewById(menuitem.ItemId)); + } + + static void SetSemanticProperties(ToolbarItem menuItem, AView? view) + { + if (view == null) + return; + + var semantics = SemanticProperties.UpdateSemantics(menuItem, null); + var desc = semantics?.Description; + var hint = semantics?.Hint; + + // Only apply delegate if we have meaningful accessibility information + if (!string.IsNullOrWhiteSpace(desc) || !string.IsNullOrWhiteSpace(hint)) + { + view.ImportantForAccessibility = ImportantForAccessibility.Yes; + ViewCompat.SetAccessibilityDelegate(view, new AccessibilityDelegateCompatImpl(desc, hint)); + } + else + { + // Remove any previously set delegate if no accessibility info is present + ViewCompat.SetAccessibilityDelegate(view, null); + } + } + + class AccessibilityDelegateCompatImpl : AccessibilityDelegateCompat + { + private readonly string? _desc; + private readonly string? _hint; + + public AccessibilityDelegateCompatImpl(string? desc, string? hint) + { + _desc = desc; + _hint = hint; + } + + public override void OnInitializeAccessibilityNodeInfo(AView? host, AccessibilityNodeInfoCompat? info) + { + base.OnInitializeAccessibilityNodeInfo(host, info); + + if (host == null || info == null) + return; + + if (!string.IsNullOrWhiteSpace(_desc)) + info.ContentDescription = _desc; + + if (!string.IsNullOrWhiteSpace(_hint)) + info.HintText = _hint; + } } internal static void UpdateMenuItemIcon(this IMauiContext mauiContext, IMenuItem menuItem, ToolbarItem toolBarItem, Color? tintColor)