Skip to content

Commit d29a7e7

Browse files
grgr-dkrkfacebook-github-bot
grgr-dkrk
authored andcommitted
add getRecommendedTimeoutMillis to AccessibilityInfo (#31063)
Summary: resolve #30866 This PR is for using `getRecommendedTimeoutMillis` with React Native, which is available on Android 10 and above. This allows the Android "Time to take action (Accessibility timeout)" setting to be reflected in the app. ## Changelog <!-- Help reviewers and the release process by writing your own changelog entry. For an example, see: https://github.com/facebook/react-native/wiki/Changelog --> [Android] [Added] - Add `getRecommendedTimeoutMillis` to AccessibilityInfo Pull Request resolved: #31063 Test Plan: I couldn't find any tests at the code level, so I tested them on my Android device. --- ### Android 10 (Pixel4a) #### Settings <img src="https://user-images.githubusercontent.com/40130327/109322854-210f2400-7896-11eb-9f3b-b88afa27abfb.png" width="400" alt="Set the timeout to 1 minute on the settings screen." /> #### App <img src="https://user-images.githubusercontent.com/40130327/109322895-32583080-7896-11eb-9c48-c4aa9afb94d9.png" width="400" alt="The baseline timeout is 3000 ms, but the result of `getRecommendedTimeoutMillis` returns 60000 ms." /> --- ### Android 7, iOS(Simulator) Return the original timeout. <img src="https://user-images.githubusercontent.com/40130327/109323217-911daa00-7896-11eb-9eba-659bc623f2ac.png" width="400" alt="Return the original timeout on Android 7." /> <img src="https://user-images.githubusercontent.com/40130327/109323357-b7dbe080-7896-11eb-89e9-305eea8b801b.png" width="400" alt="Return the original timeout on iOS simulator." /> Reviewed By: lunaleaps Differential Revision: D27475370 Pulled By: nadiia fbshipit-source-id: 4cdd9eb5ddb20d89c1d870e640b4b7e3c3c1b14d
1 parent 2785ce7 commit d29a7e7

File tree

5 files changed

+50
-0
lines changed

5 files changed

+50
-0
lines changed

Libraries/Components/AccessibilityInfo/AccessibilityInfo.android.js

+23
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,29 @@ const AccessibilityInfo = {
167167
NativeAccessibilityInfo.announceForAccessibility(announcement);
168168
}
169169
},
170+
171+
/**
172+
* Get the recommended timeout for changes to the UI needed by this user.
173+
*
174+
* See https://reactnative.dev/docs/accessibilityinfo.html#getRecommendedTimeoutMillis
175+
*/
176+
getRecommendedTimeoutMillis: function(
177+
originalTimeout: number,
178+
): Promise<number> {
179+
return new Promise((resolve, reject) => {
180+
if (
181+
NativeAccessibilityInfo &&
182+
NativeAccessibilityInfo.getRecommendedTimeoutMillis
183+
) {
184+
NativeAccessibilityInfo.getRecommendedTimeoutMillis(
185+
originalTimeout,
186+
resolve,
187+
);
188+
} else {
189+
resolve(originalTimeout);
190+
}
191+
});
192+
},
170193
};
171194

172195
module.exports = AccessibilityInfo;

Libraries/Components/AccessibilityInfo/AccessibilityInfo.ios.js

+9
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,15 @@ const AccessibilityInfo = {
275275
// $FlowFixMe[escaped-generic]
276276
_subscriptions.delete(handler);
277277
},
278+
279+
/**
280+
* Android only
281+
*/
282+
getRecommendedTimeoutMillis: function(
283+
originalTimeout: number,
284+
): Promise<number> {
285+
return Promise.resolve(originalTimeout);
286+
},
278287
};
279288

280289
module.exports = AccessibilityInfo;

Libraries/Components/AccessibilityInfo/NativeAccessibilityInfo.js

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ export interface Spec extends TurboModule {
2020
) => void;
2121
+setAccessibilityFocus: (reactTag: number) => void;
2222
+announceForAccessibility: (announcement: string) => void;
23+
+getRecommendedTimeoutMillis?: (
24+
mSec: number,
25+
onSuccess: (recommendedTimeoutMillis: number) => void,
26+
) => void;
2327
}
2428

2529
export default (TurboModuleRegistry.get<Spec>('AccessibilityInfo'): ?Spec);

ReactAndroid/src/main/java/com/facebook/react/modules/accessibilityinfo/AccessibilityInfoModule.java

+13
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public void onChange(boolean selfChange, Uri uri) {
6767
private final ContentResolver mContentResolver;
6868
private boolean mReduceMotionEnabled = false;
6969
private boolean mTouchExplorationEnabled = false;
70+
private int mRecommendedTimeout;
7071

7172
private static final String REDUCE_MOTION_EVENT_NAME = "reduceMotionDidChange";
7273
private static final String TOUCH_EXPLORATION_EVENT_NAME = "touchExplorationDidChange";
@@ -193,4 +194,16 @@ public void announceForAccessibility(String message) {
193194
public void setAccessibilityFocus(double reactTag) {
194195
// iOS only
195196
}
197+
198+
@Override
199+
public void getRecommendedTimeoutMillis(double originalTimeout, Callback successCallback) {
200+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
201+
successCallback.invoke((int) originalTimeout);
202+
return;
203+
}
204+
mRecommendedTimeout =
205+
mAccessibilityManager.getRecommendedTimeoutMillis(
206+
(int) originalTimeout, AccessibilityManager.FLAG_CONTENT_CONTROLS);
207+
successCallback.invoke(mRecommendedTimeout);
208+
}
196209
}

jest/setup.js

+1
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ jest
128128
removeEventListener: jest.fn(),
129129
setAccessibilityFocus: jest.fn(),
130130
sendAccessibilityEvent_unstable: jest.fn(),
131+
getRecommendedTimeoutMillis: jest.fn(),
131132
}))
132133
.mock('../Libraries/Components/RefreshControl/RefreshControl', () =>
133134
jest.requireActual(

0 commit comments

Comments
 (0)