Uh oh!
There was an error while loading. Please reload this page.
Adapt iOS16+ dictation - #37188
Conversation
dmytrorykun
commented
May 2, 2023
Hi @hellohublot, thank you for the PR. Unfortunately we can't merge it because it is using private API
|
\uFFFC to _UITextPlaceholderAttachmenthellohublot
commented
May 3, 2023
Thanks, everything has been changed, could you please review it again |
dmytrorykun
commented
May 3, 2023
@hellohublot could you please rebase this PR on the latest |
hellohublot
commented
May 4, 2023
@dmytrorykun Thanks, done. |
Base commit: a310217 |
facebook-github-bot
commented
May 4, 2023
@dmytrorykun has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator. |
hellohublot
commented
May 13, 2023
@dmytrorykun Hello, Is there anything I can help you with? Please feel free to ask |
dmytrorykun
left a comment
There was a problem hiding this comment.
Hey @hellohublot. typingAttributesBeforeInsertion is still private API. Even though it is not prefixed with an underscore, it is not publicly documented. Developers are not supposed to use private APIs because it may change or stop working any time without warning.
Try using this routine to detect dictation. Does it work for all the cases?
BOOL isDictationActive = NO;
for (int characterIndex = 0; characterIndex < oldText.string.length; characterIndex++) {
if ([oldText.string characterAtIndex:characterIndex] == NSAttachmentCharacter) {
isDictationActive = YES;
}
}
hellohublot
commented
May 16, 2023
@dmytrorykun Thanks for your reply, but I guess that won't work, because we only want to judge whether there is a
|
jpdriver
commented
May 16, 2023
could we move it seems like since Apple apparently only wants us to know when dictation ended or failed, that could be the way to go? 🤔 |
This comment was marked as outdated.
This comment was marked as outdated.
hellohublot
commented
May 16, 2023
@jpdriver Thanks for your suggestion, I mistook |
hellohublot
commented
May 17, 2023
@dmytrorykun@jpdriver Thanks for your suggestions, I have changed it to I also modified the PR description, could you please help me to review it again |
hellohublot
commented
May 20, 2023
@dmytrorykun Hi, Is there anything I can help you with? Please feel free to ask |
facebook-github-bot
commented
May 22, 2023
@dmytrorykun has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator. |
facebook-github-bot
commented
May 23, 2023
@dmytrorykun merged this pull request in e8b4bb0. |
Summary: react#19687https://developer.apple.com/forums/thread/711413 When system version is lower than `iOS 16`, it does not support `dictation` and `keyboard` working at the same time, so if we modify the text, the system will immediately interrupt the `dictation`, so we need to prohibit modification of the text during `recording` and `recognition` When system version is higher than `iOS 16`, `dictation` and `keyboard` can work at the same time, so `textInputMode.primaryLanguage` is no longer changed to `dictation`, so we can modify the text during `recording`, because the system will not interrupt, but we cannot modify the text during `recognition`, Because the system will temporarily add a `_UITextPlaceholderAttachment` to display the recognition `UIActivityIndicator` ## Changelog: <!-- Help reviewers and the release process by writing your own changelog entry. Pick one each for the category and type tags: [ANDROID|GENERAL|IOS|INTERNAL] [BREAKING|ADDED|CHANGED|DEPRECATED|REMOVED|FIXED|SECURITY] - Message For more details, see: https://reactnative.dev/contributing/changelogs-in-pull-requests --> [IOS][FIXED] - Adapt iOS16+ dictation judge condition Pull Request resolved: react#37188 Test Plan: Test Code ```javascript constructor(props) { super(props) this.state = { value: '', logList: [], } } render() { return ( <View style={{ flex: 1, padding: 50, backgroundColor: 'white'}}> <TextInput style={{ marginTop: 20, height: 50, borderWidth: 1, borderColor: 'black' }} placeholder={'please input'} placeholderTextColor={'gray'} value={this.state.value} onChangeText={value => { let logList = this.state.logList logList.push(value.length <= 0 ? 'null' : value.replace(/\uFFFC/g, '_uFFFC')) this.setState({ value, logList }) }} onEndEditing={() => this.setState({ value: '', logList: [] })} /> <FlatList style={{ marginTop: 20, maxHeight: 300, borderWidth: 1, borderColor: 'black' }} data={this.state.logList} renderItem={({item}) => ( <Text>{item}</Text> )} /> </View> ) } ``` Case A: Required < iOS16 1. ensure that react#18890 can work well and dictation will not be interrupted immediately https://github.com/facebook/react-native/assets/20135674/e69a609c-2dc4-48fc-8186-f9e5af3ac879 Case B: Required >= iOS16 1. ensure that react#18890 can work well and dictation will not be interrupted immediately https://github.com/facebook/react-native/assets/20135674/caa97e18-c7c4-4a08-9872-b50130f73bf4 Case C: Required >= iOS16 1. start dictation 3. then do not speak any words 4. then end dictation 5. verify that `onChangeText` will callback "\uFFFC" once 6. and then verify `onChangeText` callback an empty string "" once https://user-images.githubusercontent.com/20135674/235960378-90155ec5-a129-47bc-825b-ee6cb03e7286.MP4 Case D: Required >= iOS16 1. start dictation 3. input some text while speaking some words 4. then end dictation 5. and verify that the `onChangeText` callback work fine. https://user-images.githubusercontent.com/20135674/235960411-e479d9ab-856a-4407-a644-986426825133.MP4 Case E: Required >= iOS16 1. start dictation 2. say a word 3. and then switch the keyboard to other language 4. verify that dictation will not end 6. continue say some word 8. verify the `onChangeText` callback work fine. https://user-images.githubusercontent.com/20135674/235960450-351f1aaf-80c0-4d1c-b5c9-3e2cd7225875.MP4 Reviewed By: sammy-SC Differential Revision: D45563187 Pulled By: dmytrorykun fbshipit-source-id: 7467b313769896140434f60dcb3590d0b3c1aa15
Summary:
#19687
https://developer.apple.com/forums/thread/711413
When system version is lower than
iOS 16, it does not supportdictationandkeyboardworking at the same time, so if we modify the text, the system will immediately interrupt thedictation, so we need to prohibit modification of the text duringrecordingandrecognitionWhen system version is higher than
iOS 16,dictationandkeyboardcan work at the same time, sotextInputMode.primaryLanguageis no longer changed todictation, so we can modify the text duringrecording, because the system will not interrupt, but we cannot modify the text duringrecognition, Because the system will temporarily add a_UITextPlaceholderAttachmentto display the recognitionUIActivityIndicatorChangelog:
[IOS][FIXED] - Adapt iOS16+ dictation judge condition
Test Plan:
Test Code
Case A: Required < iOS16
_case_a.mp4
Case B: Required >= iOS16
_case_b.mp4
Case C: Required >= iOS16
onChangeTextwill callback "\uFFFC" onceonChangeTextcallback an empty string "" once_case_c.MP4
Case D: Required >= iOS16
onChangeTextcallback work fine._case_d.MP4
Case E: Required >= iOS16
onChangeTextcallback work fine._case_e.MP4