uilib-native 3.0.8 → 4.1.0
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/android/build/.transforms/1036eb23730414372a927c528351bc26/transformed/classes/classes.dex +0 -0
- package/android/build/.transforms/2b717ed37126635dfbaa465702275e27/results.bin +1 -0
- package/android/build/.transforms/2b717ed37126635dfbaa465702275e27/transformed/classes/classes.dex +0 -0
- package/android/build/.transforms/416e361a2a5e9e3ad18a35135fbe8f6e/results.bin +1 -0
- package/android/build/.transforms/416e361a2a5e9e3ad18a35135fbe8f6e/transformed/classes/classes.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/results.bin +1 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/BuildConfig.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/UiLibPackageList.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/dynamicfont/DynamicFontModule.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/dynamicfont/DynamicFontPackage.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/highlighterview/HighlightFrame.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/highlighterview/HighlightViewTagParams.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/highlighterview/HighlighterView.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/highlighterview/HighlighterViewManager$1.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/highlighterview/HighlighterViewManager.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/highlighterview/HighlighterViewPackage.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/highlighterview/ReactHacks.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/highlighterview/ReflectionUtils.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/highlighterview/UiUtils.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/AppContextHolder$1.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/AppContextHolder.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$1.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$2.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$3.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$4.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$5.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardRootView.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardRootViewManager.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardRootViewShadow.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/KeyboardInputModule.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/KeyboardInputPackage.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/ReactContextHolder.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/ReactScreenMonitor$1.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/ReactScreenMonitor$Listener.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/ReactScreenMonitor.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor$1.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor$2.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor$Listener.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/utils/PredicateFunc.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils$1.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils$2.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/utils/ViewUtils$1.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/utils/ViewUtils$VisibleViewClassMatchPredicate.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/keyboardinput/utils/ViewUtils.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/textinput/DefaultKeyListener.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/textinput/KeyListenerProxy.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerModule$1.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerModule.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerPackage.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/textinput/ViewUtils.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/utils/LogForwarder$LogType.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/debug/com/wix/reactnativeuilib/utils/LogForwarder.dex +0 -0
- package/android/build/.transforms/628785db81ac3052038232fd7a3a06ac/transformed/desugar_graph.bin +0 -0
- package/android/build/.transforms/dc6c66051bb0a2aed873a6fee209c3de/results.bin +1 -0
- package/android/build/.transforms/dc6c66051bb0a2aed873a6fee209c3de/transformed/classes/classes.dex +0 -0
- package/android/build/.transforms/e497de4b345d0cb0e578424efe3f321c/results.bin +1 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +1 -1
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output-metadata.json +4 -2
- package/android/build/intermediates/aar_metadata/debug/aar-metadata.properties +2 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/R.txt +288 -191
- package/android/build/intermediates/compiled_local_resources/debug/out/layout_wheel_picker.xml.flat +0 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +2 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +7 -0
- package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +1 -1
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +1 -1
- package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +1 -1
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/UiLibPackageList.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/dynamicfont/DynamicFontModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/dynamicfont/DynamicFontPackage.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/highlighterview/HighlightFrame.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/highlighterview/HighlightViewTagParams.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/highlighterview/HighlighterView.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/highlighterview/HighlighterViewManager$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/highlighterview/HighlighterViewManager.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/highlighterview/HighlighterViewPackage.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/highlighterview/ReactHacks.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/highlighterview/ReflectionUtils.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/highlighterview/UiUtils.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/AppContextHolder$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/AppContextHolder.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$3.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$4.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$5.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardRootView.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardRootViewManager.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardRootViewShadow.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/KeyboardInputModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/KeyboardInputPackage.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/ReactContextHolder.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/ReactScreenMonitor$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/ReactScreenMonitor$Listener.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/ReactScreenMonitor.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor$Listener.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/utils/PredicateFunc.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils$2.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/utils/ViewUtils$VisibleViewClassMatchPredicate.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/keyboardinput/utils/ViewUtils.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/textinput/DefaultKeyListener.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/textinput/KeyListenerProxy.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerModule$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerModule.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerPackage.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/textinput/ViewUtils.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/utils/LogForwarder$LogType.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/utils/LogForwarder.class +0 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +3 -3
- package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +1 -1
- package/android/build/intermediates/packaged_manifests/debug/output-metadata.json +4 -2
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/BuildConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/UiLibPackageList.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/dynamicfont/DynamicFontModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/dynamicfont/DynamicFontPackage.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/highlighterview/HighlightFrame.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/highlighterview/HighlightViewTagParams.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/highlighterview/HighlighterView.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/highlighterview/HighlighterViewManager$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/highlighterview/HighlighterViewManager.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/highlighterview/HighlighterViewPackage.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/highlighterview/ReactHacks.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/highlighterview/ReflectionUtils.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/highlighterview/UiUtils.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/AppContextHolder$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/AppContextHolder.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$3.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$4.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout$5.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardLayout.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardRootView.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardRootViewManager.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/CustomKeyboardRootViewShadow.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/KeyboardInputModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/KeyboardInputPackage.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/ReactContextHolder.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/ReactScreenMonitor$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/ReactScreenMonitor$Listener.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/ReactScreenMonitor.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor$Listener.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/ReactSoftKeyboardMonitor.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/utils/PredicateFunc.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils$2.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/utils/ViewUtils$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/utils/ViewUtils$VisibleViewClassMatchPredicate.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/keyboardinput/utils/ViewUtils.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/textinput/DefaultKeyListener.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/textinput/KeyListenerProxy.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerModule$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerPackage.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/textinput/ViewUtils.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/utils/LogForwarder$LogType.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/wix/reactnativeuilib/utils/LogForwarder.class +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +121 -51
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +18 -18
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/src/main/java/com/wix/reactnativeuilib/UiLibPackageList.java +2 -2
- package/android/src/main/java/com/wix/reactnativeuilib/dynamicfont/DynamicFontModule.java +148 -0
- package/android/src/main/java/com/wix/reactnativeuilib/dynamicfont/DynamicFontPackage.java +27 -0
- package/android/src/main/java/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils.java +6 -2
- package/components/DynamicFonts/FontDownloader.ts +135 -0
- package/components/DynamicFonts/FontLoader.ts +120 -0
- package/components/DynamicFonts/PermissionsAcquirer.android.ts +63 -0
- package/components/DynamicFonts/PermissionsAcquirer.ios.ts +9 -0
- package/components/DynamicFonts/index.ts +155 -0
- package/components/HighlighterOverlayView.web.tsx +58 -0
- package/components/Keyboard/KeyboardInput/CustomKeyboardView/index.web.tsx +11 -0
- package/components/Keyboard/KeyboardInput/KeyboardAccessoryView.tsx +1 -12
- package/components/Keyboard/KeyboardInput/keyboardAccessoryView.api.json +4 -3
- package/components/Keyboard/KeyboardInput/keyboardRegistry.api.json +1 -1
- package/components/Keyboard/KeyboardTracking/KeyboardTrackingView/index.web.tsx +11 -0
- package/components/Keyboard/KeyboardTracking/KeyboardTrackingView/keyboardTrackingView.api.json +9 -9
- package/components/Keyboard/KeyboardTracking/keyboardAwareInsetsView.api.json +2 -2
- package/components/SafeArea/SafeAreaSpacerView.web.tsx +14 -0
- package/components/index.ts +2 -3
- package/ios/reactnativeuilib/dynamicfont/DynamicFont.h +9 -0
- package/ios/reactnativeuilib/dynamicfont/DynamicFont.m +114 -0
- package/ios/reactnativeuilib.xcodeproj/project.pbxproj +14 -0
- package/ios/reactnativeuilib.xcodeproj/project.xcworkspace/xcuserdata/michaelle.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/package.json +1 -1
- package/android/build/.transforms/078d1206f8e28097fd785bd635dfbdf6/transformed/classes/classes.dex +0 -0
- package/android/build/intermediates/incremental/packageDebugResources/compile-file-map.properties +0 -2
- package/android/build/intermediates/incremental/packageDebugResources/merger.xml +0 -7
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/wheelpicker/WheelPicker$1.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/wheelpicker/WheelPicker.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/wheelpicker/WheelPickerManager.class +0 -0
- package/android/build/intermediates/javac/debug/classes/com/wix/reactnativeuilib/wheelpicker/WheelPickerPackage.class +0 -0
- package/android/build/tmp/compileDebugJavaWithJavac/source-classes-mapping.txt +0 -83
- package/android/src/main/java/com/wix/reactnativeuilib/wheelpicker/WheelPicker.java +0 -36
- package/android/src/main/java/com/wix/reactnativeuilib/wheelpicker/WheelPickerManager.java +0 -237
- package/android/src/main/java/com/wix/reactnativeuilib/wheelpicker/WheelPickerPackage.java +0 -44
- package/components/WheelPicker/WheelPickerItem.tsx +0 -21
- package/components/WheelPicker/index.tsx +0 -149
- package/ios/reactnativeuilib.xcodeproj/project.xcworkspace/xcuserdata/inbalti.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- /package/android/build/.transforms/{078d1206f8e28097fd785bd635dfbdf6 → 1036eb23730414372a927c528351bc26}/results.bin +0 -0
- /package/android/build/intermediates/incremental/{packageDebugResources → debug/packageDebugResources}/merged.dir/values/values.xml +0 -0
- /package/ios/reactnativeuilib.xcodeproj/xcuserdata/{inbalti.xcuserdatad → michaelle.xcuserdatad}/xcschemes/xcschememanagement.plist +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
package com.wix.reactnativeuilib.dynamicfont;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
4
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
5
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
6
|
+
import com.facebook.react.bridge.Callback;
|
|
7
|
+
import com.facebook.react.bridge.Arguments;
|
|
8
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
9
|
+
import com.facebook.react.bridge.WritableMap;
|
|
10
|
+
import com.facebook.react.views.text.ReactFontManager;
|
|
11
|
+
|
|
12
|
+
import android.app.Activity;
|
|
13
|
+
import android.graphics.Typeface;
|
|
14
|
+
import android.util.Base64;
|
|
15
|
+
|
|
16
|
+
import java.io.File;
|
|
17
|
+
import java.io.FileOutputStream;
|
|
18
|
+
import java.lang.reflect.Field;
|
|
19
|
+
import java.util.ArrayList;
|
|
20
|
+
import java.util.HashMap;
|
|
21
|
+
import java.util.List;
|
|
22
|
+
import java.util.Map;
|
|
23
|
+
import java.util.Set;
|
|
24
|
+
|
|
25
|
+
public class DynamicFontModule extends ReactContextBaseJavaModule {
|
|
26
|
+
int tempNameCounter = 0;
|
|
27
|
+
|
|
28
|
+
private final ReactApplicationContext reactContext;
|
|
29
|
+
|
|
30
|
+
public DynamicFontModule(ReactApplicationContext reactContext) {
|
|
31
|
+
super(reactContext);
|
|
32
|
+
this.reactContext = reactContext;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@Override
|
|
36
|
+
public String getName() {
|
|
37
|
+
return "DynamicFont";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@ReactMethod
|
|
41
|
+
public void loadFontFromFile(final ReadableMap options, final Callback callback) {
|
|
42
|
+
Activity currentActivity = getCurrentActivity();
|
|
43
|
+
if (currentActivity == null) {
|
|
44
|
+
callback.invoke("Invalid activity");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
String filePath = options.hasKey("filePath") ? options.getString("filePath") : null,
|
|
49
|
+
name = (options.hasKey("name")) ? options.getString("name") : null;
|
|
50
|
+
|
|
51
|
+
if (filePath == null || filePath.length() == 0) {
|
|
52
|
+
callback.invoke("filePath property empty");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
File f = new File(filePath);
|
|
57
|
+
|
|
58
|
+
if (f.exists() && f.canRead()) {
|
|
59
|
+
boolean wasLoaded = false;
|
|
60
|
+
try {
|
|
61
|
+
Typeface typeface = Typeface.createFromFile(f);
|
|
62
|
+
//Cache the font for react
|
|
63
|
+
ReactFontManager.getInstance().setTypeface(name, typeface.getStyle(), typeface);
|
|
64
|
+
wasLoaded = true;
|
|
65
|
+
} catch (Throwable e) {
|
|
66
|
+
callback.invoke(e.getMessage());
|
|
67
|
+
} finally {
|
|
68
|
+
if (wasLoaded) {
|
|
69
|
+
callback.invoke(null, name);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
callback.invoke("invalid file");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@ReactMethod
|
|
78
|
+
public void loadFont(final ReadableMap options, final Callback callback) throws Exception {
|
|
79
|
+
Activity currentActivity = getCurrentActivity();
|
|
80
|
+
if (currentActivity == null) {
|
|
81
|
+
callback.invoke("Invalid activity");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
String name = (options.hasKey("name")) ? options.getString("name") : null,
|
|
86
|
+
data = (options.hasKey("data")) ? options.getString("data") : null,
|
|
87
|
+
type = null;
|
|
88
|
+
|
|
89
|
+
if (name == null || name.length() == 0) {
|
|
90
|
+
callback.invoke("Name property empty");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (data == null || data.length() == 0) {
|
|
95
|
+
callback.invoke("Data property empty");
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (("data:").equalsIgnoreCase(data.substring(0, 5))) {
|
|
100
|
+
Integer pos = data.indexOf(',');
|
|
101
|
+
if (pos > 0) {
|
|
102
|
+
String[] encodingParams = data.substring(5, pos).split(";");
|
|
103
|
+
String mimeType = encodingParams[0];
|
|
104
|
+
|
|
105
|
+
data = data.substring(pos + 1);
|
|
106
|
+
|
|
107
|
+
if (("application/x-font-ttf").equalsIgnoreCase(mimeType) ||
|
|
108
|
+
("application/x-font-truetype").equalsIgnoreCase(mimeType) ||
|
|
109
|
+
("font/ttf").equalsIgnoreCase(mimeType)) {
|
|
110
|
+
type = "ttf";
|
|
111
|
+
} else if (("application/x-font-opentype").equalsIgnoreCase(mimeType) ||
|
|
112
|
+
("font/opentype").equalsIgnoreCase(mimeType)) {
|
|
113
|
+
type = "otf";
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (options.hasKey("type"))
|
|
119
|
+
type = options.getString("type");
|
|
120
|
+
|
|
121
|
+
if (type == null)
|
|
122
|
+
type = "ttf";
|
|
123
|
+
|
|
124
|
+
try {
|
|
125
|
+
byte[] decodedBytes = Base64.decode(data, Base64.DEFAULT);
|
|
126
|
+
File cacheFile = new File(currentActivity.getCacheDir(), "tempFont" + (tempNameCounter++) + type);
|
|
127
|
+
|
|
128
|
+
FileOutputStream stream = new FileOutputStream(cacheFile);
|
|
129
|
+
try {
|
|
130
|
+
stream.write(decodedBytes);
|
|
131
|
+
} finally {
|
|
132
|
+
stream.close();
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
//Load the font from the temporary file we just created
|
|
136
|
+
Typeface typeface = Typeface.createFromFile(cacheFile);
|
|
137
|
+
|
|
138
|
+
//Cache the font for react
|
|
139
|
+
ReactFontManager.getInstance().setTypeface(name, typeface.getStyle(), typeface);
|
|
140
|
+
|
|
141
|
+
cacheFile.delete();
|
|
142
|
+
} catch(Exception e) {
|
|
143
|
+
callback.invoke(e.getMessage());
|
|
144
|
+
} finally {
|
|
145
|
+
callback.invoke(null, name);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
package com.wix.reactnativeuilib.dynamicfont;
|
|
2
|
+
|
|
3
|
+
import java.util.Arrays;
|
|
4
|
+
import java.util.Collections;
|
|
5
|
+
import java.util.List;
|
|
6
|
+
|
|
7
|
+
import com.facebook.react.ReactPackage;
|
|
8
|
+
import com.facebook.react.bridge.NativeModule;
|
|
9
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
10
|
+
import com.facebook.react.uimanager.ViewManager;
|
|
11
|
+
import com.facebook.react.bridge.JavaScriptModule;
|
|
12
|
+
public class DynamicFontPackage implements ReactPackage {
|
|
13
|
+
@Override
|
|
14
|
+
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
|
15
|
+
return Arrays.<NativeModule>asList(new DynamicFontModule(reactContext));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Deprecated from RN 0.47
|
|
19
|
+
public List<Class<? extends JavaScriptModule>> createJSModules() {
|
|
20
|
+
return Collections.emptyList();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
|
25
|
+
return Collections.emptyList();
|
|
26
|
+
}
|
|
27
|
+
}
|
package/android/src/main/java/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils.java
CHANGED
|
@@ -14,7 +14,9 @@ public class RuntimeUtils {
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
public static void runOnUIThread(Runnable runnable) {
|
|
17
|
-
ReactContextHolder.getContext()
|
|
17
|
+
if (ReactContextHolder.getContext() != null) {
|
|
18
|
+
ReactContextHolder.getContext().runOnUiQueueThread(runnable);
|
|
19
|
+
}
|
|
18
20
|
}
|
|
19
21
|
|
|
20
22
|
public static void dispatchUIUpdates(final Runnable userRunnable) {
|
|
@@ -22,7 +24,9 @@ public class RuntimeUtils {
|
|
|
22
24
|
@Override
|
|
23
25
|
public void run() {
|
|
24
26
|
userRunnable.run();
|
|
25
|
-
ReactContextHolder.getContext()
|
|
27
|
+
if (ReactContextHolder.getContext() != null) {
|
|
28
|
+
ReactContextHolder.getContext().runOnNativeModulesQueueThread(sUIUpdateClosure);
|
|
29
|
+
}
|
|
26
30
|
}
|
|
27
31
|
});
|
|
28
32
|
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import {Platform} from 'react-native';
|
|
2
|
+
import fs from 'react-native-fs';
|
|
3
|
+
import {FontExtension} from './FontLoader';
|
|
4
|
+
|
|
5
|
+
const DEFAULT_DYNAMIC_FONTS_FOLDER = '/dynamicFonts';
|
|
6
|
+
const DEFAULT_DOWNLOAD_ERROR_MESSAGE = 'An error occurred downloading the file:';
|
|
7
|
+
|
|
8
|
+
export type FontDownloaderProps = {
|
|
9
|
+
/**
|
|
10
|
+
* Should be In the following convention: '/NAME'
|
|
11
|
+
*/
|
|
12
|
+
dynamicFontsFolder?: string;
|
|
13
|
+
downloadErrorMessage?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Enable debug mode to print extra logs
|
|
16
|
+
*/
|
|
17
|
+
debug?: boolean;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// TODO: this can probably be a more general "downloader" if we so choose
|
|
21
|
+
export default class FontDownloader {
|
|
22
|
+
private readonly props: FontDownloaderProps;
|
|
23
|
+
|
|
24
|
+
constructor(props: FontDownloaderProps) {
|
|
25
|
+
this.props = {
|
|
26
|
+
dynamicFontsFolder: DEFAULT_DYNAMIC_FONTS_FOLDER,
|
|
27
|
+
downloadErrorMessage: DEFAULT_DOWNLOAD_ERROR_MESSAGE,
|
|
28
|
+
...props
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private getPrivateFolder() {
|
|
33
|
+
const {dynamicFontsFolder} = this.props;
|
|
34
|
+
return (Platform.OS === 'android' ? fs.ExternalDirectoryPath : fs.DocumentDirectoryPath) + dynamicFontsFolder;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private getPrivateFilePath(fileName: string) {
|
|
38
|
+
return this.getPrivateFolder() + '/' + fileName;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private getFileName(fontName: string, fontExtension: FontExtension) {
|
|
42
|
+
return fontName + '.' + fontExtension;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private async _isFontDownloaded(fileName: string) {
|
|
46
|
+
const privateFilePath = this.getPrivateFilePath(fileName);
|
|
47
|
+
return await fs.exists(privateFilePath);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private async createPrivateFolderIfNeeded() {
|
|
51
|
+
const privateFolder = this.getPrivateFolder();
|
|
52
|
+
if (!(await fs.exists(privateFolder))) {
|
|
53
|
+
await fs.mkdir(privateFolder);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private getDownloadFontOptions(fontUri: string, downloadLocation: string, readTimeout: number) {
|
|
58
|
+
const platformSpecificOptions =
|
|
59
|
+
Platform.OS === 'ios'
|
|
60
|
+
? {
|
|
61
|
+
background: false,
|
|
62
|
+
discretionary: true,
|
|
63
|
+
cacheable: false
|
|
64
|
+
}
|
|
65
|
+
: {
|
|
66
|
+
connectionTimeout: readTimeout
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
fromUrl: fontUri,
|
|
71
|
+
toFile: downloadLocation,
|
|
72
|
+
// TODO: It is possible to add a better progress, maybe for slower networks
|
|
73
|
+
// progress: ({bytesWritten, contentLength}: {bytesWritten: number; contentLength: number}) => {},
|
|
74
|
+
...platformSpecificOptions,
|
|
75
|
+
fileCache: false,
|
|
76
|
+
readTimeout
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Download the font
|
|
82
|
+
* @param fontUri the remote location of the font
|
|
83
|
+
* @param fontName the full name of the font
|
|
84
|
+
* @param fontExtension the extension of the font, i.e. '.ttf' or '.otf'
|
|
85
|
+
* @param timeout a timeout for the download to fail after
|
|
86
|
+
* @returns the full path of the download
|
|
87
|
+
*/
|
|
88
|
+
public async downloadFont(fontUri: string,
|
|
89
|
+
fontName: string,
|
|
90
|
+
fontExtension: FontExtension,
|
|
91
|
+
timeout: number): Promise<string> {
|
|
92
|
+
const {downloadErrorMessage} = this.props;
|
|
93
|
+
await this.createPrivateFolderIfNeeded();
|
|
94
|
+
const fileName = this.getFileName(fontName, fontExtension);
|
|
95
|
+
const downloadLocation = this.getPrivateFilePath(fileName);
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
const result = await fs.downloadFile(this.getDownloadFontOptions(fontUri, downloadLocation, timeout)).promise;
|
|
99
|
+
if (result.statusCode === 200) {
|
|
100
|
+
return downloadLocation;
|
|
101
|
+
} else {
|
|
102
|
+
return Promise.reject({
|
|
103
|
+
source: 'uilib:FontDownloader:downloadFont',
|
|
104
|
+
message: `${downloadErrorMessage} fontName: ${fontName} statusCode: ${result.statusCode}`
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
} catch (error) {
|
|
108
|
+
return Promise.reject({
|
|
109
|
+
source: 'uilib:FontDownloader:downloadFont',
|
|
110
|
+
message: `${downloadErrorMessage} fontName: ${fontName} error: ${error}`
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Is the font cached (already downloaded)
|
|
117
|
+
* @param {*} fontName the full name of the font
|
|
118
|
+
* @param {*} fontExtension the extension of the font, i.e. '.ttf' or '.otf'
|
|
119
|
+
*/
|
|
120
|
+
public async isFontDownloaded(fontName: string, fontExtension: FontExtension): Promise<boolean> {
|
|
121
|
+
const fileName = this.getFileName(fontName, fontExtension);
|
|
122
|
+
return await this._isFontDownloaded(fileName);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
public async readFontFromDisk(fontName: string, fontExtension: FontExtension): Promise<string | void> {
|
|
126
|
+
let base64FontString;
|
|
127
|
+
const fileName = this.getFileName(fontName, fontExtension);
|
|
128
|
+
const privateFilePath = this.getPrivateFilePath(fileName);
|
|
129
|
+
if (await fs.exists(privateFilePath)) {
|
|
130
|
+
base64FontString = await fs.readFile(privateFilePath, 'base64').catch(() => {});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return base64FontString;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {NativeModules} from 'react-native';
|
|
2
|
+
|
|
3
|
+
const {DynamicFont} = NativeModules;
|
|
4
|
+
|
|
5
|
+
export type FontExtension = 'ttf' | 'otf';
|
|
6
|
+
|
|
7
|
+
export type LoadFontInput = {
|
|
8
|
+
/**
|
|
9
|
+
* Specify registered font name (doesn't work for iOS)
|
|
10
|
+
*/
|
|
11
|
+
fontName: string;
|
|
12
|
+
/**
|
|
13
|
+
* This can be a data URI or raw base64...
|
|
14
|
+
* if it is raw base64 type must be specified,
|
|
15
|
+
* but defaults to TTF (data URI mime: font/ttf or font/otf)
|
|
16
|
+
*/
|
|
17
|
+
base64FontString: string;
|
|
18
|
+
/**
|
|
19
|
+
* Specify the type of font in the encoded data (ttf or otf). Defaults to "ttf"
|
|
20
|
+
*/
|
|
21
|
+
fontExtension: FontExtension;
|
|
22
|
+
/**
|
|
23
|
+
* Force the loading of the font even if previously loaded it
|
|
24
|
+
*/
|
|
25
|
+
forceLoad?: boolean;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type FontLoaderProps = {
|
|
29
|
+
/**
|
|
30
|
+
* Enable debug mode to print extra logs
|
|
31
|
+
*/
|
|
32
|
+
debug?: boolean;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export default class FontLoader {
|
|
36
|
+
private readonly props: FontLoaderProps;
|
|
37
|
+
private readonly loadedFonts = new Map<string, string>();
|
|
38
|
+
|
|
39
|
+
constructor(props: FontLoaderProps) {
|
|
40
|
+
this.props = props;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public loadFont = ({
|
|
44
|
+
fontName,
|
|
45
|
+
base64FontString,
|
|
46
|
+
fontExtension = 'ttf',
|
|
47
|
+
forceLoad = false
|
|
48
|
+
}: LoadFontInput): Promise<string> => {
|
|
49
|
+
const {debug} = this.props;
|
|
50
|
+
/* Check if this font was already loaded */
|
|
51
|
+
if (!forceLoad && this.loadedFonts.has(fontName)) {
|
|
52
|
+
if (debug) {
|
|
53
|
+
console.log(fontName, 'Already loaded');
|
|
54
|
+
}
|
|
55
|
+
return Promise.resolve(this.loadedFonts.get(fontName) as string);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (!fontName) {
|
|
59
|
+
throw new Error('fontName is a required argument');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (!base64FontString) {
|
|
63
|
+
throw new Error('base64FontString is a required argument');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (debug) {
|
|
67
|
+
console.log(fontName, 'Starting to load');
|
|
68
|
+
}
|
|
69
|
+
/* Load font via native binary code */
|
|
70
|
+
return new Promise((resolve, reject) => {
|
|
71
|
+
DynamicFont.loadFont({
|
|
72
|
+
name: fontName,
|
|
73
|
+
data: base64FontString,
|
|
74
|
+
type: fontExtension
|
|
75
|
+
},
|
|
76
|
+
(err: string, givenName: string) => {
|
|
77
|
+
if (err) {
|
|
78
|
+
reject(err);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
/* Loaded successfully... resolve promise with "real" font name */
|
|
82
|
+
this.loadedFonts.set(fontName, givenName);
|
|
83
|
+
resolve(givenName);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
public loadFontFromFile = (fontName: string, filePath: string) => {
|
|
89
|
+
if (!fontName) {
|
|
90
|
+
throw new Error('name is a required argument');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!filePath) {
|
|
94
|
+
throw new Error('filePath is a required argument');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
DynamicFont.loadFontFromFile({
|
|
99
|
+
name: fontName,
|
|
100
|
+
filePath
|
|
101
|
+
},
|
|
102
|
+
(err: string, givenName: string) => {
|
|
103
|
+
if (err) {
|
|
104
|
+
reject(err);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
resolve(givenName);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
public loadFonts = (fonts: LoadFontInput | LoadFontInput[], forceLoad?: boolean) => {
|
|
113
|
+
if (!fonts) {
|
|
114
|
+
return Promise.resolve([]);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const fontsArray = fonts instanceof Array ? fonts : [fonts];
|
|
118
|
+
return Promise.all(fontsArray.filter(font => font).map(font => this.loadFont({forceLoad, ...font})));
|
|
119
|
+
};
|
|
120
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {Platform, PermissionsAndroid} from 'react-native';
|
|
2
|
+
const AndroidOsVersion = Platform.OS === 'android' ? Platform.constants.Release : undefined;
|
|
3
|
+
|
|
4
|
+
export type PermissionsAcquirerProps = {
|
|
5
|
+
requestPermissionsTitle?: string;
|
|
6
|
+
requestPermissionsMessage?: string;
|
|
7
|
+
requestPermissionsNegativeButtonText?: string;
|
|
8
|
+
requestPermissionsPositiveButtonText?: string;
|
|
9
|
+
permissionsRefusalMessage?: string;
|
|
10
|
+
permissionsErrorMessage?: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const DEFAULT_PERMISSIONS_ACQUIRER_PROPS: Required<PermissionsAcquirerProps> = {
|
|
14
|
+
requestPermissionsTitle: 'Allow Storage Access',
|
|
15
|
+
requestPermissionsMessage: 'Give the Spaces app permission to access the files and storage on your device.',
|
|
16
|
+
requestPermissionsNegativeButtonText: 'Cancel',
|
|
17
|
+
requestPermissionsPositiveButtonText: 'Continue',
|
|
18
|
+
permissionsRefusalMessage: 'Please edit your permission settings to continue.',
|
|
19
|
+
permissionsErrorMessage: `We weren't able to obtain the required permissions. Please try Again.`
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default class PermissionsAcquirer {
|
|
23
|
+
private readonly props;
|
|
24
|
+
constructor(props: PermissionsAcquirerProps) {
|
|
25
|
+
this.props = props;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public async checkPermissions() {
|
|
29
|
+
return await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public async getPermissions() {
|
|
33
|
+
if ((AndroidOsVersion && Number(AndroidOsVersion) >= 13) || (await this.checkPermissions())) {
|
|
34
|
+
return Promise.resolve();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
const result = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE, {
|
|
39
|
+
title: this.props.requestPermissionsTitle ?? DEFAULT_PERMISSIONS_ACQUIRER_PROPS.requestPermissionsTitle,
|
|
40
|
+
message: this.props.requestPermissionsMessage ?? DEFAULT_PERMISSIONS_ACQUIRER_PROPS.requestPermissionsMessage,
|
|
41
|
+
buttonNegative:
|
|
42
|
+
this.props.requestPermissionsNegativeButtonText ??
|
|
43
|
+
DEFAULT_PERMISSIONS_ACQUIRER_PROPS.requestPermissionsNegativeButtonText,
|
|
44
|
+
buttonPositive:
|
|
45
|
+
this.props.requestPermissionsPositiveButtonText ??
|
|
46
|
+
DEFAULT_PERMISSIONS_ACQUIRER_PROPS.requestPermissionsPositiveButtonText
|
|
47
|
+
});
|
|
48
|
+
if (result === PermissionsAndroid.RESULTS.GRANTED) {
|
|
49
|
+
return Promise.resolve();
|
|
50
|
+
} else {
|
|
51
|
+
return Promise.reject({
|
|
52
|
+
source: 'uilib:FontDownloader:getPermissions',
|
|
53
|
+
message: this.props.permissionsRefusalMessage ?? DEFAULT_PERMISSIONS_ACQUIRER_PROPS.permissionsRefusalMessage
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
} catch (err) {
|
|
57
|
+
return Promise.reject({
|
|
58
|
+
source: 'uilib:FontDownloader:getPermissions',
|
|
59
|
+
message: this.props.permissionsErrorMessage ?? DEFAULT_PERMISSIONS_ACQUIRER_PROPS.permissionsErrorMessage
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import {Platform} from 'react-native';
|
|
2
|
+
import FontLoader, {FontExtension, LoadFontInput} from './FontLoader';
|
|
3
|
+
import FontDownloader, {FontDownloaderProps} from './FontDownloader';
|
|
4
|
+
import PermissionsAcquirerAndroid, {PermissionsAcquirerProps} from './PermissionsAcquirer.android';
|
|
5
|
+
import PermissionsAcquirerIOS from './PermissionsAcquirer.ios';
|
|
6
|
+
const PermissionsAcquirer = Platform.OS === 'android' ? PermissionsAcquirerAndroid : PermissionsAcquirerIOS;
|
|
7
|
+
|
|
8
|
+
const DEFAULT_FONT_LOAD_ERROR_MESSAGE = 'Unable to load this font.';
|
|
9
|
+
|
|
10
|
+
type DynamicFontsProps = {
|
|
11
|
+
fontDownloadingProps?: Omit<FontDownloaderProps, 'debug'>;
|
|
12
|
+
permissionsAcquirerProps?: PermissionsAcquirerProps;
|
|
13
|
+
fontLoadErrorMessage?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Enable debug mode to print extra logs
|
|
16
|
+
*/
|
|
17
|
+
debug?: boolean;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type GetFontInput = {
|
|
21
|
+
/**
|
|
22
|
+
* The uri of the font (to be downloaded from)
|
|
23
|
+
*/
|
|
24
|
+
fontUri: string;
|
|
25
|
+
/**
|
|
26
|
+
* The full name of the font
|
|
27
|
+
*/
|
|
28
|
+
fontName: string;
|
|
29
|
+
/**
|
|
30
|
+
* The extension of the font, i.e. '.ttf' or '.otf'
|
|
31
|
+
*/
|
|
32
|
+
fontExtension: FontExtension;
|
|
33
|
+
/**
|
|
34
|
+
* Milliseconds for the download to complete in (defaults to 5000)
|
|
35
|
+
*/
|
|
36
|
+
timeout?: number;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export {DynamicFontsProps, FontExtension, GetFontInput};
|
|
40
|
+
|
|
41
|
+
export default class DynamicFonts {
|
|
42
|
+
private readonly props: DynamicFontsProps;
|
|
43
|
+
private readonly permissionsAcquirer: InstanceType<typeof PermissionsAcquirer>;
|
|
44
|
+
private readonly fontLoader: InstanceType<typeof FontLoader>;
|
|
45
|
+
private readonly fontDownloader: InstanceType<typeof FontDownloader>;
|
|
46
|
+
|
|
47
|
+
constructor(props: DynamicFontsProps) {
|
|
48
|
+
const {debug} = props;
|
|
49
|
+
this.props = {fontLoadErrorMessage: DEFAULT_FONT_LOAD_ERROR_MESSAGE, ...props};
|
|
50
|
+
this.permissionsAcquirer = new PermissionsAcquirer(this.props.permissionsAcquirerProps ?? {});
|
|
51
|
+
this.fontLoader = new FontLoader({debug});
|
|
52
|
+
const fontDownloadingProps = this.props.fontDownloadingProps ?? {};
|
|
53
|
+
this.fontDownloader = new FontDownloader({...fontDownloadingProps, debug});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private async loadFont(input: LoadFontInput) {
|
|
57
|
+
const {fontLoadErrorMessage} = this.props;
|
|
58
|
+
try {
|
|
59
|
+
return await this.fontLoader.loadFont(input);
|
|
60
|
+
} catch (err) {
|
|
61
|
+
return Promise.reject({
|
|
62
|
+
source: 'uilib:FontDownloader:loadFont',
|
|
63
|
+
message: `${fontLoadErrorMessage} fontName: ${input.fontName}`
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Get font - download from uri (or from cache if already downloaded) and load it to memory
|
|
70
|
+
* You need to handle errors in the form of Promise.reject
|
|
71
|
+
* @param fontUri the uri of the font (to be downloaded from)
|
|
72
|
+
* @param fontName the full name of the font
|
|
73
|
+
* @param fontExtension the extension of the font, i.e. '.ttf' or '.otf'
|
|
74
|
+
* @param timeout milliseconds for the download to complete in (defaults to 5000)
|
|
75
|
+
*/
|
|
76
|
+
public async getFont({fontUri, fontName, fontExtension, timeout = 5000}: GetFontInput): Promise<string> {
|
|
77
|
+
const {debug} = this.props;
|
|
78
|
+
const {fontLoadErrorMessage} = this.props;
|
|
79
|
+
await this.permissionsAcquirer.getPermissions();
|
|
80
|
+
if (await this.fontDownloader.isFontDownloaded(fontName, fontExtension)) {
|
|
81
|
+
if (debug) {
|
|
82
|
+
console.log(fontName, 'Already downloaded');
|
|
83
|
+
}
|
|
84
|
+
} else {
|
|
85
|
+
if (debug) {
|
|
86
|
+
console.log(fontName, 'Starting to download');
|
|
87
|
+
}
|
|
88
|
+
await this.fontDownloader.downloadFont(fontUri, fontName, fontExtension, timeout);
|
|
89
|
+
if (debug) {
|
|
90
|
+
console.log(fontName, 'Finished downloading');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const base64FontString = await this.fontDownloader.readFontFromDisk(fontName, fontExtension);
|
|
95
|
+
if (base64FontString) {
|
|
96
|
+
if (debug) {
|
|
97
|
+
console.log(fontName, 'Loading');
|
|
98
|
+
}
|
|
99
|
+
const _fontName = await this.loadFont({fontName, base64FontString, fontExtension});
|
|
100
|
+
if (debug) {
|
|
101
|
+
console.log(_fontName, 'Finished loading');
|
|
102
|
+
}
|
|
103
|
+
return Promise.resolve(_fontName);
|
|
104
|
+
} else {
|
|
105
|
+
return Promise.reject({
|
|
106
|
+
source: 'uilib:FontDownloader:getFont',
|
|
107
|
+
message: `${fontLoadErrorMessage} fontName: ${fontName}`
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public async getFonts(fonts: GetFontInput | GetFontInput[]): Promise<string[]> {
|
|
113
|
+
await this.permissionsAcquirer.getPermissions();
|
|
114
|
+
if (fonts instanceof Array) {
|
|
115
|
+
return Promise.all(fonts.filter(font => font).map(font => this.getFont(font)));
|
|
116
|
+
} else {
|
|
117
|
+
return Promise.resolve([await this.getFont(fonts)]);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private buildFontName(rootUri: string,
|
|
122
|
+
fontName: string,
|
|
123
|
+
fontExtension: FontExtension,
|
|
124
|
+
fontNamePrefix?: string): GetFontInput {
|
|
125
|
+
const _fontName = `${fontNamePrefix ?? ''}${fontName}`;
|
|
126
|
+
const fullFontName = `${_fontName}.${fontExtension}`;
|
|
127
|
+
return {fontUri: `${rootUri}${fullFontName}`, fontName: _fontName, fontExtension};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// eslint-disable-next-line max-params
|
|
131
|
+
public async getFontFamily(rootUri: string,
|
|
132
|
+
fontNames: string[],
|
|
133
|
+
fontExtension: FontExtension,
|
|
134
|
+
fontNamePrefix?: string,
|
|
135
|
+
retries = 1): Promise<string[]> {
|
|
136
|
+
const {debug} = this.props;
|
|
137
|
+
const fonts: GetFontInput[] = fontNames.map(fontName =>
|
|
138
|
+
this.buildFontName(rootUri, fontName, fontExtension, fontNamePrefix));
|
|
139
|
+
let fontsLoaded: string[] = [];
|
|
140
|
+
let tryCounter = 0;
|
|
141
|
+
while (fontsLoaded.length < fontNames.length && tryCounter < retries) {
|
|
142
|
+
try {
|
|
143
|
+
++tryCounter;
|
|
144
|
+
// TODO: we should return successful loaded fonts and not fail all of them
|
|
145
|
+
fontsLoaded = await this.getFonts(fonts);
|
|
146
|
+
} catch (error) {
|
|
147
|
+
if (debug) {
|
|
148
|
+
console.log(`getFontFamily failed (try #${tryCounter}) error: ${error}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return Promise.resolve(fontsLoaded);
|
|
154
|
+
}
|
|
155
|
+
}
|