forked from AvaloniaUI/Avalonia
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathToggleNodeInfoProvider.cs
More file actions
65 lines (57 loc) · 2.18 KB
/
Copy pathToggleNodeInfoProvider.cs
File metadata and controls
65 lines (57 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System.Reflection;
using Android.OS;
using AndroidX.Core.View.Accessibility;
using AndroidX.CustomView.Widget;
using Avalonia.Automation.Peers;
using Avalonia.Automation.Provider;
namespace Avalonia.Android.Automation
{
internal class ToggleNodeInfoProvider : NodeInfoProvider<IToggleProvider>
{
private static PropertyInfo? s_checkedProperty;
public ToggleNodeInfoProvider(ExploreByTouchHelper owner, AutomationPeer peer, int virtualViewId) :
base(owner, peer, virtualViewId)
{
}
static ToggleNodeInfoProvider()
{
s_checkedProperty = typeof(AccessibilityNodeInfoCompat).GetProperty(nameof(AccessibilityNodeInfoCompat.Checked));
}
public override bool PerformNodeAction(int action, Bundle? arguments)
{
IToggleProvider provider = GetProvider();
switch (action)
{
case AccessibilityNodeInfoCompat.ActionClick:
provider.Toggle();
return true;
default:
return false;
}
}
public override void PopulateNodeInfo(AccessibilityNodeInfoCompat nodeInfo)
{
nodeInfo.AddAction(AccessibilityNodeInfoCompat.ActionClick);
nodeInfo.Clickable = true;
IToggleProvider provider = GetProvider();
s_checkedProperty ??= nodeInfo.GetType().GetProperty(nameof(nodeInfo.Checked));
if (s_checkedProperty?.PropertyType == typeof(int))
{
// Needed for Xamarin.AndroidX.Core 1.17+
s_checkedProperty.SetValue(nodeInfo,
provider.ToggleState switch
{
ToggleState.On => 1,
ToggleState.Indeterminate => 2,
_ => 0
});
}
else if (s_checkedProperty?.PropertyType == typeof(bool))
{
// Needed for Xamarin.AndroidX.Core < 1.17
s_checkedProperty.SetValue(nodeInfo, provider.ToggleState == ToggleState.On);
}
nodeInfo.Checkable = true;
}
}
}