Skip to content

Commit

Permalink
Generate onSlidingComplete callbacks when sliders adjusted via 111y.
Browse files Browse the repository at this point in the history
When sliders are adjusted via accessibility, no onSlidingComplete callback is
generated. This causes problems for components which perform behavior in this
callback, and means that such components don't behave properly when adjusted via
accessibility.

Ensure that sliders call the onSlidingComplete callback after adjusted via
accessibility.
  • Loading branch information
Marc Mulcahy committed Sep 26, 2019
1 parent babf67f commit 8c84437
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
20 changes: 20 additions & 0 deletions React/Views/RCTSlider.m
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,24 @@ - (UIImage *)thumbImage
return [self thumbImageForState:UIControlStateNormal];
}

- (void)accessibilityIncrement
{
[super accessibilityIncrement];
if (_onSlidingComplete) {
_onSlidingComplete(@{
@"value": @(self.value),
});
}
}

- (void)accessibilityDecrement
{
[super accessibilityDecrement];
if (_onSlidingComplete) {
_onSlidingComplete(@{
@"value": @(self.value),
});
}
}

@end
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,14 @@
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SeekBar;
import androidx.annotation.Nullable;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
import androidx.core.view.AccessibilityDelegateCompat;
import androidx.core.view.ViewCompat;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.common.MapBuilder;
Expand Down Expand Up @@ -132,7 +136,9 @@ public Class getShadowNodeClass() {

@Override
protected ReactSlider createViewInstance(ThemedReactContext context) {
return new ReactSlider(context, null, STYLE);
final ReactSlider slider = new ReactSlider(context, null, STYLE);
ViewCompat.setAccessibilityDelegate(slider, sAccessibilityDelegate);
return slider;
}

@Override
Expand Down Expand Up @@ -256,4 +262,25 @@ public long measure(
protected ViewManagerDelegate<ReactSlider> getDelegate() {
return mDelegate;
}

protected static class ReactSliderAccessibilityDelegate extends AccessibilityDelegateCompat {
private static boolean isSliderAction(int action) {
return (action == AccessibilityActionCompat.ACTION_SCROLL_FORWARD.getId()) ||
(action == AccessibilityActionCompat.ACTION_SCROLL_BACKWARD.getId()) ||
(action == AccessibilityActionCompat.ACTION_SET_PROGRESS.getId());
}

@Override
public boolean performAccessibilityAction(View host, int action, Bundle args) {
if (isSliderAction(action)) {
ON_CHANGE_LISTENER.onStartTrackingTouch((SeekBar)host);
}
final boolean rv = super.performAccessibilityAction(host, action, args);
if (isSliderAction(action)) {
ON_CHANGE_LISTENER.onStopTrackingTouch((SeekBar)host);
}
return rv;
}
};
protected static ReactSliderAccessibilityDelegate sAccessibilityDelegate = new ReactSliderAccessibilityDelegate();
}

0 comments on commit 8c84437

Please sign in to comment.