|
11 | 11 | import android.graphics.BitmapFactory;
|
12 | 12 | import android.graphics.drawable.BitmapDrawable;
|
13 | 13 | import android.os.Build;
|
14 |
| - |
15 |
| -import androidx.annotation.RequiresApi; |
16 |
| -import androidx.appcompat.widget.AppCompatSeekBar; |
17 |
| - |
18 | 14 | import android.util.AttributeSet;
|
19 |
| - |
| 15 | +import android.view.accessibility.AccessibilityEvent; |
| 16 | +import android.view.accessibility.AccessibilityManager; |
| 17 | +import androidx.appcompat.widget.AppCompatSeekBar; |
20 | 18 | import java.net.URL;
|
| 19 | +import java.util.List; |
| 20 | +import java.util.Timer; |
| 21 | +import java.util.TimerTask; |
21 | 22 | import java.util.concurrent.Callable;
|
22 | 23 | import java.util.concurrent.ExecutorService;
|
23 | 24 | import java.util.concurrent.Executors;
|
24 | 25 | import java.util.concurrent.Future;
|
25 |
| - |
26 | 26 | import javax.annotation.Nullable;
|
27 | 27 |
|
28 | 28 | /**
|
@@ -60,6 +60,10 @@ public class ReactSlider extends AppCompatSeekBar {
|
60 | 60 |
|
61 | 61 | private double mStepCalculated = 0;
|
62 | 62 |
|
| 63 | + private String mAccessibilityUnits; |
| 64 | + |
| 65 | + private List<String> mAccessibilityIncrements; |
| 66 | + |
63 | 67 | public ReactSlider(Context context, @Nullable AttributeSet attrs, int style) {
|
64 | 68 | super(context, attrs, style);
|
65 | 69 | disableStateListAnimatorIfNeeded();
|
@@ -94,6 +98,64 @@ private void disableStateListAnimatorIfNeeded() {
|
94 | 98 | updateAll();
|
95 | 99 | }
|
96 | 100 |
|
| 101 | + void setAccessibilityUnits(String accessibilityUnits) { |
| 102 | + mAccessibilityUnits = accessibilityUnits; |
| 103 | + } |
| 104 | + |
| 105 | + void setAccessibilityIncrements(List<String> accessibilityIncrements) { |
| 106 | + mAccessibilityIncrements = accessibilityIncrements; |
| 107 | + } |
| 108 | + |
| 109 | + @Override |
| 110 | + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { |
| 111 | + super.onPopulateAccessibilityEvent(event); |
| 112 | + if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED || |
| 113 | + (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SELECTED && this.isAccessibilityFocused())) { |
| 114 | + this.setupAccessibility(); |
| 115 | + } |
| 116 | + } |
| 117 | + |
| 118 | + @Override |
| 119 | + public void announceForAccessibility(CharSequence text) { |
| 120 | + Context ctx = this.getContext(); |
| 121 | + final AccessibilityManager manager = (AccessibilityManager) ctx.getSystemService(Context.ACCESSIBILITY_SERVICE); |
| 122 | + |
| 123 | + if (manager.isEnabled()) { |
| 124 | + final AccessibilityEvent e = AccessibilityEvent.obtain(); |
| 125 | + e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT); |
| 126 | + e.setClassName(this.getClass().getName()); |
| 127 | + e.setPackageName(ctx.getPackageName()); |
| 128 | + e.getText().add(text); |
| 129 | + |
| 130 | + TimerTask task = new TimerTask() { |
| 131 | + @Override |
| 132 | + public void run() { |
| 133 | + manager.sendAccessibilityEvent(e); |
| 134 | + } |
| 135 | + }; |
| 136 | + |
| 137 | + Timer timer = new Timer(); |
| 138 | + timer.schedule(task, 1000); |
| 139 | + } |
| 140 | + } |
| 141 | + |
| 142 | + private void setupAccessibility() { |
| 143 | + if (mAccessibilityUnits != null && mAccessibilityIncrements != null && mAccessibilityIncrements.size() - 1 == (int)mMaxValue) { |
| 144 | + int index = (int)mValue; |
| 145 | + String sliderValue = mAccessibilityIncrements.get(index); |
| 146 | + int stringLength = mAccessibilityUnits.length(); |
| 147 | + |
| 148 | + String spokenUnits = mAccessibilityUnits; |
| 149 | + if (sliderValue != null && Integer.parseInt(sliderValue) == 1) { |
| 150 | + spokenUnits = spokenUnits.substring(0, stringLength - 1); |
| 151 | + } |
| 152 | + |
| 153 | + this.announceForAccessibility(String.format("%s %s", sliderValue, spokenUnits)); |
| 154 | + } |
| 155 | + } |
| 156 | + |
| 157 | + |
| 158 | + |
97 | 159 | /**
|
98 | 160 | * Convert SeekBar's native progress value (e.g. 0..100) to a value passed to JS (e.g. -1.0..2.5).
|
99 | 161 | */
|
|
0 commit comments