Browse Source

fix: talkback read display value on scroll value change (#373)

* When TalkBack is enabled, read new values while scrolling a wheel

* Support for reading displayed value instead index value (IosClone)

* Add comments and small refactoring

* Small refactor
master
Mika Lindell 4 years ago
committed by GitHub
parent
commit
456f3e8919
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 80 additions and 9 deletions
  1. +22
    -9
      android/src/main/java/com/henninghall/date_picker/pickers/IosClone.java
  2. +58
    -0
      android/src/main/java/com/henninghall/date_picker/ui/Accessibility.java

+ 22
- 9
android/src/main/java/com/henninghall/date_picker/pickers/IosClone.java View File

@ -6,22 +6,41 @@ import android.util.AttributeSet;
import android.view.View;
import android.view.MotionEvent;
import com.henninghall.date_picker.ui.Accessibility;
import cn.carbswang.android.numberpickerview.library.NumberPickerView;
import com.henninghall.date_picker.ui.Accessibility;
public class IosClone extends NumberPickerView implements Picker {
private Picker.OnValueChangeListenerInScrolling mOnValueChangeListenerInScrolling;
public IosClone(Context context) {
super(context);
initSetOnValueChangeListenerInScrolling();
}
public IosClone(Context context, AttributeSet attrs) {
super(context, attrs);
initSetOnValueChangeListenerInScrolling();
}
public IosClone(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initSetOnValueChangeListenerInScrolling();
}
private void initSetOnValueChangeListenerInScrolling() {
final Picker self = this;
super.setOnValueChangeListenerInScrolling(new NumberPickerView.OnValueChangeListenerInScrolling() {
@Override
public void onValueChangeInScrolling(NumberPickerView picker, int oldVal, int newVal) {
Accessibility.announceNumberPickerValue(picker, newVal);
if (mOnValueChangeListenerInScrolling != null) {
mOnValueChangeListenerInScrolling.onValueChangeInScrolling(self, oldVal, newVal);
}
}
});
}
@Override
@ -34,13 +53,7 @@ public class IosClone extends NumberPickerView implements Picker {
@Override
public void setOnValueChangeListenerInScrolling(final Picker.OnValueChangeListenerInScrolling listener) {
final Picker self = this;
super.setOnValueChangeListenerInScrolling(new NumberPickerView.OnValueChangeListenerInScrolling() {
@Override
public void onValueChangeInScrolling(NumberPickerView picker, int oldVal, int newVal) {
listener.onValueChangeInScrolling(self, oldVal, newVal);
}
});
this.mOnValueChangeListenerInScrolling = listener;
}
@Override

+ 58
- 0
android/src/main/java/com/henninghall/date_picker/ui/Accessibility.java View File

@ -5,6 +5,8 @@ import android.os.Build;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.accessibilityservice.AccessibilityServiceInfo;
import cn.carbswang.android.numberpickerview.library.NumberPickerView;
import com.henninghall.date_picker.DatePickerManager;
import com.henninghall.date_picker.State;
@ -13,6 +15,8 @@ import com.henninghall.date_picker.wheelFunctions.WheelFunction;
import com.henninghall.date_picker.wheels.Wheel;
import java.util.Locale;
import java.util.Arrays;
import java.util.List;
public class Accessibility {
@ -85,6 +89,60 @@ public class Accessibility {
picker.picker.getView().setContentDescription(descriptionPrefix + ", "+ descriptionPostFix + " "+ selectedDateString);
}
/**
* Checks if the accessibility service responsible of spoken feedback is active
*/
public static boolean isSpokenFeedbackEnabled() {
return hasAccessibilityFeatureTypeEnabled(AccessibilityServiceInfo.FEEDBACK_SPOKEN);
}
/**
* Get a list of accessibility services currently active
*/
private static boolean hasAccessibilityFeatureTypeEnabled(int type) {
List<AccessibilityServiceInfo> enabledServices =
systemManager.getEnabledAccessibilityServiceList(type);
return enabledServices != null && enabledServices.size() > 0;
}
/**
* Read a message out loud when spoken feedback is active
*/
public static void announce(String message) {
if (systemManager == null || !isSpokenFeedbackEnabled()) {
return;
}
AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_ANNOUNCEMENT);
event.getText().add(message);
systemManager.sendAccessibilityEvent(event);
}
/**
* Get NumberPickerView displayValue from value.
*/
private static String numberPickerValueToDisplayedValue(NumberPickerView numberPicker, int value) {
final String[] displayValues = numberPicker.getDisplayedValues();
final String displayValue = displayValues[value];
if (displayValue != null) {
return displayValue;
}
return String.valueOf(value);
}
/**
* Read NumberPickerView displayed value.
* For TalkBack to read dates etc. correctly, make sure they are in localised format.
*/
public static void announceNumberPickerValue(NumberPickerView numberPicker, int newValue) {
announce(numberPickerValueToDisplayedValue(numberPicker, newValue));
}
private String getAccessibleTextForSelectedDate() {
String accessibleText;
switch(state.getMode()) {

Loading…
Cancel
Save