pythonnative 0.40.0__cp313-cp313-win_amd64.whl
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.
- pythonnative/__init__.py +411 -0
- pythonnative/_ios_log.py +92 -0
- pythonnative/_yoga.cp313-win_amd64.pyd +0 -0
- pythonnative/alerts.py +236 -0
- pythonnative/animated.py +1687 -0
- pythonnative/animation_graph.py +78 -0
- pythonnative/appearance.py +124 -0
- pythonnative/bootstrap.py +100 -0
- pythonnative/bridge/__init__.py +302 -0
- pythonnative/bridge/android.py +78 -0
- pythonnative/bridge/codec.py +170 -0
- pythonnative/bridge/commits.py +114 -0
- pythonnative/bridge/fake.py +243 -0
- pythonnative/bridge/ios.py +138 -0
- pythonnative/bridge/web.py +489 -0
- pythonnative/cli/__init__.py +7 -0
- pythonnative/cli/pn.py +1214 -0
- pythonnative/component.py +271 -0
- pythonnative/components/__init__.py +111 -0
- pythonnative/components/_base.py +166 -0
- pythonnative/components/controls.py +521 -0
- pythonnative/components/layout.py +518 -0
- pythonnative/components/lists.py +785 -0
- pythonnative/components/media.py +204 -0
- pythonnative/components/overlays.py +107 -0
- pythonnative/components/pressable.py +252 -0
- pythonnative/components/structural.py +167 -0
- pythonnative/components/text.py +291 -0
- pythonnative/devclient.py +824 -0
- pythonnative/devserver/__init__.py +34 -0
- pythonnative/devserver/server.py +718 -0
- pythonnative/devserver/static/animation_graph.js +82 -0
- pythonnative/devserver/static/bridge.js +147 -0
- pythonnative/devserver/static/colors.js +70 -0
- pythonnative/devserver/static/host.js +552 -0
- pythonnative/devserver/static/index.html +60 -0
- pythonnative/devserver/static/layout.js +85 -0
- pythonnative/devserver/static/preview.css +415 -0
- pythonnative/devserver/static/renderer.js +1994 -0
- pythonnative/devserver/static/shell.js +345 -0
- pythonnative/devserver/static/yoga/LICENSE +21 -0
- pythonnative/devserver/static/yoga/binaries/yoga-wasm-base64-esm.js +75 -0
- pythonnative/devserver/static/yoga/src/generated/YGEnums.d.ts +189 -0
- pythonnative/devserver/static/yoga/src/generated/YGEnums.js +211 -0
- pythonnative/devserver/static/yoga/src/generated/YGEnums.js.map +1 -0
- pythonnative/devserver/static/yoga/src/index.d.ts +12 -0
- pythonnative/devserver/static/yoga/src/index.js +16 -0
- pythonnative/devserver/static/yoga/src/index.js.map +1 -0
- pythonnative/devserver/static/yoga/src/load.d.ts +11 -0
- pythonnative/devserver/static/yoga/src/load.js +17 -0
- pythonnative/devserver/static/yoga/src/load.js.map +1 -0
- pythonnative/devserver/static/yoga/src/wrapAssembly.d.ts +155 -0
- pythonnative/devserver/static/yoga/src/wrapAssembly.js +125 -0
- pythonnative/devserver/static/yoga/src/wrapAssembly.js.map +1 -0
- pythonnative/devserver/watcher.py +267 -0
- pythonnative/devserver/ws.py +421 -0
- pythonnative/diagnostics.py +241 -0
- pythonnative/element.py +159 -0
- pythonnative/equality.py +19 -0
- pythonnative/events.py +231 -0
- pythonnative/gestures.py +1333 -0
- pythonnative/hooks.py +1621 -0
- pythonnative/hosts/__init__.py +63 -0
- pythonnative/hosts/base.py +596 -0
- pythonnative/hosts/native.py +302 -0
- pythonnative/hot_reload.py +585 -0
- pythonnative/layout.py +328 -0
- pythonnative/mutations.py +142 -0
- pythonnative/native/android/build.gradle +52 -0
- pythonnative/native/android/gradle.properties +3 -0
- pythonnative/native/android/settings.gradle +12 -0
- pythonnative/native/android/src/main/AndroidManifest.xml +11 -0
- pythonnative/native/android/src/main/cpp/CMakeLists.txt +9 -0
- pythonnative/native/android/src/main/cpp/yoga_jni.cpp +52 -0
- pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeModules.kt +5 -0
- pythonnative/native/android/src/main/java/com/pythonnative/generated/NativeProps.kt +3705 -0
- pythonnative/native/android/src/main/java/com/pythonnative/generated/PNContracts.kt +129 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/PNBridge.kt +261 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/PythonHost.kt +20 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationGraph.kt +108 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/AnimationSpecs.kt +141 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/animation/PNAnimator.kt +257 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/CommitState.kt +106 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/JsonUtil.kt +175 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/MainThread.kt +40 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNLog.kt +33 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNRegistry.kt +82 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/PNTransaction.kt +80 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/TransactionApplier.kt +117 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/bridge/ViewRegistry.kt +74 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/BuiltinComponents.kt +37 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ButtonManager.kt +32 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ComponentManager.kt +213 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ContainerManagers.kt +69 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ControlManagers.kt +186 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/DatePickerManager.kt +123 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageLoader.kt +141 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ImageManager.kt +162 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ModalManager.kt +134 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PNColor.kt +201 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PickerManager.kt +86 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PortalManager.kt +55 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/PressableManager.kt +122 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScreenStackManager.kt +110 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ScrollViewManager.kt +214 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/SegmentedControlManager.kt +113 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/StatusBarManager.kt +52 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TabBarManager.kt +131 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextInputManager.kt +250 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/TextManager.kt +233 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/ViewStyler.kt +355 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/VirtualListManager.kt +159 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/components/WebViewManager.kt +149 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureArbiter.kt +233 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureCoordinator.kt +127 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/gestures/GestureRecognizers.kt +527 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/NativeLayout.kt +145 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/layout/YogaNode.kt +29 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/BuiltinModules.kt +73 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/DeviceModules.kt +316 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/HostModule.kt +61 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/MediaModules.kt +200 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NativeModule.kt +158 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/NotificationsModule.kt +100 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/PermissionsModule.kt +99 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/StorageModules.kt +89 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/modules/SystemModules.kt +178 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/plugins/GeneratedPlugins.kt +16 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/PNScreenFragment.kt +188 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/screens/ScreenRegistry.kt +80 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNAccessibilityDelegate.kt +48 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNBorderDrawable.kt +76 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNEditText.kt +18 -0
- pythonnative/native/android/src/main/java/com/pythonnative/runtime/views/PNFrameLayout.kt +49 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/AnimationSpecsTest.kt +75 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/GestureArbiterTest.kt +197 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNColorTest.kt +47 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/PNTransactionTest.kt +78 -0
- pythonnative/native/android/src/test/java/com/pythonnative/runtime/PromiseTest.kt +89 -0
- pythonnative/native/ios/Package.swift +23 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimationGraph.swift +199 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Animation/PNAnimator.swift +312 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNBridge.swift +255 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNCommit.swift +104 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNRegistry.swift +142 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNTransaction.swift +166 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Bridge/PNViewRegistry.swift +53 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNButtonManagers.swift +207 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNColor.swift +173 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNComponentManager.swift +183 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNContainerView.swift +56 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNControlManagers.swift +281 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNImageManager.swift +222 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNOverlayManagers.swift +243 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNPressableManager.swift +114 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScreenStackManager.swift +107 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNScrollViewManager.swift +197 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTabBarManager.swift +106 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextInputManager.swift +297 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTextManager.swift +230 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNTransform.swift +82 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewManager.swift +86 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewState.swift +87 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNViewStyler.swift +340 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNVirtualListManager.swift +155 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Components/PNWebViewManager.swift +124 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeModules.swift +1 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Generated/NativeProps.swift +3775 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Generated/PNContracts.swift +46 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Gestures/PNGestureCoordinator.swift +260 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Layout/PNLayout.swift +173 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/AlertModule.swift +92 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/HostModule.swift +80 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/LifecycleModules.swift +174 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/MediaModules.swift +177 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/PNNativeModule.swift +168 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/PermissionModules.swift +266 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Modules/SystemModules.swift +251 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Plugins/PNPluginRegistration.swift +8 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNScreenRegistry.swift +46 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Screens/PNViewController.swift +237 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNCompat.swift +46 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNJSON.swift +173 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNLog.swift +47 -0
- pythonnative/native/ios/Sources/PythonNativeKit/Support/PNWindow.swift +51 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNAnimationGraphTests.swift +26 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNColorTests.swift +50 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNCommitTests.swift +86 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNGestureTests.swift +101 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNManagerTests.swift +126 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNModuleTests.swift +111 -0
- pythonnative/native/ios/Tests/PythonNativeKitTests/PNTransactionTests.swift +91 -0
- pythonnative/native/yoga/LICENSE +21 -0
- pythonnative/native/yoga/Package.swift +9 -0
- pythonnative/native/yoga/VENDORED.md +2 -0
- pythonnative/native/yoga/include/PNStyle.h +10 -0
- pythonnative/native/yoga/include/module.modulemap +5 -0
- pythonnative/native/yoga/include/yoga/YGConfig.h +158 -0
- pythonnative/native/yoga/include/yoga/YGEnums.h +142 -0
- pythonnative/native/yoga/include/yoga/YGMacros.h +99 -0
- pythonnative/native/yoga/include/yoga/YGNode.h +304 -0
- pythonnative/native/yoga/include/yoga/YGNodeLayout.h +35 -0
- pythonnative/native/yoga/include/yoga/YGNodeStyle.h +130 -0
- pythonnative/native/yoga/include/yoga/YGPixelGrid.h +29 -0
- pythonnative/native/yoga/include/yoga/YGValue.h +84 -0
- pythonnative/native/yoga/include/yoga/Yoga.h +21 -0
- pythonnative/native/yoga/python.cpp +16 -0
- pythonnative/native/yoga/style.cpp +272 -0
- pythonnative/native/yoga/yoga/CMakeLists.txt +41 -0
- pythonnative/native/yoga/yoga/YGConfig.cpp +92 -0
- pythonnative/native/yoga/yoga/YGConfig.h +158 -0
- pythonnative/native/yoga/yoga/YGEnums.cpp +262 -0
- pythonnative/native/yoga/yoga/YGEnums.h +142 -0
- pythonnative/native/yoga/yoga/YGMacros.h +99 -0
- pythonnative/native/yoga/yoga/YGNode.cpp +366 -0
- pythonnative/native/yoga/yoga/YGNode.h +304 -0
- pythonnative/native/yoga/yoga/YGNodeLayout.cpp +92 -0
- pythonnative/native/yoga/yoga/YGNodeLayout.h +35 -0
- pythonnative/native/yoga/yoga/YGNodeStyle.cpp +405 -0
- pythonnative/native/yoga/yoga/YGNodeStyle.h +130 -0
- pythonnative/native/yoga/yoga/YGPixelGrid.cpp +22 -0
- pythonnative/native/yoga/yoga/YGPixelGrid.h +29 -0
- pythonnative/native/yoga/yoga/YGValue.cpp +20 -0
- pythonnative/native/yoga/yoga/YGValue.h +84 -0
- pythonnative/native/yoga/yoga/Yoga.h +21 -0
- pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.cpp +563 -0
- pythonnative/native/yoga/yoga/algorithm/AbsoluteLayout.h +41 -0
- pythonnative/native/yoga/yoga/algorithm/Align.h +72 -0
- pythonnative/native/yoga/yoga/algorithm/Baseline.cpp +78 -0
- pythonnative/native/yoga/yoga/algorithm/Baseline.h +21 -0
- pythonnative/native/yoga/yoga/algorithm/BoundAxis.h +79 -0
- pythonnative/native/yoga/yoga/algorithm/Cache.cpp +121 -0
- pythonnative/native/yoga/yoga/algorithm/Cache.h +30 -0
- pythonnative/native/yoga/yoga/algorithm/CalculateLayout.cpp +2428 -0
- pythonnative/native/yoga/yoga/algorithm/CalculateLayout.h +38 -0
- pythonnative/native/yoga/yoga/algorithm/FlexDirection.h +120 -0
- pythonnative/native/yoga/yoga/algorithm/FlexLine.cpp +124 -0
- pythonnative/native/yoga/yoga/algorithm/FlexLine.h +75 -0
- pythonnative/native/yoga/yoga/algorithm/PixelGrid.cpp +132 -0
- pythonnative/native/yoga/yoga/algorithm/PixelGrid.h +29 -0
- pythonnative/native/yoga/yoga/algorithm/SizingMode.h +73 -0
- pythonnative/native/yoga/yoga/algorithm/TrailingPosition.h +44 -0
- pythonnative/native/yoga/yoga/config/Config.cpp +135 -0
- pythonnative/native/yoga/yoga/config/Config.h +92 -0
- pythonnative/native/yoga/yoga/debug/AssertFatal.cpp +53 -0
- pythonnative/native/yoga/yoga/debug/AssertFatal.h +29 -0
- pythonnative/native/yoga/yoga/debug/Log.cpp +107 -0
- pythonnative/native/yoga/yoga/debug/Log.h +34 -0
- pythonnative/native/yoga/yoga/enums/Align.h +47 -0
- pythonnative/native/yoga/yoga/enums/BoxSizing.h +40 -0
- pythonnative/native/yoga/yoga/enums/Dimension.h +40 -0
- pythonnative/native/yoga/yoga/enums/Direction.h +41 -0
- pythonnative/native/yoga/yoga/enums/Display.h +41 -0
- pythonnative/native/yoga/yoga/enums/Edge.h +47 -0
- pythonnative/native/yoga/yoga/enums/Errata.h +41 -0
- pythonnative/native/yoga/yoga/enums/ExperimentalFeature.h +39 -0
- pythonnative/native/yoga/yoga/enums/FlexDirection.h +42 -0
- pythonnative/native/yoga/yoga/enums/Gutter.h +41 -0
- pythonnative/native/yoga/yoga/enums/Justify.h +44 -0
- pythonnative/native/yoga/yoga/enums/LogLevel.h +44 -0
- pythonnative/native/yoga/yoga/enums/MeasureMode.h +41 -0
- pythonnative/native/yoga/yoga/enums/NodeType.h +40 -0
- pythonnative/native/yoga/yoga/enums/Overflow.h +41 -0
- pythonnative/native/yoga/yoga/enums/PhysicalEdge.h +21 -0
- pythonnative/native/yoga/yoga/enums/PositionType.h +41 -0
- pythonnative/native/yoga/yoga/enums/Unit.h +42 -0
- pythonnative/native/yoga/yoga/enums/Wrap.h +41 -0
- pythonnative/native/yoga/yoga/enums/YogaEnums.h +85 -0
- pythonnative/native/yoga/yoga/event/event.cpp +87 -0
- pythonnative/native/yoga/yoga/event/event.h +130 -0
- pythonnative/native/yoga/yoga/module.modulemap +21 -0
- pythonnative/native/yoga/yoga/node/CachedMeasurement.h +53 -0
- pythonnative/native/yoga/yoga/node/LayoutResults.cpp +48 -0
- pythonnative/native/yoga/yoga/node/LayoutResults.h +122 -0
- pythonnative/native/yoga/yoga/node/LayoutableChildren.h +148 -0
- pythonnative/native/yoga/yoga/node/Node.cpp +443 -0
- pythonnative/native/yoga/yoga/node/Node.h +337 -0
- pythonnative/native/yoga/yoga/numeric/Comparison.h +81 -0
- pythonnative/native/yoga/yoga/numeric/FloatOptional.h +93 -0
- pythonnative/native/yoga/yoga/style/SmallValueBuffer.h +133 -0
- pythonnative/native/yoga/yoga/style/Style.h +757 -0
- pythonnative/native/yoga/yoga/style/StyleLength.h +107 -0
- pythonnative/native/yoga/yoga/style/StyleValueHandle.h +98 -0
- pythonnative/native/yoga/yoga/style/StyleValuePool.h +127 -0
- pythonnative/native_modules/__init__.py +124 -0
- pythonnative/native_modules/app_state.py +99 -0
- pythonnative/native_modules/battery.py +75 -0
- pythonnative/native_modules/biometrics.py +42 -0
- pythonnative/native_modules/camera.py +65 -0
- pythonnative/native_modules/clipboard.py +46 -0
- pythonnative/native_modules/fallback.py +324 -0
- pythonnative/native_modules/file_system.py +145 -0
- pythonnative/native_modules/haptics.py +75 -0
- pythonnative/native_modules/linking.py +123 -0
- pythonnative/native_modules/location.py +75 -0
- pythonnative/native_modules/net_info.py +112 -0
- pythonnative/native_modules/notifications.py +129 -0
- pythonnative/native_modules/permissions.py +108 -0
- pythonnative/native_modules/registry.py +526 -0
- pythonnative/native_modules/secure_store.py +52 -0
- pythonnative/native_modules/share.py +51 -0
- pythonnative/native_views/__init__.py +375 -0
- pythonnative/native_views/base.py +316 -0
- pythonnative/native_views/bridge_backend.py +277 -0
- pythonnative/navigation/__init__.py +103 -0
- pythonnative/navigation/container.py +154 -0
- pythonnative/navigation/handle.py +540 -0
- pythonnative/navigation/hooks.py +133 -0
- pythonnative/navigation/host.py +58 -0
- pythonnative/navigation/linking.py +200 -0
- pythonnative/navigation/navigators.py +659 -0
- pythonnative/navigation/screen.py +149 -0
- pythonnative/navigation/state.py +269 -0
- pythonnative/net.py +248 -0
- pythonnative/platform.py +166 -0
- pythonnative/platform_metrics.py +252 -0
- pythonnative/preview.py +287 -0
- pythonnative/profiling.py +101 -0
- pythonnative/project/__init__.py +68 -0
- pythonnative/project/android.py +557 -0
- pythonnative/project/builder.py +817 -0
- pythonnative/project/config.py +773 -0
- pythonnative/project/deps.py +719 -0
- pythonnative/project/devices.py +304 -0
- pythonnative/project/doctor.py +283 -0
- pythonnative/project/fingerprint.py +171 -0
- pythonnative/project/icons.py +247 -0
- pythonnative/project/ios.py +325 -0
- pythonnative/project/lockfile.py +100 -0
- pythonnative/project/permissions.py +361 -0
- pythonnative/project/plugins.py +519 -0
- pythonnative/project/runtime_assets.py +183 -0
- pythonnative/py.typed +0 -0
- pythonnative/query.py +153 -0
- pythonnative/reconciler/__init__.py +29 -0
- pythonnative/reconciler/boundaries.py +375 -0
- pythonnative/reconciler/children.py +88 -0
- pythonnative/reconciler/core.py +1165 -0
- pythonnative/reconciler/layout_pass.py +393 -0
- pythonnative/reconciler/vnode.py +266 -0
- pythonnative/refresh.py +55 -0
- pythonnative/runtime.py +306 -0
- pythonnative/scheduler.py +159 -0
- pythonnative/sdk/__init__.py +153 -0
- pythonnative/sdk/_components.py +427 -0
- pythonnative/sdk/builtins.py +91 -0
- pythonnative/sdk/codegen.py +149 -0
- pythonnative/sdk/module_codegen.py +184 -0
- pythonnative/sdk/schema.py +224 -0
- pythonnative/sdk/templates/contracts.kt +46 -0
- pythonnative/sdk/templates/contracts.swift +46 -0
- pythonnative/storage.py +184 -0
- pythonnative/style.py +841 -0
- pythonnative/suspense.py +183 -0
- pythonnative/templates/android_template/app/build.gradle +75 -0
- pythonnative/templates/android_template/app/proguard-rules.pro +21 -0
- pythonnative/templates/android_template/app/src/androidTest/java/com/pythonnative/android_template/ExampleInstrumentedTest.kt +24 -0
- pythonnative/templates/android_template/app/src/debug/AndroidManifest.xml +7 -0
- pythonnative/templates/android_template/app/src/main/AndroidManifest.xml +32 -0
- pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/MainActivity.kt +130 -0
- pythonnative/templates/android_template/app/src/main/java/com/pythonnative/android_template/ScreenFragment.kt +13 -0
- pythonnative/templates/android_template/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
- pythonnative/templates/android_template/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +30 -0
- pythonnative/templates/android_template/app/src/main/res/layout/activity_main.xml +10 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +6 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +6 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
- pythonnative/templates/android_template/app/src/main/res/navigation/nav_graph.xml +22 -0
- pythonnative/templates/android_template/app/src/main/res/values/colors.xml +5 -0
- pythonnative/templates/android_template/app/src/main/res/values/strings.xml +5 -0
- pythonnative/templates/android_template/app/src/main/res/values/themes.xml +9 -0
- pythonnative/templates/android_template/app/src/main/res/values-night/themes.xml +7 -0
- pythonnative/templates/android_template/app/src/main/res/xml/backup_rules.xml +13 -0
- pythonnative/templates/android_template/app/src/main/res/xml/data_extraction_rules.xml +19 -0
- pythonnative/templates/android_template/app/src/test/java/com/pythonnative/android_template/ExampleUnitTest.kt +17 -0
- pythonnative/templates/android_template/build.gradle +10 -0
- pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.jar +0 -0
- pythonnative/templates/android_template/gradle/wrapper/gradle-wrapper.properties +6 -0
- pythonnative/templates/android_template/gradle.properties +23 -0
- pythonnative/templates/android_template/gradlew +185 -0
- pythonnative/templates/android_template/gradlew.bat +89 -0
- pythonnative/templates/android_template/settings.gradle +17 -0
- pythonnative/templates/ios_template/ios_template/AppDelegate.swift +51 -0
- pythonnative/templates/ios_template/ios_template/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
- pythonnative/templates/ios_template/ios_template/Assets.xcassets/AppIcon.appiconset/Contents.json +13 -0
- pythonnative/templates/ios_template/ios_template/Assets.xcassets/Contents.json +6 -0
- pythonnative/templates/ios_template/ios_template/Base.lproj/LaunchScreen.storyboard +25 -0
- pythonnative/templates/ios_template/ios_template/BridgingHeader.h +14 -0
- pythonnative/templates/ios_template/ios_template/Info.plist +28 -0
- pythonnative/templates/ios_template/ios_template/PythonRuntime.swift +390 -0
- pythonnative/templates/ios_template/ios_template/SceneDelegate.swift +61 -0
- pythonnative/templates/ios_template/ios_template/ViewController.swift +23 -0
- pythonnative/templates/ios_template/ios_template.xcodeproj/project.pbxproj +745 -0
- pythonnative/templates/ios_template/ios_template.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- pythonnative/templates/ios_template/ios_templateTests/ios_templateTests.swift +36 -0
- pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITests.swift +41 -0
- pythonnative/templates/ios_template/ios_templateUITests/ios_templateUITestsLaunchTests.swift +32 -0
- pythonnative/testing/__init__.py +53 -0
- pythonnative/testing/backend.py +276 -0
- pythonnative/testing/harness.py +369 -0
- pythonnative/utils.py +145 -0
- pythonnative-0.40.0.dist-info/DELVEWHEEL +2 -0
- pythonnative-0.40.0.dist-info/METADATA +150 -0
- pythonnative-0.40.0.dist-info/RECORD +418 -0
- pythonnative-0.40.0.dist-info/WHEEL +5 -0
- pythonnative-0.40.0.dist-info/entry_points.txt +2 -0
- pythonnative-0.40.0.dist-info/licenses/LICENSE +21 -0
- pythonnative-0.40.0.dist-info/top_level.txt +1 -0
- pythonnative.libs/msvcp140-a4c2229bdc2a2a630acdc095b4d86008.dll +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <yoga/enums/Unit.h>
|
|
11
|
+
#include <yoga/numeric/FloatOptional.h>
|
|
12
|
+
|
|
13
|
+
namespace facebook::yoga {
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Style::Length represents a CSS Value which may be one of:
|
|
17
|
+
* 1. Undefined
|
|
18
|
+
* 2. A keyword (e.g. auto)
|
|
19
|
+
* 3. A CSS <length-percentage> value:
|
|
20
|
+
* a. <length> value (e.g. 10px)
|
|
21
|
+
* b. <percentage> value of a reference <length>
|
|
22
|
+
* 4. (soon) A math function which returns a <length-percentage> value
|
|
23
|
+
*
|
|
24
|
+
* References:
|
|
25
|
+
* 1. https://www.w3.org/TR/css-values-4/#lengths
|
|
26
|
+
* 2. https://www.w3.org/TR/css-values-4/#percentage-value
|
|
27
|
+
* 3. https://www.w3.org/TR/css-values-4/#mixed-percentages
|
|
28
|
+
* 4. https://www.w3.org/TR/css-values-4/#math
|
|
29
|
+
*/
|
|
30
|
+
class StyleLength {
|
|
31
|
+
public:
|
|
32
|
+
constexpr StyleLength() = default;
|
|
33
|
+
|
|
34
|
+
constexpr static StyleLength points(float value) {
|
|
35
|
+
return yoga::isUndefined(value) || yoga::isinf(value)
|
|
36
|
+
? undefined()
|
|
37
|
+
: StyleLength{FloatOptional{value}, Unit::Point};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
constexpr static StyleLength percent(float value) {
|
|
41
|
+
return yoga::isUndefined(value) || yoga::isinf(value)
|
|
42
|
+
? undefined()
|
|
43
|
+
: StyleLength{FloatOptional{value}, Unit::Percent};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
constexpr static StyleLength ofAuto() {
|
|
47
|
+
return StyleLength{{}, Unit::Auto};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
constexpr static StyleLength undefined() {
|
|
51
|
+
return StyleLength{{}, Unit::Undefined};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
constexpr bool isAuto() const {
|
|
55
|
+
return unit_ == Unit::Auto;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
constexpr bool isUndefined() const {
|
|
59
|
+
return unit_ == Unit::Undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
constexpr bool isDefined() const {
|
|
63
|
+
return !isUndefined();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
constexpr FloatOptional value() const {
|
|
67
|
+
return value_;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
constexpr Unit unit() const {
|
|
71
|
+
return unit_;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
constexpr FloatOptional resolve(float referenceLength) {
|
|
75
|
+
switch (unit_) {
|
|
76
|
+
case Unit::Point:
|
|
77
|
+
return value_;
|
|
78
|
+
case Unit::Percent:
|
|
79
|
+
return FloatOptional{value_.unwrap() * referenceLength * 0.01f};
|
|
80
|
+
default:
|
|
81
|
+
return FloatOptional{};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
explicit constexpr operator YGValue() const {
|
|
86
|
+
return YGValue{value_.unwrap(), unscopedEnum(unit_)};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
constexpr bool operator==(const StyleLength& rhs) const {
|
|
90
|
+
return value_ == rhs.value_ && unit_ == rhs.unit_;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private:
|
|
94
|
+
// We intentionally do not allow direct construction using value and unit, to
|
|
95
|
+
// avoid invalid, or redundant combinations.
|
|
96
|
+
constexpr StyleLength(FloatOptional value, Unit unit)
|
|
97
|
+
: value_(value), unit_(unit) {}
|
|
98
|
+
|
|
99
|
+
FloatOptional value_{};
|
|
100
|
+
Unit unit_{Unit::Undefined};
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
inline bool inexactEquals(const StyleLength& a, const StyleLength& b) {
|
|
104
|
+
return a.unit() == b.unit() && inexactEquals(a.value(), b.value());
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
} // namespace facebook::yoga
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <cstdint>
|
|
11
|
+
|
|
12
|
+
#include <yoga/Yoga.h>
|
|
13
|
+
|
|
14
|
+
#include <yoga/numeric/FloatOptional.h>
|
|
15
|
+
#include <yoga/style/SmallValueBuffer.h>
|
|
16
|
+
#include <yoga/style/StyleLength.h>
|
|
17
|
+
|
|
18
|
+
namespace facebook::yoga {
|
|
19
|
+
|
|
20
|
+
#pragma pack(push)
|
|
21
|
+
#pragma pack(1)
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* StyleValueHandle is a small (16-bit) handle to a length or number in a style.
|
|
25
|
+
* The value may be embedded directly in the handle if simple, or the handle may
|
|
26
|
+
* instead point to an index within a StyleValuePool.
|
|
27
|
+
*
|
|
28
|
+
* To read or write a value from a StyleValueHandle, use
|
|
29
|
+
* `StyleValuePool::store()`, and `StyleValuePool::getLength()`/
|
|
30
|
+
* `StyleValuePool::getNumber()`.
|
|
31
|
+
*/
|
|
32
|
+
class StyleValueHandle {
|
|
33
|
+
public:
|
|
34
|
+
static constexpr StyleValueHandle ofAuto() {
|
|
35
|
+
StyleValueHandle handle;
|
|
36
|
+
handle.setType(Type::Auto);
|
|
37
|
+
return handle;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
constexpr bool isUndefined() const {
|
|
41
|
+
return type() == Type::Undefined;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
constexpr bool isDefined() const {
|
|
45
|
+
return !isUndefined();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
constexpr bool isAuto() const {
|
|
49
|
+
return type() == Type::Auto;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private:
|
|
53
|
+
friend class StyleValuePool;
|
|
54
|
+
|
|
55
|
+
static constexpr uint16_t kHandleTypeMask = 0b0000'0000'0000'0111;
|
|
56
|
+
static constexpr uint16_t kHandleIndexedMask = 0b0000'0000'0000'1000;
|
|
57
|
+
static constexpr uint16_t kHandleValueMask = 0b1111'1111'1111'0000;
|
|
58
|
+
|
|
59
|
+
enum class Type : uint8_t {
|
|
60
|
+
Undefined,
|
|
61
|
+
Point,
|
|
62
|
+
Percent,
|
|
63
|
+
Number,
|
|
64
|
+
Auto,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
constexpr Type type() const {
|
|
68
|
+
return static_cast<Type>(repr_ & kHandleTypeMask);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
constexpr void setType(Type handleType) {
|
|
72
|
+
repr_ &= (~kHandleTypeMask);
|
|
73
|
+
repr_ |= static_cast<uint8_t>(handleType);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
constexpr uint16_t value() const {
|
|
77
|
+
return repr_ >> 4;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
constexpr void setValue(uint16_t value) {
|
|
81
|
+
repr_ &= (~kHandleValueMask);
|
|
82
|
+
repr_ |= (value << 4);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
constexpr bool isValueIndexed() const {
|
|
86
|
+
return (repr_ & kHandleIndexedMask) != 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
constexpr void setValueIsIndexed() {
|
|
90
|
+
repr_ |= kHandleIndexedMask;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
uint16_t repr_{0};
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
#pragma pack(pop)
|
|
97
|
+
|
|
98
|
+
} // namespace facebook::yoga
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include <cassert>
|
|
11
|
+
#include <cstdint>
|
|
12
|
+
|
|
13
|
+
#include <yoga/numeric/FloatOptional.h>
|
|
14
|
+
#include <yoga/style/SmallValueBuffer.h>
|
|
15
|
+
#include <yoga/style/StyleLength.h>
|
|
16
|
+
#include <yoga/style/StyleValueHandle.h>
|
|
17
|
+
|
|
18
|
+
namespace facebook::yoga {
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* StyleValuePool allows compact storage for a sparse collection of assigned
|
|
22
|
+
* lengths and numbers. Values are referred to using StyleValueHandle. In most
|
|
23
|
+
* cases StyleValueHandle can embed the value directly, but if not, the value is
|
|
24
|
+
* stored within a buffer provided by the pool. The pool contains a fixed number
|
|
25
|
+
* of inline slots before falling back to heap allocating additional slots.
|
|
26
|
+
*/
|
|
27
|
+
class StyleValuePool {
|
|
28
|
+
public:
|
|
29
|
+
void store(StyleValueHandle& handle, StyleLength length) {
|
|
30
|
+
if (length.isUndefined()) {
|
|
31
|
+
handle.setType(StyleValueHandle::Type::Undefined);
|
|
32
|
+
} else if (length.isAuto()) {
|
|
33
|
+
handle.setType(StyleValueHandle::Type::Auto);
|
|
34
|
+
} else {
|
|
35
|
+
auto type = length.unit() == Unit::Point
|
|
36
|
+
? StyleValueHandle::Type::Point
|
|
37
|
+
: StyleValueHandle::Type::Percent;
|
|
38
|
+
storeValue(handle, length.value().unwrap(), type);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void store(StyleValueHandle& handle, FloatOptional number) {
|
|
43
|
+
if (number.isUndefined()) {
|
|
44
|
+
handle.setType(StyleValueHandle::Type::Undefined);
|
|
45
|
+
} else {
|
|
46
|
+
storeValue(handle, number.unwrap(), StyleValueHandle::Type::Number);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
StyleLength getLength(StyleValueHandle handle) const {
|
|
51
|
+
if (handle.isUndefined()) {
|
|
52
|
+
return StyleLength::undefined();
|
|
53
|
+
} else if (handle.isAuto()) {
|
|
54
|
+
return StyleLength::ofAuto();
|
|
55
|
+
} else {
|
|
56
|
+
assert(
|
|
57
|
+
handle.type() == StyleValueHandle::Type::Point ||
|
|
58
|
+
handle.type() == StyleValueHandle::Type::Percent);
|
|
59
|
+
float value = (handle.isValueIndexed())
|
|
60
|
+
? std::bit_cast<float>(buffer_.get32(handle.value()))
|
|
61
|
+
: unpackInlineInteger(handle.value());
|
|
62
|
+
|
|
63
|
+
return handle.type() == StyleValueHandle::Type::Point
|
|
64
|
+
? StyleLength::points(value)
|
|
65
|
+
: StyleLength::percent(value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
FloatOptional getNumber(StyleValueHandle handle) const {
|
|
70
|
+
if (handle.isUndefined()) {
|
|
71
|
+
return FloatOptional{};
|
|
72
|
+
} else {
|
|
73
|
+
assert(handle.type() == StyleValueHandle::Type::Number);
|
|
74
|
+
float value = (handle.isValueIndexed())
|
|
75
|
+
? std::bit_cast<float>(buffer_.get32(handle.value()))
|
|
76
|
+
: unpackInlineInteger(handle.value());
|
|
77
|
+
return FloatOptional{value};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private:
|
|
82
|
+
void storeValue(
|
|
83
|
+
StyleValueHandle& handle,
|
|
84
|
+
float value,
|
|
85
|
+
StyleValueHandle::Type type) {
|
|
86
|
+
handle.setType(type);
|
|
87
|
+
|
|
88
|
+
if (handle.isValueIndexed()) {
|
|
89
|
+
auto newIndex =
|
|
90
|
+
buffer_.replace(handle.value(), std::bit_cast<uint32_t>(value));
|
|
91
|
+
handle.setValue(newIndex);
|
|
92
|
+
} else if (isIntegerPackable(value)) {
|
|
93
|
+
handle.setValue(packInlineInteger(value));
|
|
94
|
+
} else {
|
|
95
|
+
auto newIndex = buffer_.push(std::bit_cast<uint32_t>(value));
|
|
96
|
+
handle.setValue(newIndex);
|
|
97
|
+
handle.setValueIsIndexed();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static constexpr bool isIntegerPackable(float f) {
|
|
102
|
+
constexpr uint16_t kMaxInlineAbsValue = (1 << 11) - 1;
|
|
103
|
+
|
|
104
|
+
auto i = static_cast<int32_t>(f);
|
|
105
|
+
return static_cast<float>(i) == f && i >= -kMaxInlineAbsValue &&
|
|
106
|
+
i <= +kMaxInlineAbsValue;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static constexpr uint16_t packInlineInteger(float value) {
|
|
110
|
+
uint16_t isNegative = value < 0 ? 1 : 0;
|
|
111
|
+
return static_cast<uint16_t>(
|
|
112
|
+
(isNegative << 11) |
|
|
113
|
+
(static_cast<int32_t>(value) * (isNegative != 0u ? -1 : 1)));
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
static constexpr float unpackInlineInteger(uint16_t value) {
|
|
117
|
+
constexpr uint16_t kValueSignMask = 0b0000'1000'0000'0000;
|
|
118
|
+
constexpr uint16_t kValueMagnitudeMask = 0b0000'0111'1111'1111;
|
|
119
|
+
const bool isNegative = (value & kValueSignMask) != 0;
|
|
120
|
+
return static_cast<float>(
|
|
121
|
+
(value & kValueMagnitudeMask) * (isNegative ? -1 : 1));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
SmallValueBuffer<4> buffer_;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
} // namespace facebook::yoga
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""Native API modules for device capabilities.
|
|
2
|
+
|
|
3
|
+
Cross-platform Python interfaces to common device APIs. Every module
|
|
4
|
+
here is a thin facade over a *native module*: a Swift class in
|
|
5
|
+
``PythonNativeKit`` and a Kotlin class in the ``pythonnative`` Gradle
|
|
6
|
+
module registered under the same name (``"Camera"``, ``"Haptics"``,
|
|
7
|
+
...). Facades reach them through
|
|
8
|
+
[`native_module`][pythonnative.native_modules.registry.native_module]
|
|
9
|
+
and the bridge described in ``docs/concepts/bridge.md``; there is no
|
|
10
|
+
Python-side Objective-C or JNI anywhere in this package.
|
|
11
|
+
|
|
12
|
+
Off device the same names resolve to plain Python implementations in
|
|
13
|
+
[`pythonnative.native_modules.fallback`][pythonnative.native_modules.fallback]
|
|
14
|
+
with safe defaults (in-memory buffers, ``"unknown"`` states, no-op
|
|
15
|
+
feedback), so the same code stays runnable in unit tests. The browser
|
|
16
|
+
preview (``pn start``) implements the modules a browser can honor
|
|
17
|
+
(``Alert``, ``Clipboard``, ``Device``, ``Linking``, ``Share``, ...) in
|
|
18
|
+
the page and falls back to the Python classes for the rest. Third-party
|
|
19
|
+
packages ship their own native modules the same way; see
|
|
20
|
+
``docs/guides/native-modules.md``.
|
|
21
|
+
|
|
22
|
+
Two rules hold across every facade, so you never have to look one up:
|
|
23
|
+
|
|
24
|
+
1. **Sync or async is decided by what the OS has to do.** A method is
|
|
25
|
+
a plain function when the answer is already on the device and
|
|
26
|
+
returns on the calling thread (read the pasteboard, check a
|
|
27
|
+
permission, read the battery level, Keychain get/set, file I/O).
|
|
28
|
+
It is a coroutine when the OS has to prompt the user, drive
|
|
29
|
+
hardware, or hand off to another process (camera and gallery
|
|
30
|
+
pickers, biometric prompts, permission requests, the share sheet,
|
|
31
|
+
GPS fixes, notification scheduling, remote push registration).
|
|
32
|
+
2. **Failures raise; "nothing happened" returns a value.** A native
|
|
33
|
+
error (a rejected promise, a missing module, a bad argument) is a
|
|
34
|
+
[`NativeModuleError`][pythonnative.native_modules.NativeModuleError]
|
|
35
|
+
and propagates to the caller like any other Python exception. Outcomes
|
|
36
|
+
that are not errors, such as the user cancelling a picker, denying a
|
|
37
|
+
permission, or dismissing the share sheet, come back as ``None``,
|
|
38
|
+
``False``, or a status string, and are documented per method. No
|
|
39
|
+
facade converts an exception into a default value.
|
|
40
|
+
|
|
41
|
+
Hardware / media:
|
|
42
|
+
|
|
43
|
+
- [`Camera`][pythonnative.native_modules.Camera]: photo capture and
|
|
44
|
+
gallery picking.
|
|
45
|
+
- [`Location`][pythonnative.native_modules.Location]: GPS and location.
|
|
46
|
+
- [`Battery`][pythonnative.native_modules.Battery]: charge level/state.
|
|
47
|
+
- [`Haptics`][pythonnative.native_modules.Haptics] /
|
|
48
|
+
[`Vibration`][pythonnative.native_modules.Vibration]: tactile feedback.
|
|
49
|
+
- [`Biometrics`][pythonnative.native_modules.Biometrics]: Face ID /
|
|
50
|
+
Touch ID / fingerprint auth.
|
|
51
|
+
|
|
52
|
+
System integration:
|
|
53
|
+
|
|
54
|
+
- [`FileSystem`][pythonnative.native_modules.FileSystem]: app-scoped
|
|
55
|
+
file I/O.
|
|
56
|
+
- [`Notifications`][pythonnative.native_modules.Notifications]: local
|
|
57
|
+
push notifications.
|
|
58
|
+
- [`Clipboard`][pythonnative.native_modules.Clipboard]: pasteboard
|
|
59
|
+
read/write.
|
|
60
|
+
- [`Share`][pythonnative.native_modules.Share]: system share sheet.
|
|
61
|
+
- [`Linking`][pythonnative.native_modules.Linking]: open URLs and deep
|
|
62
|
+
links.
|
|
63
|
+
- [`Permissions`][pythonnative.native_modules.Permissions]: runtime
|
|
64
|
+
permission checks/requests.
|
|
65
|
+
- [`SecureStore`][pythonnative.native_modules.SecureStore]: encrypted
|
|
66
|
+
secret storage.
|
|
67
|
+
|
|
68
|
+
Reactive state (with hooks):
|
|
69
|
+
|
|
70
|
+
- [`AppState`][pythonnative.native_modules.AppState] +
|
|
71
|
+
[`use_app_state`][pythonnative.use_app_state]: foreground/background
|
|
72
|
+
lifecycle.
|
|
73
|
+
- [`NetInfo`][pythonnative.native_modules.NetInfo] +
|
|
74
|
+
[`use_net_info`][pythonnative.use_net_info]: connectivity.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
from .app_state import AppState, use_app_state
|
|
78
|
+
from .battery import Battery
|
|
79
|
+
from .biometrics import Biometrics
|
|
80
|
+
from .camera import Camera
|
|
81
|
+
from .clipboard import Clipboard
|
|
82
|
+
from .file_system import FileSystem
|
|
83
|
+
from .haptics import Haptics, Vibration
|
|
84
|
+
from .linking import Linking
|
|
85
|
+
from .location import Location
|
|
86
|
+
from .net_info import NetInfo, use_net_info
|
|
87
|
+
from .notifications import Notifications
|
|
88
|
+
from .permissions import Permissions
|
|
89
|
+
from .registry import (
|
|
90
|
+
BridgeModule,
|
|
91
|
+
NativeModule,
|
|
92
|
+
NativeModuleError,
|
|
93
|
+
PythonModule,
|
|
94
|
+
native_module,
|
|
95
|
+
register_python_module,
|
|
96
|
+
)
|
|
97
|
+
from .secure_store import SecureStore
|
|
98
|
+
from .share import Share
|
|
99
|
+
|
|
100
|
+
__all__ = [
|
|
101
|
+
"AppState",
|
|
102
|
+
"Battery",
|
|
103
|
+
"Biometrics",
|
|
104
|
+
"BridgeModule",
|
|
105
|
+
"Camera",
|
|
106
|
+
"Clipboard",
|
|
107
|
+
"FileSystem",
|
|
108
|
+
"Haptics",
|
|
109
|
+
"Linking",
|
|
110
|
+
"Location",
|
|
111
|
+
"NativeModule",
|
|
112
|
+
"NativeModuleError",
|
|
113
|
+
"NetInfo",
|
|
114
|
+
"Notifications",
|
|
115
|
+
"Permissions",
|
|
116
|
+
"PythonModule",
|
|
117
|
+
"SecureStore",
|
|
118
|
+
"Share",
|
|
119
|
+
"Vibration",
|
|
120
|
+
"native_module",
|
|
121
|
+
"register_python_module",
|
|
122
|
+
"use_app_state",
|
|
123
|
+
"use_net_info",
|
|
124
|
+
]
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""Foreground / background app lifecycle state.
|
|
2
|
+
|
|
3
|
+
[`AppState`][pythonnative.AppState] exposes the current lifecycle phase
|
|
4
|
+
(``"active"``, ``"inactive"``, or ``"background"``) and lets you
|
|
5
|
+
subscribe to transitions. The native ``AppState`` module pushes a
|
|
6
|
+
``change`` event on every transition; off device, tests drive the same
|
|
7
|
+
path through
|
|
8
|
+
[`dispatch_app_state`][pythonnative.native_modules.app_state.dispatch_app_state].
|
|
9
|
+
|
|
10
|
+
Prefer the [`use_app_state`][pythonnative.use_app_state] hook inside
|
|
11
|
+
components; use the imperative API for non-UI code.
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
```python
|
|
15
|
+
import pythonnative as pn
|
|
16
|
+
|
|
17
|
+
@pn.component
|
|
18
|
+
def Banner():
|
|
19
|
+
state = pn.use_app_state()
|
|
20
|
+
return pn.Text(f"App is {state}")
|
|
21
|
+
```
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
from typing import Callable, List
|
|
27
|
+
|
|
28
|
+
from .. import diagnostics
|
|
29
|
+
from ..hooks import use_effect, use_state
|
|
30
|
+
from .registry import on_event
|
|
31
|
+
|
|
32
|
+
AppStateStatus = str # "active" | "inactive" | "background"
|
|
33
|
+
|
|
34
|
+
_VALID = ("active", "inactive", "background")
|
|
35
|
+
_current: AppStateStatus = "active"
|
|
36
|
+
_listeners: List[Callable[[AppStateStatus], None]] = []
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class AppState:
|
|
40
|
+
"""App lifecycle state interface."""
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
def current_state() -> AppStateStatus:
|
|
44
|
+
"""Return the current lifecycle phase."""
|
|
45
|
+
return _current
|
|
46
|
+
|
|
47
|
+
@staticmethod
|
|
48
|
+
def add_listener(callback: Callable[[AppStateStatus], None]) -> Callable[[], None]:
|
|
49
|
+
"""Subscribe to lifecycle changes.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
A zero-arg function that unsubscribes when called.
|
|
53
|
+
"""
|
|
54
|
+
_listeners.append(callback)
|
|
55
|
+
|
|
56
|
+
def _unsubscribe() -> None:
|
|
57
|
+
try:
|
|
58
|
+
_listeners.remove(callback)
|
|
59
|
+
except ValueError:
|
|
60
|
+
pass
|
|
61
|
+
|
|
62
|
+
return _unsubscribe
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def dispatch_app_state(state: AppStateStatus) -> None:
|
|
66
|
+
"""Update the current state and notify every listener.
|
|
67
|
+
|
|
68
|
+
Unknown values are ignored so a misbehaving host can't push garbage
|
|
69
|
+
into the tree.
|
|
70
|
+
"""
|
|
71
|
+
global _current
|
|
72
|
+
if state not in _VALID or state == _current:
|
|
73
|
+
return
|
|
74
|
+
_current = state
|
|
75
|
+
for listener in list(_listeners):
|
|
76
|
+
try:
|
|
77
|
+
listener(state)
|
|
78
|
+
except Exception:
|
|
79
|
+
diagnostics.swallowed("app_state.dispatch_app_state")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
on_event("AppState", "change", lambda payload: dispatch_app_state(str(payload)))
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def use_app_state() -> AppStateStatus:
|
|
86
|
+
"""Subscribe a component to [`AppState`][pythonnative.AppState].
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
The current lifecycle phase; the component re-renders whenever
|
|
90
|
+
it changes.
|
|
91
|
+
"""
|
|
92
|
+
state, set_state = use_state(_current)
|
|
93
|
+
|
|
94
|
+
def _subscribe() -> Callable[[], None]:
|
|
95
|
+
set_state(_current)
|
|
96
|
+
return AppState.add_listener(set_state)
|
|
97
|
+
|
|
98
|
+
use_effect(_subscribe, [])
|
|
99
|
+
return state
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"""Battery level and charging state.
|
|
2
|
+
|
|
3
|
+
[`Battery`][pythonnative.Battery] reports the current charge fraction
|
|
4
|
+
(``0.0`` to ``1.0``, or ``-1.0`` when the platform doesn't know) and
|
|
5
|
+
charging state, and lets you subscribe to changes. Both getters read a
|
|
6
|
+
value the OS already holds, so they are synchronous. The native
|
|
7
|
+
``Battery`` module pushes a ``change`` event with ``{"level", "state"}``;
|
|
8
|
+
off device, tests drive the same path through
|
|
9
|
+
[`dispatch_battery`][pythonnative.native_modules.battery.dispatch_battery].
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from typing import Any, Callable, Dict, List
|
|
15
|
+
|
|
16
|
+
from .. import diagnostics
|
|
17
|
+
from .registry import native_module, on_event
|
|
18
|
+
|
|
19
|
+
BatteryState = str # "unknown" | "unplugged" | "charging" | "full"
|
|
20
|
+
|
|
21
|
+
_listeners: List[Callable[[Dict[str, object]], None]] = []
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class Battery:
|
|
25
|
+
"""Battery interface (synchronous getters + change listener).
|
|
26
|
+
|
|
27
|
+
Raises:
|
|
28
|
+
NativeModuleError: If the native module fails.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
@staticmethod
|
|
32
|
+
def get_level() -> float:
|
|
33
|
+
"""Return the charge fraction in ``[0, 1]``, or ``-1.0`` when the platform can't report it."""
|
|
34
|
+
level = float(native_module("Battery").call("get_level"))
|
|
35
|
+
return level if 0.0 <= level <= 1.0 else -1.0
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def get_state() -> BatteryState:
|
|
39
|
+
"""Return ``"charging"`` / ``"full"`` / ``"unplugged"`` / ``"unknown"``."""
|
|
40
|
+
state = str(native_module("Battery").call("get_state") or "unknown")
|
|
41
|
+
return state if state in ("unknown", "unplugged", "charging", "full") else "unknown"
|
|
42
|
+
|
|
43
|
+
@staticmethod
|
|
44
|
+
def add_listener(callback: Callable[[Dict[str, object]], None]) -> Callable[[], None]:
|
|
45
|
+
"""Subscribe to battery changes; returns an unsubscribe fn.
|
|
46
|
+
|
|
47
|
+
Each callback receives ``{"level": float, "state": str}``.
|
|
48
|
+
"""
|
|
49
|
+
_listeners.append(callback)
|
|
50
|
+
|
|
51
|
+
def _unsubscribe() -> None:
|
|
52
|
+
try:
|
|
53
|
+
_listeners.remove(callback)
|
|
54
|
+
except ValueError:
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
return _unsubscribe
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def dispatch_battery(level: float, state: BatteryState) -> None:
|
|
61
|
+
"""Notify listeners of a battery change."""
|
|
62
|
+
payload: Dict[str, object] = {"level": level, "state": state}
|
|
63
|
+
for listener in list(_listeners):
|
|
64
|
+
try:
|
|
65
|
+
listener(dict(payload))
|
|
66
|
+
except Exception:
|
|
67
|
+
diagnostics.swallowed("battery.dispatch_battery")
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _on_native_change(payload: Any) -> None:
|
|
71
|
+
if isinstance(payload, dict):
|
|
72
|
+
dispatch_battery(float(payload.get("level", -1.0)), str(payload.get("state", "unknown")))
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
on_event("Battery", "change", _on_native_change)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Biometric authentication (Face ID / Touch ID / fingerprint).
|
|
2
|
+
|
|
3
|
+
[`Biometrics`][pythonnative.Biometrics] gates an action behind the
|
|
4
|
+
device's biometric hardware via ``LAContext`` (iOS) and
|
|
5
|
+
``BiometricPrompt`` (Android), both implemented in the native
|
|
6
|
+
``Biometrics`` module.
|
|
7
|
+
|
|
8
|
+
``is_available`` is synchronous (a capability lookup); ``authenticate``
|
|
9
|
+
is a coroutine that presents the system prompt and resolves to ``True``
|
|
10
|
+
on success or ``False`` when the user fails or cancels the prompt.
|
|
11
|
+
|
|
12
|
+
Example:
|
|
13
|
+
```python
|
|
14
|
+
import pythonnative as pn
|
|
15
|
+
|
|
16
|
+
async def unlock():
|
|
17
|
+
if await pn.Biometrics.authenticate("Unlock your vault"):
|
|
18
|
+
show_secrets()
|
|
19
|
+
```
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
from .registry import native_module
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class Biometrics:
|
|
28
|
+
"""Biometric authentication interface.
|
|
29
|
+
|
|
30
|
+
Raises:
|
|
31
|
+
NativeModuleError: If the native module fails.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
@staticmethod
|
|
35
|
+
def is_available() -> bool:
|
|
36
|
+
"""Return ``True`` when biometric auth can be attempted (enrolled hardware; ``False`` off device)."""
|
|
37
|
+
return bool(native_module("Biometrics").call("is_available"))
|
|
38
|
+
|
|
39
|
+
@staticmethod
|
|
40
|
+
async def authenticate(reason: str = "Authenticate") -> bool:
|
|
41
|
+
"""Present the biometric prompt; resolve ``True`` on success, ``False`` on failure or cancel."""
|
|
42
|
+
return bool(await native_module("Biometrics").call_async("authenticate", reason=reason))
|