|
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