Skip to content

Commit

Permalink
add getRecommendedTimeoutMillis to AccessibilityInfo (#31063)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
grgr-dkrk authored and facebook-github-bot committed Apr 6, 2021
1 parent 2785ce7 commit d29a7e7
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,29 @@ const AccessibilityInfo = {
NativeAccessibilityInfo.announceForAccessibility(announcement);
}
},

/**
* Get the recommended timeout for changes to the UI needed by this user.
*
* See https://reactnative.dev/docs/accessibilityinfo.html#getRecommendedTimeoutMillis
*/
getRecommendedTimeoutMillis: function(
originalTimeout: number,
): Promise<number> {
return new Promise((resolve, reject) => {
if (
NativeAccessibilityInfo &&
NativeAccessibilityInfo.getRecommendedTimeoutMillis
) {
NativeAccessibilityInfo.getRecommendedTimeoutMillis(
originalTimeout,
resolve,
);
} else {
resolve(originalTimeout);
}
});
},
};

module.exports = AccessibilityInfo;
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,15 @@ const AccessibilityInfo = {
// $FlowFixMe[escaped-generic]
_subscriptions.delete(handler);
},

/**
* Android only
*/
getRecommendedTimeoutMillis: function(
originalTimeout: number,
): Promise<number> {
return Promise.resolve(originalTimeout);
},
};

module.exports = AccessibilityInfo;
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ export interface Spec extends TurboModule {
) => void;
+setAccessibilityFocus: (reactTag: number) => void;
+announceForAccessibility: (announcement: string) => void;
+getRecommendedTimeoutMillis?: (
mSec: number,
onSuccess: (recommendedTimeoutMillis: number) => void,
) => void;
}

export default (TurboModuleRegistry.get<Spec>('AccessibilityInfo'): ?Spec);
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ public void onChange(boolean selfChange, Uri uri) {
private final ContentResolver mContentResolver;
private boolean mReduceMotionEnabled = false;
private boolean mTouchExplorationEnabled = false;
private int mRecommendedTimeout;

private static final String REDUCE_MOTION_EVENT_NAME = "reduceMotionDidChange";
private static final String TOUCH_EXPLORATION_EVENT_NAME = "touchExplorationDidChange";
Expand Down Expand Up @@ -193,4 +194,16 @@ public void announceForAccessibility(String message) {
public void setAccessibilityFocus(double reactTag) {
// iOS only
}

@Override
public void getRecommendedTimeoutMillis(double originalTimeout, Callback successCallback) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
successCallback.invoke((int) originalTimeout);
return;
}
mRecommendedTimeout =
mAccessibilityManager.getRecommendedTimeoutMillis(
(int) originalTimeout, AccessibilityManager.FLAG_CONTENT_CONTROLS);
successCallback.invoke(mRecommendedTimeout);
}
}
1 change: 1 addition & 0 deletions jest/setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ jest
removeEventListener: jest.fn(),
setAccessibilityFocus: jest.fn(),
sendAccessibilityEvent_unstable: jest.fn(),
getRecommendedTimeoutMillis: jest.fn(),
}))
.mock('../Libraries/Components/RefreshControl/RefreshControl', () =>
jest.requireActual(
Expand Down

0 comments on commit d29a7e7

Please sign in to comment.