1717using Android . Content ;
1818using AndroidOS = Android . OS ;
1919using System . ComponentModel ;
20+ using Java . Interop ;
2021
2122[ assembly: ResolutionGroupName ( nameof ( TouchEffect ) ) ]
2223[ assembly: ExportEffect ( typeof ( PlatformTouchEff ) , nameof ( TouchEff ) ) ]
@@ -28,6 +29,7 @@ public class PlatformTouchEff : PlatformEffect
2829 public static void Preserve ( ) { }
2930
3031 private AccessibilityManager _accessibilityManager ;
32+ private AccessibilityListener _accessibilityListener ;
3133 private TouchEff _effect ;
3234 private bool _isHoverSupported ;
3335 private RippleDrawable _ripple ;
@@ -63,8 +65,9 @@ protected override void OnAttached()
6365 _accessibilityManager = View . Context . GetSystemService ( Context . AccessibilityService ) as AccessibilityManager ;
6466 if ( _accessibilityManager != null )
6567 {
66- _accessibilityManager . AccessibilityStateChange += OnAccessibilityStateChange ; ;
67- _accessibilityManager . TouchExplorationStateChange += OnTouchExplorationStateChange ; ;
68+ _accessibilityListener = new AccessibilityListener ( this ) ;
69+ _accessibilityManager . AddAccessibilityStateChangeListener ( _accessibilityListener ) ;
70+ _accessibilityManager . AddTouchExplorationStateChangeListener ( _accessibilityListener ) ;
6871 }
6972
7073 if ( _effect . NativeAnimation && Group != null && AndroidOS . Build . VERSION . SdkInt >= AndroidOS . BuildVersionCodes . Lollipop )
@@ -93,8 +96,10 @@ protected override void OnDetached()
9396 {
9497 if ( _accessibilityManager != null )
9598 {
96- _accessibilityManager . AccessibilityStateChange -= OnAccessibilityStateChange ;
97- _accessibilityManager . TouchExplorationStateChange -= OnTouchExplorationStateChange ;
99+ _accessibilityManager . RemoveAccessibilityStateChangeListener ( _accessibilityListener ) ;
100+ _accessibilityManager . RemoveTouchExplorationStateChangeListener ( _accessibilityListener ) ;
101+ _accessibilityListener . Dispose ( ) ;
102+ _accessibilityManager = null ;
98103 _accessibilityManager = null ;
99104 }
100105
@@ -138,12 +143,6 @@ protected override void OnElementPropertyChanged(PropertyChangedEventArgs args)
138143 }
139144 }
140145
141- private void OnTouchExplorationStateChange ( object sender , AccessibilityManager . TouchExplorationStateChangeEventArgs e )
142- => UpdateClickHandler ( ) ;
143-
144- private void OnAccessibilityStateChange ( object sender , AccessibilityManager . AccessibilityStateChangeEventArgs e )
145- => UpdateClickHandler ( ) ;
146-
147146 private void UpdateClickHandler ( )
148147 {
149148 View . Click -= OnClick ;
@@ -336,5 +335,21 @@ private void LayoutChange(object sender, AView.LayoutChangeEventArgs e)
336335 _viewOverlay . Right = group . Width ;
337336 _viewOverlay . Bottom = group . Height ;
338337 }
338+
339+ private sealed class AccessibilityListener : Java . Lang . Object ,
340+ AccessibilityManager . IAccessibilityStateChangeListener ,
341+ AccessibilityManager . ITouchExplorationStateChangeListener
342+ {
343+ private readonly PlatformTouchEff _platformTouchEff ;
344+
345+ internal AccessibilityListener ( PlatformTouchEff platformTouchEff )
346+ => _platformTouchEff = platformTouchEff ;
347+
348+ public void OnAccessibilityStateChanged ( bool enabled )
349+ => _platformTouchEff . UpdateClickHandler ( ) ;
350+
351+ public void OnTouchExplorationStateChanged ( bool enabled )
352+ => _platformTouchEff . UpdateClickHandler ( ) ;
353+ }
339354 }
340355}
0 commit comments