react-native-tvos 0.69.6-2 → 0.69.6-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Libraries/Components/Pressable/Pressable.js +11 -2
- package/Libraries/Components/ScrollView/ScrollView.js +1 -0
- package/Libraries/Components/TV/TVEventHandler.js +4 -2
- package/Libraries/Components/TV/TVFocusEventHandler.js +4 -2
- package/Libraries/Components/TV/TVFocusGuideView.js +28 -11
- package/Libraries/Components/TV/TVViewPropTypes.js +7 -0
- package/Libraries/Components/TV/useTVEventHandler.js +2 -1
- package/Libraries/Components/TextInput/TextInput.js +1 -1
- package/Libraries/Components/Touchable/TouchableBounce.js +5 -0
- package/Libraries/Components/Touchable/TouchableHighlight.js +7 -2
- package/Libraries/Components/Touchable/TouchableOpacity.js +7 -2
- package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +7 -0
- package/Libraries/Core/ReactNativeVersion.js +1 -1
- package/Libraries/LogBox/UI/LogBoxButton.js +16 -12
- package/Libraries/LogBox/UI/LogBoxNotification.js +1 -1
- package/Libraries/NativeAnimation/RCTNativeAnimatedTurboModule.mm +2 -20
- package/Libraries/StyleSheet/StyleSheetTypes.js +1 -0
- package/Libraries/Types/CoreEventTypes.js +9 -0
- package/README.md +2 -1
- package/React/Base/RCTVersion.m +1 -1
- package/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +48 -4
- package/React/Views/RCTTVView.h +5 -0
- package/React/Views/RCTTVView.m +19 -0
- package/React/Views/RCTViewManager.m +1 -0
- package/ReactAndroid/gradle.properties +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/animated/EventAnimationDriver.java +6 -1
- package/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedModule.java +4 -5
- package/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java +57 -62
- package/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/ReactNativeVersion.java +1 -1
- package/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/Event.java +18 -0
- package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewGroup.java +190 -1
- package/ReactAndroid/src/main/java/com/facebook/react/views/view/ReactViewManager.java +5 -0
- package/ReactCommon/cxxreact/ReactNativeVersion.h +1 -1
- package/ReactCommon/react/renderer/components/view/ViewProps.cpp +13 -1
- package/ReactCommon/react/renderer/components/view/ViewProps.h +2 -1
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-release-javadoc.jar → 0.69.6-3/hermes-engine-0.69.6-3-debug-javadoc.jar} +0 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug-javadoc.jar.md5 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug-javadoc.jar.sha1 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug-javadoc.jar.sha256 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug-javadoc.jar.sha512 +1 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-debug-sources.jar → 0.69.6-3/hermes-engine-0.69.6-3-debug-sources.jar} +0 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-debug-sources.jar.md5 → 0.69.6-3/hermes-engine-0.69.6-3-debug-sources.jar.md5} +0 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-debug-sources.jar.sha1 → 0.69.6-3/hermes-engine-0.69.6-3-debug-sources.jar.sha1} +0 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-debug-sources.jar.sha256 → 0.69.6-3/hermes-engine-0.69.6-3-debug-sources.jar.sha256} +0 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-debug-sources.jar.sha512 → 0.69.6-3/hermes-engine-0.69.6-3-debug-sources.jar.sha512} +0 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug.aar +0 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug.aar.md5 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug.aar.sha1 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug.aar.sha256 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug.aar.sha512 +1 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-debug-javadoc.jar → 0.69.6-3/hermes-engine-0.69.6-3-release-javadoc.jar} +0 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-release-javadoc.jar.md5 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-release-javadoc.jar.sha1 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-release-javadoc.jar.sha256 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-release-javadoc.jar.sha512 +1 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-release-sources.jar → 0.69.6-3/hermes-engine-0.69.6-3-release-sources.jar} +0 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-release-sources.jar.md5 → 0.69.6-3/hermes-engine-0.69.6-3-release-sources.jar.md5} +0 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-release-sources.jar.sha1 → 0.69.6-3/hermes-engine-0.69.6-3-release-sources.jar.sha1} +0 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-release-sources.jar.sha256 → 0.69.6-3/hermes-engine-0.69.6-3-release-sources.jar.sha256} +0 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2-release-sources.jar.sha512 → 0.69.6-3/hermes-engine-0.69.6-3-release-sources.jar.sha512} +0 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-release.aar +0 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-release.aar.md5 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-release.aar.sha1 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-release.aar.sha256 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-release.aar.sha512 +1 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2.module → 0.69.6-3/hermes-engine-0.69.6-3.module} +45 -45
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3.module.md5 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3.module.sha1 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3.module.sha256 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3.module.sha512 +1 -0
- package/android/com/facebook/react/hermes-engine/{0.69.6-2/hermes-engine-0.69.6-2.pom → 0.69.6-3/hermes-engine-0.69.6-3.pom} +1 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3.pom.md5 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3.pom.sha1 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3.pom.sha256 +1 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3.pom.sha512 +1 -0
- package/android/com/facebook/react/hermes-engine/maven-metadata.xml +4 -4
- package/android/com/facebook/react/hermes-engine/maven-metadata.xml.md5 +1 -1
- package/android/com/facebook/react/hermes-engine/maven-metadata.xml.sha1 +1 -1
- package/android/com/facebook/react/hermes-engine/maven-metadata.xml.sha256 +1 -1
- package/android/com/facebook/react/hermes-engine/maven-metadata.xml.sha512 +1 -1
- package/android/com/facebook/react/react-native/{0.69.6-2/react-native-0.69.6-2-debug-javadoc.jar → 0.69.6-3/react-native-0.69.6-3-debug-javadoc.jar} +0 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug-javadoc.jar.md5 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug-javadoc.jar.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug-javadoc.jar.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug-javadoc.jar.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.69.6-2/react-native-0.69.6-2-debug-sources.jar → 0.69.6-3/react-native-0.69.6-3-debug-sources.jar} +0 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug-sources.jar.md5 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug-sources.jar.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug-sources.jar.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug-sources.jar.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.69.6-2/react-native-0.69.6-2-debug.aar → 0.69.6-3/react-native-0.69.6-3-debug.aar} +0 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug.aar.md5 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug.aar.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug.aar.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-debug.aar.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.69.6-2/react-native-0.69.6-2-release-javadoc.jar → 0.69.6-3/react-native-0.69.6-3-release-javadoc.jar} +0 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release-javadoc.jar.md5 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release-javadoc.jar.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release-javadoc.jar.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release-javadoc.jar.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.69.6-2/react-native-0.69.6-2-release-sources.jar → 0.69.6-3/react-native-0.69.6-3-release-sources.jar} +0 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release-sources.jar.md5 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release-sources.jar.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release-sources.jar.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release-sources.jar.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.69.6-2/react-native-0.69.6-2-release.aar → 0.69.6-3/react-native-0.69.6-3-release.aar} +0 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release.aar.md5 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release.aar.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release.aar.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3-release.aar.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.69.6-2/react-native-0.69.6-2.module → 0.69.6-3/react-native-0.69.6-3.module} +57 -57
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3.module.md5 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3.module.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3.module.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3.module.sha512 +1 -0
- package/android/com/facebook/react/react-native/{0.69.6-2/react-native-0.69.6-2.pom → 0.69.6-3/react-native-0.69.6-3.pom} +1 -1
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3.pom.md5 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3.pom.sha1 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3.pom.sha256 +1 -0
- package/android/com/facebook/react/react-native/0.69.6-3/react-native-0.69.6-3.pom.sha512 +1 -0
- package/android/com/facebook/react/react-native/maven-metadata.xml +4 -4
- package/android/com/facebook/react/react-native/maven-metadata.xml.md5 +1 -1
- package/android/com/facebook/react/react-native/maven-metadata.xml.sha1 +1 -1
- package/android/com/facebook/react/react-native/maven-metadata.xml.sha256 +1 -1
- package/android/com/facebook/react/react-native/maven-metadata.xml.sha512 +1 -1
- package/index.js +1 -7
- package/package.json +1 -1
- package/template/package.json +1 -1
- package/tvos-types.d.ts +9 -0
- package/Libraries/DeprecatedPropTypes/DeprecatedTVViewPropTypes.js +0 -23
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-debug-javadoc.jar.md5 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-debug-javadoc.jar.sha1 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-debug-javadoc.jar.sha256 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-debug-javadoc.jar.sha512 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-debug.aar +0 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-debug.aar.md5 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-debug.aar.sha1 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-debug.aar.sha256 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-debug.aar.sha512 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-release-javadoc.jar.md5 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-release-javadoc.jar.sha1 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-release-javadoc.jar.sha256 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-release-javadoc.jar.sha512 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-release.aar +0 -0
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-release.aar.md5 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-release.aar.sha1 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-release.aar.sha256 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2-release.aar.sha512 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2.module.md5 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2.module.sha1 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2.module.sha256 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2.module.sha512 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2.pom.md5 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2.pom.sha1 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2.pom.sha256 +0 -1
- package/android/com/facebook/react/hermes-engine/0.69.6-2/hermes-engine-0.69.6-2.pom.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug-javadoc.jar.md5 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug-javadoc.jar.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug-javadoc.jar.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug-javadoc.jar.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug-sources.jar.md5 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug-sources.jar.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug-sources.jar.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug-sources.jar.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug.aar.md5 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug.aar.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug.aar.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-debug.aar.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release-javadoc.jar.md5 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release-javadoc.jar.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release-javadoc.jar.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release-javadoc.jar.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release-sources.jar.md5 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release-sources.jar.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release-sources.jar.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release-sources.jar.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release.aar.md5 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release.aar.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release.aar.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2-release.aar.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2.module.md5 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2.module.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2.module.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2.module.sha512 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2.pom.md5 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2.pom.sha1 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2.pom.sha256 +0 -1
- package/android/com/facebook/react/react-native/0.69.6-2/react-native-0.69.6-2.pom.sha512 +0 -1
|
@@ -21,8 +21,13 @@ import java.util.List;
|
|
|
21
21
|
/* package */ class EventAnimationDriver implements RCTEventEmitter {
|
|
22
22
|
private List<String> mEventPath;
|
|
23
23
|
/* package */ ValueAnimatedNode mValueNode;
|
|
24
|
+
/* package */ String mEventName;
|
|
25
|
+
/* package */ int mViewTag;
|
|
24
26
|
|
|
25
|
-
public EventAnimationDriver(
|
|
27
|
+
public EventAnimationDriver(
|
|
28
|
+
String eventName, int viewTag, List<String> eventPath, ValueAnimatedNode valueNode) {
|
|
29
|
+
mEventName = eventName;
|
|
30
|
+
mViewTag = viewTag;
|
|
26
31
|
mEventPath = eventPath;
|
|
27
32
|
mValueNode = valueNode;
|
|
28
33
|
}
|
|
@@ -113,7 +113,7 @@ public class NativeAnimatedModule extends NativeAnimatedModuleSpec
|
|
|
113
113
|
|
|
114
114
|
@AnyThread
|
|
115
115
|
boolean isEmpty() {
|
|
116
|
-
return mQueue.isEmpty();
|
|
116
|
+
return mQueue.isEmpty() && mPeekedOperation != null;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
void setSynchronizedAccess(boolean isSynchronizedAccess) {
|
|
@@ -393,8 +393,8 @@ public class NativeAnimatedModule extends NativeAnimatedModuleSpec
|
|
|
393
393
|
|
|
394
394
|
/**
|
|
395
395
|
* Given a viewTag, detect if we're running in Fabric or non-Fabric and attach an event listener
|
|
396
|
-
* to the correct UIManager, if necessary. This is expected to only be called from the
|
|
397
|
-
* and not concurrently.
|
|
396
|
+
* to the correct UIManager, if necessary. This is expected to only be called from the native
|
|
397
|
+
* module thread, and not concurrently.
|
|
398
398
|
*
|
|
399
399
|
* @param viewTag
|
|
400
400
|
*/
|
|
@@ -417,8 +417,7 @@ public class NativeAnimatedModule extends NativeAnimatedModuleSpec
|
|
|
417
417
|
}
|
|
418
418
|
|
|
419
419
|
// Subscribe to UIManager (Fabric or non-Fabric) lifecycle events if we haven't yet
|
|
420
|
-
if (
|
|
421
|
-
|| (mInitializedForNonFabric && mUIManagerType == UIManagerType.DEFAULT)) {
|
|
420
|
+
if (mUIManagerType == UIManagerType.FABRIC ? mInitializedForFabric : mInitializedForNonFabric) {
|
|
422
421
|
return;
|
|
423
422
|
}
|
|
424
423
|
|
package/ReactAndroid/src/main/java/com/facebook/react/animated/NativeAnimatedNodesManager.java
CHANGED
|
@@ -30,11 +30,9 @@ import com.facebook.react.uimanager.events.EventDispatcher;
|
|
|
30
30
|
import com.facebook.react.uimanager.events.EventDispatcherListener;
|
|
31
31
|
import java.util.ArrayDeque;
|
|
32
32
|
import java.util.ArrayList;
|
|
33
|
-
import java.util.HashMap;
|
|
34
33
|
import java.util.LinkedList;
|
|
35
34
|
import java.util.List;
|
|
36
35
|
import java.util.ListIterator;
|
|
37
|
-
import java.util.Map;
|
|
38
36
|
import java.util.Queue;
|
|
39
37
|
|
|
40
38
|
/**
|
|
@@ -57,9 +55,9 @@ import java.util.Queue;
|
|
|
57
55
|
private final SparseArray<AnimatedNode> mAnimatedNodes = new SparseArray<>();
|
|
58
56
|
private final SparseArray<AnimationDriver> mActiveAnimations = new SparseArray<>();
|
|
59
57
|
private final SparseArray<AnimatedNode> mUpdatedNodes = new SparseArray<>();
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
private final
|
|
58
|
+
// List of event animation drivers for an event on view.
|
|
59
|
+
// There may be multiple drivers for the same event and view.
|
|
60
|
+
private final List<EventAnimationDriver> mEventDrivers = new ArrayList<>();
|
|
63
61
|
private final ReactApplicationContext mReactApplicationContext;
|
|
64
62
|
private int mAnimatedGraphBFSColor = 0;
|
|
65
63
|
// Used to avoid allocating a new array on every frame in `runUpdates` and `onEventDispatch`.
|
|
@@ -76,36 +74,27 @@ import java.util.Queue;
|
|
|
76
74
|
|
|
77
75
|
/**
|
|
78
76
|
* Initialize event listeners for Fabric UIManager or non-Fabric UIManager, exactly once. Once
|
|
79
|
-
* Fabric is the only UIManager, this logic can be simplified. This is
|
|
80
|
-
* thread.
|
|
77
|
+
* Fabric is the only UIManager, this logic can be simplified. This is expected to only be called
|
|
78
|
+
* from the native module thread.
|
|
81
79
|
*
|
|
82
80
|
* @param uiManagerType
|
|
83
81
|
*/
|
|
84
|
-
@UiThread
|
|
85
82
|
public void initializeEventListenerForUIManagerType(@UIManagerType final int uiManagerType) {
|
|
86
|
-
if (
|
|
87
|
-
|
|
83
|
+
if (uiManagerType == UIManagerType.FABRIC
|
|
84
|
+
? mEventListenerInitializedForFabric
|
|
85
|
+
: mEventListenerInitializedForNonFabric) {
|
|
88
86
|
return;
|
|
89
87
|
}
|
|
90
88
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
if (uiManagerType == UIManagerType.FABRIC) {
|
|
102
|
-
mEventListenerInitializedForFabric = true;
|
|
103
|
-
} else {
|
|
104
|
-
mEventListenerInitializedForNonFabric = true;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
});
|
|
89
|
+
UIManager uiManager = UIManagerHelper.getUIManager(mReactApplicationContext, uiManagerType);
|
|
90
|
+
if (uiManager != null) {
|
|
91
|
+
uiManager.<EventDispatcher>getEventDispatcher().addListener(this);
|
|
92
|
+
if (uiManagerType == UIManagerType.FABRIC) {
|
|
93
|
+
mEventListenerInitializedForFabric = true;
|
|
94
|
+
} else {
|
|
95
|
+
mEventListenerInitializedForNonFabric = true;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
109
98
|
}
|
|
110
99
|
|
|
111
100
|
/*package*/ @Nullable
|
|
@@ -471,7 +460,8 @@ import java.util.Queue;
|
|
|
471
460
|
}
|
|
472
461
|
|
|
473
462
|
@UiThread
|
|
474
|
-
public void addAnimatedEventToView(
|
|
463
|
+
public void addAnimatedEventToView(
|
|
464
|
+
int viewTag, String eventHandlerName, ReadableMap eventMapping) {
|
|
475
465
|
int nodeTag = eventMapping.getInt("animatedValueTag");
|
|
476
466
|
AnimatedNode node = mAnimatedNodes.get(nodeTag);
|
|
477
467
|
if (node == null) {
|
|
@@ -482,8 +472,8 @@ import java.util.Queue;
|
|
|
482
472
|
throw new JSApplicationIllegalArgumentException(
|
|
483
473
|
"addAnimatedEventToView: Animated node on view ["
|
|
484
474
|
+ viewTag
|
|
485
|
-
+ "] connected to event ("
|
|
486
|
-
+
|
|
475
|
+
+ "] connected to event handler ("
|
|
476
|
+
+ eventHandlerName
|
|
487
477
|
+ ") should be of type "
|
|
488
478
|
+ ValueAnimatedNode.class.getName());
|
|
489
479
|
}
|
|
@@ -494,37 +484,31 @@ import java.util.Queue;
|
|
|
494
484
|
pathList.add(path.getString(i));
|
|
495
485
|
}
|
|
496
486
|
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
List<EventAnimationDriver> drivers = new ArrayList<>(1);
|
|
503
|
-
drivers.add(event);
|
|
504
|
-
mEventDrivers.put(key, drivers);
|
|
505
|
-
}
|
|
487
|
+
String eventName = normalizeEventName(eventHandlerName);
|
|
488
|
+
|
|
489
|
+
EventAnimationDriver eventDriver =
|
|
490
|
+
new EventAnimationDriver(eventName, viewTag, pathList, (ValueAnimatedNode) node);
|
|
491
|
+
mEventDrivers.add(eventDriver);
|
|
506
492
|
}
|
|
507
493
|
|
|
508
494
|
@UiThread
|
|
509
|
-
public void removeAnimatedEventFromView(
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
}
|
|
495
|
+
public void removeAnimatedEventFromView(
|
|
496
|
+
int viewTag, String eventHandlerName, int animatedValueTag) {
|
|
497
|
+
|
|
498
|
+
String eventName = normalizeEventName(eventHandlerName);
|
|
499
|
+
|
|
500
|
+
ListIterator<EventAnimationDriver> it = mEventDrivers.listIterator();
|
|
501
|
+
while (it.hasNext()) {
|
|
502
|
+
EventAnimationDriver driver = it.next();
|
|
503
|
+
if (eventName.equals(driver.mEventName)
|
|
504
|
+
&& viewTag == driver.mViewTag
|
|
505
|
+
&& animatedValueTag == driver.mValueNode.mTag) {
|
|
506
|
+
it.remove();
|
|
507
|
+
break;
|
|
523
508
|
}
|
|
524
509
|
}
|
|
525
510
|
}
|
|
526
511
|
|
|
527
|
-
@UiThread
|
|
528
512
|
@Override
|
|
529
513
|
public void onEventDispatch(final Event event) {
|
|
530
514
|
// Events can be dispatched from any thread so we have to make sure handleEvent is run from the
|
|
@@ -556,18 +540,19 @@ import java.util.Queue;
|
|
|
556
540
|
if (uiManager == null) {
|
|
557
541
|
return;
|
|
558
542
|
}
|
|
559
|
-
String eventName = uiManager.resolveCustomDirectEventName(event.getEventName());
|
|
560
|
-
if (eventName == null) {
|
|
561
|
-
eventName = "";
|
|
562
|
-
}
|
|
563
543
|
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
544
|
+
boolean foundAtLeastOneDriver = false;
|
|
545
|
+
Event.EventAnimationDriverMatchSpec matchSpec = event.getEventAnimationDriverMatchSpec();
|
|
546
|
+
for (EventAnimationDriver driver : mEventDrivers) {
|
|
547
|
+
if (matchSpec.match(driver.mViewTag, driver.mEventName)) {
|
|
548
|
+
foundAtLeastOneDriver = true;
|
|
567
549
|
stopAnimationsForNode(driver.mValueNode);
|
|
568
550
|
event.dispatch(driver);
|
|
569
551
|
mRunUpdateNodeList.add(driver.mValueNode);
|
|
570
552
|
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
if (foundAtLeastOneDriver) {
|
|
571
556
|
updateNodes(mRunUpdateNodeList);
|
|
572
557
|
mRunUpdateNodeList.clear();
|
|
573
558
|
}
|
|
@@ -782,4 +767,14 @@ import java.util.Queue;
|
|
|
782
767
|
mWarnedAboutGraphTraversal = false;
|
|
783
768
|
}
|
|
784
769
|
}
|
|
770
|
+
|
|
771
|
+
private String normalizeEventName(String eventHandlerName) {
|
|
772
|
+
// Fabric UIManager also makes this assumption
|
|
773
|
+
String eventName = eventHandlerName;
|
|
774
|
+
if (eventHandlerName.startsWith("on")) {
|
|
775
|
+
eventName = "top" + eventHandlerName.substring(2);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
return eventName;
|
|
779
|
+
}
|
|
785
780
|
}
|
|
@@ -39,6 +39,7 @@ public abstract class Event<T extends Event> {
|
|
|
39
39
|
private int mViewTag;
|
|
40
40
|
private long mTimestampMs;
|
|
41
41
|
private int mUniqueID = sUniqueID++;
|
|
42
|
+
private @Nullable EventAnimationDriverMatchSpec mEventAnimationDriverMatchSpec;
|
|
42
43
|
|
|
43
44
|
protected Event() {}
|
|
44
45
|
|
|
@@ -156,6 +157,19 @@ public abstract class Event<T extends Event> {
|
|
|
156
157
|
/** @return the name of this event as registered in JS */
|
|
157
158
|
public abstract String getEventName();
|
|
158
159
|
|
|
160
|
+
public EventAnimationDriverMatchSpec getEventAnimationDriverMatchSpec() {
|
|
161
|
+
if (mEventAnimationDriverMatchSpec == null) {
|
|
162
|
+
mEventAnimationDriverMatchSpec =
|
|
163
|
+
new EventAnimationDriverMatchSpec() {
|
|
164
|
+
@Override
|
|
165
|
+
public boolean match(int viewTag, String eventName) {
|
|
166
|
+
return viewTag == getViewTag() && eventName.equals(getEventName());
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return mEventAnimationDriverMatchSpec;
|
|
171
|
+
}
|
|
172
|
+
|
|
159
173
|
/**
|
|
160
174
|
* Dispatch this event to JS using the given event emitter. Compatible with old and new renderer.
|
|
161
175
|
* Instead of using this or dispatchModern, it is recommended that you simply override
|
|
@@ -216,4 +230,8 @@ public abstract class Event<T extends Event> {
|
|
|
216
230
|
}
|
|
217
231
|
dispatch(rctEventEmitter);
|
|
218
232
|
}
|
|
233
|
+
|
|
234
|
+
public interface EventAnimationDriverMatchSpec {
|
|
235
|
+
boolean match(int viewTag, String eventName);
|
|
236
|
+
}
|
|
219
237
|
}
|
|
@@ -60,6 +60,9 @@ import com.facebook.react.uimanager.common.UIManagerType;
|
|
|
60
60
|
import com.facebook.react.uimanager.common.ViewUtil;
|
|
61
61
|
import com.facebook.yoga.YogaConstants;
|
|
62
62
|
|
|
63
|
+
import java.lang.ref.WeakReference;
|
|
64
|
+
import java.util.ArrayList;
|
|
65
|
+
|
|
63
66
|
/**
|
|
64
67
|
* Backing for a React View. Has support for borders, but since borders aren't common, lazy
|
|
65
68
|
* initializes most of the storage needed for them.
|
|
@@ -80,6 +83,9 @@ public class ReactViewGroup extends ViewGroup
|
|
|
80
83
|
/* should only be used in {@link #updateClippingToRect} */
|
|
81
84
|
private static final Rect sHelperRect = new Rect();
|
|
82
85
|
private @NonNull int[] focusDestinations = new int[0];
|
|
86
|
+
private boolean autoFocus = false;
|
|
87
|
+
private WeakReference<View> lastFocusedElement;
|
|
88
|
+
private boolean mRecoverFocus = false;
|
|
83
89
|
|
|
84
90
|
/**
|
|
85
91
|
* This listener will be set for child views when removeClippedSubview property is enabled. When
|
|
@@ -440,6 +446,71 @@ public class ReactViewGroup extends ViewGroup
|
|
|
440
446
|
}
|
|
441
447
|
}
|
|
442
448
|
|
|
449
|
+
boolean moveFocusToFirstFocusable(ReactViewGroup viewGroup) {
|
|
450
|
+
ArrayList<View> focusables = new ArrayList<View>(0);
|
|
451
|
+
/**
|
|
452
|
+
* `addFocusables` is the method used by `FocusFinder` to determine
|
|
453
|
+
* which elements are `focusable` within the given view.
|
|
454
|
+
* Here we use it for the exact purpose. It mutates/populates the `focusables` array list.
|
|
455
|
+
* Focus direction (FOCUS_DOWN) doesn't matter at all because
|
|
456
|
+
* it's not being used by the underlying implementation.
|
|
457
|
+
*/
|
|
458
|
+
viewGroup.addFocusables(focusables, FOCUS_DOWN, FOCUSABLES_ALL);
|
|
459
|
+
/**
|
|
460
|
+
* Depending on ViewGroup's `descendantFocusability` property,
|
|
461
|
+
* the first element can be the ViewGroup itself.
|
|
462
|
+
* The other ones on the list can be non-focusable as well.
|
|
463
|
+
* So, we run a loop till finding the first real focusable element.
|
|
464
|
+
*/
|
|
465
|
+
if (focusables.size() <= 0) return false;
|
|
466
|
+
|
|
467
|
+
View firstFocusableElement = null;
|
|
468
|
+
Integer index = 0;
|
|
469
|
+
while (firstFocusableElement == null && index < focusables.size()) {
|
|
470
|
+
View elem = focusables.get(index);
|
|
471
|
+
if (elem.isFocusable() && elem != viewGroup) {
|
|
472
|
+
firstFocusableElement = elem;
|
|
473
|
+
break;
|
|
474
|
+
}
|
|
475
|
+
index++;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
if (firstFocusableElement != null) return firstFocusableElement.requestFocus();
|
|
479
|
+
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
void recoverFocus(View view) {
|
|
484
|
+
if (!view.hasFocus() || !(view instanceof ReactViewGroup)) return;
|
|
485
|
+
|
|
486
|
+
ReactViewGroup parentFocusGuide = findParentFocusGuide(view);
|
|
487
|
+
if (parentFocusGuide == null) return;
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* Making `parentFocusGuide` focusable for a brief time to
|
|
491
|
+
* temporarily move the focus to it. We do this to prevent
|
|
492
|
+
* Android from moving the focus to top-left-most element of the screen.
|
|
493
|
+
*/
|
|
494
|
+
parentFocusGuide.mRecoverFocus = true;
|
|
495
|
+
parentFocusGuide.setFocusable(true);
|
|
496
|
+
parentFocusGuide.requestFocus();
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* We set a Runnable to wait and make sure every layout related action gets completed
|
|
500
|
+
* before trying to find a new focus candidate inside the `parentFocusGuide`.
|
|
501
|
+
*/
|
|
502
|
+
UiThreadUtil.runOnUiThread(
|
|
503
|
+
new Runnable() {
|
|
504
|
+
@Override
|
|
505
|
+
public void run() {
|
|
506
|
+
moveFocusToFirstFocusable(parentFocusGuide);
|
|
507
|
+
|
|
508
|
+
parentFocusGuide.setFocusable(false);
|
|
509
|
+
parentFocusGuide.mRecoverFocus = false;
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
|
|
443
514
|
@Override
|
|
444
515
|
public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) {
|
|
445
516
|
return super.getChildVisibleRect(child, r, offset);
|
|
@@ -494,6 +565,8 @@ public class ReactViewGroup extends ViewGroup
|
|
|
494
565
|
setChildrenDrawingOrderEnabled(false);
|
|
495
566
|
}
|
|
496
567
|
|
|
568
|
+
recoverFocus(view);
|
|
569
|
+
|
|
497
570
|
super.removeView(view);
|
|
498
571
|
}
|
|
499
572
|
|
|
@@ -508,6 +581,8 @@ public class ReactViewGroup extends ViewGroup
|
|
|
508
581
|
setChildrenDrawingOrderEnabled(false);
|
|
509
582
|
}
|
|
510
583
|
|
|
584
|
+
recoverFocus(getChildAt(index));
|
|
585
|
+
|
|
511
586
|
super.removeViewAt(index);
|
|
512
587
|
}
|
|
513
588
|
|
|
@@ -1017,12 +1092,121 @@ public class ReactViewGroup extends ViewGroup
|
|
|
1017
1092
|
return false;
|
|
1018
1093
|
}
|
|
1019
1094
|
|
|
1095
|
+
private boolean isTVFocusGuide() {
|
|
1096
|
+
return focusDestinations.length > 0 || autoFocus;
|
|
1097
|
+
}
|
|
1098
|
+
|
|
1099
|
+
@Nullable
|
|
1100
|
+
private ReactViewGroup findParentFocusGuide(View view) {
|
|
1101
|
+
ViewParent parent = view.getParent();
|
|
1102
|
+
|
|
1103
|
+
while (parent != null) {
|
|
1104
|
+
if (parent instanceof ReactViewGroup) {
|
|
1105
|
+
ReactViewGroup elem = (ReactViewGroup) parent;
|
|
1106
|
+
if (elem.isTVFocusGuide()) return elem;
|
|
1107
|
+
}
|
|
1108
|
+
parent = parent.getParent();
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1111
|
+
return null;
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
/***
|
|
1115
|
+
* This is meant to be used only for TVFocusGuide.
|
|
1116
|
+
* @return View | null
|
|
1117
|
+
*/
|
|
1118
|
+
@Nullable
|
|
1119
|
+
private View getFocusedChildOfFocusGuide() {
|
|
1120
|
+
if (!isTVFocusGuide()) return null;
|
|
1121
|
+
|
|
1122
|
+
/*
|
|
1123
|
+
* We can have nested `TVFocusGuide`s, this is a typical scenario.
|
|
1124
|
+
* The problem is, returned element from `getFocusedChild` can be
|
|
1125
|
+
* either a direct `child` of the `TVFocusGuide` or a `descendant` of it.
|
|
1126
|
+
* Let's say if we run `getFocusedChild` for the Root element, it will always
|
|
1127
|
+
* give us an element even though the Root element is not the direct parent
|
|
1128
|
+
* of the focused element.
|
|
1129
|
+
* So, we need to find the closest `TVFocusGuide` to the focused child
|
|
1130
|
+
* to make sure the focused element's closest `TVFocusGuide` is "this" one.
|
|
1131
|
+
*/
|
|
1132
|
+
View focusedChild = this.getFocusedChild();
|
|
1133
|
+
if (focusedChild == null) return null;
|
|
1134
|
+
|
|
1135
|
+
ReactViewGroup parentFocusGuide = findParentFocusGuide(focusedChild);
|
|
1136
|
+
if (parentFocusGuide == this) return focusedChild;
|
|
1137
|
+
|
|
1138
|
+
return null;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
@Override
|
|
1142
|
+
public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
|
|
1143
|
+
/**
|
|
1144
|
+
* TVFocusGuides should reveral their children when `mRecoverFocus` is set.
|
|
1145
|
+
* `mRecoverFocus` flag indicates a temporary focus recovery mode it's in which
|
|
1146
|
+
* requires full access to children focusable elements.
|
|
1147
|
+
*/
|
|
1148
|
+
if (isTVFocusGuide() && !mRecoverFocus) {
|
|
1149
|
+
View focusedChild = getFocusedChildOfFocusGuide();
|
|
1150
|
+
|
|
1151
|
+
/*
|
|
1152
|
+
* We only include the view's (TVFocusGuide) itself if it doesn't have a child that currently has the focus.
|
|
1153
|
+
* Otherwise, it means focus is already in the `TVFocusGuide` and all of it's descendants should be included
|
|
1154
|
+
* for focus calculations.
|
|
1155
|
+
*/
|
|
1156
|
+
if (focusedChild == null) {
|
|
1157
|
+
views.add(this);
|
|
1158
|
+
return;
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
super.addFocusables(views, direction, focusableMode);
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
@Override
|
|
1166
|
+
public void requestChildFocus(View child, View focused) {
|
|
1167
|
+
super.requestChildFocus(child, focused);
|
|
1168
|
+
|
|
1169
|
+
if (autoFocus) {
|
|
1170
|
+
lastFocusedElement = new WeakReference<View>(focused);
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
@Override
|
|
1175
|
+
protected void onFocusChanged(boolean gainFocus, int direction, @Nullable Rect previouslyFocusedRect) {
|
|
1176
|
+
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1020
1179
|
@Override
|
|
1021
1180
|
public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
|
|
1022
|
-
if (
|
|
1181
|
+
if (!isTVFocusGuide() || mRecoverFocus) {
|
|
1023
1182
|
return super.requestFocus(direction, previouslyFocusedRect);
|
|
1024
1183
|
}
|
|
1025
1184
|
|
|
1185
|
+
if (this.autoFocus) {
|
|
1186
|
+
View lastFocusedElem = lastFocusedElement.get();
|
|
1187
|
+
|
|
1188
|
+
if (lastFocusedElem != null) {
|
|
1189
|
+
|
|
1190
|
+
if (lastFocusedElem.isAttachedToWindow()) {
|
|
1191
|
+
lastFocusedElem.requestFocus();
|
|
1192
|
+
return true;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
/**
|
|
1196
|
+
* `lastFocusedElem` can get detached based on application logic.
|
|
1197
|
+
* If the code reaches here, that means we're dealing with that case.
|
|
1198
|
+
* We should set `lastFocusedElem` to null and let the focus determination
|
|
1199
|
+
* logic below to do its magic and redirect focus to the first element.
|
|
1200
|
+
*/
|
|
1201
|
+
lastFocusedElement = new WeakReference<View>(null);
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
// Try moving the focus to the first focusable element otherwise.
|
|
1205
|
+
if (moveFocusToFirstFocusable(this)) {
|
|
1206
|
+
return true;
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1026
1210
|
View destination = findDestinationView();
|
|
1027
1211
|
|
|
1028
1212
|
if (destination != null && requestFocusViewOrAncestor(destination)) {
|
|
@@ -1041,4 +1225,9 @@ public class ReactViewGroup extends ViewGroup
|
|
|
1041
1225
|
public void setFocusDestinations(@NonNull int[] focusDestinations) {
|
|
1042
1226
|
this.focusDestinations = focusDestinations;
|
|
1043
1227
|
}
|
|
1228
|
+
|
|
1229
|
+
public void setAutoFocusTV(boolean autoFocus) {
|
|
1230
|
+
this.autoFocus = autoFocus;
|
|
1231
|
+
lastFocusedElement = new WeakReference<View>(null);
|
|
1232
|
+
}
|
|
1044
1233
|
}
|
|
@@ -369,4 +369,9 @@ public class ReactViewManager extends ReactClippingViewManager<ReactViewGroup> {
|
|
|
369
369
|
view.setFocusDestinations(fd);
|
|
370
370
|
}
|
|
371
371
|
|
|
372
|
+
@ReactProp(name = "autoFocus")
|
|
373
|
+
public void setAutoFocusTV(ReactViewGroup view, boolean autoFocus) {
|
|
374
|
+
view.setAutoFocusTV(autoFocus);
|
|
375
|
+
}
|
|
376
|
+
|
|
372
377
|
}
|
|
@@ -52,6 +52,12 @@ ViewProps::ViewProps(
|
|
|
52
52
|
convertRawProp(context, rawProps, "nextFocusLeft", sourceProps.nextFocusLeft, {})),
|
|
53
53
|
nextFocusRight(
|
|
54
54
|
convertRawProp(context, rawProps, "nextFocusRight", sourceProps.nextFocusRight, {})),
|
|
55
|
+
autoFocus(convertRawProp(
|
|
56
|
+
context,
|
|
57
|
+
rawProps,
|
|
58
|
+
"autoFocus",
|
|
59
|
+
sourceProps.autoFocus,
|
|
60
|
+
(Boolean) false)),
|
|
55
61
|
#endif
|
|
56
62
|
opacity(convertRawProp(
|
|
57
63
|
context,
|
|
@@ -210,7 +216,13 @@ ViewProps::ViewProps(
|
|
|
210
216
|
rawProps,
|
|
211
217
|
"renderToHardwareTextureAndroid",
|
|
212
218
|
sourceProps.renderToHardwareTextureAndroid,
|
|
213
|
-
{}))
|
|
219
|
+
{})),
|
|
220
|
+
autoFocus(convertRawProp(
|
|
221
|
+
context,
|
|
222
|
+
rawProps,
|
|
223
|
+
"autoFocus",
|
|
224
|
+
sourceProps.autoFocus,
|
|
225
|
+
false))
|
|
214
226
|
#endif
|
|
215
227
|
{};
|
|
216
228
|
|
|
@@ -78,6 +78,7 @@ class ViewProps : public YogaStylableProps, public AccessibilityProps {
|
|
|
78
78
|
std::optional<int> nextFocusDown;
|
|
79
79
|
std::optional<int> nextFocusLeft;
|
|
80
80
|
std::optional<int> nextFocusRight;
|
|
81
|
+
bool autoFocus{false};
|
|
81
82
|
#endif
|
|
82
83
|
|
|
83
84
|
Float elevation{}; /* Android-only */
|
|
@@ -91,7 +92,7 @@ class ViewProps : public YogaStylableProps, public AccessibilityProps {
|
|
|
91
92
|
bool hasTVPreferredFocus{false};
|
|
92
93
|
bool needsOffscreenAlphaCompositing{false};
|
|
93
94
|
bool renderToHardwareTextureAndroid{false};
|
|
94
|
-
|
|
95
|
+
bool autoFocus{false};
|
|
95
96
|
#endif
|
|
96
97
|
|
|
97
98
|
#pragma mark - Convenience Methods
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
30e17a3c87b7749bfe1274ecbce32625
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
46136471b2e128b02b6899a6f7077e45411cef86
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cb54ac291bde395af1a3fdf979feb3d6f1c5877f169eb265032cb1538b6be748
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ea55856f042ca2b8bb1b1729ceaafb0911d7d0e7867d81a097bbe19da6a12c23fd0b70f4ae67db67278cc363c20b41739aa2784bb9ea59b41a91b36e607422a9
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
Binary file
|
package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug.aar.md5
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
66de0799def1aeda1e565442acdd59e7
|
package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug.aar.sha1
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
34ca05140514f0e47a0914e94e77ca2b8c16b0a9
|
package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug.aar.sha256
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
070356a04d53ef7606de4b1ad9bec0814b9705a061a882d7ecf3415e804d7ddf
|
package/android/com/facebook/react/hermes-engine/0.69.6-3/hermes-engine-0.69.6-3-debug.aar.sha512
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
a03e1a01e8258b8aeab1543286e21095cf8e7a8bb0b1dd465444615d2051da77625fb7cf381439288899029ea55604d51a949778a3622682a13a5d36b0d5a1db
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
30e17a3c87b7749bfe1274ecbce32625
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
46136471b2e128b02b6899a6f7077e45411cef86
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cb54ac291bde395af1a3fdf979feb3d6f1c5877f169eb265032cb1538b6be748
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ea55856f042ca2b8bb1b1729ceaafb0911d7d0e7867d81a097bbe19da6a12c23fd0b70f4ae67db67278cc363c20b41739aa2784bb9ea59b41a91b36e607422a9
|
|
File without changes
|
|
File without changes
|
|
File without changes
|