diff --git a/src/Android/Avalonia.Android/Automation/ToggleNodeInfoProvider.cs b/src/Android/Avalonia.Android/Automation/ToggleNodeInfoProvider.cs index cbd64e3b18b..f8aeb694fc7 100644 --- a/src/Android/Avalonia.Android/Automation/ToggleNodeInfoProvider.cs +++ b/src/Android/Avalonia.Android/Automation/ToggleNodeInfoProvider.cs @@ -45,7 +45,7 @@ public override void PopulateNodeInfo(AccessibilityNodeInfoCompat nodeInfo) if (s_checkedProperty?.PropertyType == typeof(int)) { // Needed for Xamarin.AndroidX.Core 1.17+ - s_checkedProperty.SetValue(this, + s_checkedProperty.SetValue(nodeInfo, provider.ToggleState switch { ToggleState.On => 1, @@ -56,7 +56,7 @@ public override void PopulateNodeInfo(AccessibilityNodeInfoCompat nodeInfo) else if (s_checkedProperty?.PropertyType == typeof(bool)) { // Needed for Xamarin.AndroidX.Core < 1.17 - s_checkedProperty.SetValue(this, provider.ToggleState == ToggleState.On); + s_checkedProperty.SetValue(nodeInfo, provider.ToggleState == ToggleState.On); } nodeInfo.Checkable = true; diff --git a/src/Android/Avalonia.Android/AvaloniaAccessHelper.cs b/src/Android/Avalonia.Android/AvaloniaAccessHelper.cs index 0b5a7e03c41..c034c4ec5b4 100644 --- a/src/Android/Avalonia.Android/AvaloniaAccessHelper.cs +++ b/src/Android/Avalonia.Android/AvaloniaAccessHelper.cs @@ -147,13 +147,33 @@ protected override void GetVisibleVirtualViews(IList? virtualViewIds) protected override bool OnPerformActionForVirtualView(int virtualViewId, int action, Bundle? arguments) { return (GetNodeInfoProvidersFromVirtualViewId(virtualViewId) ?? []) - .Select(x => x.PerformNodeAction(action, arguments)) + .Select(x => TryPerformNodeAction(x, action, arguments)) .Aggregate(false, (a, b) => a | b); } - protected override void OnPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfoCompat nodeInfo) + private static bool TryPerformNodeAction(INodeInfoProvider nodeInfoProvider, int action, Bundle? arguments) { - if (!_peers.TryGetValue(virtualViewId, out AutomationPeer? peer)) + try + { + return nodeInfoProvider.PerformNodeAction(action, arguments); + } + catch (ElementNotEnabledException) + { + return false; + } + catch (InvalidOperationException) + { + return false; + } + catch (NotSupportedException) + { + return false; + } + } + + protected override void OnPopulateNodeForVirtualView(int virtualViewId, AccessibilityNodeInfoCompat? nodeInfo) + { + if (nodeInfo is null || !_peers.TryGetValue(virtualViewId, out AutomationPeer? peer)) { return; // BAIL!! No work to be done }