-
Notifications
You must be signed in to change notification settings - Fork 24.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adapt iOS16+ dictation #37188
Adapt iOS16+ dictation #37188
Conversation
Hi @hellohublot, thank you for the PR. Unfortunately we can't merge it because it is using private API
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Previous comment.
\uFFFC
to _UITextPlaceholderAttachment
Thanks, everything has been changed, could you please review it again |
@hellohublot could you please rebase this PR on the latest |
@dmytrorykun Thanks, done. |
Base commit: a310217 |
@dmytrorykun has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator. |
@dmytrorykun Hello, Is there anything I can help you with? Please feel free to ask |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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;
}
}
@dmytrorykun Thanks for your reply, but I guess that won't work, because we only want to judge whether there is a
|
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.
@jpdriver Thanks for your suggestion, I mistook |
@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 |
@dmytrorykun Hi, Is there anything I can help you with? Please feel free to ask |
@dmytrorykun has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator. |
@dmytrorykun merged this pull request in e8b4bb0. |
Summary: facebook#19687 https://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` <!-- 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: facebook#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 facebook#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 facebook#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: facebook#19687 https://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` <!-- 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: facebook#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 facebook#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 facebook#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: facebook#19687 https://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: facebook#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 facebook#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 facebook#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 supportdictation
andkeyboard
working 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 duringrecording
andrecognition
When system version is higher than
iOS 16
,dictation
andkeyboard
can work at the same time, sotextInputMode.primaryLanguage
is 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_UITextPlaceholderAttachment
to display the recognitionUIActivityIndicator
Changelog:
[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
onChangeText
will callback "\uFFFC" onceonChangeText
callback an empty string "" once_case_c.MP4
Case D: Required >= iOS16
onChangeText
callback work fine._case_d.MP4
Case E: Required >= iOS16
onChangeText
callback work fine._case_e.MP4