Skip to content

Commit

Permalink
Add onSlidingComplete callbacks when sliders adjusted via a11y (#26600)
Browse files Browse the repository at this point in the history
Summary:
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. For example, if an app hosting a volume control slider only commits the volume change to the hardware on onSlidingComplete, it is impossible for a screen reader user to ever actually adjust the volume.

Ensure that sliders call the onSlidingComplete callback after adjusted via
accessibility.

## Changelog

[General] [Fix] - Add onSlidingComplete callbacks when sliders adjusted via a11y.

[CATEGORY] [TYPE] - Message
Pull Request resolved: #26600

Test Plan: Prior to this change, using the RNTester slider example with a screen reader, the onSlidingComplete callback tests never shows any callbacks when the slider is adjusted. With this change applied, the callback test will show a number of callbacks corresponding to the number of times the slider was adjusted via the screen reader.

Differential Revision: D17661157

Pulled By: cpojer

fbshipit-source-id: a6eedef099c6c1b571b290c329059ac9b69b53dd
  • Loading branch information
Marc Mulcahy authored and facebook-github-bot committed Sep 30, 2019
1 parent 113c4e2 commit c7aa6dc
Show file tree
Hide file tree
Showing 2 changed files with 50 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.AccessibilityDelegateCompat;
import androidx.core.view.ViewCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
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,27 @@ 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 c7aa6dc

Please sign in to comment.