peachsim 0.1.1641 → 0.1.1653
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/README.md +12 -0
- package/cli/app-bundle-resources.ts +57 -0
- package/cli/app-catalog.ts +1 -1
- package/cli/app-fonts.ts +11 -80
- package/cli/app-splash.ts +18 -12
- package/cli/bridge-flow-runner.ts +11 -7
- package/cli/cloud-client.ts +10 -13
- package/cli/command-registry.ts +13 -4
- package/cli/commands/box.ts +4 -4
- package/cli/commands/control.ts +105 -53
- package/cli/commands/coverage-parser.ts +67 -0
- package/cli/commands/coverage.ts +550 -0
- package/cli/commands/debug.ts +9 -18
- package/cli/commands/desktop.ts +19 -7
- package/cli/commands/device.ts +14 -9
- package/cli/commands/guest-host.ts +6 -10
- package/cli/commands/inspect/core.ts +81 -17
- package/cli/commands/inspect.ts +13 -8
- package/cli/commands/kotlin.ts +2 -2
- package/cli/commands/maestro-compare.ts +1 -1
- package/cli/commands/platform.ts +20 -11
- package/cli/commands/preview.ts +16 -18
- package/cli/commands/runtime.ts +3 -2
- package/cli/commands/screenshot-layers.ts +1 -1
- package/cli/commands/screenshot.ts +1 -1
- package/cli/commands/serve.ts +5 -1
- package/cli/commands/support.ts +4 -4
- package/cli/commands/three-mode.ts +22 -15
- package/cli/commands/upload.ts +44 -45
- package/cli/current-sim.ts +38 -0
- package/cli/desktop-companion.ts +36 -8
- package/cli/device-option.ts +1 -1
- package/cli/drivers/playwright.ts +40 -0
- package/cli/drivers/types.ts +4 -0
- package/cli/help-core.ts +1 -1
- package/cli/internal-child.ts +2 -1
- package/cli/main.ts +9 -3
- package/cli/outbound-endpoints.ts +15 -5
- package/cli/output-redaction.ts +39 -14
- package/cli/remote-simulators.ts +4 -1
- package/cli/scene-video.ts +5 -2
- package/cli/send-to-box.ts +7 -10
- package/cli/telemetry.ts +1 -1
- package/cli/ws-bridge.ts +8 -1
- package/detox/attempt-events.cjs +3 -1
- package/detox/attempt-events.d.cts +1 -1
- package/detox/expectations.ts +108 -99
- package/detox/frame-offset.d.mts +6 -0
- package/detox/frame-offset.mjs +35 -0
- package/detox/gestures.ts +6 -18
- package/detox/index.ts +169 -101
- package/detox/jest-preset.cjs +1 -3
- package/detox/jest-transform.cjs +4 -0
- package/detox/matchers.ts +3 -0
- package/detox/motion-change.cjs +52 -118
- package/detox/motion-change.d.cts +6 -27
- package/detox/motion-leg-starts.cjs +20 -0
- package/detox/motion-leg-starts.d.cts +8 -0
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +3 -3
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract-input.cjs +65 -1
- package/dist-lib/bridge-contract-input.mjs +63 -1
- package/dist-lib/bridge-contract.cjs +19 -1
- package/dist-lib/bridge-contract.mjs +17 -1
- package/dist-lib/bundle-channel.cjs +38332 -14940
- package/dist-lib/capture-contract.cjs +1 -1
- package/dist-lib/capture-contract.mjs +1 -1
- package/dist-lib/cloud-contract.cjs +1 -1
- package/dist-lib/cloud-contract.mjs +1 -1
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +1 -1
- package/dist-lib/cloud.mjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/config.mjs +5 -3
- package/dist-lib/detox/index.cjs +1247 -4511
- package/dist-lib/detox/jest-preset.cjs +1 -3
- package/dist-lib/detox/jest-transform.cjs +4 -0
- package/dist-lib/dev-bundle-resolution.cjs +28 -24
- package/dist-lib/expo-swift-bundle.cjs +35243 -13172
- package/dist-lib/expo-swift-metadata.cjs +1 -1
- package/dist-lib/expo-swift-metadata.mjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +45285 -63163
- package/dist-lib/host/fetch-proxy-handler.cjs +3544 -11
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/replacement-module-handler.cjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +1997 -2069
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/kotlin-host.cjs +2 -2
- package/dist-lib/menu.cjs +14 -6
- package/dist-lib/menu.mjs +14 -6
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +1 -1
- package/dist-lib/metro-production-bundle.mjs +1 -1
- package/dist-lib/metro.cjs +468 -563
- package/dist-lib/native-app-identity-project.cjs +128 -292
- package/dist-lib/native-app-identity-project.mjs +1262 -51
- package/dist-lib/native-app-identity.cjs +8 -3
- package/dist-lib/native-app-identity.mjs +8 -3
- package/dist-lib/native-firebase-metadata.cjs +1 -1
- package/dist-lib/native-firebase-metadata.mjs +1 -1
- package/dist-lib/plist.cjs +2 -244
- package/dist-lib/plist.mjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/public-origins-lib-esm.json +290 -0
- package/dist-lib/public-origins-lib-static.json +1 -0
- package/dist-lib/public-origins-lib.json +1852 -0
- package/dist-lib/react-native-host-modules.cjs +1 -1
- package/dist-lib/react-native-host-modules.mjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +14 -253
- package/dist-lib/sdk.cjs +84 -16
- package/dist-lib/sdk.mjs +82 -15
- package/dist-lib/skills.cjs +51248 -75450
- package/dist-lib/swift-compile.cjs +26154 -1245
- package/dist-lib/swift-compile.mjs +26151 -1230
- package/dist-lib/swift-package.cjs +79 -1
- package/dist-lib/swift-package.mjs +75 -1
- package/dist-lib/swift-submit.cjs +1 -1
- package/dist-lib/swift-submit.mjs +1 -1
- package/dist-lib/swift-toolchain.cjs +1 -1
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +34394 -12323
- package/dist-lib/vite.cjs +373 -298
- package/dist-lib/worklet-executable.cjs +1 -1
- package/dist-lib/worklet-executable.mjs +1 -1
- package/dist-types/packages/peach-compat/src/engine-config.d.ts +2 -0
- package/dist-types/packages/peach-compat/src/stubs/form-sheet-spring.d.ts +9 -0
- package/dist-types/packages/peach-compat/src/stubs/native-evaluation-lease.d.ts +47 -0
- package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-cookies.d.ts +113 -0
- package/dist-types/packages/peach-compat/src/stubs/native-seams/react-native-gesture-handler.d.ts +154 -0
- package/dist-types/packages/peach-compat/src/stubs/screen-transition-math.d.ts +756 -0
- package/dist-types/packages/peach-compat/src/stubs/transition-scalar.d.ts +25 -0
- package/dist-types/packages/peach-engine/src/billing/plans.d.ts +64 -0
- package/dist-types/packages/peach-engine/src/browser-page-target.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/bundle-platform-url.d.ts +3 -0
- package/dist-types/packages/peach-engine/src/capture/browser-accessibility-host.d.ts +3 -0
- package/dist-types/packages/peach-engine/src/capture/browser-composite.d.ts +55 -0
- package/dist-types/packages/peach-engine/src/capture/browserAccessibilityContract.d.ts +27 -0
- package/dist-types/packages/peach-engine/src/capture/nativeScreenCaptureContract.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/cli-companion.d.ts +36 -0
- package/dist-types/packages/peach-engine/src/components/native-ui/webview-frame-bridge.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/config.d.ts +5 -0
- package/dist-types/packages/peach-engine/src/engine/android-stretch-effect.d.ts +57 -0
- package/dist-types/packages/peach-engine/src/engine/animated-driven-style.d.ts +47 -0
- package/dist-types/packages/peach-engine/src/engine/animated-value.d.ts +5 -0
- package/dist-types/packages/peach-engine/src/engine/animated.d.ts +195 -0
- package/dist-types/packages/peach-engine/src/engine/animation-clockContract.d.ts +15 -0
- package/dist-types/packages/peach-engine/src/engine/animation-graph.d.ts +148 -0
- package/dist-types/packages/peach-engine/src/engine/app-catalog-wire.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/engine/app-font-registry.d.ts +87 -0
- package/dist-types/packages/peach-engine/src/engine/attributed-paragraph-paint.d.ts +7 -0
- package/dist-types/packages/peach-engine/src/engine/attributed-paragraph.d.ts +123 -0
- package/dist-types/packages/peach-engine/src/engine/audioContract.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/engine/canvaskit-api.d.ts +93 -0
- package/dist-types/packages/peach-engine/src/engine/canvaskit-renderer.d.ts +216 -0
- package/dist-types/packages/peach-engine/src/engine/config-plugin-fonts.d.ts +40 -0
- package/dist-types/packages/peach-engine/src/engine/config-plugin-splash.d.ts +25 -0
- package/dist-types/packages/peach-engine/src/engine/cull-visibility.d.ts +44 -0
- package/dist-types/packages/peach-engine/src/engine/damage-rect.d.ts +19 -0
- package/dist-types/packages/peach-engine/src/engine/engine-resource.d.ts +6 -0
- package/dist-types/packages/peach-engine/src/engine/expo-manifest.d.ts +5 -0
- package/dist-types/packages/peach-engine/src/engine/fiber-debug-metadata.d.ts +30 -0
- package/dist-types/packages/peach-engine/src/engine/font-config.d.ts +139 -0
- package/dist-types/packages/peach-engine/src/engine/generated/sf-pro-font.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/engine/glass-material.d.ts +31 -0
- package/dist-types/packages/peach-engine/src/engine/host-composite.d.ts +100 -0
- package/dist-types/packages/peach-engine/src/engine/hosted-semantics.d.ts +49 -0
- package/dist-types/packages/peach-engine/src/engine/image-audit.d.ts +70 -0
- package/dist-types/packages/peach-engine/src/engine/image-loader.d.ts +350 -0
- package/dist-types/packages/peach-engine/src/engine/inspect-info.d.ts +27 -0
- package/dist-types/packages/peach-engine/src/engine/inspect-outline.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/engine/inspect-visibility.d.ts +33 -0
- package/dist-types/packages/peach-engine/src/engine/ios-fast-scroll.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/engine/layout-sab.d.ts +43 -0
- package/dist-types/packages/peach-engine/src/engine/liquid-glass-rect.d.ts +23 -0
- package/dist-types/packages/peach-engine/src/engine/liquid-glass-shaders.d.ts +9 -0
- package/dist-types/packages/peach-engine/src/engine/liquid-glass.d.ts +283 -0
- package/dist-types/packages/peach-engine/src/engine/live-object-counts.d.ts +6 -0
- package/dist-types/packages/peach-engine/src/engine/lottie-runtime.d.ts +32 -0
- package/dist-types/packages/peach-engine/src/engine/lottie-types.d.ts +138 -0
- package/dist-types/packages/peach-engine/src/engine/memory-counts.d.ts +27 -0
- package/dist-types/packages/peach-engine/src/engine/metalDirectContract.d.ts +108 -0
- package/dist-types/packages/peach-engine/src/engine/metalShaderContract.d.ts +217 -0
- package/dist-types/packages/peach-engine/src/engine/native-animation-driver.d.ts +112 -0
- package/dist-types/packages/peach-engine/src/engine/native-animation-graph.d.ts +62 -0
- package/dist-types/packages/peach-engine/src/engine/native-layout.d.ts +133 -0
- package/dist-types/packages/peach-engine/src/engine/native-resources.d.ts +26 -0
- package/dist-types/packages/peach-engine/src/engine/nativeReanimatedContract.d.ts +25 -0
- package/dist-types/packages/peach-engine/src/engine/nativeReplayContract.d.ts +64 -0
- package/dist-types/packages/peach-engine/src/engine/node.d.ts +589 -0
- package/dist-types/packages/peach-engine/src/engine/paint-boundary-types.d.ts +112 -0
- package/dist-types/packages/peach-engine/src/engine/paint-boundary.d.ts +57 -0
- package/dist-types/packages/peach-engine/src/engine/portalContract.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/engine/portals.d.ts +20 -0
- package/dist-types/packages/peach-engine/src/engine/render-damage.d.ts +107 -0
- package/dist-types/packages/peach-engine/src/engine/riveContract.d.ts +420 -0
- package/dist-types/packages/peach-engine/src/engine/rn-spring.d.ts +51 -0
- package/dist-types/packages/peach-engine/src/engine/scene-table.d.ts +379 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-momentum-math.d.ts +152 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-pan-contacts.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-platform.d.ts +75 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-range.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/engine/scroll-velocity.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/engine/scroll.d.ts +320 -0
- package/dist-types/packages/peach-engine/src/engine/signal.d.ts +7 -0
- package/dist-types/packages/peach-engine/src/engine/snapshot-cache-policy.d.ts +6 -0
- package/dist-types/packages/peach-engine/src/engine/svg-geometry.d.ts +41 -0
- package/dist-types/packages/peach-engine/src/engine/text-attachment-paragraphs.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/engine/text-decoration.d.ts +11 -0
- package/dist-types/packages/peach-engine/src/engine/text-line-break.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/engine/text-paint-receipt.d.ts +98 -0
- package/dist-types/packages/peach-engine/src/engine/text-paragraph.d.ts +11 -0
- package/dist-types/packages/peach-engine/src/engine/text-paragraphContract.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/engine/text-transform.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/engine/types.d.ts +657 -0
- package/dist-types/packages/peach-engine/src/engine/visible-frame.d.ts +54 -0
- package/dist-types/packages/peach-engine/src/engine/webrtcContract.d.ts +74 -0
- package/dist-types/packages/peach-engine/src/graphite-stats-fields.d.ts +184 -0
- package/dist-types/packages/peach-engine/src/guest-import-meta.d.ts +12 -0
- package/dist-types/packages/peach-engine/src/guest-module-overrides.d.ts +7 -0
- package/dist-types/packages/peach-engine/src/ios/app-card-types.d.ts +7 -0
- package/dist-types/packages/peach-engine/src/ios/apps/canvas-map-data.d.ts +177 -0
- package/dist-types/packages/peach-engine/src/ios/aux-home-scene.d.ts +54 -0
- package/dist-types/packages/peach-engine/src/ios/chrome-metrics.d.ts +47 -0
- package/dist-types/packages/peach-engine/src/ios/constants.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/ios/duo-housing.d.ts +37 -0
- package/dist-types/packages/peach-engine/src/ios/home/types.d.ts +29 -0
- package/dist-types/packages/peach-engine/src/ios/home-app-catalog.d.ts +43 -0
- package/dist-types/packages/peach-engine/src/ios/photo-store.d.ts +73 -0
- package/dist-types/packages/peach-engine/src/ios/photoLibraryContract.d.ts +166 -0
- package/dist-types/packages/peach-engine/src/ios/shell-controller-types.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/ios/shell-transition-debug.d.ts +18 -0
- package/dist-types/packages/peach-engine/src/metro-asset-path.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/metro-fingerprint-registry-client.d.ts +11 -0
- package/dist-types/packages/peach-engine/src/metro-fingerprint.d.ts +38 -0
- package/dist-types/packages/peach-engine/src/native-preview-bundle.d.ts +44 -0
- package/dist-types/packages/peach-engine/src/observability/types.d.ts +74 -0
- package/dist-types/packages/peach-engine/src/peach-warm-manifest.d.ts +32 -0
- package/dist-types/packages/peach-engine/src/permissions/app-settings-client.d.ts +25 -0
- package/dist-types/packages/peach-engine/src/permissions/system-permission-types.d.ts +20 -0
- package/dist-types/packages/peach-engine/src/platform/android-back-panel.d.ts +131 -0
- package/dist-types/packages/peach-engine/src/platform/android-gesture-exclusion.d.ts +28 -0
- package/dist-types/packages/peach-engine/src/platform/android-predictive-back.d.ts +33 -0
- package/dist-types/packages/peach-engine/src/platform/system-bars-state.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/playwright-sim-host.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/preview/bundle-layout.d.ts +8 -0
- package/dist-types/packages/peach-engine/src/preview/bundle-variantContract.d.ts +24 -0
- package/dist-types/packages/peach-engine/src/preview/capture-bundle.d.ts +26 -0
- package/dist-types/packages/peach-engine/src/preview/compress-node.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/preview/compress.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/preview/presigned-upload.d.ts +60 -0
- package/dist-types/packages/peach-engine/src/preview/trace.d.ts +144 -0
- package/dist-types/packages/peach-engine/src/preview/upload-protocol.d.ts +152 -0
- package/dist-types/packages/peach-engine/src/profiler/animation-recording-loader.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/profiler/profile-trace.d.ts +4 -0
- package/dist-types/packages/peach-engine/src/react-bridge.d.ts +3 -0
- package/dist-types/packages/peach-engine/src/react-native/AppState.d.ts +45 -0
- package/dist-types/packages/peach-engine/src/react-native/Appearance.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/react-native/framework-colors-data.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/react-native/host-services.d.ts +42 -0
- package/dist-types/packages/peach-engine/src/react-native/layout-animation.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/react-native/platform-colors.d.ts +17 -0
- package/dist-types/packages/peach-engine/src/remote-stream/client-config.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/remote-stream/cloud-display.d.ts +58 -0
- package/dist-types/packages/peach-engine/src/remote-stream/scene-recording.d.ts +45 -0
- package/dist-types/packages/peach-engine/src/render-worker/animated-drive-output.d.ts +35 -0
- package/dist-types/packages/peach-engine/src/render-worker/app-load.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/render-worker/aux-surface-types.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/render-worker/canvaskit-shared.d.ts +42 -0
- package/dist-types/packages/peach-engine/src/render-worker/canvaskit-webgpu.d.ts +434 -0
- package/dist-types/packages/peach-engine/src/render-worker/canvaskit-worker-init.d.ts +12 -0
- package/dist-types/packages/peach-engine/src/render-worker/compositor-backend.d.ts +31 -0
- package/dist-types/packages/peach-engine/src/render-worker/compositor-gpu.d.ts +202 -0
- package/dist-types/packages/peach-engine/src/render-worker/compositor-protocol.d.ts +1945 -0
- package/dist-types/packages/peach-engine/src/render-worker/compositor-runtime/scroll-drag-resample.d.ts +44 -0
- package/dist-types/packages/peach-engine/src/render-worker/css-keyframes-drive.d.ts +36 -0
- package/dist-types/packages/peach-engine/src/render-worker/edit-menu-geometry.d.ts +8 -0
- package/dist-types/packages/peach-engine/src/render-worker/engine-resource-relay.d.ts +21 -0
- package/dist-types/packages/peach-engine/src/render-worker/expo-widgetContract.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/render-worker/gesture-seam-protocol.d.ts +152 -0
- package/dist-types/packages/peach-engine/src/render-worker/graph-linked-value.d.ts +29 -0
- package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler-contract.d.ts +49 -0
- package/dist-types/packages/peach-engine/src/render-worker/graphite-pipeline-compiler.d.ts +12 -0
- package/dist-types/packages/peach-engine/src/render-worker/host-service-protocol.d.ts +756 -0
- package/dist-types/packages/peach-engine/src/render-worker/image-lifecycle-event.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/render-worker/image-pixel-contract.d.ts +48 -0
- package/dist-types/packages/peach-engine/src/render-worker/live-frame-mirror.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/render-worker/map-command-channel.d.ts +189 -0
- package/dist-types/packages/peach-engine/src/render-worker/mapNativeContract.d.ts +101 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-dynamic-synchronizable.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-menu-gesture.d.ts +9 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-ui-commandContract.d.ts +23 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-ui-protocol.d.ts +1087 -0
- package/dist-types/packages/peach-engine/src/render-worker/native-widgetContract.d.ts +100 -0
- package/dist-types/packages/peach-engine/src/render-worker/nativeAnimMirrorContract.d.ts +174 -0
- package/dist-types/packages/peach-engine/src/render-worker/nativeSyncReplyContract.d.ts +11 -0
- package/dist-types/packages/peach-engine/src/render-worker/one-native-contentContract.d.ts +54 -0
- package/dist-types/packages/peach-engine/src/render-worker/pointerSampleContract.d.ts +14 -0
- package/dist-types/packages/peach-engine/src/render-worker/protocol.d.ts +880 -0
- package/dist-types/packages/peach-engine/src/render-worker/reanimated-css-contract.d.ts +63 -0
- package/dist-types/packages/peach-engine/src/render-worker/reanimated-readiness.d.ts +29 -0
- package/dist-types/packages/peach-engine/src/render-worker/resilient-frame-clock.d.ts +22 -0
- package/dist-types/packages/peach-engine/src/render-worker/retained-app-load.d.ts +20 -0
- package/dist-types/packages/peach-engine/src/render-worker/screen-edge-swipe-commit-protocol.d.ts +1 -0
- package/dist-types/packages/peach-engine/src/render-worker/screen-form-sheet-commit-protocol.d.ts +26 -0
- package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror-tenant.d.ts +37 -0
- package/dist-types/packages/peach-engine/src/render-worker/scroll-mirror.d.ts +164 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-event-registry.d.ts +119 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-gesture-regions.d.ts +41 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-protocol.d.ts +603 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-scene-schema.d.ts +101 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-tree-inline-sources.d.ts +13 -0
- package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +87 -0
- package/dist-types/packages/peach-engine/src/render-worker/test-bridge-protocol.d.ts +47 -0
- package/dist-types/packages/peach-engine/src/render-worker/text-inputContract.d.ts +93 -0
- package/dist-types/packages/peach-engine/src/render-worker/tree-sync-port.d.ts +102 -0
- package/dist-types/packages/peach-engine/src/render-worker/webgpu-frame-transaction.d.ts +292 -0
- package/dist-types/packages/peach-engine/src/render-worker/webgpu-readback-scheduler.d.ts +107 -0
- package/dist-types/packages/peach-engine/src/render-worker/webview-capture-protocol.d.ts +16 -0
- package/dist-types/packages/peach-engine/src/render-worker/worker-input-runtime.d.ts +211 -0
- package/dist-types/packages/peach-engine/src/render-worker/worker-storage.d.ts +33 -0
- package/dist-types/packages/peach-engine/src/render-worker/worklet-runtime.d.ts +987 -0
- package/dist-types/packages/peach-engine/src/render-worker/worklet-sab.d.ts +24 -0
- package/dist-types/packages/peach-engine/src/rolldown-bundle-inventory.d.ts +84 -0
- package/dist-types/packages/peach-engine/src/rolldown-production-fingerprint.d.ts +31 -0
- package/dist-types/packages/peach-engine/src/screenshots/timeline-assets.d.ts +10 -0
- package/dist-types/packages/peach-engine/src/screenshots/tokens.d.ts +9 -0
- package/dist-types/packages/peach-engine/src/settings/devices.d.ts +70 -0
- package/dist-types/packages/peach-engine/src/settings/duo-fold-bus.d.ts +87 -0
- package/dist-types/packages/peach-engine/src/settings/interface-rotation.d.ts +30 -0
- package/dist-types/packages/peach-engine/src/settings/react-native-configuration.d.ts +12 -0
- package/dist-types/packages/peach-engine/src/settings/scene-geometryContract.d.ts +40 -0
- package/dist-types/packages/peach-engine/src/settings/store.d.ts +37 -0
- package/dist-types/packages/peach-engine/src/shell-events.d.ts +203 -0
- package/dist-types/packages/peach-engine/src/shell-intent.d.ts +68 -0
- package/dist-types/packages/peach-engine/src/sootsim-event.d.ts +35 -0
- package/dist-types/packages/peach-engine/src/top-overlay-state.d.ts +5 -0
- package/dist-types/packages/peach-engine/src/web-authentication-automation-host.d.ts +2 -0
- package/dist-types/packages/peach-engine/src/webAuthenticationContract.d.ts +34 -0
- package/dist-types/packages/peach-engine/src/webview-automation-host.d.ts +180 -0
- package/dist-types/packages/peach-engine/src/wireframe-mode.d.ts +16 -0
- package/dist-types/packages/peach-globals/src/frameBreakdownContract.d.ts +16 -0
- package/dist-types/packages/peach-globals/src/index.d.ts +3311 -0
- package/dist-types/packages/peach-globals/src/nativeSurfaceContract.d.ts +76 -0
- package/dist-types/packages/peach-globals/src/pointerSourceEventContract.d.ts +8 -0
- package/dist-types/packages/peach-globals/src/profileTrace.d.ts +11 -0
- package/dist-types/packages/peach-globals/src/profilerContract.d.ts +223 -0
- package/dist-types/packages/peach-kit/src/capabilities.d.ts +721 -0
- package/dist-types/packages/peach-kit/src/internal.d.ts +4 -0
- package/dist-types/packages/peach-kit/src/materials/types.d.ts +27 -0
- package/dist-types/packages/peach-kit/src/materials/uikit-blur-material.d.ts +14 -0
- package/dist-types/packages/peach-kit/src/navigation-types.d.ts +11 -0
- package/dist-types/packages/peach-kit/src/react-bridge.d.ts +53 -0
- package/dist-types/packages/peach-kit/src/runtime.d.ts +26 -0
- package/dist-types/packages/peach-kit/src/ui/hosting-safe-area.d.ts +24 -0
- package/dist-types/packages/peach-kit/src/ui/popover-placement.d.ts +53 -0
- package/dist-types/packages/peach-kit/src/ui/presentationContract.d.ts +17 -0
- package/kotlin/ComposeSources/PeachComposeHost.kt +1 -1
- package/kotlin/JniSources/com/facebook/jni/HybridData.kt +0 -2
- package/kotlin/JniSources/dev/peach/jni/NativeBindings.kt +0 -2
- package/kotlin/JniTransportSources/dev/peach/jni/integration/JniTransport.kt +0 -2
- package/kotlin/README.md +6 -0
- package/package.json +22 -2
- package/runtime-companion.json +1 -0
- package/skills/contrast/SKILL.md +1 -0
- package/src/appBundleResourcesContract.ts +51 -0
- package/src/assetCatalogContract.ts +21 -0
- package/src/backend-origin.ts +3 -1
- package/src/bridge-contract-input.ts +84 -0
- package/src/bridge-contract.ts +35 -3
- package/src/browser-launch-policy.ts +1 -0
- package/src/bundle-channel.mjs +4 -2
- package/src/cli-runtime.ts +55 -0
- package/src/crash-fingerprint.ts +26 -0
- package/src/dev-bundle-resolution.ts +50 -23
- package/src/device-catalog.ts +1159 -0
- package/src/host/bridge-host.ts +20 -37
- package/src/host/browser-pointer.ts +71 -0
- package/src/host/dev-server-package-versions.ts +23 -0
- package/src/host/fetch-proxy-handler.ts +17 -4
- package/src/host/staged-host-files.ts +28 -4
- package/src/installed-package-versions.ts +142 -38
- package/src/kotlin-host.ts +1 -1
- package/src/launchMetadataContract.ts +1 -0
- package/src/menu.ts +12 -4
- package/src/metro-plugin.ts +4 -4
- package/src/metro-project-root.ts +68 -0
- package/src/native-app-identity-project.ts +47 -38
- package/src/nitro-adapter.lock.json +26 -0
- package/src/nitro-adapter.ts +103 -0
- package/src/nitro-bundle.ts +24 -10
- package/src/nitro-compile.ts +33 -51
- package/src/nitro-source.ts +177 -96
- package/src/nitroAdapterContract.ts +217 -0
- package/src/nitroContract.ts +24 -11
- package/src/process-group.ts +41 -34
- package/src/react-bridge-importers.ts +28 -0
- package/src/reactNativeConfigurationContract.ts +36 -0
- package/src/runtime-assets.ts +7 -2
- package/src/runtime-delivery.ts +8 -7
- package/src/runtimePlatformContract.ts +70 -0
- package/src/screenshots/frame-compose.ts +42 -43
- package/src/screenshots/org-deck.ts +9 -4
- package/src/screenshots/preset-names.ts +29 -0
- package/src/screenshots/registry.ts +5 -5
- package/src/screenshots/schema.ts +1 -1
- package/src/screenshots/screenshotContract.ts +971 -0
- package/src/settings-flags.ts +107 -0
- package/src/settingsContract.ts +609 -0
- package/src/storageSnapshotContract.ts +344 -0
- package/src/stub-pattern-matcher.ts +550 -0
- package/src/swift-compile.ts +926 -47
- package/src/swift-compiler-digest.ts +17 -3
- package/src/swift-distribution.lock.json +49 -22
- package/src/swift-host.ts +167 -52
- package/src/swift-objc-compile.ts +86 -26
- package/src/swift-objc-export.ts +532 -0
- package/src/swift-objc-import.ts +769 -0
- package/src/swift-objc-metadata.ts +285 -10
- package/src/swift-objc-sdk.ts +13970 -158
- package/src/swift-objc-standin.ts +137 -1
- package/src/swift-package.ts +94 -0
- package/src/swift-packages.ts +5 -5
- package/src/swift-root-lock.ts +241 -92
- package/src/swift-submit.ts +6 -0
- package/src/swiftContract.ts +99 -0
- package/src/target-matcher.ts +6 -1
- package/src/vite-plugin.ts +14 -40
- package/src/worker-system-chunks.ts +1 -1
- package/src/workerChunkContract.ts +5 -0
- package/src/worklets-babel.ts +24 -5
- package/src/xcode-project.ts +103 -11
- package/src/xcode-target-members.ts +10 -3
- package/cli/drivers/playwright-sim-host.ts +0 -825
- package/kotlin/fixtures/counter/Counter.d.kt.ts +0 -17
- package/kotlin/fixtures/counter/Counter.kt +0 -51
- package/kotlin/fixtures/counter/CounterApp.native.tsx +0 -61
- package/kotlin/fixtures/counter/CounterApp.tsx +0 -3
- package/kotlin/fixtures/counter/CounterScreen.d.kt.ts +0 -8
- package/kotlin/fixtures/counter/CounterScreen.kt +0 -56
- package/kotlin/fixtures/counter/app/_layout.tsx +0 -4
- package/kotlin/fixtures/counter/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/counter/app/routes.d.ts +0 -18
- package/kotlin/fixtures/counter/package.json +0 -20
- package/kotlin/fixtures/counter/tsconfig.json +0 -19
- package/kotlin/fixtures/counter/vite.config.ts +0 -20
- package/kotlin/fixtures/headless-counter/Headless.kt +0 -234
- package/kotlin/fixtures/import-animation/Animation.d.kt.ts +0 -7
- package/kotlin/fixtures/import-animation/Animation.kt +0 -80
- package/kotlin/fixtures/import-animation/ImportAnimation.native.tsx +0 -13
- package/kotlin/fixtures/import-animation/README.md +0 -24
- package/kotlin/fixtures/import-animation/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-animation/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-animation/app/routes.d.ts +0 -18
- package/kotlin/fixtures/import-animation/package.json +0 -23
- package/kotlin/fixtures/import-animation/tsconfig.json +0 -20
- package/kotlin/fixtures/import-animation/vite.config.ts +0 -20
- package/kotlin/fixtures/import-drawing/Drawing.d.kt.ts +0 -7
- package/kotlin/fixtures/import-drawing/Drawing.kt +0 -101
- package/kotlin/fixtures/import-drawing/ImportDrawing.native.tsx +0 -18
- package/kotlin/fixtures/import-drawing/README.md +0 -34
- package/kotlin/fixtures/import-drawing/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-drawing/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-drawing/package.json +0 -23
- package/kotlin/fixtures/import-drawing/tsconfig.json +0 -20
- package/kotlin/fixtures/import-drawing/vite.config.ts +0 -20
- package/kotlin/fixtures/import-editor/Editor.d.kt.ts +0 -7
- package/kotlin/fixtures/import-editor/Editor.kt +0 -59
- package/kotlin/fixtures/import-editor/ImportEditor.native.tsx +0 -23
- package/kotlin/fixtures/import-editor/README.md +0 -27
- package/kotlin/fixtures/import-editor/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-editor/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-editor/package.json +0 -23
- package/kotlin/fixtures/import-editor/tsconfig.json +0 -20
- package/kotlin/fixtures/import-editor/vite.config.ts +0 -20
- package/kotlin/fixtures/import-effects/Effects.d.kt.ts +0 -7
- package/kotlin/fixtures/import-effects/Effects.kt +0 -87
- package/kotlin/fixtures/import-effects/ImportEffects.native.tsx +0 -13
- package/kotlin/fixtures/import-effects/README.md +0 -19
- package/kotlin/fixtures/import-effects/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-effects/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-effects/package.json +0 -23
- package/kotlin/fixtures/import-effects/tsconfig.json +0 -20
- package/kotlin/fixtures/import-effects/vite.config.ts +0 -20
- package/kotlin/fixtures/import-layout/ImportLayout.native.tsx +0 -13
- package/kotlin/fixtures/import-layout/Layout.d.kt.ts +0 -7
- package/kotlin/fixtures/import-layout/Layout.kt +0 -72
- package/kotlin/fixtures/import-layout/README.md +0 -24
- package/kotlin/fixtures/import-layout/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-layout/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-layout/package.json +0 -23
- package/kotlin/fixtures/import-layout/tsconfig.json +0 -20
- package/kotlin/fixtures/import-layout/vite.config.ts +0 -20
- package/kotlin/fixtures/import-navigation/ImportNavigation.native.tsx +0 -18
- package/kotlin/fixtures/import-navigation/Navigation.d.kt.ts +0 -7
- package/kotlin/fixtures/import-navigation/Navigation.kt +0 -104
- package/kotlin/fixtures/import-navigation/README.md +0 -31
- package/kotlin/fixtures/import-navigation/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-navigation/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-navigation/package.json +0 -23
- package/kotlin/fixtures/import-navigation/tsconfig.json +0 -20
- package/kotlin/fixtures/import-navigation/vite.config.ts +0 -20
- package/kotlin/fixtures/import-overlays/ImportOverlays.native.tsx +0 -29
- package/kotlin/fixtures/import-overlays/Overlays.d.kt.ts +0 -7
- package/kotlin/fixtures/import-overlays/Overlays.kt +0 -93
- package/kotlin/fixtures/import-overlays/README.md +0 -34
- package/kotlin/fixtures/import-overlays/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-overlays/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-overlays/package.json +0 -23
- package/kotlin/fixtures/import-overlays/tsconfig.json +0 -20
- package/kotlin/fixtures/import-overlays/vite.config.ts +0 -20
- package/kotlin/fixtures/import-resources/ImportResources.native.tsx +0 -18
- package/kotlin/fixtures/import-resources/README.md +0 -26
- package/kotlin/fixtures/import-resources/Resources.d.kt.ts +0 -6
- package/kotlin/fixtures/import-resources/Resources.kt +0 -72
- package/kotlin/fixtures/import-resources/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-resources/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-resources/package.json +0 -23
- package/kotlin/fixtures/import-resources/tsconfig.json +0 -20
- package/kotlin/fixtures/import-resources/vite.config.ts +0 -20
- package/kotlin/fixtures/import-scroll/ImportNested.native.tsx +0 -10
- package/kotlin/fixtures/import-scroll/ImportScroll.native.tsx +0 -13
- package/kotlin/fixtures/import-scroll/Nested.d.kt.ts +0 -4
- package/kotlin/fixtures/import-scroll/Nested.kt +0 -64
- package/kotlin/fixtures/import-scroll/README.md +0 -38
- package/kotlin/fixtures/import-scroll/Scroll.d.kt.ts +0 -7
- package/kotlin/fixtures/import-scroll/Scroll.kt +0 -91
- package/kotlin/fixtures/import-scroll/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-scroll/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-scroll/app/nested+spa.tsx +0 -1
- package/kotlin/fixtures/import-scroll/package.json +0 -23
- package/kotlin/fixtures/import-scroll/tsconfig.json +0 -20
- package/kotlin/fixtures/import-scroll/vite.config.ts +0 -20
- package/kotlin/fixtures/import-selection/ImportSelection.native.tsx +0 -44
- package/kotlin/fixtures/import-selection/README.md +0 -32
- package/kotlin/fixtures/import-selection/Selection.d.kt.ts +0 -8
- package/kotlin/fixtures/import-selection/Selection.kt +0 -78
- package/kotlin/fixtures/import-selection/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-selection/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-selection/package.json +0 -23
- package/kotlin/fixtures/import-selection/tsconfig.json +0 -20
- package/kotlin/fixtures/import-selection/vite.config.ts +0 -20
- package/kotlin/fixtures/import-surfaces/ImportSurfaces.native.tsx +0 -13
- package/kotlin/fixtures/import-surfaces/README.md +0 -22
- package/kotlin/fixtures/import-surfaces/Surfaces.d.kt.ts +0 -7
- package/kotlin/fixtures/import-surfaces/Surfaces.kt +0 -64
- package/kotlin/fixtures/import-surfaces/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-surfaces/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-surfaces/package.json +0 -23
- package/kotlin/fixtures/import-surfaces/tsconfig.json +0 -20
- package/kotlin/fixtures/import-surfaces/vite.config.ts +0 -20
- package/kotlin/fixtures/import-values/ImportValues.native.tsx +0 -61
- package/kotlin/fixtures/import-values/README.md +0 -28
- package/kotlin/fixtures/import-values/Values.d.kt.ts +0 -15
- package/kotlin/fixtures/import-values/Values.kt +0 -84
- package/kotlin/fixtures/import-values/app/_layout.tsx +0 -4
- package/kotlin/fixtures/import-values/app/index+spa.tsx +0 -1
- package/kotlin/fixtures/import-values/package.json +0 -23
- package/kotlin/fixtures/import-values/tsconfig.json +0 -20
- package/kotlin/fixtures/import-values/vite.config.ts +0 -20
- package/kotlin/fixtures/kotlin-app/app/build.gradle.kts +0 -30
- package/kotlin/fixtures/kotlin-app/app/src/main/AndroidManifest.xml +0 -13
- package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/MainActivity.kt +0 -60
- package/kotlin/fixtures/kotlin-app/app/src/main/java/dev/contrast/kotlinapp/ProbeApplication.kt +0 -18
- package/kotlin/fixtures/kotlin-app/build.gradle.kts +0 -5
- package/kotlin/fixtures/kotlin-app/gradle.properties +0 -4
- package/kotlin/fixtures/kotlin-app/settings.gradle.kts +0 -4
- package/kotlin/fixtures/kotlin-app-variants/Anim.kt +0 -62
- package/kotlin/fixtures/kotlin-app-variants/BarBehavior.kt +0 -38
- package/kotlin/fixtures/kotlin-app-variants/BarVisibility.kt +0 -36
- package/kotlin/fixtures/kotlin-app-variants/Bitmaps.kt +0 -50
- package/kotlin/fixtures/kotlin-app-variants/Browse.kt +0 -73
- package/kotlin/fixtures/kotlin-app-variants/Colors.kt +0 -41
- package/kotlin/fixtures/kotlin-app-variants/Controls.kt +0 -62
- package/kotlin/fixtures/kotlin-app-variants/Drag.kt +0 -56
- package/kotlin/fixtures/kotlin-app-variants/Draw.kt +0 -74
- package/kotlin/fixtures/kotlin-app-variants/Drawables.kt +0 -53
- package/kotlin/fixtures/kotlin-app-variants/Focus.kt +0 -62
- package/kotlin/fixtures/kotlin-app-variants/Form.kt +0 -47
- package/kotlin/fixtures/kotlin-app-variants/Icons.kt +0 -59
- package/kotlin/fixtures/kotlin-app-variants/Ime.kt +0 -53
- package/kotlin/fixtures/kotlin-app-variants/Lists.kt +0 -57
- package/kotlin/fixtures/kotlin-app-variants/Nav.kt +0 -47
- package/kotlin/fixtures/kotlin-app-variants/Note.kt +0 -40
- package/kotlin/fixtures/kotlin-app-variants/Overlays.kt +0 -56
- package/kotlin/fixtures/kotlin-app-variants/Pan.kt +0 -38
- package/kotlin/fixtures/kotlin-app-variants/Pickers.kt +0 -44
- package/kotlin/fixtures/kotlin-app-variants/Press.kt +0 -43
- package/kotlin/fixtures/kotlin-app-variants/Scroll.kt +0 -63
- package/kotlin/fixtures/kotlin-app-variants/Sheet.kt +0 -43
- package/kotlin/fixtures/kotlin-app-variants/Strings.kt +0 -49
- package/kotlin/fixtures/kotlin-app-variants/Tabs.kt +0 -47
- package/kotlin/fixtures/kotlin-app-variants/TextWidth.kt +0 -45
- package/kotlin/fixtures/kotlin-app-variants/TransientInsets.kt +0 -50
- package/kotlin/fixtures/kotlin-app-variants/Transition.kt +0 -69
- package/kotlin/fixtures/kotlin-app-variants/ViewConfig.kt +0 -22
- package/kotlin/fixtures/kotlin-app-variants/Widgets.kt +0 -67
- package/kotlin/fixtures/runtime-state/RuntimeState.kt +0 -200
- package/kotlin/fork/README.md +0 -97
- package/kotlin/fork/build.sh +0 -176
- package/kotlin/fork/compose-worker-globals.patch +0 -1247
- package/kotlin/fork/fork.json +0 -46
- package/kotlin/fork/publish.ts +0 -99
- package/kotlin/fork/skia-android-shaping.patch +0 -189
- package/kotlin/fork/skiko-local.init.gradle +0 -10
- package/kotlin/fork/skiko-worker-clock.patch +0 -122
|
@@ -1,1247 +0,0 @@
|
|
|
1
|
-
diff --git a/compose/ui/ui-text/src/webMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.web.kt b/compose/ui/ui-text/src/webMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.web.kt
|
|
2
|
-
--- a/compose/ui/ui-text/src/webMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.web.kt
|
|
3
|
-
+++ b/compose/ui/ui-text/src/webMain/kotlin/androidx/compose/ui/text/intl/PlatformLocale.web.kt
|
|
4
|
-
@@ -12,6 +12,10 @@
|
|
5
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
6
|
-
* See the License for the specific language governing permissions and
|
|
7
|
-
* limitations under the License.
|
|
8
|
-
+ *
|
|
9
|
-
+ * modified for Peach: an explicit locale provider lets a native host supply
|
|
10
|
-
+ * device languages without exposing browser navigator fields to guest code.
|
|
11
|
-
+ * see the fork record for the patch and upstream revision.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
package androidx.compose.ui.text.intl
|
|
15
|
-
@@ -64,8 +68,18 @@
|
|
16
|
-
// The locale code en-001 denotes the English language spoken in the World.
|
|
17
|
-
private const val FALLBACK_LANGUAGE_TAG = "en-001"
|
|
18
|
-
|
|
19
|
-
+private var currentLocaleProvider: () -> LocaleList = {
|
|
20
|
-
+ localeListFromLanguageTags(userPreferredLanguages())
|
|
21
|
-
+}
|
|
22
|
-
+
|
|
23
|
-
+// the host installs the device provider before constructing its first scene.
|
|
24
|
-
+@InternalComposeUiApi
|
|
25
|
-
+fun setPlatformLocaleProvider(provider: () -> LocaleList) {
|
|
26
|
-
+ currentLocaleProvider = provider
|
|
27
|
-
+}
|
|
28
|
-
+
|
|
29
|
-
internal actual fun createPlatformLocaleDelegate(): PlatformLocaleDelegate =
|
|
30
|
-
object : PlatformLocaleDelegate {
|
|
31
|
-
override val current: LocaleList
|
|
32
|
-
- get() = localeListFromLanguageTags(userPreferredLanguages())
|
|
33
|
-
+ get() = currentLocaleProvider()
|
|
34
|
-
}
|
|
35
|
-
diff --git a/compose/ui/ui/src/wasmJsMain/kotlin/androidx/compose/ui/Actuals.wasm.kt b/compose/ui/ui/src/wasmJsMain/kotlin/androidx/compose/ui/Actuals.wasm.kt
|
|
36
|
-
index 26aa8ea..aa4f6d4 100644
|
|
37
|
-
--- a/compose/ui/ui/src/wasmJsMain/kotlin/androidx/compose/ui/Actuals.wasm.kt
|
|
38
|
-
+++ b/compose/ui/ui/src/wasmJsMain/kotlin/androidx/compose/ui/Actuals.wasm.kt
|
|
39
|
-
@@ -12,16 +12,22 @@
|
|
40
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
41
|
-
* See the License for the specific language governing permissions and
|
|
42
|
-
* limitations under the License.
|
|
43
|
-
+ *
|
|
44
|
-
+ * Modified for Peach (https://peachsim.com): reads worker-safe globals through
|
|
45
|
-
+ * globalThis instead of window, so this code runs in a Web Worker as well as a
|
|
46
|
-
+ * document. See the Peach fork record for the patch and upstream revision.
|
|
47
|
-
*/
|
|
48
|
-
|
|
49
|
-
package androidx.compose.ui
|
|
50
|
-
|
|
51
|
-
-import kotlinx.browser.window
|
|
52
|
-
+import kotlin.js.js
|
|
53
|
-
|
|
54
|
-
internal actual fun areObjectsOfSameType(a: Any, b: Any): Boolean {
|
|
55
|
-
return a === b || a::class == b::class
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
internal actual fun currentTimeMillis(): Long {
|
|
59
|
-
- return window.performance.now().toLong()
|
|
60
|
-
-}
|
|
61
|
-
|
|
62
|
-
+ return performanceNow().toLong()
|
|
63
|
-
+}
|
|
64
|
-
+
|
|
65
|
-
+private fun performanceNow(): Double = js("globalThis.performance.now()")
|
|
66
|
-
diff --git a/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/platform/PlatformClipboard.web.kt b/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/platform/PlatformClipboard.web.kt
|
|
67
|
-
index 7aa3e26..47e20a8 100644
|
|
68
|
-
--- a/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/platform/PlatformClipboard.web.kt
|
|
69
|
-
+++ b/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/platform/PlatformClipboard.web.kt
|
|
70
|
-
@@ -12,6 +12,10 @@
|
|
71
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
72
|
-
* See the License for the specific language governing permissions and
|
|
73
|
-
* limitations under the License.
|
|
74
|
-
+ *
|
|
75
|
-
+ * Modified for Peach (https://peachsim.com): reads worker-safe globals through
|
|
76
|
-
+ * globalThis instead of window, so this code runs in a Web Worker as well as a
|
|
77
|
-
+ * document. See the Peach fork record for the patch and upstream revision.
|
|
78
|
-
*/
|
|
79
|
-
|
|
80
|
-
package androidx.compose.ui.platform
|
|
81
|
-
@@ -34,20 +38,20 @@ actual typealias NativeClipboard = W3CTemporaryClipboard
|
|
82
|
-
internal fun isFullClipboardApiSupported(): Boolean =
|
|
83
|
-
js(
|
|
84
|
-
"""Boolean(
|
|
85
|
-
- window.navigator.clipboard &&
|
|
86
|
-
- window.navigator.clipboard.write &&
|
|
87
|
-
- window.navigator.clipboard.read &&
|
|
88
|
-
+ globalThis.navigator.clipboard &&
|
|
89
|
-
+ globalThis.navigator.clipboard.write &&
|
|
90
|
-
+ globalThis.navigator.clipboard.read &&
|
|
91
|
-
typeof(ClipboardItem) !== 'undefined'
|
|
92
|
-
)
|
|
93
|
-
"""
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
-internal fun isSecureContext(): Boolean = js("window.isSecureContext === true")
|
|
97
|
-
+internal fun isSecureContext(): Boolean = js("globalThis.isSecureContext === true")
|
|
98
|
-
|
|
99
|
-
internal fun isFallbackWriteTextApiAvailable(): Boolean =
|
|
100
|
-
- js("Boolean(window.navigator.clipboard && window.navigator.clipboard.writeText)")
|
|
101
|
-
+ js("Boolean(globalThis.navigator.clipboard && globalThis.navigator.clipboard.writeText)")
|
|
102
|
-
|
|
103
|
-
-internal fun getW3CClipboard(): NativeClipboard = js("window.navigator.clipboard")
|
|
104
|
-
+internal fun getW3CClipboard(): NativeClipboard = js("globalThis.navigator.clipboard")
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API
|
|
108
|
-
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/SystemTheme.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/SystemTheme.kt
|
|
109
|
-
index a14f182..9c4862d 100644
|
|
110
|
-
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/SystemTheme.kt
|
|
111
|
-
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/SystemTheme.kt
|
|
112
|
-
@@ -12,6 +12,11 @@
|
|
113
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
114
|
-
* See the License for the specific language governing permissions and
|
|
115
|
-
* limitations under the License.
|
|
116
|
-
+ *
|
|
117
|
-
+ * modified for Peach: the system theme composition local is visible to a
|
|
118
|
-
+ * native host, which provides the device's night mode to the scenes it owns,
|
|
119
|
-
+ * as later upstream releases expose it. see the fork record for the patch and
|
|
120
|
-
+ * upstream revision.
|
|
121
|
-
*/
|
|
122
|
-
|
|
123
|
-
package androidx.compose.ui
|
|
124
|
-
@@ -27,7 +32,8 @@ enum class SystemTheme {
|
|
125
|
-
Dark, Light, Unknown
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
-internal val LocalSystemTheme = staticCompositionLocalOf { currentSystemTheme }
|
|
129
|
-
+@InternalComposeUiApi
|
|
130
|
-
+val LocalSystemTheme = staticCompositionLocalOf { currentSystemTheme }
|
|
131
|
-
|
|
132
|
-
@InternalComposeUiApi
|
|
133
|
-
@Composable
|
|
134
|
-
diff --git a/compose/material3/material3/src/webMain/kotlin/androidx/compose/material3/internal/PlatformDateFormat.web.kt b/compose/material3/material3/src/webMain/kotlin/androidx/compose/material3/internal/PlatformDateFormat.web.kt
|
|
135
|
-
--- a/compose/material3/material3/src/webMain/kotlin/androidx/compose/material3/internal/PlatformDateFormat.web.kt
|
|
136
|
-
+++ b/compose/material3/material3/src/webMain/kotlin/androidx/compose/material3/internal/PlatformDateFormat.web.kt
|
|
137
|
-
@@ -12,6 +12,9 @@
|
|
138
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
139
|
-
* See the License for the specific language governing permissions and
|
|
140
|
-
* limitations under the License.
|
|
141
|
-
+ *
|
|
142
|
-
+ * modified for Peach: UTC date formatting matches Android independent of the browser time zone.
|
|
143
|
-
+ * see the fork record for the patch and upstream revision.
|
|
144
|
-
*/
|
|
145
|
-
|
|
146
|
-
@file:OptIn(ExperimentalTime::class)
|
|
147
|
-
@@ -74,6 +77,7 @@
|
|
148
|
-
jsDate.toLocaleDateString(
|
|
149
|
-
locales = locale.toLanguageTag(),
|
|
150
|
-
options = dateLocaleOptions {
|
|
151
|
-
+ timeZone = "UTC"
|
|
152
|
-
month = it
|
|
153
|
-
}
|
|
154
|
-
)
|
|
155
|
-
@@ -83,6 +87,7 @@
|
|
156
|
-
jsDate.toLocaleDateString(
|
|
157
|
-
locales = locale.toLanguageTag(),
|
|
158
|
-
options = dateLocaleOptions {
|
|
159
|
-
+ timeZone = "UTC"
|
|
160
|
-
weekday = it
|
|
161
|
-
}
|
|
162
|
-
)
|
|
163
|
-
@@ -106,6 +111,7 @@
|
|
164
|
-
return jsDate.toLocaleDateString(
|
|
165
|
-
locales = locale.toLanguageTag(),
|
|
166
|
-
options = dateLocaleOptions {
|
|
167
|
-
+ timeZone = "UTC"
|
|
168
|
-
when {
|
|
169
|
-
skeleton.contains("y", true) -> NUMERIC
|
|
170
|
-
else -> null
|
|
171
|
-
diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.nonAndroid.kt
|
|
172
|
-
--- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.nonAndroid.kt
|
|
173
|
-
+++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/graphics/SkiaBackedPaint.nonAndroid.kt
|
|
174
|
-
@@ -12,6 +12,9 @@
|
|
175
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
176
|
-
* See the License for the specific language governing permissions and
|
|
177
|
-
* limitations under the License.
|
|
178
|
-
+ *
|
|
179
|
-
+ * modified for Peach: initial stroke join matches the backing Skia paint and Android default.
|
|
180
|
-
+ * see the fork record for the patch and upstream revision.
|
|
181
|
-
*/
|
|
182
|
-
|
|
183
|
-
@file:JvmName("SkiaBackedPaint_skikoKt")
|
|
184
|
-
@@ -99,7 +102,7 @@
|
|
185
|
-
field = value
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
- override var strokeJoin: StrokeJoin = StrokeJoin.Round
|
|
189
|
-
+ override var strokeJoin: StrokeJoin = StrokeJoin.Miter
|
|
190
|
-
set(value) {
|
|
191
|
-
internalSkiaPaint.strokeJoin = value.toSkia()
|
|
192
|
-
field = value
|
|
193
|
-
diff --git a/navigation/navigation-compose/src/webMain/kotlin/androidx/navigation/compose/DefaultNavTransitions.web.kt b/navigation/navigation-compose/src/webMain/kotlin/androidx/navigation/compose/DefaultNavTransitions.web.kt
|
|
194
|
-
--- a/navigation/navigation-compose/src/webMain/kotlin/androidx/navigation/compose/DefaultNavTransitions.web.kt
|
|
195
|
-
+++ b/navigation/navigation-compose/src/webMain/kotlin/androidx/navigation/compose/DefaultNavTransitions.web.kt
|
|
196
|
-
@@ -12,6 +12,9 @@
|
|
197
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
198
|
-
* See the License for the specific language governing permissions and
|
|
199
|
-
* limitations under the License.
|
|
200
|
-
+ *
|
|
201
|
-
+ * modified for Peach: default navigation transitions match the pinned Android implementation.
|
|
202
|
-
+ * see the fork record for the patch and upstream revision.
|
|
203
|
-
*/
|
|
204
|
-
|
|
205
|
-
package androidx.navigation.compose
|
|
206
|
-
@@ -20,24 +23,29 @@
|
|
207
|
-
import androidx.compose.animation.EnterTransition
|
|
208
|
-
import androidx.compose.animation.ExitTransition
|
|
209
|
-
import androidx.compose.animation.SizeTransform
|
|
210
|
-
+import androidx.compose.animation.core.spring
|
|
211
|
-
+import androidx.compose.animation.core.tween
|
|
212
|
-
+import androidx.compose.animation.fadeIn
|
|
213
|
-
+import androidx.compose.animation.fadeOut
|
|
214
|
-
+import androidx.compose.animation.scaleOut
|
|
215
|
-
import androidx.navigation.NavBackStackEntry
|
|
216
|
-
|
|
217
|
-
public actual object DefaultNavTransitions {
|
|
218
|
-
public actual val enterTransition:
|
|
219
|
-
AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition =
|
|
220
|
-
- { EnterTransition.None }
|
|
221
|
-
+ { fadeIn(animationSpec = tween(700)) }
|
|
222
|
-
|
|
223
|
-
public actual val exitTransition:
|
|
224
|
-
AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition =
|
|
225
|
-
- { ExitTransition.None }
|
|
226
|
-
+ { fadeOut(animationSpec = tween(700)) }
|
|
227
|
-
|
|
228
|
-
public actual val predictivePopEnterTransition:
|
|
229
|
-
AnimatedContentTransitionScope<NavBackStackEntry>.(Int) -> EnterTransition =
|
|
230
|
-
- { EnterTransition.None }
|
|
231
|
-
+ { fadeIn(spring(dampingRatio = 1.0f, stiffness = 1600.0f)) }
|
|
232
|
-
|
|
233
|
-
public actual val predictivePopExitTransition:
|
|
234
|
-
AnimatedContentTransitionScope<NavBackStackEntry>.(Int) -> ExitTransition =
|
|
235
|
-
- { ExitTransition.None }
|
|
236
|
-
+ { scaleOut(targetScale = 0.7f) }
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
public actual val sizeTransform:
|
|
240
|
-
diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoText.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoText.nonAndroid.kt
|
|
241
|
-
--- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoText.nonAndroid.kt
|
|
242
|
-
+++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoText.nonAndroid.kt
|
|
243
|
-
@@ -1,3 +1,4 @@
|
|
244
|
-
+// modified for Peach: Android static text uses integer glyph advances.
|
|
245
|
-
/*
|
|
246
|
-
* Copyright 2026 The Android Open Source Project
|
|
247
|
-
*
|
|
248
|
-
@@ -123,7 +124,7 @@
|
|
249
|
-
)
|
|
250
|
-
|
|
251
|
-
Platform.Android -> FontRasterizationSettings(
|
|
252
|
-
- subpixelPositioning = true,
|
|
253
|
-
+ subpixelPositioning = false,
|
|
254
|
-
smoothing = FontSmoothing.AntiAlias,
|
|
255
|
-
hinting = FontHinting.Slight,
|
|
256
|
-
autoHintingForced = false,
|
|
257
|
-
diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
|
|
258
|
-
--- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
|
|
259
|
-
+++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
|
|
260
|
-
@@ -1,3 +1,4 @@
|
|
261
|
-
+// modified for Peach: Android static font sizes and advances follow the native paint.
|
|
262
|
-
/*
|
|
263
|
-
* Copyright 2020 The Android Open Source Project
|
|
264
|
-
*
|
|
265
|
-
@@ -19,6 +20,10 @@
|
|
266
|
-
package androidx.compose.ui.text.platform
|
|
267
|
-
|
|
268
|
-
import androidx.compose.ui.InternalComposeUiApi
|
|
269
|
-
+import androidx.compose.ui.text.platform.Platform
|
|
270
|
-
+import androidx.compose.ui.text.platform.currentPlatform
|
|
271
|
-
+import androidx.compose.ui.text.style.TextMotion
|
|
272
|
-
+import kotlin.math.floor
|
|
273
|
-
import androidx.compose.ui.geometry.Size
|
|
274
|
-
import androidx.compose.ui.graphics.BlendMode
|
|
275
|
-
import androidx.compose.ui.graphics.Color
|
|
276
|
-
@@ -163,6 +168,8 @@
|
|
277
|
-
|
|
278
|
-
fun toSkTextStyle(fontFamilyResolver: FontFamily.Resolver): SkTextStyle {
|
|
279
|
-
val res = SkTextStyle()
|
|
280
|
-
+ val resolvedFontSize = if (currentPlatform() == Platform.Android &&
|
|
281
|
-
+ !fontRasterizationSettings.subpixelPositioning) floor(fontSize) else fontSize
|
|
282
|
-
if (textForegroundStyle.color.isSpecified) {
|
|
283
|
-
res.color = textForegroundStyle.color.toArgb()
|
|
284
|
-
}
|
|
285
|
-
@@ -194,7 +201,7 @@
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
letterSpacing?.let {
|
|
289
|
-
- res.letterSpacing = it
|
|
290
|
-
+ res.letterSpacing = if (fontSize == 0f) it else it * resolvedFontSize / fontSize
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
res.addFontFeatures(FontFeature.parseW3(fontFeatureSettings.orEmpty()))
|
|
294
|
-
@@ -338,6 +345,7 @@
|
|
295
|
-
blendMode: BlendMode = DrawScope.DefaultBlendMode,
|
|
296
|
-
lineHeight: TextUnit,
|
|
297
|
-
lineHeightStyle: LineHeightStyle?,
|
|
298
|
-
+ textMotion: TextMotion?,
|
|
299
|
-
) = ComputedStyle.Mutable(
|
|
300
|
-
textForegroundStyle = spanStyle.toParagraphTextForegroundStyle(),
|
|
301
|
-
brushSize = brushSize,
|
|
302
|
-
@@ -347,7 +355,10 @@
|
|
303
|
-
fontSynthesis = spanStyle.fontSynthesis,
|
|
304
|
-
fontFamily = spanStyle.fontFamily,
|
|
305
|
-
fontFeatureSettings = spanStyle.fontFeatureSettings,
|
|
306
|
-
- fontRasterizationSettings = platformParagraphStyle?.fontRasterizationSettings ?: FontRasterizationSettings.PlatformDefault,
|
|
307
|
-
+ fontRasterizationSettings = platformParagraphStyle?.fontRasterizationSettings ?:
|
|
308
|
-
+ if (currentPlatform() == Platform.Android && textMotion === TextMotion.Animated) {
|
|
309
|
-
+ FontRasterizationSettings(FontSmoothing.AntiAlias, FontHinting.Slight, true, false)
|
|
310
|
-
+ } else FontRasterizationSettings.PlatformDefault,
|
|
311
|
-
letterSpacing = if (spanStyle.letterSpacing.isSpecified) {
|
|
312
|
-
with(density) { spanStyle.letterSpacing.toPx() }
|
|
313
|
-
} else null,
|
|
314
|
-
@@ -401,6 +412,7 @@
|
|
315
|
-
blendMode = blendMode,
|
|
316
|
-
lineHeight = textStyle.lineHeight,
|
|
317
|
-
lineHeightStyle = textStyle.lineHeightStyle,
|
|
318
|
-
+ textMotion = textStyle.textMotion,
|
|
319
|
-
).toImmutable()
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
@@ -609,7 +621,8 @@
|
|
323
|
-
brushSize = brushSize,
|
|
324
|
-
blendMode = blendMode,
|
|
325
|
-
lineHeight = textStyle.lineHeight,
|
|
326
|
-
- lineHeightStyle = textStyle.lineHeightStyle
|
|
327
|
-
+ lineHeightStyle = textStyle.lineHeightStyle,
|
|
328
|
-
+ textMotion = textStyle.textMotion,
|
|
329
|
-
)
|
|
330
|
-
for (i in 1 until activeStyles.size) {
|
|
331
|
-
style.merge(density, activeStyles[i])
|
|
332
|
-
diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoParagraph.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoParagraph.nonAndroid.kt
|
|
333
|
-
--- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoParagraph.nonAndroid.kt
|
|
334
|
-
+++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/SkikoParagraph.nonAndroid.kt
|
|
335
|
-
@@ -1,3 +1,4 @@
|
|
336
|
-
+// modified for peach: Android text bounds and intrinsic padding match the platform.
|
|
337
|
-
/*
|
|
338
|
-
* Copyright 2023 The Android Open Source Project
|
|
339
|
-
*
|
|
340
|
-
@@ -35,6 +36,8 @@
|
|
341
|
-
import androidx.compose.ui.graphics.toComposeRect
|
|
342
|
-
import androidx.compose.ui.text.PlatformParagraph
|
|
343
|
-
import androidx.compose.ui.text.platform.SkikoParagraphIntrinsics
|
|
344
|
-
+import androidx.compose.ui.text.platform.Platform
|
|
345
|
-
+import androidx.compose.ui.text.platform.currentPlatform
|
|
346
|
-
import androidx.compose.ui.text.platform.cursorHorizontalPosition
|
|
347
|
-
import androidx.compose.ui.text.style.LineHeightStyle
|
|
348
|
-
import androidx.compose.ui.text.style.ResolvedTextDirection
|
|
349
|
-
@@ -43,6 +46,7 @@
|
|
350
|
-
import androidx.compose.ui.text.style.TextOverflow
|
|
351
|
-
import androidx.compose.ui.unit.Constraints
|
|
352
|
-
import androidx.compose.ui.unit.isUnspecified
|
|
353
|
-
+import kotlin.math.ceil
|
|
354
|
-
import kotlin.math.floor
|
|
355
|
-
import org.jetbrains.skia.FontMetrics
|
|
356
|
-
import org.jetbrains.skia.IRange
|
|
357
|
-
@@ -216,11 +220,31 @@
|
|
358
|
-
)
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
+ private val usesAndroidBoringLayout: Boolean
|
|
362
|
-
+ get() = paragraphIntrinsics.androidBoringMetrics &&
|
|
363
|
-
+ maxIntrinsicWidth <= width && lineCount == 1 && !didExceedMaxLines
|
|
364
|
-
+
|
|
365
|
-
override fun getLineLeft(lineIndex: Int): Float =
|
|
366
|
-
- lineMetrics.getOrNull(lineIndex)?.left?.toFloat() ?: 0f
|
|
367
|
-
+ lineMetrics.getOrNull(lineIndex)?.let { line ->
|
|
368
|
-
+ if (currentPlatform() == Platform.Android && paragraphIntrinsics.style.textAlign == TextAlign.Center) {
|
|
369
|
-
+ floor((width - line.width.toFloat()) / 2)
|
|
370
|
-
+ } else if (usesAndroidBoringLayout) {
|
|
371
|
-
+ if (paragraphIntrinsics.style.textAlign == TextAlign.Right ||
|
|
372
|
-
+ paragraphIntrinsics.style.textAlign == TextAlign.End)
|
|
373
|
-
+ width - paragraphIntrinsics.androidBoringWidth else 0f
|
|
374
|
-
+ } else line.left.toFloat()
|
|
375
|
-
+ } ?: 0f
|
|
376
|
-
|
|
377
|
-
override fun getLineRight(lineIndex: Int): Float =
|
|
378
|
-
- lineMetrics.getOrNull(lineIndex)?.right?.toFloat() ?: 0f
|
|
379
|
-
+ lineMetrics.getOrNull(lineIndex)?.let { line ->
|
|
380
|
-
+ if (currentPlatform() == Platform.Android && paragraphIntrinsics.style.textAlign == TextAlign.Center) {
|
|
381
|
-
+ ceil((width + line.width.toFloat()) / 2)
|
|
382
|
-
+ } else if (usesAndroidBoringLayout) {
|
|
383
|
-
+ if (paragraphIntrinsics.style.textAlign == TextAlign.Right ||
|
|
384
|
-
+ paragraphIntrinsics.style.textAlign == TextAlign.End)
|
|
385
|
-
+ width else paragraphIntrinsics.androidBoringWidth
|
|
386
|
-
+ } else line.right.toFloat()
|
|
387
|
-
+ } ?: 0f
|
|
388
|
-
|
|
389
|
-
override fun getLineTop(lineIndex: Int) =
|
|
390
|
-
lineMetrics.getOrNull(lineIndex)?.let { line ->
|
|
391
|
-
diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphIntrinsics.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphIntrinsics.nonAndroid.kt
|
|
392
|
-
--- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphIntrinsics.nonAndroid.kt
|
|
393
|
-
+++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphIntrinsics.nonAndroid.kt
|
|
394
|
-
@@ -1,3 +1,4 @@
|
|
395
|
-
+// modified for peach: Android text bounds and intrinsic padding match the platform.
|
|
396
|
-
@file:OptIn(InternalComposeUiApi::class)
|
|
397
|
-
|
|
398
|
-
/*
|
|
399
|
-
@@ -23,9 +24,12 @@
|
|
400
|
-
import androidx.compose.ui.InternalComposeUiApi
|
|
401
|
-
import androidx.compose.ui.text.AnnotatedString
|
|
402
|
-
import androidx.compose.ui.text.AnnotatedString.Range
|
|
403
|
-
+import androidx.compose.ui.text.Bullet
|
|
404
|
-
+import androidx.compose.ui.text.ParagraphStyle
|
|
405
|
-
import androidx.compose.ui.text.ParagraphIntrinsics
|
|
406
|
-
import androidx.compose.ui.text.Placeholder
|
|
407
|
-
import androidx.compose.ui.text.StrongDirectionType
|
|
408
|
-
+import androidx.compose.ui.text.SpanStyle
|
|
409
|
-
import androidx.compose.ui.text.TextStyle
|
|
410
|
-
import androidx.compose.ui.text.firstStrongDirectionType
|
|
411
|
-
import androidx.compose.ui.text.font.FontFamily
|
|
412
|
-
@@ -33,19 +37,40 @@
|
|
413
|
-
import androidx.compose.ui.text.intl.LocaleList
|
|
414
|
-
import androidx.compose.ui.text.intl.isRtl
|
|
415
|
-
import androidx.compose.ui.text.style.ResolvedTextDirection
|
|
416
|
-
+import androidx.compose.ui.text.style.TextIndent
|
|
417
|
-
import androidx.compose.ui.text.style.TextDirection
|
|
418
|
-
import androidx.compose.ui.unit.Density
|
|
419
|
-
+import androidx.compose.ui.unit.TextUnit
|
|
420
|
-
+import androidx.compose.ui.unit.isUnspecified
|
|
421
|
-
import kotlin.math.ceil
|
|
422
|
-
|
|
423
|
-
internal class SkikoParagraphIntrinsics(
|
|
424
|
-
val text: String,
|
|
425
|
-
- private val style: TextStyle,
|
|
426
|
-
+ val style: TextStyle,
|
|
427
|
-
private val annotations: List<AnnotatedString.Range<out AnnotatedString.Annotation>>,
|
|
428
|
-
private val placeholders: List<Range<Placeholder>>,
|
|
429
|
-
private val density: Density,
|
|
430
|
-
private val fontFamilyResolver: FontFamily.Resolver
|
|
431
|
-
) : ParagraphIntrinsics {
|
|
432
|
-
val textDirection = resolveTextDirection(text, style.textDirection, style.localeList)
|
|
433
|
-
+
|
|
434
|
-
+ // android boring layout ceilings the extent without rounding glyph positions.
|
|
435
|
-
+ val androidBoringMetrics = currentPlatform() == Platform.Android &&
|
|
436
|
-
+ textDirection == ResolvedTextDirection.Ltr && style.lineHeight.isUnspecified &&
|
|
437
|
-
+ (style.textIndent == null || style.textIndent == TextIndent.None) &&
|
|
438
|
-
+ style.baselineShift?.multiplier?.let { it == 0f } != false &&
|
|
439
|
-
+ placeholders.isEmpty() && annotations.none {
|
|
440
|
-
+ val annotation = it.item
|
|
441
|
-
+ annotation is ParagraphStyle || annotation is Bullet ||
|
|
442
|
-
+ (annotation is SpanStyle && annotation.baselineShift?.multiplier?.let { it != 0f } == true)
|
|
443
|
-
+ } && text.none {
|
|
444
|
-
+ it == '\n' || it == '\t' || it in '\u0590'..'\u08FF' ||
|
|
445
|
-
+ it == '\u200E' || it == '\u200F' || it in '\u202A'..'\u202E' ||
|
|
446
|
-
+ it in '\u2066'..'\u2069' || it in '\uD800'..'\uDFFF' ||
|
|
447
|
-
+ it in '\uFB1D'..'\uFDFF' || it in '\uFE70'..'\uFEFE'
|
|
448
|
-
+ }
|
|
449
|
-
+ var androidBoringWidth = 0f
|
|
450
|
-
+ private set
|
|
451
|
-
|
|
452
|
-
//we need to track it reactively to invalidate the UI
|
|
453
|
-
override var hasStaleResolvedFonts: Boolean by mutableStateOf(false)
|
|
454
|
-
@@ -79,6 +104,17 @@
|
|
455
|
-
val para = layouter!!.layoutParagraph(Float.POSITIVE_INFINITY)
|
|
456
|
-
minIntrinsicWidth = ceil(para.minIntrinsicWidth)
|
|
457
|
-
maxIntrinsicWidth = ceil(para.maxIntrinsicWidth)
|
|
458
|
-
+ androidBoringWidth = maxIntrinsicWidth
|
|
459
|
-
+ val hasLetterSpacing =
|
|
460
|
-
+ (style.letterSpacing != TextUnit.Unspecified && style.letterSpacing.value != 0f) ||
|
|
461
|
-
+ annotations.any {
|
|
462
|
-
+ val span = it.item
|
|
463
|
-
+ span is SpanStyle && span.letterSpacing != TextUnit.Unspecified &&
|
|
464
|
-
+ span.letterSpacing.value != 0f
|
|
465
|
-
+ }
|
|
466
|
-
+ if (currentPlatform() == Platform.Android && maxIntrinsicWidth != 0f && hasLetterSpacing) {
|
|
467
|
-
+ maxIntrinsicWidth += 0.5f
|
|
468
|
-
+ }
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
diff --git a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
|
|
473
|
-
--- a/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
|
|
474
|
-
+++ b/compose/ui/ui-skiko/src/nonAndroidMain/kotlin/androidx/compose/ui/text/platform/SkikoParagraphBuilder.nonAndroid.kt
|
|
475
|
-
@@ -832,7 +832,7 @@
|
|
476
|
-
return when (this) {
|
|
477
|
-
TextAlign.Left -> SkAlignment.LEFT
|
|
478
|
-
TextAlign.Right -> SkAlignment.RIGHT
|
|
479
|
-
- TextAlign.Center -> SkAlignment.CENTER
|
|
480
|
-
+ TextAlign.Center -> if (currentPlatform() == Platform.Android) SkAlignment.CENTER_ANDROID else SkAlignment.CENTER
|
|
481
|
-
TextAlign.Justify -> SkAlignment.JUSTIFY
|
|
482
|
-
TextAlign.Start -> SkAlignment.START
|
|
483
|
-
TextAlign.End -> SkAlignment.END
|
|
484
|
-
diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/RequestFocusOnClick.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/RequestFocusOnClick.web.kt
|
|
485
|
-
--- a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/RequestFocusOnClick.web.kt
|
|
486
|
-
+++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/RequestFocusOnClick.web.kt
|
|
487
|
-
@@ -12,8 +12,11 @@
|
|
488
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
489
|
-
* See the License for the specific language governing permissions and
|
|
490
|
-
* limitations under the License.
|
|
491
|
-
+ *
|
|
492
|
-
+ * modified for Peach: Android touch focus keeps sibling controls from
|
|
493
|
-
+ * taking the active field on press. see the fork record for the source pin.
|
|
494
|
-
*/
|
|
495
|
-
|
|
496
|
-
package androidx.compose.foundation
|
|
497
|
-
|
|
498
|
-
-internal actual fun isRequestFocusOnClickEnabled(): Boolean = true
|
|
499
|
-
+internal actual fun isRequestFocusOnClickEnabled(): Boolean = false
|
|
500
|
-
diff --git a/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/focus/Focusability.web.kt b/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/focus/Focusability.web.kt
|
|
501
|
-
--- a/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/focus/Focusability.web.kt
|
|
502
|
-
+++ b/compose/ui/ui/src/webMain/kotlin/androidx/compose/ui/focus/Focusability.web.kt
|
|
503
|
-
@@ -12,10 +12,14 @@
|
|
504
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
505
|
-
* See the License for the specific language governing permissions and
|
|
506
|
-
* limitations under the License.
|
|
507
|
-
+ *
|
|
508
|
-
+ * modified for Peach: Android touch focus keeps sibling controls from
|
|
509
|
-
+ * taking the active field on press. see the fork record for the source pin.
|
|
510
|
-
*/
|
|
511
|
-
|
|
512
|
-
package androidx.compose.ui.focus
|
|
513
|
-
|
|
514
|
-
import androidx.compose.ui.node.CompositionLocalConsumerModifierNode
|
|
515
|
-
|
|
516
|
-
-internal actual fun systemDefinedCanFocus(node: CompositionLocalConsumerModifierNode) = true
|
|
517
|
-
|
|
518
|
-
+internal actual fun systemDefinedCanFocus(node: CompositionLocalConsumerModifierNode) =
|
|
519
|
-
+ mobilePlatformSystemDefinedCanFocus(node)
|
|
520
|
-
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformContext.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformContext.skiko.kt
|
|
521
|
-
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformContext.skiko.kt
|
|
522
|
-
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/platform/PlatformContext.skiko.kt
|
|
523
|
-
@@ -13,4 +13,7 @@
|
|
524
|
-
* See the License for the specific language governing permissions and
|
|
525
|
-
* limitations under the License.
|
|
526
|
-
+ *
|
|
527
|
-
+ * modified for Peach: dialogs attach a distinct native receiving window and
|
|
528
|
-
+ * navigation dispatcher, isolating back from the activity underneath.
|
|
529
|
-
*/
|
|
530
|
-
|
|
531
|
-
@@ -51,4 +54,5 @@
|
|
532
|
-
import androidx.compose.ui.text.intl.LocaleList
|
|
533
|
-
import androidx.compose.ui.unit.Dp
|
|
534
|
-
+import androidx.navigationevent.NavigationEventDispatcher
|
|
535
|
-
import androidx.lifecycle.Lifecycle
|
|
536
|
-
import androidx.lifecycle.LifecycleOwner
|
|
537
|
-
@@ -83,4 +87,8 @@
|
|
538
|
-
*/
|
|
539
|
-
val architectureComponentsOwner: PlatformArchitectureComponentsOwner get() = EmptyArchitectureComponentsOwner
|
|
540
|
-
+
|
|
541
|
-
+ // the host owns a dialog window until its composition is disposed.
|
|
542
|
-
+ fun attachDialogWindow(dispatcher: NavigationEventDispatcher): AutoCloseable =
|
|
543
|
-
+ error("the native host must attach a dialog receiving window")
|
|
544
|
-
|
|
545
|
-
/**
|
|
546
|
-
diff --git a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt
|
|
547
|
-
--- a/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt
|
|
548
|
-
+++ b/compose/ui/ui/src/skikoMain/kotlin/androidx/compose/ui/window/Dialog.skiko.kt
|
|
549
|
-
@@ -13,4 +13,7 @@
|
|
550
|
-
* See the License for the specific language governing permissions and
|
|
551
|
-
* limitations under the License.
|
|
552
|
-
+ *
|
|
553
|
-
+ * modified for Peach: dialogs attach a distinct native receiving window and
|
|
554
|
-
+ * navigation dispatcher, isolating back from the activity underneath.
|
|
555
|
-
*/
|
|
556
|
-
|
|
557
|
-
@@ -19,4 +22,5 @@
|
|
558
|
-
import androidx.compose.runtime.Composable
|
|
559
|
-
import androidx.compose.runtime.CompositionContext
|
|
560
|
-
+import androidx.compose.runtime.CompositionLocalProvider
|
|
561
|
-
import androidx.compose.runtime.DisposableEffect
|
|
562
|
-
import androidx.compose.runtime.Immutable
|
|
563
|
-
@@ -34,4 +38,5 @@
|
|
564
|
-
import androidx.compose.ui.ComposeUiFlags
|
|
565
|
-
import androidx.compose.ui.ExperimentalComposeUiApi
|
|
566
|
-
+import androidx.compose.ui.InternalComposeUiApi
|
|
567
|
-
import androidx.compose.ui.Modifier
|
|
568
|
-
import androidx.compose.ui.MotionDurationScale
|
|
569
|
-
@@ -57,4 +62,6 @@
|
|
570
|
-
import androidx.compose.ui.platform.union
|
|
571
|
-
import androidx.compose.ui.scene.ComposeSceneLayer
|
|
572
|
-
+import androidx.compose.ui.scene.LocalComposeSceneContext
|
|
573
|
-
+import androidx.compose.ui.scene.requireCurrent
|
|
574
|
-
import androidx.compose.ui.scene.Content
|
|
575
|
-
import androidx.compose.ui.scene.rememberComposeSceneLayer
|
|
576
|
-
@@ -65,4 +72,6 @@
|
|
577
|
-
import androidx.compose.ui.unit.center
|
|
578
|
-
import androidx.navigationevent.compose.LocalNavigationEventDispatcherOwner
|
|
579
|
-
+import androidx.navigationevent.NavigationEventDispatcher
|
|
580
|
-
+import androidx.navigationevent.NavigationEventDispatcherOwner
|
|
581
|
-
import kotlin.coroutines.CoroutineContext
|
|
582
|
-
import kotlin.time.Duration.Companion.seconds
|
|
583
|
-
@@ -167,5 +176,5 @@
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
-@OptIn(InternalComposeApi::class)
|
|
587
|
-
+@OptIn(InternalComposeApi::class, InternalComposeUiApi::class)
|
|
588
|
-
@Composable
|
|
589
|
-
actual fun Dialog(
|
|
590
|
-
@@ -182,8 +191,15 @@
|
|
591
|
-
onBackHandler.backClickIsEnabled = properties.dismissOnBackPress
|
|
592
|
-
}
|
|
593
|
-
- val navigationEventDispatcher =
|
|
594
|
-
- requireNotNull(LocalNavigationEventDispatcherOwner.current) {
|
|
595
|
-
- error("NavigationEventDispatcherOwner not found")
|
|
596
|
-
- }.navigationEventDispatcher
|
|
597
|
-
+ val dialogOwner = remember {
|
|
598
|
-
+ object : NavigationEventDispatcherOwner {
|
|
599
|
-
+ override val navigationEventDispatcher = NavigationEventDispatcher()
|
|
600
|
-
+ }
|
|
601
|
-
+ }
|
|
602
|
-
+ val navigationEventDispatcher = dialogOwner.navigationEventDispatcher
|
|
603
|
-
+ val platformContext = LocalComposeSceneContext.requireCurrent().platformContext
|
|
604
|
-
+ DisposableEffect(platformContext, navigationEventDispatcher) {
|
|
605
|
-
+ val window = platformContext.attachDialogWindow(navigationEventDispatcher)
|
|
606
|
-
+ onDispose { window.close(); navigationEventDispatcher.dispose() }
|
|
607
|
-
+ }
|
|
608
|
-
DisposableEffect(navigationEventDispatcher, onBackHandler) {
|
|
609
|
-
navigationEventDispatcher.addHandler(onBackHandler)
|
|
610
|
-
@@ -208,5 +224,7 @@
|
|
611
|
-
onOutsidePointerEvent = onOutsidePointerEvent,
|
|
612
|
-
properties = properties,
|
|
613
|
-
- content = content
|
|
614
|
-
+ content = {
|
|
615
|
-
+ CompositionLocalProvider(LocalNavigationEventDispatcherOwner provides dialogOwner, content = content)
|
|
616
|
-
+ }
|
|
617
|
-
)
|
|
618
|
-
}
|
|
619
|
-
diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/Magnifier.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/Magnifier.web.kt
|
|
620
|
-
new file mode 100644
|
|
621
|
-
--- /dev/null
|
|
622
|
-
+++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/Magnifier.web.kt
|
|
623
|
-
@@ -0,0 +1,470 @@
|
|
624
|
-
+/*
|
|
625
|
-
+ * Copyright 2021 The Android Open Source Project
|
|
626
|
-
+ *
|
|
627
|
-
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
628
|
-
+ * you may not use this file except in compliance with the License.
|
|
629
|
-
+ * You may obtain a copy of the License at
|
|
630
|
-
+ *
|
|
631
|
-
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
632
|
-
+ *
|
|
633
|
-
+ * Unless required by applicable law or agreed to in writing, software
|
|
634
|
-
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
635
|
-
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
636
|
-
+ * See the License for the specific language governing permissions and
|
|
637
|
-
+ * limitations under the License.
|
|
638
|
-
+ */
|
|
639
|
-
+
|
|
640
|
-
+package androidx.compose.foundation
|
|
641
|
-
+
|
|
642
|
-
+// modified by peach: android magnifier lifecycle with a scene-owned native backend.
|
|
643
|
-
+
|
|
644
|
-
+import androidx.compose.runtime.State
|
|
645
|
-
+import androidx.compose.runtime.derivedStateOf
|
|
646
|
-
+import androidx.compose.runtime.getValue
|
|
647
|
-
+import androidx.compose.runtime.mutableStateOf
|
|
648
|
-
+import androidx.compose.runtime.neverEqualPolicy
|
|
649
|
-
+import androidx.compose.runtime.setValue
|
|
650
|
-
+import androidx.compose.runtime.withFrameMillis
|
|
651
|
-
+import androidx.compose.ui.Modifier
|
|
652
|
-
+import androidx.compose.ui.composed
|
|
653
|
-
+import androidx.compose.ui.geometry.Offset
|
|
654
|
-
+import androidx.compose.ui.geometry.isSpecified
|
|
655
|
-
+import androidx.compose.ui.graphics.drawscope.ContentDrawScope
|
|
656
|
-
+import androidx.compose.ui.layout.LayoutCoordinates
|
|
657
|
-
+import androidx.compose.ui.layout.positionInRoot
|
|
658
|
-
+import androidx.compose.ui.node.DrawModifierNode
|
|
659
|
-
+import androidx.compose.ui.node.GlobalPositionAwareModifierNode
|
|
660
|
-
+import androidx.compose.ui.node.ModifierNodeElement
|
|
661
|
-
+import androidx.compose.ui.node.ObserverModifierNode
|
|
662
|
-
+import androidx.compose.ui.node.SemanticsModifierNode
|
|
663
|
-
+import androidx.compose.ui.node.observeReads
|
|
664
|
-
+import androidx.compose.ui.node.requireDensity
|
|
665
|
-
+import androidx.compose.ui.platform.InspectorInfo
|
|
666
|
-
+import androidx.compose.ui.semantics.SemanticsPropertyKey
|
|
667
|
-
+import androidx.compose.ui.semantics.SemanticsPropertyReceiver
|
|
668
|
-
+import androidx.compose.ui.unit.Density
|
|
669
|
-
+import androidx.compose.ui.unit.Dp
|
|
670
|
-
+import androidx.compose.ui.unit.DpSize
|
|
671
|
-
+import androidx.compose.ui.unit.IntSize
|
|
672
|
-
+import androidx.compose.ui.unit.toSize
|
|
673
|
-
+import kotlinx.coroutines.CoroutineStart
|
|
674
|
-
+import kotlinx.coroutines.channels.Channel
|
|
675
|
-
+import kotlinx.coroutines.launch
|
|
676
|
-
+
|
|
677
|
-
+/**
|
|
678
|
-
+ * A function on elements that are magnified with a [magnifier] modifier that returns the position
|
|
679
|
-
+ * of the center of the magnified content in the coordinate space of the root composable.
|
|
680
|
-
+ */
|
|
681
|
-
+internal val MagnifierPositionInRoot = SemanticsPropertyKey<() -> Offset>("MagnifierPositionInRoot")
|
|
682
|
-
+
|
|
683
|
-
+/**
|
|
684
|
-
+ * Shows a [Magnifier] widget that shows an enlarged version of the content at [sourceCenter]
|
|
685
|
-
+ * relative to the current layout node.
|
|
686
|
-
+ *
|
|
687
|
-
+ * This function returns a no-op modifier on API levels below P (28), since the framework does not
|
|
688
|
-
+ * support the [Magnifier] widget on those levels. However, even on higher API levels, not all
|
|
689
|
-
+ * magnifier features are supported on all platforms. Please refer to parameter explanations below
|
|
690
|
-
+ * to learn more about supported features on different platform versions.
|
|
691
|
-
+ *
|
|
692
|
-
+ * This function does not allow configuration of [source bounds][Magnifier.Builder.setSourceBounds]
|
|
693
|
-
+ * since the magnifier widget does not support constraining to the bounds of composables.
|
|
694
|
-
+ *
|
|
695
|
-
+ * @sample androidx.compose.foundation.samples.MagnifierSample
|
|
696
|
-
+ * @param sourceCenter The offset of the center of the magnified content. Measured in pixels from
|
|
697
|
-
+ * the top-left of the layout node this modifier is applied to. This offset is passed to
|
|
698
|
-
+ * [Magnifier.show].
|
|
699
|
-
+ * @param magnifierCenter The offset of the magnifier widget itself, where the magnified content is
|
|
700
|
-
+ * rendered over the original content. Measured in density-independent pixels from the top-left of
|
|
701
|
-
+ * the layout node this modifier is applied to. If left null or returns an
|
|
702
|
-
+ * [unspecified][DpOffset.Unspecified] value, the magnifier widget will be placed at a default
|
|
703
|
-
+ * offset relative to [sourceCenter]. The value of that offset is specified by the system.
|
|
704
|
-
+ * @param onSizeChanged An optional callback that will be invoked when the magnifier widget is
|
|
705
|
-
+ * initialized to report on its actual size. This can be useful when [size] parameter is left
|
|
706
|
-
+ * unspecified.
|
|
707
|
-
+ * @param zoom See [Magnifier.setZoom]. Only supported on API 29+.
|
|
708
|
-
+ * @param size See [Magnifier.Builder.setSize]. Only supported on API 29+.
|
|
709
|
-
+ * @param cornerRadius See [Magnifier.Builder.setCornerRadius]. Only supported on API 29+.
|
|
710
|
-
+ * @param elevation See [Magnifier.Builder.setElevation]. Only supported on API 29+.
|
|
711
|
-
+ * @param clip See [Magnifier.Builder.setClippingEnabled]. Only supported on API 29+.
|
|
712
|
-
+ */
|
|
713
|
-
+public fun Modifier.magnifier(
|
|
714
|
-
+ sourceCenter: Density.() -> Offset,
|
|
715
|
-
+ magnifierCenter: (Density.() -> Offset)? = null,
|
|
716
|
-
+ onSizeChanged: ((DpSize) -> Unit)? = null,
|
|
717
|
-
+ zoom: Float = Float.NaN,
|
|
718
|
-
+ size: DpSize = DpSize.Unspecified,
|
|
719
|
-
+ cornerRadius: Dp = Dp.Unspecified,
|
|
720
|
-
+ elevation: Dp = Dp.Unspecified,
|
|
721
|
-
+ clip: Boolean = true,
|
|
722
|
-
+): Modifier {
|
|
723
|
-
+ return magnifier(
|
|
724
|
-
+ sourceCenter = sourceCenter,
|
|
725
|
-
+ magnifierCenter = magnifierCenter,
|
|
726
|
-
+ onSizeChanged = onSizeChanged,
|
|
727
|
-
+ zoom = zoom,
|
|
728
|
-
+ useTextDefault = false,
|
|
729
|
-
+ size = size,
|
|
730
|
-
+ cornerRadius = cornerRadius,
|
|
731
|
-
+ elevation = elevation,
|
|
732
|
-
+ clippingEnabled = clip,
|
|
733
|
-
+ )
|
|
734
|
-
+}
|
|
735
|
-
+
|
|
736
|
-
+/**
|
|
737
|
-
+ * For testing and internal Text usage purposes.
|
|
738
|
-
+ *
|
|
739
|
-
+ * TextField and SelectionManager uses this internal API to pass `useTextDefault` as true.
|
|
740
|
-
+ */
|
|
741
|
-
+internal fun Modifier.magnifier(
|
|
742
|
-
+ sourceCenter: Density.() -> Offset,
|
|
743
|
-
+ magnifierCenter: (Density.() -> Offset)? = null,
|
|
744
|
-
+ onSizeChanged: ((DpSize) -> Unit)? = null,
|
|
745
|
-
+ zoom: Float = Float.NaN,
|
|
746
|
-
+ useTextDefault: Boolean = false,
|
|
747
|
-
+ size: DpSize = DpSize.Unspecified,
|
|
748
|
-
+ cornerRadius: Dp = Dp.Unspecified,
|
|
749
|
-
+ elevation: Dp = Dp.Unspecified,
|
|
750
|
-
+ clippingEnabled: Boolean = true,
|
|
751
|
-
+ platformMagnifierFactory: PlatformMagnifierFactory? = null,
|
|
752
|
-
+): Modifier {
|
|
753
|
-
+ return composed {
|
|
754
|
-
+ MagnifierElement(
|
|
755
|
-
+ sourceCenter = sourceCenter,
|
|
756
|
-
+ magnifierCenter = magnifierCenter,
|
|
757
|
-
+ onSizeChanged = onSizeChanged,
|
|
758
|
-
+ useTextDefault = useTextDefault,
|
|
759
|
-
+ zoom = zoom,
|
|
760
|
-
+ size = size,
|
|
761
|
-
+ cornerRadius = cornerRadius,
|
|
762
|
-
+ elevation = elevation,
|
|
763
|
-
+ clippingEnabled = clippingEnabled,
|
|
764
|
-
+ platformMagnifierFactory = platformMagnifierFactory ?: LocalPlatformMagnifierFactory.current,
|
|
765
|
-
+ )
|
|
766
|
-
+ }
|
|
767
|
-
+}
|
|
768
|
-
+
|
|
769
|
-
+internal class MagnifierElement(
|
|
770
|
-
+ private val sourceCenter: Density.() -> Offset,
|
|
771
|
-
+ private val magnifierCenter: (Density.() -> Offset)? = null,
|
|
772
|
-
+ private val onSizeChanged: ((DpSize) -> Unit)? = null,
|
|
773
|
-
+ private val zoom: Float = Float.NaN,
|
|
774
|
-
+ private val useTextDefault: Boolean = false,
|
|
775
|
-
+ private val size: DpSize = DpSize.Unspecified,
|
|
776
|
-
+ private val cornerRadius: Dp = Dp.Unspecified,
|
|
777
|
-
+ private val elevation: Dp = Dp.Unspecified,
|
|
778
|
-
+ private val clippingEnabled: Boolean = true,
|
|
779
|
-
+ private val platformMagnifierFactory: PlatformMagnifierFactory,
|
|
780
|
-
+) : ModifierNodeElement<MagnifierNode>() {
|
|
781
|
-
+
|
|
782
|
-
+ override fun create(): MagnifierNode {
|
|
783
|
-
+ return MagnifierNode(
|
|
784
|
-
+ sourceCenter = sourceCenter,
|
|
785
|
-
+ magnifierCenter = magnifierCenter,
|
|
786
|
-
+ zoom = zoom,
|
|
787
|
-
+ useTextDefault = useTextDefault,
|
|
788
|
-
+ size = size,
|
|
789
|
-
+ cornerRadius = cornerRadius,
|
|
790
|
-
+ elevation = elevation,
|
|
791
|
-
+ clippingEnabled = clippingEnabled,
|
|
792
|
-
+ onSizeChanged = onSizeChanged,
|
|
793
|
-
+ platformMagnifierFactory = platformMagnifierFactory,
|
|
794
|
-
+ )
|
|
795
|
-
+ }
|
|
796
|
-
+
|
|
797
|
-
+ override fun update(node: MagnifierNode) {
|
|
798
|
-
+ node.update(
|
|
799
|
-
+ sourceCenter = sourceCenter,
|
|
800
|
-
+ magnifierCenter = magnifierCenter,
|
|
801
|
-
+ zoom = zoom,
|
|
802
|
-
+ useTextDefault = useTextDefault,
|
|
803
|
-
+ size = size,
|
|
804
|
-
+ cornerRadius = cornerRadius,
|
|
805
|
-
+ elevation = elevation,
|
|
806
|
-
+ clippingEnabled = clippingEnabled,
|
|
807
|
-
+ onSizeChanged = onSizeChanged,
|
|
808
|
-
+ platformMagnifierFactory = platformMagnifierFactory,
|
|
809
|
-
+ )
|
|
810
|
-
+ }
|
|
811
|
-
+
|
|
812
|
-
+ override fun equals(other: Any?): Boolean {
|
|
813
|
-
+ if (this === other) return true
|
|
814
|
-
+ if (other !is MagnifierElement) return false
|
|
815
|
-
+
|
|
816
|
-
+ if (sourceCenter !== other.sourceCenter) return false
|
|
817
|
-
+ if (magnifierCenter !== other.magnifierCenter) return false
|
|
818
|
-
+ if (zoom != other.zoom) return false
|
|
819
|
-
+ if (useTextDefault != other.useTextDefault) return false
|
|
820
|
-
+ if (size != other.size) return false
|
|
821
|
-
+ if (cornerRadius != other.cornerRadius) return false
|
|
822
|
-
+ if (elevation != other.elevation) return false
|
|
823
|
-
+ if (clippingEnabled != other.clippingEnabled) return false
|
|
824
|
-
+ if (onSizeChanged !== other.onSizeChanged) return false
|
|
825
|
-
+ if (platformMagnifierFactory != other.platformMagnifierFactory) return false
|
|
826
|
-
+
|
|
827
|
-
+ return true
|
|
828
|
-
+ }
|
|
829
|
-
+
|
|
830
|
-
+ override fun hashCode(): Int {
|
|
831
|
-
+ var result = sourceCenter.hashCode()
|
|
832
|
-
+ result = 31 * result + magnifierCenter.hashCode()
|
|
833
|
-
+ result = 31 * result + zoom.hashCode()
|
|
834
|
-
+ result = 31 * result + useTextDefault.hashCode()
|
|
835
|
-
+ result = 31 * result + size.hashCode()
|
|
836
|
-
+ result = 31 * result + cornerRadius.hashCode()
|
|
837
|
-
+ result = 31 * result + elevation.hashCode()
|
|
838
|
-
+ result = 31 * result + clippingEnabled.hashCode()
|
|
839
|
-
+ result = 31 * result + (onSizeChanged?.hashCode() ?: 0)
|
|
840
|
-
+ result = 31 * result + platformMagnifierFactory.hashCode()
|
|
841
|
-
+ return result
|
|
842
|
-
+ }
|
|
843
|
-
+
|
|
844
|
-
+ override fun InspectorInfo.inspectableProperties() {
|
|
845
|
-
+ name = "magnifier"
|
|
846
|
-
+ properties["sourceCenter"] = sourceCenter
|
|
847
|
-
+ properties["magnifierCenter"] = magnifierCenter
|
|
848
|
-
+ properties["zoom"] = zoom
|
|
849
|
-
+ properties["size"] = size
|
|
850
|
-
+ properties["cornerRadius"] = cornerRadius
|
|
851
|
-
+ properties["elevation"] = elevation
|
|
852
|
-
+ properties["clippingEnabled"] = clippingEnabled
|
|
853
|
-
+ }
|
|
854
|
-
+}
|
|
855
|
-
+
|
|
856
|
-
+internal class MagnifierNode(
|
|
857
|
-
+ var sourceCenter: Density.() -> Offset,
|
|
858
|
-
+ var magnifierCenter: (Density.() -> Offset)? = null,
|
|
859
|
-
+ var onSizeChanged: ((DpSize) -> Unit)? = null,
|
|
860
|
-
+ var zoom: Float = Float.NaN,
|
|
861
|
-
+ var useTextDefault: Boolean = false,
|
|
862
|
-
+ var size: DpSize = DpSize.Unspecified,
|
|
863
|
-
+ var cornerRadius: Dp = Dp.Unspecified,
|
|
864
|
-
+ var elevation: Dp = Dp.Unspecified,
|
|
865
|
-
+ var clippingEnabled: Boolean = true,
|
|
866
|
-
+ var platformMagnifierFactory: PlatformMagnifierFactory,
|
|
867
|
-
+) :
|
|
868
|
-
+ Modifier.Node(),
|
|
869
|
-
+ GlobalPositionAwareModifierNode,
|
|
870
|
-
+ DrawModifierNode,
|
|
871
|
-
+ SemanticsModifierNode,
|
|
872
|
-
+ ObserverModifierNode {
|
|
873
|
-
+
|
|
874
|
-
+ /**
|
|
875
|
-
+ * Current density provided by [requireDensity]. Used as a receiver to callback functions that
|
|
876
|
-
+ * are expected return pixel targeted offsets.
|
|
877
|
-
+ */
|
|
878
|
-
+ private var density: Density? = null
|
|
879
|
-
+
|
|
880
|
-
+ /** Current magnifier instance. */
|
|
881
|
-
+ private var magnifier: PlatformMagnifier? = null
|
|
882
|
-
+
|
|
883
|
-
+ /**
|
|
884
|
-
+ * The latest [LayoutCoordinates] that is reported by [onGloballyPositioned] callback. Using
|
|
885
|
-
+ * [neverEqualPolicy] guarantees that every update to this value restarts snapshots aware
|
|
886
|
-
+ * listeners since the [LayoutCoordinates] instance itself does not change.
|
|
887
|
-
+ */
|
|
888
|
-
+ private var layoutCoordinates: LayoutCoordinates? by mutableStateOf(null, neverEqualPolicy())
|
|
889
|
-
+
|
|
890
|
-
+ /**
|
|
891
|
-
+ * Lazily initialized state that keeps track of anchor Composable's position in root layout.
|
|
892
|
-
+ * This state should be derived from [layoutCoordinates]. This variable shouldn't be used
|
|
893
|
-
+ * directly from the code, only [anchorPositionInRoot] should initialize and read from this.
|
|
894
|
-
+ */
|
|
895
|
-
+ private var anchorPositionInRootState: State<Offset>? = null
|
|
896
|
-
+
|
|
897
|
-
+ private val anchorPositionInRoot: Offset
|
|
898
|
-
+ get() {
|
|
899
|
-
+ if (anchorPositionInRootState == null) {
|
|
900
|
-
+ anchorPositionInRootState = derivedStateOf {
|
|
901
|
-
+ layoutCoordinates?.positionInRoot() ?: Offset.Unspecified
|
|
902
|
-
+ }
|
|
903
|
-
+ }
|
|
904
|
-
+ return anchorPositionInRootState?.value ?: Offset.Unspecified
|
|
905
|
-
+ }
|
|
906
|
-
+
|
|
907
|
-
+ /**
|
|
908
|
-
+ * Position where [sourceCenter] is mapped on root layout. This is passed to platform magnifier
|
|
909
|
-
+ * to precisely target the requested location.
|
|
910
|
-
+ */
|
|
911
|
-
+ private var sourceCenterInRoot: Offset = Offset.Unspecified
|
|
912
|
-
+
|
|
913
|
-
+ /**
|
|
914
|
-
+ * Last reported size to [onSizeChanged]. This is compared to the current size before calling
|
|
915
|
-
+ * the lambda again.
|
|
916
|
-
+ */
|
|
917
|
-
+ private var previousSize: IntSize? = null
|
|
918
|
-
+
|
|
919
|
-
+ private var drawSignalChannel: Channel<Unit>? = null
|
|
920
|
-
+
|
|
921
|
-
+ fun update(
|
|
922
|
-
+ sourceCenter: Density.() -> Offset,
|
|
923
|
-
+ magnifierCenter: (Density.() -> Offset)?,
|
|
924
|
-
+ zoom: Float,
|
|
925
|
-
+ useTextDefault: Boolean,
|
|
926
|
-
+ size: DpSize,
|
|
927
|
-
+ cornerRadius: Dp,
|
|
928
|
-
+ elevation: Dp,
|
|
929
|
-
+ clippingEnabled: Boolean,
|
|
930
|
-
+ onSizeChanged: ((DpSize) -> Unit)?,
|
|
931
|
-
+ platformMagnifierFactory: PlatformMagnifierFactory,
|
|
932
|
-
+ ) {
|
|
933
|
-
+ val previousZoom = this.zoom
|
|
934
|
-
+ val previousSize = this.size
|
|
935
|
-
+ val previousCornerRadius = this.cornerRadius
|
|
936
|
-
+ val previousUseTextDefault = this.useTextDefault
|
|
937
|
-
+ val previousElevation = this.elevation
|
|
938
|
-
+ val previousClippingEnabled = this.clippingEnabled
|
|
939
|
-
+ val previousPlatformMagnifierFactory = this.platformMagnifierFactory
|
|
940
|
-
+ val previousDensity = this.density
|
|
941
|
-
+
|
|
942
|
-
+ this.sourceCenter = sourceCenter
|
|
943
|
-
+ this.magnifierCenter = magnifierCenter
|
|
944
|
-
+ this.zoom = zoom
|
|
945
|
-
+ this.useTextDefault = useTextDefault
|
|
946
|
-
+ this.size = size
|
|
947
|
-
+ this.cornerRadius = cornerRadius
|
|
948
|
-
+ this.elevation = elevation
|
|
949
|
-
+ this.clippingEnabled = clippingEnabled
|
|
950
|
-
+ this.onSizeChanged = onSizeChanged
|
|
951
|
-
+ this.platformMagnifierFactory = platformMagnifierFactory
|
|
952
|
-
+
|
|
953
|
-
+ val density = requireDensity()
|
|
954
|
-
+
|
|
955
|
-
+ val shouldRecreate =
|
|
956
|
-
+ magnifier != null && // only recreate if it was already created
|
|
957
|
-
+ // On platforms >=Q, the zoom level can be updated dynamically on an existing
|
|
958
|
-
+ // magnifier,
|
|
959
|
-
+ // so if the zoom changes between recompositions we don't need to recreate the
|
|
960
|
-
+ // magnifier. On older platforms, the zoom can only be set initially, so we use the
|
|
961
|
-
+ // zoom itself as a key so the magnifier gets recreated if it changes.
|
|
962
|
-
+ ((!zoom.equalsIncludingNaN(previousZoom) &&
|
|
963
|
-
+ !platformMagnifierFactory.canUpdateZoom) ||
|
|
964
|
-
+ size != previousSize ||
|
|
965
|
-
+ cornerRadius != previousCornerRadius ||
|
|
966
|
-
+ elevation != previousElevation ||
|
|
967
|
-
+ useTextDefault != previousUseTextDefault ||
|
|
968
|
-
+ clippingEnabled != previousClippingEnabled ||
|
|
969
|
-
+ platformMagnifierFactory != previousPlatformMagnifierFactory ||
|
|
970
|
-
+ density != previousDensity)
|
|
971
|
-
+
|
|
972
|
-
+ if (shouldRecreate) {
|
|
973
|
-
+ recreateMagnifier()
|
|
974
|
-
+ }
|
|
975
|
-
+
|
|
976
|
-
+ updateMagnifier()
|
|
977
|
-
+ }
|
|
978
|
-
+
|
|
979
|
-
+ override fun onAttach() {
|
|
980
|
-
+ onObservedReadsChanged()
|
|
981
|
-
+ drawSignalChannel = Channel()
|
|
982
|
-
+ // Launch undispatched, otherwise we could miss the first draw signal
|
|
983
|
-
+ coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
|
|
984
|
-
+ while (true) {
|
|
985
|
-
+ drawSignalChannel?.receive()
|
|
986
|
-
+ // don't update the magnifier immediately, actual frame draw happens right after
|
|
987
|
-
+ // all draw commands are recorded. Magnifier update should happen in the next frame.
|
|
988
|
-
+ if (magnifier != null) {
|
|
989
|
-
+ withFrameMillis {}
|
|
990
|
-
+ magnifier?.updateContent()
|
|
991
|
-
+ }
|
|
992
|
-
+ }
|
|
993
|
-
+ }
|
|
994
|
-
+ }
|
|
995
|
-
+
|
|
996
|
-
+ override fun onDetach() {
|
|
997
|
-
+ magnifier?.dismiss()
|
|
998
|
-
+ magnifier = null
|
|
999
|
-
+ }
|
|
1000
|
-
+
|
|
1001
|
-
+ override fun onObservedReadsChanged() {
|
|
1002
|
-
+ observeReads { updateMagnifier() }
|
|
1003
|
-
+ }
|
|
1004
|
-
+
|
|
1005
|
-
+ private fun recreateMagnifier() {
|
|
1006
|
-
+ magnifier?.dismiss()
|
|
1007
|
-
+ val density = (density ?: requireDensity()).also { density = it }
|
|
1008
|
-
+ magnifier =
|
|
1009
|
-
+ platformMagnifierFactory.create(
|
|
1010
|
-
+ useTextDefault = useTextDefault,
|
|
1011
|
-
+ size = size,
|
|
1012
|
-
+ cornerRadius = cornerRadius,
|
|
1013
|
-
+ elevation = elevation,
|
|
1014
|
-
+ clippingEnabled = clippingEnabled,
|
|
1015
|
-
+ density = density,
|
|
1016
|
-
+ initialZoom = zoom,
|
|
1017
|
-
+ )
|
|
1018
|
-
+ updateSizeIfNecessary()
|
|
1019
|
-
+ }
|
|
1020
|
-
+
|
|
1021
|
-
+ private fun updateMagnifier() {
|
|
1022
|
-
+ val density = density ?: requireDensity().also { density = it }
|
|
1023
|
-
+
|
|
1024
|
-
+ val sourceCenterOffset = sourceCenter(density)
|
|
1025
|
-
+
|
|
1026
|
-
+ // the order of these checks are important since we don't want to query
|
|
1027
|
-
+ // `anchorPositionInRoot` if `sourceCenterOffset` is unspecified.
|
|
1028
|
-
+ if (sourceCenterOffset.isSpecified && anchorPositionInRoot.isSpecified) {
|
|
1029
|
-
+ sourceCenterInRoot = anchorPositionInRoot + sourceCenterOffset
|
|
1030
|
-
+ // Calculate magnifier center if it's provided. Only accept if the returned
|
|
1031
|
-
+ // value is specified. Then add [anchorPositionInRoot] for relative positioning.
|
|
1032
|
-
+ val magnifierCenter =
|
|
1033
|
-
+ magnifierCenter
|
|
1034
|
-
+ ?.invoke(density)
|
|
1035
|
-
+ ?.takeIf { it.isSpecified }
|
|
1036
|
-
+ ?.let { anchorPositionInRoot + it } ?: Offset.Unspecified
|
|
1037
|
-
+
|
|
1038
|
-
+ if (magnifier == null) {
|
|
1039
|
-
+ recreateMagnifier()
|
|
1040
|
-
+ }
|
|
1041
|
-
+
|
|
1042
|
-
+ magnifier?.update(
|
|
1043
|
-
+ sourceCenter = sourceCenterInRoot,
|
|
1044
|
-
+ magnifierCenter = magnifierCenter,
|
|
1045
|
-
+ zoom = zoom,
|
|
1046
|
-
+ )
|
|
1047
|
-
+ updateSizeIfNecessary()
|
|
1048
|
-
+ return
|
|
1049
|
-
+ }
|
|
1050
|
-
+
|
|
1051
|
-
+ // If the flow reaches here, it means that the magnifier could not be placed at a specified
|
|
1052
|
-
+ // position. We now need to hide it so it doesn't show up at an invalid location.
|
|
1053
|
-
+ sourceCenterInRoot = Offset.Unspecified
|
|
1054
|
-
+ magnifier?.dismiss()
|
|
1055
|
-
+ }
|
|
1056
|
-
+
|
|
1057
|
-
+ private fun updateSizeIfNecessary() {
|
|
1058
|
-
+ val magnifier = magnifier ?: return
|
|
1059
|
-
+ val density = density ?: return
|
|
1060
|
-
+
|
|
1061
|
-
+ if (magnifier.size != previousSize) {
|
|
1062
|
-
+ onSizeChanged?.invoke(with(density) { magnifier.size.toSize().toDpSize() })
|
|
1063
|
-
+ previousSize = magnifier.size
|
|
1064
|
-
+ }
|
|
1065
|
-
+ }
|
|
1066
|
-
+
|
|
1067
|
-
+ override fun ContentDrawScope.draw() {
|
|
1068
|
-
+ drawContent()
|
|
1069
|
-
+ drawSignalChannel?.trySend(Unit)
|
|
1070
|
-
+ }
|
|
1071
|
-
+
|
|
1072
|
-
+ override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
|
|
1073
|
-
+ // The mutable state must store the Offset, not the LocalCoordinates, because the same
|
|
1074
|
-
+ // LocalCoordinates instance may be sent to this callback multiple times, not implement
|
|
1075
|
-
+ // equals, or be stable, and so won't invalidate the snapshotFlow.
|
|
1076
|
-
+ layoutCoordinates = coordinates
|
|
1077
|
-
+ }
|
|
1078
|
-
+
|
|
1079
|
-
+ override fun SemanticsPropertyReceiver.applySemantics() {
|
|
1080
|
-
+ this[MagnifierPositionInRoot] = { sourceCenterInRoot }
|
|
1081
|
-
+ }
|
|
1082
|
-
+}
|
|
1083
|
-
+
|
|
1084
|
-
+
|
|
1085
|
-
+/**
|
|
1086
|
-
+ * Normally `Float.NaN == Float.NaN` returns false but we use [Float.NaN] to mean Unspecified. The
|
|
1087
|
-
+ * comparison between two unspecified values should return _equal_ if we are only interested in
|
|
1088
|
-
+ * state changes.
|
|
1089
|
-
+ */
|
|
1090
|
-
+internal fun Float.equalsIncludingNaN(other: Float): Boolean {
|
|
1091
|
-
+ if (this.isNaN() && other.isNaN()) return true
|
|
1092
|
-
+ return this == other
|
|
1093
|
-
+}
|
|
1094
|
-
diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/PlatformMagnifier.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/PlatformMagnifier.web.kt
|
|
1095
|
-
new file mode 100644
|
|
1096
|
-
--- /dev/null
|
|
1097
|
-
+++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/PlatformMagnifier.web.kt
|
|
1098
|
-
@@ -0,0 +1,52 @@
|
|
1099
|
-
+/*
|
|
1100
|
-
+ * Copyright 2021 The Android Open Source Project
|
|
1101
|
-
+ *
|
|
1102
|
-
+ * Licensed under the Apache License, Version 2.0 (the "License");
|
|
1103
|
-
+ * you may not use this file except in compliance with the License.
|
|
1104
|
-
+ * You may obtain a copy of the License at
|
|
1105
|
-
+ *
|
|
1106
|
-
+ * http://www.apache.org/licenses/LICENSE-2.0
|
|
1107
|
-
+ *
|
|
1108
|
-
+ * Unless required by applicable law or agreed to in writing, software
|
|
1109
|
-
+ * distributed under the License is distributed on an "AS IS" BASIS,
|
|
1110
|
-
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1111
|
-
+ * See the License for the specific language governing permissions and
|
|
1112
|
-
+ * limitations under the License.
|
|
1113
|
-
+ */
|
|
1114
|
-
+
|
|
1115
|
-
+package androidx.compose.foundation
|
|
1116
|
-
+
|
|
1117
|
-
+// modified by peach: the native scene supplies the android magnifier backend.
|
|
1118
|
-
+import androidx.compose.runtime.ProvidableCompositionLocal
|
|
1119
|
-
+import androidx.compose.runtime.Stable
|
|
1120
|
-
+import androidx.compose.runtime.staticCompositionLocalOf
|
|
1121
|
-
+import androidx.compose.ui.geometry.Offset
|
|
1122
|
-
+import androidx.compose.ui.unit.Density
|
|
1123
|
-
+import androidx.compose.ui.unit.Dp
|
|
1124
|
-
+import androidx.compose.ui.unit.DpSize
|
|
1125
|
-
+import androidx.compose.ui.unit.IntSize
|
|
1126
|
-
+
|
|
1127
|
-
+@Stable
|
|
1128
|
-
+public interface PlatformMagnifierFactory {
|
|
1129
|
-
+ public val canUpdateZoom: Boolean
|
|
1130
|
-
+ public fun create(
|
|
1131
|
-
+ useTextDefault: Boolean,
|
|
1132
|
-
+ size: DpSize,
|
|
1133
|
-
+ cornerRadius: Dp,
|
|
1134
|
-
+ elevation: Dp,
|
|
1135
|
-
+ clippingEnabled: Boolean,
|
|
1136
|
-
+ density: Density,
|
|
1137
|
-
+ initialZoom: Float,
|
|
1138
|
-
+ ): PlatformMagnifier
|
|
1139
|
-
+}
|
|
1140
|
-
+
|
|
1141
|
-
+public interface PlatformMagnifier {
|
|
1142
|
-
+ public val size: IntSize
|
|
1143
|
-
+ public fun updateContent(): Unit
|
|
1144
|
-
+ public fun update(sourceCenter: Offset, magnifierCenter: Offset, zoom: Float): Unit
|
|
1145
|
-
+ public fun dismiss(): Unit
|
|
1146
|
-
+}
|
|
1147
|
-
+
|
|
1148
|
-
+public val LocalPlatformMagnifierFactory: ProvidableCompositionLocal<PlatformMagnifierFactory> = staticCompositionLocalOf<PlatformMagnifierFactory> {
|
|
1149
|
-
+ error("the native scene must provide its platform magnifier factory")
|
|
1150
|
-
+}
|
|
1151
|
-
diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.web.kt
|
|
1152
|
-
--- a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.web.kt
|
|
1153
|
-
+++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/selection/TextFieldSelectionManager.web.kt
|
|
1154
|
-
@@ -16,6 +16,17 @@
|
|
1155
|
-
|
|
1156
|
-
package androidx.compose.foundation.text.selection
|
|
1157
|
-
|
|
1158
|
-
+// modified by peach: use android magnifier placement, animation and lifetime.
|
|
1159
|
-
+
|
|
1160
|
-
+import androidx.compose.foundation.LocalPlatformMagnifierFactory
|
|
1161
|
-
+import androidx.compose.foundation.magnifier
|
|
1162
|
-
+import androidx.compose.runtime.getValue
|
|
1163
|
-
+import androidx.compose.runtime.mutableStateOf
|
|
1164
|
-
+import androidx.compose.runtime.remember
|
|
1165
|
-
+import androidx.compose.runtime.setValue
|
|
1166
|
-
+import androidx.compose.ui.composed
|
|
1167
|
-
+import androidx.compose.ui.platform.LocalDensity
|
|
1168
|
-
+import androidx.compose.ui.unit.IntSize
|
|
1169
|
-
import androidx.compose.foundation.text.TextContextMenuItems
|
|
1170
|
-
import androidx.compose.foundation.text.TextContextMenuItems.Copy
|
|
1171
|
-
import androidx.compose.foundation.text.TextContextMenuItems.Cut
|
|
1172
|
-
@@ -30,7 +41,30 @@
|
|
1173
|
-
import kotlinx.coroutines.CoroutineStart
|
|
1174
|
-
import kotlinx.coroutines.launch
|
|
1175
|
-
|
|
1176
|
-
-internal actual fun Modifier.textFieldMagnifier(manager: TextFieldSelectionManager): Modifier = this
|
|
1177
|
-
+internal actual fun Modifier.textFieldMagnifier(manager: TextFieldSelectionManager): Modifier {
|
|
1178
|
-
+ return composed {
|
|
1179
|
-
+ val density = LocalDensity.current
|
|
1180
|
-
+ val factory = LocalPlatformMagnifierFactory.current
|
|
1181
|
-
+ var magnifierSize by remember { mutableStateOf(IntSize.Zero) }
|
|
1182
|
-
+ animatedSelectionMagnifier(
|
|
1183
|
-
+ magnifierCenter = { calculateSelectionMagnifierCenterAndroid(manager, magnifierSize) },
|
|
1184
|
-
+ platformMagnifier = { center ->
|
|
1185
|
-
+ Modifier.magnifier(
|
|
1186
|
-
+ sourceCenter = { center() },
|
|
1187
|
-
+ onSizeChanged = { size ->
|
|
1188
|
-
+ magnifierSize =
|
|
1189
|
-
+ with(density) {
|
|
1190
|
-
+ IntSize(size.width.roundToPx(), size.height.roundToPx())
|
|
1191
|
-
+ }
|
|
1192
|
-
+ },
|
|
1193
|
-
+ useTextDefault = true,
|
|
1194
|
-
+ platformMagnifierFactory = factory,
|
|
1195
|
-
+ )
|
|
1196
|
-
+ },
|
|
1197
|
-
+ )
|
|
1198
|
-
+ }
|
|
1199
|
-
+}
|
|
1200
|
-
+
|
|
1201
|
-
|
|
1202
|
-
/**
|
|
1203
|
-
* Whether the selection handle is in the visible bound of the TextField.
|
|
1204
|
-
diff --git a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/UndoManager.web.kt b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/UndoManager.web.kt
|
|
1205
|
-
--- a/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/UndoManager.web.kt
|
|
1206
|
-
+++ b/compose/foundation/foundation/src/webMain/kotlin/androidx/compose/foundation/text/UndoManager.web.kt
|
|
1207
|
-
@@ -16,7 +16,10 @@
|
|
1208
|
-
|
|
1209
|
-
package androidx.compose.foundation.text
|
|
1210
|
-
|
|
1211
|
-
-import kotlinx.browser.window
|
|
1212
|
-
+// modified by peach: use the worker clock without a document global.
|
|
1213
|
-
+import kotlin.js.js
|
|
1214
|
-
|
|
1215
|
-
-internal actual fun timeNowMillis(): Long = window.performance.now().toLong()
|
|
1216
|
-
+internal actual fun timeNowMillis(): Long = performanceNow().toLong()
|
|
1217
|
-
|
|
1218
|
-
+
|
|
1219
|
-
+private fun performanceNow(): Double = js("globalThis.performance.now()")
|
|
1220
|
-
diff --git a/compose/foundation/foundation/src/wasmJsMain/kotlin/androidx/compose/foundation/internal/ClipboardUtils.wasm.kt b/compose/foundation/foundation/src/wasmJsMain/kotlin/androidx/compose/foundation/internal/ClipboardUtils.wasm.kt
|
|
1221
|
-
--- a/compose/foundation/foundation/src/wasmJsMain/kotlin/androidx/compose/foundation/internal/ClipboardUtils.wasm.kt
|
|
1222
|
-
+++ b/compose/foundation/foundation/src/wasmJsMain/kotlin/androidx/compose/foundation/internal/ClipboardUtils.wasm.kt
|
|
1223
|
-
@@ -17,6 +17,8 @@
|
|
1224
|
-
@file:OptIn(ExperimentalComposeUiApi::class)
|
|
1225
|
-
|
|
1226
|
-
package androidx.compose.foundation.internal
|
|
1227
|
-
+
|
|
1228
|
-
+// modified by peach: query the worker clipboard capability without a document global.
|
|
1229
|
-
|
|
1230
|
-
import androidx.compose.ui.ExperimentalComposeUiApi
|
|
1231
|
-
import androidx.compose.ui.InternalComposeUiApi
|
|
1232
|
-
@@ -62,13 +64,13 @@
|
|
1233
|
-
isClipboardReadSupported()
|
|
1234
|
-
|
|
1235
|
-
private fun isClipboardReadSupported(): Boolean =
|
|
1236
|
-
- js("Boolean(window.navigator.clipboard && window.navigator.clipboard.read)")
|
|
1237
|
-
+ js("Boolean(globalThis.navigator.clipboard && globalThis.navigator.clipboard.read)")
|
|
1238
|
-
|
|
1239
|
-
internal actual fun Clipboard.isWriteSupported(): Boolean =
|
|
1240
|
-
isClipboardWriteSupported()
|
|
1241
|
-
|
|
1242
|
-
private fun isClipboardWriteSupported(): Boolean =
|
|
1243
|
-
- js("Boolean(window.navigator.clipboard && (window.navigator.clipboard.write || window.navigator.clipboard.writeText))")
|
|
1244
|
-
+ js("Boolean(globalThis.navigator.clipboard && (globalThis.navigator.clipboard.write || globalThis.navigator.clipboard.writeText))")
|
|
1245
|
-
|
|
1246
|
-
@Suppress("UNUSED_PARAMETER")
|
|
1247
|
-
private fun doesJsArrayContainValue(jsArray: JsArray<*>, value: JsAny): Boolean =
|