akanjs 3.0.0-beta.20 → 3.0.0-beta.21
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.ko.md +0 -1
- package/README.md +0 -1
- package/base/baseEnv.ts +40 -3
- package/client/cookie.ts +56 -20
- package/client/device.ts +47 -95
- package/client/frameConfig.ts +2 -2
- package/client/native.ts +44 -0
- package/client/router.ts +11 -1
- package/client/rscNavigation.ts +5 -0
- package/client/storage.ts +68 -39
- package/fetch/client/fetchClient.ts +13 -4
- package/index.ts +47 -46
- package/package.json +6 -87
- package/server/devtools/signalSerializer.ts +1 -2
- package/server/hmr/devHmrController.ts +29 -11
- package/server/resolver/signal.resolver.ts +1 -10
- package/server/routeTreeBuilder.ts +8 -11
- package/server/routing/apiRouter.ts +15 -2
- package/server/rscClient.tsx +1 -2
- package/server/ssrFromRscRenderer.tsx +2 -0
- package/server/webRouter.ts +1 -0
- package/signal/CrossSiteGuard.ts +34 -2
- package/signal/endpoint.ts +12 -7
- package/signal/endpointInfo.ts +13 -0
- package/signal/internal.ts +9 -5
- package/signal/serializer/fetch.serializer.ts +6 -3
- package/signal/slice.ts +34 -24
- package/store/baseSt.ts +0 -1
- package/store/storeInstance.ts +29 -17
- package/types/client/cookie.d.ts +6 -4
- package/types/client/device.d.ts +7 -10
- package/types/client/native.d.ts +26 -0
- package/types/client/rscNavigation.d.ts +4 -0
- package/types/client/storage.d.ts +8 -1
- package/types/index.d.ts +48 -44
- package/types/server/hmr/devHmrController.d.ts +2 -1
- package/types/server/resolver/signal.resolver.d.ts +0 -1
- package/types/server/rscClient.d.ts +0 -3
- package/types/signal/CrossSiteGuard.d.ts +7 -2
- package/types/signal/endpoint.d.ts +1 -1
- package/types/signal/endpointInfo.d.ts +3 -0
- package/types/signal/slice.d.ts +3 -2
- package/types/store/baseSt.d.ts +0 -13
- package/types/vendor/@akanjs/native/packages/cli/src/api.d.ts +182 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/build.d.ts +28 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/compat.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/dev.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/doctor.d.ts +37 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/plugin.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/signing.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/test.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/toolchain.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/update.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/config.d.ts +278 -0
- package/types/vendor/@akanjs/native/packages/cli/src/index.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/acl.d.ts +21 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/apilevel.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/apk.d.ts +36 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/args.d.ts +9 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/boot.d.ts +32 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/chrome.d.ts +6 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/codegen.d.ts +94 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/compat.d.ts +49 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/configkeys.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/csp.d.ts +51 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/env.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/exec.d.ts +31 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/googleservices.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/hmr.d.ts +120 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/html.d.ts +20 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/icons.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/image.d.ts +21 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/iossigning.d.ts +81 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/launch.d.ts +51 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/log.d.ts +42 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.d.ts +18 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/maven.d.ts +97 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/names.d.ts +45 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.d.ts +67 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/permissions.d.ts +10 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/plist.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/png.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/prepare.d.ts +138 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/privacy.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/project.d.ts +208 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/root.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/routes.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/serve.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/signing.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/spec.d.ts +96 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/toolchains.d.ts +150 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/updates.d.ts +77 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/vectors.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/xml.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/android.d.ts +57 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/index.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/ios.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/linux.d.ts +6 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/macos.d.ts +7 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/targets.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/web-run.d.ts +15 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/windows.d.ts +8 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/core/src/acl.d.ts +97 -0
- package/types/vendor/@akanjs/native/packages/core/src/boot.d.ts +66 -0
- package/types/vendor/@akanjs/native/packages/core/src/contract.d.ts +35 -0
- package/types/vendor/@akanjs/native/packages/core/src/errors.d.ts +27 -0
- package/types/vendor/@akanjs/native/packages/core/src/files.d.ts +23 -0
- package/types/vendor/@akanjs/native/packages/core/src/index.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/core/src/kernel.d.ts +112 -0
- package/types/vendor/@akanjs/native/packages/core/src/live.d.ts +12 -0
- package/types/vendor/@akanjs/native/packages/core/src/mime.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/core/src/plugin.d.ts +71 -0
- package/types/vendor/@akanjs/native/packages/core/src/protocol.d.ts +109 -0
- package/types/vendor/@akanjs/native/packages/core/src/runtime.d.ts +66 -0
- package/types/vendor/@akanjs/native/packages/core/src/state.d.ts +28 -0
- package/types/vendor/@akanjs/native/packages/core/src/testing.d.ts +41 -0
- package/types/vendor/@akanjs/native/packages/core/src/version.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/core/src/veto.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/core/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/deeplinks.d.ts +24 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/delta.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/dispatcher.d.ts +95 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/ffi.d.ts +144 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/host.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/lifecycle.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/main.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/page-veto.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/paths.d.ts +25 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/plugin.d.ts +179 -0
- package/types/vendor/@akanjs/native/packages/react/src/index.d.ts +8 -0
- package/types/vendor/@akanjs/native/packages/react/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/announce.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/index.d.ts +47 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/app/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/app/src/index.d.ts +66 -0
- package/types/vendor/@akanjs/native/plugins/app/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/app/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src/index.d.ts +19 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/index.d.ts +32 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/setting.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/args.d.ts +18 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/desktop.d.ts +17 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/index.d.ts +41 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src/desktop.d.ts +44 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src/index.d.ts +44 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/count.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/index.d.ts +37 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/badge/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/biometric/src/index.d.ts +53 -0
- package/types/vendor/@akanjs/native/plugins/biometric/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/args.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/index.d.ts +36 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/browser/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/desktop.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/camera/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/index.d.ts +40 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/device/src/desktop.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/device/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/device/src/web.d.ts +22 -0
- package/types/vendor/@akanjs/native/plugins/device/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/index.d.ts +60 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/options.d.ts +29 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/dock/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/dock/src/index.d.ts +46 -0
- package/types/vendor/@akanjs/native/plugins/dock/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/common.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/index.d.ts +84 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/web.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/common.d.ts +49 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/index.d.ts +123 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src/index.d.ts +93 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src/web.d.ts +11 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src/index.d.ts +52 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src/index.d.ts +31 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/http/src/common.d.ts +71 -0
- package/types/vendor/@akanjs/native/plugins/http/src/desktop.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/http/src/index.d.ts +104 -0
- package/types/vendor/@akanjs/native/plugins/http/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/http/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/iap/src/index.d.ts +171 -0
- package/types/vendor/@akanjs/native/plugins/iap/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/desktop.d.ts +15 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src/index.d.ts +42 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/desktop.d.ts +29 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/index.d.ts +126 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/schedule.d.ts +38 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/timers.d.ts +25 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/menu/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/menu/src/index.d.ts +85 -0
- package/types/vendor/@akanjs/native/plugins/menu/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/network/src/index.d.ts +22 -0
- package/types/vendor/@akanjs/native/plugins/network/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/network/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/desktop.d.ts +14 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/url.d.ts +16 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/opener/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/index.d.ts +26 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/push/src/index.d.ts +57 -0
- package/types/vendor/@akanjs/native/plugins/push/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/index.d.ts +70 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/web.d.ts +18 -0
- package/types/vendor/@akanjs/native/plugins/screen/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/index.d.ts +32 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/types.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src/desktop.d.ts +16 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src/index.d.ts +39 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/share/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/share/src/options.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/share/src/web.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/share/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/index.d.ts +25 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/socket.d.ts +46 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src/index.d.ts +19 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/common.d.ts +34 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/desktop.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/index.d.ts +115 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/index.d.ts +30 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/queue.d.ts +23 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/toast/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/tray/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/tray/src/index.d.ts +113 -0
- package/types/vendor/@akanjs/native/plugins/tray/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/updates/src/desktop.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/updates/src/index.d.ts +68 -0
- package/types/vendor/@akanjs/native/plugins/updates/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/window/src/desktop.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/window/src/index.d.ts +185 -0
- package/types/vendor/@akanjs/native/plugins/window/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/window/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/desktop.d.ts +7 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/state.d.ts +39 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src.d.ts +1 -0
- package/types/webkit/index.d.ts +0 -2
- package/types/webkit/nativeNavigation.d.ts +25 -0
- package/types/webkit/nativePurchase.d.ts +37 -0
- package/types/webkit/useCamera.d.ts +13 -15
- package/types/webkit/useGeoLocation.d.ts +4 -5
- package/types/webkit/usePurchase.d.ts +12 -16
- package/ui/Link/Anchor.tsx +2 -5
- package/ui/System/Client.tsx +2 -6
- package/vendor/@akanjs/native/LICENSE +21 -0
- package/vendor/@akanjs/native/README.ko.md +88 -0
- package/vendor/@akanjs/native/README.md +93 -0
- package/vendor/@akanjs/native/THIRD_PARTY_NOTICES.md +237 -0
- package/vendor/@akanjs/native/native/android/maven.lock.json +1751 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAcl.kt +243 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeActivity.kt +936 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeApplication.kt +189 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAssetServer.kt +225 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeBridge.kt +444 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeCompat.kt +55 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeContract.kt +99 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeEd25519.kt +100 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeFileProvider.kt +71 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeKernel.kt +324 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativePlugin.kt +361 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeSpec.kt +100 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeUpdates.kt +305 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeVectors.kt +132 -0
- package/vendor/@akanjs/native/native/desktop/Cargo.lock +2565 -0
- package/vendor/@akanjs/native/native/desktop/Cargo.toml +49 -0
- package/vendor/@akanjs/native/native/desktop/build.rs +19 -0
- package/vendor/@akanjs/native/native/desktop/rust-toolchain.toml +7 -0
- package/vendor/@akanjs/native/native/desktop/src/accelerator.rs +466 -0
- package/vendor/@akanjs/native/native/desktop/src/autostart.rs +158 -0
- package/vendor/@akanjs/native/native/desktop/src/camera.rs +53 -0
- package/vendor/@akanjs/native/native/desktop/src/chrome.rs +710 -0
- package/vendor/@akanjs/native/native/desktop/src/contract.rs +105 -0
- package/vendor/@akanjs/native/native/desktop/src/devproxy.rs +234 -0
- package/vendor/@akanjs/native/native/desktop/src/dialog_args.rs +189 -0
- package/vendor/@akanjs/native/native/desktop/src/dock.rs +209 -0
- package/vendor/@akanjs/native/native/desktop/src/hotkey.rs +209 -0
- package/vendor/@akanjs/native/native/desktop/src/js_panels.rs +125 -0
- package/vendor/@akanjs/native/native/desktop/src/json.rs +272 -0
- package/vendor/@akanjs/native/native/desktop/src/keychain.rs +151 -0
- package/vendor/@akanjs/native/native/desktop/src/lib.rs +2185 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/appearance.rs +177 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/camera.rs +11 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/clipboard.rs +48 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/device.rs +9 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/dialogs.rs +348 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/dock.rs +146 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/hotkey.rs +228 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/keychain.rs +243 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/menu.rs +445 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/mod.rs +116 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/notify.rs +211 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/open.rs +79 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/power.rs +155 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/screen.rs +158 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/tray.rs +604 -0
- package/vendor/@akanjs/native/native/desktop/src/menu.rs +517 -0
- package/vendor/@akanjs/native/native/desktop/src/navigation.rs +381 -0
- package/vendor/@akanjs/native/native/desktop/src/notify.rs +411 -0
- package/vendor/@akanjs/native/native/desktop/src/notify_schedule.rs +382 -0
- package/vendor/@akanjs/native/native/desktop/src/page_menu.rs +287 -0
- package/vendor/@akanjs/native/native/desktop/src/panels.rs +333 -0
- package/vendor/@akanjs/native/native/desktop/src/placement.rs +92 -0
- package/vendor/@akanjs/native/native/desktop/src/routes.rs +153 -0
- package/vendor/@akanjs/native/native/desktop/src/screen.rs +190 -0
- package/vendor/@akanjs/native/native/desktop/src/tray.rs +279 -0
- package/vendor/@akanjs/native/native/desktop/src/vectors.rs +126 -0
- package/vendor/@akanjs/native/native/desktop/src/win/appearance.rs +51 -0
- package/vendor/@akanjs/native/native/desktop/src/win/autostart.rs +77 -0
- package/vendor/@akanjs/native/native/desktop/src/win/camera.rs +34 -0
- package/vendor/@akanjs/native/native/desktop/src/win/clipboard.rs +106 -0
- package/vendor/@akanjs/native/native/desktop/src/win/device.rs +80 -0
- package/vendor/@akanjs/native/native/desktop/src/win/dialogs.rs +917 -0
- package/vendor/@akanjs/native/native/desktop/src/win/dock.rs +228 -0
- package/vendor/@akanjs/native/native/desktop/src/win/hotkey.rs +110 -0
- package/vendor/@akanjs/native/native/desktop/src/win/keychain.rs +103 -0
- package/vendor/@akanjs/native/native/desktop/src/win/menu.rs +500 -0
- package/vendor/@akanjs/native/native/desktop/src/win/mod.rs +100 -0
- package/vendor/@akanjs/native/native/desktop/src/win/msgwin.rs +86 -0
- package/vendor/@akanjs/native/native/desktop/src/win/notify.rs +334 -0
- package/vendor/@akanjs/native/native/desktop/src/win/open.rs +127 -0
- package/vendor/@akanjs/native/native/desktop/src/win/power.rs +64 -0
- package/vendor/@akanjs/native/native/desktop/src/win/registry.rs +87 -0
- package/vendor/@akanjs/native/native/desktop/src/win/screen.rs +127 -0
- package/vendor/@akanjs/native/native/desktop/src/win/tray.rs +280 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeAcl.swift +241 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeApp.swift +285 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeBridge.swift +407 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeContract.swift +106 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeKernel.swift +317 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativePlugin.swift +250 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSchemeHandler.swift +209 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeShell.swift +161 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSpec.swift +143 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeUpdates.swift +270 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeVectors.swift +155 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeViewController.swift +371 -0
- package/vendor/@akanjs/native/packages/cli/src/api.ts +600 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/build.ts +101 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/compat.ts +53 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/dev.ts +249 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/doctor.ts +536 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/plugin.ts +164 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/signing.ts +32 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/test.ts +130 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/toolchain.ts +143 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/update.ts +168 -0
- package/vendor/@akanjs/native/packages/cli/src/config.ts +257 -0
- package/vendor/@akanjs/native/packages/cli/src/index.ts +77 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/acl.ts +420 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/apilevel.ts +245 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/apk.ts +203 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/args.ts +44 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/boot.ts +73 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/chrome.ts +89 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/codegen.ts +1128 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/compat.ts +185 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/configkeys.ts +91 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/csp.ts +198 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/env.ts +257 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/exec.ts +104 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/googleservices.ts +53 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/hmr.ts +534 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/html.ts +63 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/icons.ts +316 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/image.ts +175 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/iossigning.ts +295 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/launch.ts +98 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/log.ts +105 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.ts +107 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/maven.ts +244 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/names.ts +202 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.ts +326 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.ts +68 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/permissions.ts +80 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/plist.ts +139 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/png.ts +240 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/prepare.ts +290 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/privacy.ts +64 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/project.ts +710 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/root.ts +18 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/routes.ts +3 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/serve.ts +83 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/signing.ts +117 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/spec.ts +521 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/toolchains.ts +579 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/updates.ts +160 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/vectors.ts +121 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/xml.ts +72 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/android.ts +1320 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.ts +78 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/desktop.ts +279 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/index.ts +31 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/ios.ts +801 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/linux.ts +52 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/macos.ts +97 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/targets.ts +12 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/web-run.ts +69 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/web.ts +28 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/windows.ts +82 -0
- package/vendor/@akanjs/native/packages/core/contract.json +96 -0
- package/vendor/@akanjs/native/packages/core/src/acl.ts +272 -0
- package/vendor/@akanjs/native/packages/core/src/boot.ts +97 -0
- package/vendor/@akanjs/native/packages/core/src/contract.ts +100 -0
- package/vendor/@akanjs/native/packages/core/src/errors.ts +95 -0
- package/vendor/@akanjs/native/packages/core/src/files.ts +105 -0
- package/vendor/@akanjs/native/packages/core/src/index.ts +35 -0
- package/vendor/@akanjs/native/packages/core/src/kernel.ts +281 -0
- package/vendor/@akanjs/native/packages/core/src/live.ts +62 -0
- package/vendor/@akanjs/native/packages/core/src/mime.ts +8 -0
- package/vendor/@akanjs/native/packages/core/src/plugin.ts +358 -0
- package/vendor/@akanjs/native/packages/core/src/protocol.ts +194 -0
- package/vendor/@akanjs/native/packages/core/src/runtime.ts +520 -0
- package/vendor/@akanjs/native/packages/core/src/state.ts +46 -0
- package/vendor/@akanjs/native/packages/core/src/testing.ts +176 -0
- package/vendor/@akanjs/native/packages/core/src/version.ts +2 -0
- package/vendor/@akanjs/native/packages/core/src/veto.ts +55 -0
- package/vendor/@akanjs/native/packages/core/vectors/acl.json +57 -0
- package/vendor/@akanjs/native/packages/core/vectors/bridge.json +76 -0
- package/vendor/@akanjs/native/packages/core/vectors/ed25519.json +29 -0
- package/vendor/@akanjs/native/packages/core/vectors/ids.json +73 -0
- package/vendor/@akanjs/native/packages/core/vectors/navigation.json +75 -0
- package/vendor/@akanjs/native/packages/core/vectors/ranges.json +39 -0
- package/vendor/@akanjs/native/packages/core/vectors/retained.json +17 -0
- package/vendor/@akanjs/native/packages/core/vectors/routes.json +66 -0
- package/vendor/@akanjs/native/packages/core/vectors/scope.json +143 -0
- package/vendor/@akanjs/native/packages/desktop/src/deeplinks.ts +143 -0
- package/vendor/@akanjs/native/packages/desktop/src/delta.ts +174 -0
- package/vendor/@akanjs/native/packages/desktop/src/dispatcher.ts +679 -0
- package/vendor/@akanjs/native/packages/desktop/src/ffi.ts +76 -0
- package/vendor/@akanjs/native/packages/desktop/src/host.ts +355 -0
- package/vendor/@akanjs/native/packages/desktop/src/lifecycle.ts +142 -0
- package/vendor/@akanjs/native/packages/desktop/src/main.ts +133 -0
- package/vendor/@akanjs/native/packages/desktop/src/page-veto.ts +103 -0
- package/vendor/@akanjs/native/packages/desktop/src/paths.ts +59 -0
- package/vendor/@akanjs/native/packages/desktop/src/plugin.ts +232 -0
- package/vendor/@akanjs/native/packages/react/src/index.ts +23 -0
- package/vendor/@akanjs/native/plugins/accessibility/android/AccessibilityPlugin.kt +96 -0
- package/vendor/@akanjs/native/plugins/accessibility/ios/AccessibilityPlugin.swift +92 -0
- package/vendor/@akanjs/native/plugins/accessibility/native-plugin.json +21 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/announce.ts +71 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/index.ts +77 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/web.ts +52 -0
- package/vendor/@akanjs/native/plugins/app/android/AppPlugin.kt +72 -0
- package/vendor/@akanjs/native/plugins/app/ios/AppPlugin.swift +52 -0
- package/vendor/@akanjs/native/plugins/app/native-plugin.json +21 -0
- package/vendor/@akanjs/native/plugins/app/src/desktop.ts +64 -0
- package/vendor/@akanjs/native/plugins/app/src/index.ts +77 -0
- package/vendor/@akanjs/native/plugins/app/src/web.ts +12 -0
- package/vendor/@akanjs/native/plugins/app-state/android/AppStatePlugin.kt +54 -0
- package/vendor/@akanjs/native/plugins/app-state/ios/AppStatePlugin.swift +58 -0
- package/vendor/@akanjs/native/plugins/app-state/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/app-state/src/index.ts +42 -0
- package/vendor/@akanjs/native/plugins/app-state/src/web.ts +33 -0
- package/vendor/@akanjs/native/plugins/appearance/android/AppearancePlugin.kt +133 -0
- package/vendor/@akanjs/native/plugins/appearance/ios/AppearancePlugin.swift +109 -0
- package/vendor/@akanjs/native/plugins/appearance/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/appearance/src/desktop.ts +133 -0
- package/vendor/@akanjs/native/plugins/appearance/src/index.ts +62 -0
- package/vendor/@akanjs/native/plugins/appearance/src/setting.ts +18 -0
- package/vendor/@akanjs/native/plugins/appearance/src/web.ts +25 -0
- package/vendor/@akanjs/native/plugins/auth-session/android/AuthSessionPlugin.kt +171 -0
- package/vendor/@akanjs/native/plugins/auth-session/ios/AuthSessionPlugin.swift +112 -0
- package/vendor/@akanjs/native/plugins/auth-session/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/args.ts +62 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/desktop.ts +133 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/index.ts +39 -0
- package/vendor/@akanjs/native/plugins/autostart/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/autostart/src/desktop.ts +189 -0
- package/vendor/@akanjs/native/plugins/autostart/src/index.ts +51 -0
- package/vendor/@akanjs/native/plugins/badge/ios/BadgePlugin.swift +92 -0
- package/vendor/@akanjs/native/plugins/badge/native-plugin.json +15 -0
- package/vendor/@akanjs/native/plugins/badge/src/count.ts +12 -0
- package/vendor/@akanjs/native/plugins/badge/src/desktop.ts +24 -0
- package/vendor/@akanjs/native/plugins/badge/src/index.ts +40 -0
- package/vendor/@akanjs/native/plugins/badge/src/web.ts +37 -0
- package/vendor/@akanjs/native/plugins/biometric/android/BiometricPlugin.kt +179 -0
- package/vendor/@akanjs/native/plugins/biometric/ios/BiometricPlugin.swift +129 -0
- package/vendor/@akanjs/native/plugins/biometric/native-plugin.json +22 -0
- package/vendor/@akanjs/native/plugins/biometric/src/index.ts +100 -0
- package/vendor/@akanjs/native/plugins/browser/android/BrowserPlugin.kt +178 -0
- package/vendor/@akanjs/native/plugins/browser/ios/BrowserPlugin.swift +63 -0
- package/vendor/@akanjs/native/plugins/browser/native-plugin.json +22 -0
- package/vendor/@akanjs/native/plugins/browser/src/args.ts +34 -0
- package/vendor/@akanjs/native/plugins/browser/src/desktop.ts +40 -0
- package/vendor/@akanjs/native/plugins/browser/src/index.ts +47 -0
- package/vendor/@akanjs/native/plugins/browser/src/web.ts +60 -0
- package/vendor/@akanjs/native/plugins/camera/android/CameraPlugin.kt +365 -0
- package/vendor/@akanjs/native/plugins/camera/ios/CameraPlugin.swift +296 -0
- package/vendor/@akanjs/native/plugins/camera/native-plugin.json +32 -0
- package/vendor/@akanjs/native/plugins/camera/src/desktop.ts +27 -0
- package/vendor/@akanjs/native/plugins/camera/src/index.ts +85 -0
- package/vendor/@akanjs/native/plugins/camera/src/web.ts +267 -0
- package/vendor/@akanjs/native/plugins/clipboard/android/ClipboardPlugin.kt +51 -0
- package/vendor/@akanjs/native/plugins/clipboard/ios/ClipboardPlugin.swift +35 -0
- package/vendor/@akanjs/native/plugins/clipboard/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/desktop.ts +66 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/index.ts +72 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/web.ts +69 -0
- package/vendor/@akanjs/native/plugins/device/android/DevicePlugin.kt +70 -0
- package/vendor/@akanjs/native/plugins/device/ios/DevicePlugin.swift +80 -0
- package/vendor/@akanjs/native/plugins/device/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/device/src/desktop.ts +276 -0
- package/vendor/@akanjs/native/plugins/device/src/index.ts +72 -0
- package/vendor/@akanjs/native/plugins/device/src/web.ts +162 -0
- package/vendor/@akanjs/native/plugins/dialog/android/DialogPlugin.kt +260 -0
- package/vendor/@akanjs/native/plugins/dialog/ios/DialogPlugin.swift +198 -0
- package/vendor/@akanjs/native/plugins/dialog/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/dialog/src/desktop.ts +80 -0
- package/vendor/@akanjs/native/plugins/dialog/src/index.ts +87 -0
- package/vendor/@akanjs/native/plugins/dialog/src/options.ts +111 -0
- package/vendor/@akanjs/native/plugins/dialog/src/web.ts +296 -0
- package/vendor/@akanjs/native/plugins/dock/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/dock/src/desktop.ts +34 -0
- package/vendor/@akanjs/native/plugins/dock/src/index.ts +46 -0
- package/vendor/@akanjs/native/plugins/file-picker/android/FilePickerPlugin.kt +316 -0
- package/vendor/@akanjs/native/plugins/file-picker/ios/FilePickerPlugin.swift +366 -0
- package/vendor/@akanjs/native/plugins/file-picker/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/common.ts +125 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/desktop.ts +164 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/index.ts +187 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/web.ts +158 -0
- package/vendor/@akanjs/native/plugins/filesystem/android/FilesystemPlugin.kt +561 -0
- package/vendor/@akanjs/native/plugins/filesystem/ios/FilesystemPlugin.swift +596 -0
- package/vendor/@akanjs/native/plugins/filesystem/native-plugin.json +45 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/common.ts +150 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/desktop.ts +438 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/index.ts +179 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/web.ts +334 -0
- package/vendor/@akanjs/native/plugins/geolocation/android/GeolocationPlugin.kt +360 -0
- package/vendor/@akanjs/native/plugins/geolocation/ios/GeolocationPlugin.swift +284 -0
- package/vendor/@akanjs/native/plugins/geolocation/native-plugin.json +23 -0
- package/vendor/@akanjs/native/plugins/geolocation/src/index.ts +155 -0
- package/vendor/@akanjs/native/plugins/geolocation/src/web.ts +132 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.ts +36 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/src/index.ts +55 -0
- package/vendor/@akanjs/native/plugins/haptics/android/HapticsPlugin.kt +127 -0
- package/vendor/@akanjs/native/plugins/haptics/ios/HapticsPlugin.swift +127 -0
- package/vendor/@akanjs/native/plugins/haptics/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/haptics/src/index.ts +34 -0
- package/vendor/@akanjs/native/plugins/haptics/src/web.ts +53 -0
- package/vendor/@akanjs/native/plugins/http/android/HttpPlugin.kt +234 -0
- package/vendor/@akanjs/native/plugins/http/android/HttpUrl.kt +182 -0
- package/vendor/@akanjs/native/plugins/http/ios/HttpPlugin.swift +228 -0
- package/vendor/@akanjs/native/plugins/http/ios/HttpUrl.swift +166 -0
- package/vendor/@akanjs/native/plugins/http/native-plugin.json +27 -0
- package/vendor/@akanjs/native/plugins/http/src/common.ts +294 -0
- package/vendor/@akanjs/native/plugins/http/src/desktop.ts +69 -0
- package/vendor/@akanjs/native/plugins/http/src/index.ts +181 -0
- package/vendor/@akanjs/native/plugins/http/src/web.ts +40 -0
- package/vendor/@akanjs/native/plugins/iap/android/IapPlugin.kt +358 -0
- package/vendor/@akanjs/native/plugins/iap/ios/IapPlugin.swift +306 -0
- package/vendor/@akanjs/native/plugins/iap/native-plugin.json +28 -0
- package/vendor/@akanjs/native/plugins/iap/src/index.ts +206 -0
- package/vendor/@akanjs/native/plugins/keep-awake/android/KeepAwakePlugin.kt +48 -0
- package/vendor/@akanjs/native/plugins/keep-awake/ios/KeepAwakePlugin.swift +36 -0
- package/vendor/@akanjs/native/plugins/keep-awake/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/desktop.ts +127 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/index.ts +79 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/web.ts +78 -0
- package/vendor/@akanjs/native/plugins/keyboard/android/KeyboardPlugin.kt +77 -0
- package/vendor/@akanjs/native/plugins/keyboard/ios/KeyboardPlugin.swift +93 -0
- package/vendor/@akanjs/native/plugins/keyboard/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/keyboard/src/index.ts +78 -0
- package/vendor/@akanjs/native/plugins/keyboard/src/web.ts +57 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationReceiver.kt +38 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotifications.kt +284 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationsPlugin.kt +248 -0
- package/vendor/@akanjs/native/plugins/local-notifications/ios/LocalNotificationsPlugin.swift +279 -0
- package/vendor/@akanjs/native/plugins/local-notifications/native-plugin.json +35 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/desktop.ts +196 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/index.ts +174 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/schedule.ts +164 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/timers.ts +72 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/web.ts +158 -0
- package/vendor/@akanjs/native/plugins/menu/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/menu/src/desktop.ts +52 -0
- package/vendor/@akanjs/native/plugins/menu/src/index.ts +107 -0
- package/vendor/@akanjs/native/plugins/network/android/NetworkPlugin.kt +124 -0
- package/vendor/@akanjs/native/plugins/network/ios/NetworkPlugin.swift +82 -0
- package/vendor/@akanjs/native/plugins/network/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/network/src/index.ts +59 -0
- package/vendor/@akanjs/native/plugins/network/src/web.ts +43 -0
- package/vendor/@akanjs/native/plugins/opener/android/OpenerPlugin.kt +81 -0
- package/vendor/@akanjs/native/plugins/opener/ios/OpenerPlugin.swift +83 -0
- package/vendor/@akanjs/native/plugins/opener/native-plugin.json +25 -0
- package/vendor/@akanjs/native/plugins/opener/src/desktop.ts +88 -0
- package/vendor/@akanjs/native/plugins/opener/src/index.ts +35 -0
- package/vendor/@akanjs/native/plugins/opener/src/url.ts +39 -0
- package/vendor/@akanjs/native/plugins/opener/src/web.ts +33 -0
- package/vendor/@akanjs/native/plugins/preferences/android/PreferencesPlugin.kt +44 -0
- package/vendor/@akanjs/native/plugins/preferences/ios/PreferencesPlugin.swift +47 -0
- package/vendor/@akanjs/native/plugins/preferences/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/preferences/src/desktop.ts +59 -0
- package/vendor/@akanjs/native/plugins/preferences/src/index.ts +75 -0
- package/vendor/@akanjs/native/plugins/preferences/src/web.ts +55 -0
- package/vendor/@akanjs/native/plugins/push/android/AkanNativeMessagingService.kt +17 -0
- package/vendor/@akanjs/native/plugins/push/android/PushPlugin.kt +257 -0
- package/vendor/@akanjs/native/plugins/push/ios/PushPlugin.swift +169 -0
- package/vendor/@akanjs/native/plugins/push/native-plugin.json +23 -0
- package/vendor/@akanjs/native/plugins/push/src/index.ts +73 -0
- package/vendor/@akanjs/native/plugins/screen/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/screen/src/desktop.ts +50 -0
- package/vendor/@akanjs/native/plugins/screen/src/index.ts +107 -0
- package/vendor/@akanjs/native/plugins/screen/src/web.ts +92 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/android/ScreenOrientationPlugin.kt +113 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/ios/ScreenOrientationPlugin.swift +150 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/index.ts +69 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/types.ts +26 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/web.ts +67 -0
- package/vendor/@akanjs/native/plugins/secure-storage/android/SecureStoragePlugin.kt +184 -0
- package/vendor/@akanjs/native/plugins/secure-storage/ios/SecureStoragePlugin.swift +145 -0
- package/vendor/@akanjs/native/plugins/secure-storage/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/secure-storage/src/desktop.ts +332 -0
- package/vendor/@akanjs/native/plugins/secure-storage/src/index.ts +33 -0
- package/vendor/@akanjs/native/plugins/share/android/SharePlugin.kt +218 -0
- package/vendor/@akanjs/native/plugins/share/ios/SharePlugin.swift +142 -0
- package/vendor/@akanjs/native/plugins/share/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/share/src/index.ts +87 -0
- package/vendor/@akanjs/native/plugins/share/src/options.ts +43 -0
- package/vendor/@akanjs/native/plugins/share/src/web.ts +116 -0
- package/vendor/@akanjs/native/plugins/single-instance/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/desktop.ts +63 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/index.ts +32 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/socket.ts +248 -0
- package/vendor/@akanjs/native/plugins/splash-screen/android/SplashScreenPlugin.kt +19 -0
- package/vendor/@akanjs/native/plugins/splash-screen/ios/SplashScreenPlugin.swift +20 -0
- package/vendor/@akanjs/native/plugins/splash-screen/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/splash-screen/src/index.ts +24 -0
- package/vendor/@akanjs/native/plugins/splash-screen/src/web.ts +17 -0
- package/vendor/@akanjs/native/plugins/sqlite/android/SqlStatements.kt +121 -0
- package/vendor/@akanjs/native/plugins/sqlite/android/SqlitePlugin.kt +327 -0
- package/vendor/@akanjs/native/plugins/sqlite/ios/SqlitePlugin.swift +361 -0
- package/vendor/@akanjs/native/plugins/sqlite/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/common.ts +221 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/desktop.ts +140 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/index.ts +114 -0
- package/vendor/@akanjs/native/plugins/toast/android/ToastPlugin.kt +27 -0
- package/vendor/@akanjs/native/plugins/toast/native-plugin.json +14 -0
- package/vendor/@akanjs/native/plugins/toast/src/index.ts +41 -0
- package/vendor/@akanjs/native/plugins/toast/src/queue.ts +77 -0
- package/vendor/@akanjs/native/plugins/toast/src/web.ts +130 -0
- package/vendor/@akanjs/native/plugins/tray/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/tray/src/desktop.ts +73 -0
- package/vendor/@akanjs/native/plugins/tray/src/index.ts +111 -0
- package/vendor/@akanjs/native/plugins/updates/android/UpdatesPlugin.kt +290 -0
- package/vendor/@akanjs/native/plugins/updates/ios/UpdatesPlugin.swift +292 -0
- package/vendor/@akanjs/native/plugins/updates/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/updates/src/desktop.ts +558 -0
- package/vendor/@akanjs/native/plugins/updates/src/index.ts +95 -0
- package/vendor/@akanjs/native/plugins/window/native-plugin.json +32 -0
- package/vendor/@akanjs/native/plugins/window/src/desktop.ts +170 -0
- package/vendor/@akanjs/native/plugins/window/src/index.ts +342 -0
- package/vendor/@akanjs/native/plugins/window/src/web.ts +43 -0
- package/vendor/@akanjs/native/plugins/window-state/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/window-state/src/desktop.ts +73 -0
- package/vendor/@akanjs/native/plugins/window-state/src/index.ts +35 -0
- package/vendor/@akanjs/native/plugins/window-state/src/state.ts +146 -0
- package/webkit/bootCsr.tsx +26 -14
- package/webkit/index.ts +0 -2
- package/webkit/nativeNavigation.ts +116 -0
- package/webkit/nativePurchase.ts +93 -0
- package/webkit/useCamera.tsx +76 -71
- package/webkit/useCsrValues.ts +10 -124
- package/webkit/useGeoLocation.tsx +11 -13
- package/webkit/usePurchase.tsx +68 -123
- package/capacitor.base.config.ts +0 -140
- package/client/capacitor.ts +0 -252
- package/types/capacitor.base.config.d.ts +0 -3
- package/types/client/capacitor.d.ts +0 -290
- package/types/webkit/useCodepush.d.ts +0 -16
- package/types/webkit/useContact.d.ts +0 -11
- package/webkit/useCodepush.tsx +0 -76
- package/webkit/useContact.tsx +0 -45
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
package com.akanjs.plugins.geolocation
|
|
2
|
+
|
|
3
|
+
import android.Manifest
|
|
4
|
+
import android.app.Activity
|
|
5
|
+
import android.app.Application
|
|
6
|
+
import android.content.pm.PackageManager
|
|
7
|
+
import android.location.Location
|
|
8
|
+
import android.location.LocationListener
|
|
9
|
+
import android.location.LocationManager
|
|
10
|
+
import android.location.LocationRequest
|
|
11
|
+
import android.os.Build
|
|
12
|
+
import android.os.Bundle
|
|
13
|
+
import android.os.CancellationSignal
|
|
14
|
+
import android.os.Handler
|
|
15
|
+
import android.os.Looper
|
|
16
|
+
import android.os.SystemClock
|
|
17
|
+
import android.util.Log
|
|
18
|
+
import java.util.concurrent.Executor
|
|
19
|
+
import java.util.function.Consumer
|
|
20
|
+
import com.akanjs.runtime.AkanNativeErrorCode
|
|
21
|
+
import com.akanjs.runtime.AkanNativePluginContext
|
|
22
|
+
import com.akanjs.runtime.AkanNativeReply
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Framework LocationManager instead of Play Services FusedLocationProviderClient (plugins.md §2),
|
|
26
|
+
* following tauri-plugins-workspace/plugins/geolocation/android/src/main/java/Geolocation.kt:
|
|
27
|
+
* - Provider: LocationManager.FUSED_PROVIDER (API 31; implemented by Play services where present,
|
|
28
|
+
* by the AOSP FusedLocation otherwise), else GPS for high accuracy with fine permission, else
|
|
29
|
+
* NETWORK. GPS is never used with coarse permission only.
|
|
30
|
+
* - Both ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION are requested together: on Android 12+
|
|
31
|
+
* the dialog offers precise or approximate, and the user may grant coarse only (precise: false,
|
|
32
|
+
* the system then coarsens every fix; a high-accuracy request quietly gets the approximate one).
|
|
33
|
+
* Balanced and coarse-only requests do not turn on GPS: where there is no network location
|
|
34
|
+
* (the emulator, verified) they only get a fix another request produced recently, or time out.
|
|
35
|
+
* capacitor/android/.../BridgeWebChromeClient.java:246-273 treats coarse as enough in the same way.
|
|
36
|
+
* - getCurrentPosition: newest getLastKnownLocation within maximumAge (Tauri's getLastLocation),
|
|
37
|
+
* else getCurrentLocation (API 31 LocationRequest overload) with a CancellationSignal for the
|
|
38
|
+
* timeout. The platform ends a single request after at most 30 s with null (NOT_FOUND).
|
|
39
|
+
* - Watches stop on pause and resume on resume (Tauri onPause/onResume): background delivery would
|
|
40
|
+
* need ACCESS_BACKGROUND_LOCATION or a foreground service.
|
|
41
|
+
* - Location turned off is NOT_FOUND for getCurrentPosition and an "error" event for a watch, whose
|
|
42
|
+
* registration stays so updates resume when it is turned on (Tauri rejects checkPermissions instead).
|
|
43
|
+
* Emulator: `adb emu geo fix <lon> <lat>`, `adb shell pm grant <app id> android.permission.ACCESS_FINE_LOCATION`.
|
|
44
|
+
* Arguments arrive decoded and checked by the generated GeolocationPluginSpec (PL-10); the ranges
|
|
45
|
+
* of timeout and maximumAge are checked here.
|
|
46
|
+
*/
|
|
47
|
+
class GeolocationPlugin(private val context: AkanNativePluginContext) : GeolocationPluginSpec {
|
|
48
|
+
private class Watch(val provider: String, val high: Boolean, val listener: LocationListener)
|
|
49
|
+
|
|
50
|
+
private val activity = context.activity
|
|
51
|
+
private val events = GeolocationEvents(context)
|
|
52
|
+
private val manager: LocationManager? = activity.getSystemService(LocationManager::class.java)
|
|
53
|
+
private val main = Handler(Looper.getMainLooper())
|
|
54
|
+
private val listening = LinkedHashSet<String>()
|
|
55
|
+
private var watch: Watch? = null
|
|
56
|
+
private var resumed = true
|
|
57
|
+
private var askedForWatch = false
|
|
58
|
+
private var lastReport: String? = null
|
|
59
|
+
|
|
60
|
+
private val lifecycle = object : Application.ActivityLifecycleCallbacks {
|
|
61
|
+
override fun onActivityResumed(activity: Activity) {
|
|
62
|
+
resumed = true
|
|
63
|
+
updateWatch() // also picks up a permission granted in Settings meanwhile
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
override fun onActivityPaused(activity: Activity) {
|
|
67
|
+
resumed = false
|
|
68
|
+
updateWatch()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
override fun onActivityStarted(activity: Activity) {}
|
|
72
|
+
override fun onActivityStopped(activity: Activity) {}
|
|
73
|
+
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
|
|
74
|
+
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
|
|
75
|
+
override fun onActivityDestroyed(activity: Activity) {}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
override fun checkPermission(reply: AkanNativeReply<GeolocationLocationPermission>) = reply.resolve(permission())
|
|
79
|
+
|
|
80
|
+
override fun requestPermission(reply: AkanNativeReply<GeolocationLocationPermission>) =
|
|
81
|
+
context.requestPermissions(PERMISSIONS) { reply.resolve(permission()) }
|
|
82
|
+
|
|
83
|
+
override fun startListening(event: String) {
|
|
84
|
+
if (event !in EVENTS) return
|
|
85
|
+
if (listening.isEmpty()) {
|
|
86
|
+
askedForWatch = false
|
|
87
|
+
lastReport = null
|
|
88
|
+
activity.registerActivityLifecycleCallbacks(lifecycle)
|
|
89
|
+
}
|
|
90
|
+
listening.add(event)
|
|
91
|
+
updateWatch()
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
override fun stopListening(event: String) {
|
|
95
|
+
if (!listening.remove(event)) return
|
|
96
|
+
if (listening.isEmpty()) activity.unregisterActivityLifecycleCallbacks(lifecycle)
|
|
97
|
+
updateWatch()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
override fun destroy() {
|
|
101
|
+
if (listening.isNotEmpty()) activity.unregisterActivityLifecycleCallbacks(lifecycle)
|
|
102
|
+
listening.clear()
|
|
103
|
+
stopWatch()
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ------------------------------------------------------------ permission
|
|
107
|
+
|
|
108
|
+
private fun granted(permission: String) = activity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED
|
|
109
|
+
private fun fine() = granted(Manifest.permission.ACCESS_FINE_LOCATION)
|
|
110
|
+
private fun anyLocation() = fine() || granted(Manifest.permission.ACCESS_COARSE_LOCATION)
|
|
111
|
+
|
|
112
|
+
private fun permission(): GeolocationLocationPermission =
|
|
113
|
+
if (anyLocation()) GeolocationLocationPermission(location = GeolocationPermissionState.GRANTED, precise = fine())
|
|
114
|
+
// Both are always requested together, so the coarse history stands for the pair.
|
|
115
|
+
else GeolocationLocationPermission(location = permissionState(Manifest.permission.ACCESS_COARSE_LOCATION), precise = null)
|
|
116
|
+
|
|
117
|
+
/** context.permissionState answers with one of the four AkanNativePermission strings. */
|
|
118
|
+
private fun permissionState(permission: String): GeolocationPermissionState {
|
|
119
|
+
val state = context.permissionState(permission)
|
|
120
|
+
return GeolocationPermissionState.entries.first { it.json == state }
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ------------------------------------------------------------ getCurrentPosition
|
|
124
|
+
|
|
125
|
+
/** A non-negative number of ms, or [fallback] when absent. JSON has no Infinity: it arrives as null. */
|
|
126
|
+
private fun milliseconds(value: Double?, name: String, fallback: Long, reply: AkanNativeReply<*>): Long? {
|
|
127
|
+
if (value == null) return fallback
|
|
128
|
+
if (value < 0) {
|
|
129
|
+
reply.reject(AkanNativeErrorCode.INVALID_ARGS, "$name must be a number of ms >= 0")
|
|
130
|
+
return null
|
|
131
|
+
}
|
|
132
|
+
return value.coerceAtMost(Long.MAX_VALUE.toDouble()).toLong()
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
override fun getCurrentPosition(args: GeolocationPositionOptions, reply: AkanNativeReply<GeolocationPosition>) {
|
|
136
|
+
val timeout = milliseconds(args.timeout, "timeout", 30_000, reply) ?: return
|
|
137
|
+
val maximumAge = milliseconds(args.maximumAge, "maximumAge", 0, reply) ?: return
|
|
138
|
+
val high = args.enableHighAccuracy == true
|
|
139
|
+
if (anyLocation()) return locate(reply, high, timeout, maximumAge)
|
|
140
|
+
// Like W3C getCurrentPosition, ask first. After "don't ask again" this answers at once.
|
|
141
|
+
context.requestPermissions(PERMISSIONS) {
|
|
142
|
+
if (anyLocation()) locate(reply, high, timeout, maximumAge)
|
|
143
|
+
else reply.reject(AkanNativeErrorCode.PERMISSION_DENIED, "location access was denied")
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
private fun locate(reply: AkanNativeReply<GeolocationPosition>, high: Boolean, timeout: Long, maximumAge: Long) {
|
|
148
|
+
val lm = manager ?: return reply.reject(AkanNativeErrorCode.UNSUPPORTED, "no location service")
|
|
149
|
+
if (!lm.isLocationEnabled) return reply.reject(AkanNativeErrorCode.NOT_FOUND, "location is turned off")
|
|
150
|
+
val fine = fine()
|
|
151
|
+
if (maximumAge > 0) cached(lm, maximumAge)?.let { return reply.resolve(position(it)) }
|
|
152
|
+
if (timeout == 0L) return reply.reject(AkanNativeErrorCode.NOT_FOUND, "no position within 0 ms")
|
|
153
|
+
val provider = provider(lm, high, fine, enabledOnly = true)
|
|
154
|
+
?: return reply.reject(AkanNativeErrorCode.NOT_FOUND, "no location provider is enabled")
|
|
155
|
+
val signal = CancellationSignal()
|
|
156
|
+
var done = false
|
|
157
|
+
val timer = Runnable {
|
|
158
|
+
if (!done) {
|
|
159
|
+
done = true
|
|
160
|
+
signal.cancel()
|
|
161
|
+
reply.reject(AkanNativeErrorCode.NOT_FOUND, "no position within $timeout ms")
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
main.postDelayed(timer, timeout)
|
|
165
|
+
val settle = { settleReply: AkanNativeReply<GeolocationPosition>.() -> Unit ->
|
|
166
|
+
if (!done) {
|
|
167
|
+
done = true
|
|
168
|
+
main.removeCallbacks(timer)
|
|
169
|
+
reply.settleReply()
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
val deliver: (Location?) -> Unit = { location ->
|
|
173
|
+
settle { if (location == null) reject(AkanNativeErrorCode.NOT_FOUND, "no position from $provider") else resolve(position(location)) }
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
when {
|
|
177
|
+
Build.VERSION.SDK_INT >= 31 -> Api31.currentLocation(lm, provider, high && fine, timeout, signal, activity.mainExecutor, deliver)
|
|
178
|
+
Build.VERSION.SDK_INT >= 30 -> Api30.currentLocation(lm, provider, signal, activity.mainExecutor, deliver)
|
|
179
|
+
else -> oneShot(lm, provider, signal, deliver)
|
|
180
|
+
}
|
|
181
|
+
} catch (e: SecurityException) { // permission revoked in between
|
|
182
|
+
settle { reject(AkanNativeErrorCode.PERMISSION_DENIED, e.message ?: "location access was denied") }
|
|
183
|
+
} catch (e: IllegalArgumentException) { // provider vanished
|
|
184
|
+
settle { reject(AkanNativeErrorCode.NOT_FOUND, e.message ?: "no provider $provider") }
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* API 29 has no getCurrentLocation: updates from the provider, removed after the first fix or when
|
|
190
|
+
* the provider is turned off (androidx LocationManagerCompat). The caller's timer still applies.
|
|
191
|
+
*/
|
|
192
|
+
private fun oneShot(lm: LocationManager, provider: String, signal: CancellationSignal, done: (Location?) -> Unit) {
|
|
193
|
+
var finished = false
|
|
194
|
+
lateinit var listener: LocationListener
|
|
195
|
+
val finish = { location: Location? ->
|
|
196
|
+
if (!finished) {
|
|
197
|
+
finished = true
|
|
198
|
+
lm.removeUpdates(listener)
|
|
199
|
+
done(location)
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
listener = object : LocationListener {
|
|
203
|
+
override fun onLocationChanged(location: Location) = finish(location)
|
|
204
|
+
override fun onProviderDisabled(provider: String) = finish(null)
|
|
205
|
+
override fun onProviderEnabled(provider: String) {}
|
|
206
|
+
@Deprecated("abstract before API 30, never called from 29 on")
|
|
207
|
+
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {}
|
|
208
|
+
}
|
|
209
|
+
signal.setOnCancelListener {
|
|
210
|
+
if (!finished) {
|
|
211
|
+
finished = true
|
|
212
|
+
lm.removeUpdates(listener)
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
lm.requestLocationUpdates(provider, 0L, 0f, listener, Looper.getMainLooper())
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/** Whether the provider exists. hasProvider is API 31; before it the fused provider is hidden. */
|
|
219
|
+
private fun has(lm: LocationManager, provider: String): Boolean = when {
|
|
220
|
+
Build.VERSION.SDK_INT >= 31 -> Api31.hasProvider(lm, provider)
|
|
221
|
+
provider == LocationManager.FUSED_PROVIDER -> false
|
|
222
|
+
else -> provider in lm.allProviders
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** The newest last known fix of any provider, if it is at most [maximumAge] ms old. */
|
|
226
|
+
private fun cached(lm: LocationManager, maximumAge: Long): Location? {
|
|
227
|
+
val now = SystemClock.elapsedRealtimeNanos()
|
|
228
|
+
return PROVIDERS.asSequence()
|
|
229
|
+
.filter { has(lm, it) }
|
|
230
|
+
.mapNotNull { runCatching { lm.getLastKnownLocation(it) }.getOrNull() }
|
|
231
|
+
.filter { (now - it.elapsedRealtimeNanos) / 1_000_000 <= maximumAge }
|
|
232
|
+
.maxByOrNull { it.elapsedRealtimeNanos }
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
private fun provider(lm: LocationManager, high: Boolean, fine: Boolean, enabledOnly: Boolean): String? {
|
|
236
|
+
fun usable(p: String) = has(lm, p) && (!enabledOnly || lm.isProviderEnabled(p))
|
|
237
|
+
return when {
|
|
238
|
+
usable(LocationManager.FUSED_PROVIDER) -> LocationManager.FUSED_PROVIDER
|
|
239
|
+
high && fine && usable(LocationManager.GPS_PROVIDER) -> LocationManager.GPS_PROVIDER
|
|
240
|
+
usable(LocationManager.NETWORK_PROVIDER) -> LocationManager.NETWORK_PROVIDER
|
|
241
|
+
fine && usable(LocationManager.GPS_PROVIDER) -> LocationManager.GPS_PROVIDER
|
|
242
|
+
else -> null
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// ------------------------------------------------------------ watch
|
|
247
|
+
|
|
248
|
+
private fun updateWatch() {
|
|
249
|
+
if (listening.isEmpty() || !resumed) return stopWatch()
|
|
250
|
+
val lm = manager ?: return report(GeolocationErrorCode.UNSUPPORTED, "no location service")
|
|
251
|
+
if (!anyLocation()) {
|
|
252
|
+
stopWatch()
|
|
253
|
+
if (askedForWatch) return report(GeolocationErrorCode.PERMISSION_DENIED, "location access was denied")
|
|
254
|
+
askedForWatch = true
|
|
255
|
+
// The dialog pauses the activity; the watch starts on the following resume.
|
|
256
|
+
context.requestPermissions(PERMISSIONS) { if (!anyLocation()) report(GeolocationErrorCode.PERMISSION_DENIED, "location access was denied") }
|
|
257
|
+
return
|
|
258
|
+
}
|
|
259
|
+
val fine = fine()
|
|
260
|
+
val high = "highAccuracyPosition" in listening && fine
|
|
261
|
+
// Registered even while location is off: updates start when it is turned on.
|
|
262
|
+
val provider = provider(lm, high, fine, enabledOnly = false) ?: return report(GeolocationErrorCode.NOT_FOUND, "no location provider")
|
|
263
|
+
val current = watch
|
|
264
|
+
if (current != null && current.provider == provider && current.high == high) return
|
|
265
|
+
stopWatch()
|
|
266
|
+
val listener = object : LocationListener {
|
|
267
|
+
override fun onLocationChanged(location: Location) {
|
|
268
|
+
lastReport = null
|
|
269
|
+
val fix = position(location)
|
|
270
|
+
for (event in listening.toList()) if (event == "highAccuracyPosition") events.highAccuracyPosition(fix) else events.position(fix)
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
override fun onProviderDisabled(provider: String) = report(GeolocationErrorCode.NOT_FOUND, "location is turned off")
|
|
274
|
+
|
|
275
|
+
override fun onProviderEnabled(provider: String) {
|
|
276
|
+
lastReport = null
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
@Deprecated("abstract before API 30, never called from 29 on")
|
|
280
|
+
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {}
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
val interval = if (high) 1_000L else 5_000L
|
|
284
|
+
when {
|
|
285
|
+
Build.VERSION.SDK_INT >= 31 -> Api31.requestUpdates(lm, provider, high, activity.mainExecutor, listener)
|
|
286
|
+
Build.VERSION.SDK_INT >= 30 -> Api30.requestUpdates(lm, provider, interval, activity.mainExecutor, listener)
|
|
287
|
+
else -> lm.requestLocationUpdates(provider, interval, 0f, listener, Looper.getMainLooper())
|
|
288
|
+
}
|
|
289
|
+
watch = Watch(provider, high, listener)
|
|
290
|
+
} catch (e: RuntimeException) { // SecurityException, IllegalArgumentException
|
|
291
|
+
Log.w("AkanNative", "geolocation: cannot watch $provider", e)
|
|
292
|
+
return report(if (e is SecurityException) GeolocationErrorCode.PERMISSION_DENIED else GeolocationErrorCode.NOT_FOUND, e.message ?: "cannot watch $provider")
|
|
293
|
+
}
|
|
294
|
+
if (!lm.isLocationEnabled) report(GeolocationErrorCode.NOT_FOUND, "location is turned off")
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
private fun stopWatch() {
|
|
298
|
+
val current = watch ?: return
|
|
299
|
+
manager?.removeUpdates(current.listener)
|
|
300
|
+
watch = null
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/** Sends an "error" event, once per distinct problem until the next fix. */
|
|
304
|
+
private fun report(code: GeolocationErrorCode, message: String) {
|
|
305
|
+
val key = "${code.json} $message"
|
|
306
|
+
if (lastReport == key) return
|
|
307
|
+
lastReport = key
|
|
308
|
+
events.error(GeolocationError(code = code, message = message))
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// ------------------------------------------------------------ Location → Position
|
|
312
|
+
|
|
313
|
+
/** Float → Double through its shortest decimal form: 3.9f stays 3.9, not 3.9000000953674316. */
|
|
314
|
+
private fun num(value: Float): Double = value.toString().toDouble()
|
|
315
|
+
|
|
316
|
+
private fun position(l: Location) = GeolocationPosition(
|
|
317
|
+
latitude = l.latitude,
|
|
318
|
+
longitude = l.longitude,
|
|
319
|
+
accuracy = num(l.accuracy),
|
|
320
|
+
altitude = if (l.hasAltitude()) l.altitude else null, // WGS84 ellipsoid, as W3C
|
|
321
|
+
altitudeAccuracy = if (l.hasVerticalAccuracy()) num(l.verticalAccuracyMeters) else null,
|
|
322
|
+
heading = if (l.hasBearing() && l.hasSpeed() && l.speed > 0f) num(l.bearing) else null,
|
|
323
|
+
speed = if (l.hasSpeed()) num(l.speed) else null,
|
|
324
|
+
timestamp = l.time.toDouble(), // epoch ms: exact in a Double, and written without a fraction
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
private object Api30 {
|
|
328
|
+
fun currentLocation(lm: LocationManager, provider: String, signal: CancellationSignal, executor: Executor, done: (Location?) -> Unit) =
|
|
329
|
+
lm.getCurrentLocation(provider, signal, executor, Consumer { done(it) })
|
|
330
|
+
|
|
331
|
+
fun requestUpdates(lm: LocationManager, provider: String, interval: Long, executor: Executor, listener: LocationListener) =
|
|
332
|
+
lm.requestLocationUpdates(provider, interval, 0f, executor, listener)
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
private object Api31 {
|
|
336
|
+
fun hasProvider(lm: LocationManager, provider: String): Boolean = lm.hasProvider(provider)
|
|
337
|
+
|
|
338
|
+
fun currentLocation(lm: LocationManager, provider: String, high: Boolean, timeout: Long, signal: CancellationSignal, executor: Executor, done: (Location?) -> Unit) {
|
|
339
|
+
val request = LocationRequest.Builder(0)
|
|
340
|
+
.setQuality(if (high) LocationRequest.QUALITY_HIGH_ACCURACY else LocationRequest.QUALITY_BALANCED_POWER_ACCURACY)
|
|
341
|
+
.setDurationMillis(timeout)
|
|
342
|
+
.build()
|
|
343
|
+
lm.getCurrentLocation(provider, request, signal, executor, Consumer { done(it) })
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
fun requestUpdates(lm: LocationManager, provider: String, high: Boolean, executor: Executor, listener: LocationListener) {
|
|
347
|
+
val request = LocationRequest.Builder(if (high) 1_000 else 5_000)
|
|
348
|
+
.setQuality(if (high) LocationRequest.QUALITY_HIGH_ACCURACY else LocationRequest.QUALITY_BALANCED_POWER_ACCURACY)
|
|
349
|
+
.setMinUpdateIntervalMillis(if (high) 500 else 2_000)
|
|
350
|
+
.build()
|
|
351
|
+
lm.requestLocationUpdates(provider, request, executor, listener)
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
private companion object {
|
|
356
|
+
val PERMISSIONS = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)
|
|
357
|
+
val EVENTS = setOf("position", "highAccuracyPosition")
|
|
358
|
+
val PROVIDERS = listOf(LocationManager.FUSED_PROVIDER, LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER, LocationManager.PASSIVE_PROVIDER)
|
|
359
|
+
}
|
|
360
|
+
}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import CoreLocation
|
|
2
|
+
import Foundation
|
|
3
|
+
|
|
4
|
+
/// CoreLocation, when-in-use authorization only.
|
|
5
|
+
/// Compared with tauri-plugins-workspace/plugins/geolocation/ios/Sources/GeolocationPlugin.swift:
|
|
6
|
+
/// - Two managers: `single` answers getCurrentPosition with requestLocation(), `watcher` runs
|
|
7
|
+
/// startUpdatingLocation() while the page listens. requestLocation() and startUpdatingLocation()
|
|
8
|
+
/// on one manager interfere (a running update makes the one-shot request moot, and
|
|
9
|
+
/// stopUpdatingLocation() is also how a pending requestLocation() is cancelled).
|
|
10
|
+
/// - Instance authorizationStatus / accuracyAuthorization and locationManagerDidChangeAuthorization
|
|
11
|
+
/// (iOS 14+); Tauri still uses the deprecated class method (its own TODO).
|
|
12
|
+
/// - timeout and maximumAge are honored (Tauri ignores both on iOS); balanced accuracy is 100 m
|
|
13
|
+
/// (Tauri: 1 km, which in a city is often just the cell tower).
|
|
14
|
+
/// - Invalid CLLocation fields (negative accuracy, course, speed) become null instead of -1, and
|
|
15
|
+
/// altitude is ellipsoidalAltitude (iOS 15+) so it means the same as on Android and in W3C.
|
|
16
|
+
/// - kCLErrorLocationUnknown during a watch is transient (Apple: "keeps trying"), so it is not
|
|
17
|
+
/// reported; for a one-shot request it ends the request with NOT_FOUND.
|
|
18
|
+
/// - Asking without NSLocationWhenInUseUsageDescription does nothing (the prompt never appears), so
|
|
19
|
+
/// it is checked first. Location services off system-wide reads as .denied.
|
|
20
|
+
/// - Reduced accuracy (Precise Location off) is reported as precise: false; asking for temporary
|
|
21
|
+
/// full accuracy needs NSLocationTemporaryUsageDescriptionDictionary and is not offered yet.
|
|
22
|
+
/// Simulator: `xcrun simctl location <udid> set <lat>,<lon>`, `xcrun simctl privacy <udid> grant location <bundle id>`.
|
|
23
|
+
/// Arguments arrive decoded and checked by the generated GeolocationPluginSpec (PL-10); the ranges
|
|
24
|
+
/// of timeout and maximumAge are checked here.
|
|
25
|
+
final class GeolocationPlugin: NSObject, GeolocationPluginSpec, CLLocationManagerDelegate {
|
|
26
|
+
static let id = "geolocation"
|
|
27
|
+
|
|
28
|
+
private final class Request {
|
|
29
|
+
let reply: AkanNativeReply<GeolocationPosition>
|
|
30
|
+
let high: Bool
|
|
31
|
+
let timeout: Double
|
|
32
|
+
let timer: DispatchWorkItem
|
|
33
|
+
var started = false
|
|
34
|
+
|
|
35
|
+
init(reply: AkanNativeReply<GeolocationPosition>, high: Bool, timeout: Double, timer: DispatchWorkItem) {
|
|
36
|
+
(self.reply, self.high, self.timeout, self.timer) = (reply, high, timeout, timer)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private static let watchEvents: Set<String> = ["position", "highAccuracyPosition"]
|
|
41
|
+
private let events: GeolocationEvents
|
|
42
|
+
private let single = CLLocationManager()
|
|
43
|
+
private let watcher = CLLocationManager()
|
|
44
|
+
private var requests: [Int: Request] = [:]
|
|
45
|
+
private var nextRequest = 0
|
|
46
|
+
private var singleRunning = false
|
|
47
|
+
private var singleHigh = false
|
|
48
|
+
private var permissionReplies: [AkanNativeReply<GeolocationLocationPermission>] = []
|
|
49
|
+
private var listening: Set<String> = []
|
|
50
|
+
private var watchRunning = false
|
|
51
|
+
private var reportedDenied = false
|
|
52
|
+
|
|
53
|
+
init(context: AkanNativePluginContext) {
|
|
54
|
+
events = GeolocationEvents(context)
|
|
55
|
+
super.init()
|
|
56
|
+
single.delegate = self // created on the main thread: delegate calls arrive on the main run loop
|
|
57
|
+
watcher.delegate = self
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
func checkPermission(_ reply: AkanNativeReply<GeolocationLocationPermission>) {
|
|
61
|
+
reply.resolve(permission())
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
func requestPermission(_ reply: AkanNativeReply<GeolocationLocationPermission>) {
|
|
65
|
+
guard single.authorizationStatus == .notDetermined else { return reply.resolve(permission()) }
|
|
66
|
+
guard Self.hasUsageDescription else { return reply.reject(.internalError, Self.missingUsage) }
|
|
67
|
+
permissionReplies.append(reply)
|
|
68
|
+
single.requestWhenInUseAuthorization() // answered in locationManagerDidChangeAuthorization
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
func startListening(_ event: String) {
|
|
72
|
+
guard Self.watchEvents.contains(event) else { return }
|
|
73
|
+
listening.insert(event)
|
|
74
|
+
updateWatch()
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
func stopListening(_ event: String) {
|
|
78
|
+
guard Self.watchEvents.contains(event) else { return }
|
|
79
|
+
listening.remove(event)
|
|
80
|
+
updateWatch()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// MARK: permission
|
|
84
|
+
|
|
85
|
+
private static let missingUsage = "Info.plist has no NSLocationWhenInUseUsageDescription"
|
|
86
|
+
|
|
87
|
+
private static var hasUsageDescription: Bool {
|
|
88
|
+
Bundle.main.object(forInfoDictionaryKey: "NSLocationWhenInUseUsageDescription") != nil
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private var authorized: Bool {
|
|
92
|
+
let status = single.authorizationStatus
|
|
93
|
+
return status == .authorizedWhenInUse || status == .authorizedAlways
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private func permission() -> GeolocationLocationPermission {
|
|
97
|
+
let state: GeolocationPermissionState =
|
|
98
|
+
switch single.authorizationStatus {
|
|
99
|
+
case .notDetermined: .prompt
|
|
100
|
+
case .denied, .restricted: .denied
|
|
101
|
+
default: .granted
|
|
102
|
+
}
|
|
103
|
+
return GeolocationLocationPermission(location: state, precise: authorized ? single.accuracyAuthorization == .fullAccuracy : nil)
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private func authorizationChanged() {
|
|
107
|
+
if single.authorizationStatus == .notDetermined { return } // the initial callback, or still asking
|
|
108
|
+
let replies = permissionReplies
|
|
109
|
+
permissionReplies.removeAll()
|
|
110
|
+
let state = permission()
|
|
111
|
+
for reply in replies { reply.resolve(state) }
|
|
112
|
+
if authorized { reportedDenied = false }
|
|
113
|
+
startSingle()
|
|
114
|
+
updateWatch()
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// MARK: getCurrentPosition
|
|
118
|
+
|
|
119
|
+
/// A non-negative number of ms, or the fallback when absent. JSON has no Infinity: it arrives as null.
|
|
120
|
+
private static func milliseconds<T>(_ value: Double?, _ name: String, _ fallback: Double, _ reply: AkanNativeReply<T>) -> Double? {
|
|
121
|
+
guard let value else { return fallback }
|
|
122
|
+
guard value >= 0 else {
|
|
123
|
+
reply.reject(.invalidArgs, "\(name) must be a number of ms >= 0")
|
|
124
|
+
return nil
|
|
125
|
+
}
|
|
126
|
+
return value
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
func getCurrentPosition(_ args: GeolocationPositionOptions, _ reply: AkanNativeReply<GeolocationPosition>) {
|
|
130
|
+
guard let timeout = Self.milliseconds(args.timeout, "timeout", 30_000, reply),
|
|
131
|
+
let maximumAge = Self.milliseconds(args.maximumAge, "maximumAge", 0, reply) else { return }
|
|
132
|
+
let high = args.enableHighAccuracy ?? false
|
|
133
|
+
if maximumAge > 0, authorized, let cached = watcher.location ?? single.location,
|
|
134
|
+
cached.horizontalAccuracy >= 0, -cached.timestamp.timeIntervalSinceNow * 1000 <= maximumAge
|
|
135
|
+
{
|
|
136
|
+
return reply.resolve(GeolocationPosition(cached))
|
|
137
|
+
}
|
|
138
|
+
let id = nextRequest
|
|
139
|
+
nextRequest += 1
|
|
140
|
+
let timer = DispatchWorkItem { [weak self] in MainActor.assumeIsolated { self?.timedOut(id) } }
|
|
141
|
+
requests[id] = Request(reply: reply, high: high, timeout: timeout, timer: timer)
|
|
142
|
+
startSingle()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private func startSingle() {
|
|
146
|
+
guard !requests.isEmpty else { return stopSingle() }
|
|
147
|
+
switch single.authorizationStatus {
|
|
148
|
+
case .notDetermined:
|
|
149
|
+
guard Self.hasUsageDescription else { return finishAll(.internalError, Self.missingUsage) }
|
|
150
|
+
single.requestWhenInUseAuthorization() // continues in authorizationChanged
|
|
151
|
+
case .denied, .restricted:
|
|
152
|
+
finishAll(.permissionDenied, "location access was denied")
|
|
153
|
+
default:
|
|
154
|
+
// Like W3C, the timeout runs from here: time spent on the permission prompt does not count.
|
|
155
|
+
for request in requests.values where !request.started {
|
|
156
|
+
request.started = true
|
|
157
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + min(request.timeout, 86_400_000) / 1000, execute: request.timer)
|
|
158
|
+
}
|
|
159
|
+
let high = requests.values.contains { $0.high }
|
|
160
|
+
if singleRunning, singleHigh || !high { return } // the running request is good enough
|
|
161
|
+
if singleRunning { single.stopUpdatingLocation() } // restart with the better accuracy
|
|
162
|
+
single.desiredAccuracy = high ? kCLLocationAccuracyBest : kCLLocationAccuracyHundredMeters
|
|
163
|
+
singleHigh = high
|
|
164
|
+
singleRunning = true
|
|
165
|
+
single.requestLocation()
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
private func stopSingle() {
|
|
170
|
+
if singleRunning { single.stopUpdatingLocation() } // also cancels a pending requestLocation()
|
|
171
|
+
singleRunning = false
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
private func timedOut(_ id: Int) {
|
|
175
|
+
guard let request = requests.removeValue(forKey: id) else { return }
|
|
176
|
+
request.reply.reject(.notFound, "no position within \(Int(request.timeout)) ms")
|
|
177
|
+
if requests.isEmpty { stopSingle() }
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
private func finishAll(_ code: AkanNativeErrorCode?, _ message: String, fix: GeolocationPosition? = nil) {
|
|
181
|
+
let pending = requests.values
|
|
182
|
+
requests.removeAll()
|
|
183
|
+
singleRunning = false
|
|
184
|
+
for request in pending {
|
|
185
|
+
request.timer.cancel()
|
|
186
|
+
if let fix { request.reply.resolve(fix) } else if let code { request.reply.reject(code, message) }
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// MARK: watch
|
|
191
|
+
|
|
192
|
+
private func updateWatch() {
|
|
193
|
+
guard !listening.isEmpty else {
|
|
194
|
+
if watchRunning { watcher.stopUpdatingLocation() }
|
|
195
|
+
watchRunning = false
|
|
196
|
+
reportedDenied = false
|
|
197
|
+
return
|
|
198
|
+
}
|
|
199
|
+
switch watcher.authorizationStatus {
|
|
200
|
+
case .notDetermined:
|
|
201
|
+
guard Self.hasUsageDescription else { return reportOnce(.internal, Self.missingUsage) }
|
|
202
|
+
watcher.requestWhenInUseAuthorization()
|
|
203
|
+
case .denied, .restricted:
|
|
204
|
+
if watchRunning { watcher.stopUpdatingLocation() }
|
|
205
|
+
watchRunning = false
|
|
206
|
+
reportOnce(.permissionDenied, "location access was denied")
|
|
207
|
+
default:
|
|
208
|
+
// Changing desiredAccuracy on a running manager applies right away.
|
|
209
|
+
watcher.desiredAccuracy = listening.contains("highAccuracyPosition") ? kCLLocationAccuracyBest : kCLLocationAccuracyHundredMeters
|
|
210
|
+
if !watchRunning { watcher.startUpdatingLocation() }
|
|
211
|
+
watchRunning = true
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
private func reportOnce(_ code: GeolocationErrorCode, _ message: String) {
|
|
216
|
+
guard !reportedDenied else { return }
|
|
217
|
+
reportedDenied = true
|
|
218
|
+
events.error(GeolocationError(code: code, message: message))
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// MARK: CLLocationManagerDelegate (main thread, see init)
|
|
222
|
+
|
|
223
|
+
private func received(_ fix: GeolocationPosition, from manager: ObjectIdentifier) {
|
|
224
|
+
if manager == ObjectIdentifier(single) {
|
|
225
|
+
finishAll(nil, "", fix: fix)
|
|
226
|
+
} else if watchRunning {
|
|
227
|
+
for event in listening {
|
|
228
|
+
if event == "highAccuracyPosition" { events.highAccuracyPosition(fix) } else { events.position(fix) }
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
private func failed(_ code: Int, _ message: String, from manager: ObjectIdentifier) {
|
|
234
|
+
let denied = code == CLError.Code.denied.rawValue
|
|
235
|
+
if manager == ObjectIdentifier(single) {
|
|
236
|
+
finishAll(denied ? .permissionDenied : .notFound, denied ? "location access was denied" : "no position: \(message)")
|
|
237
|
+
} else if denied {
|
|
238
|
+
if watchRunning { watcher.stopUpdatingLocation() }
|
|
239
|
+
watchRunning = false
|
|
240
|
+
reportOnce(.permissionDenied, "location access was denied")
|
|
241
|
+
} else if code != CLError.Code.locationUnknown.rawValue {
|
|
242
|
+
events.error(GeolocationError(code: .notFound, message: "no position: \(message)"))
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
nonisolated func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
|
|
247
|
+
let id = ObjectIdentifier(manager)
|
|
248
|
+
MainActor.assumeIsolated {
|
|
249
|
+
if id == ObjectIdentifier(single) { authorizationChanged() } // both managers report the same app-wide change
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
nonisolated func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
|
|
254
|
+
// The last one is the newest (Tauri's comment on capacitor using .first).
|
|
255
|
+
guard let location = locations.last, location.horizontalAccuracy >= 0 else { return }
|
|
256
|
+
let fix = GeolocationPosition(location)
|
|
257
|
+
let id = ObjectIdentifier(manager)
|
|
258
|
+
MainActor.assumeIsolated { received(fix, from: id) }
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
nonisolated func locationManager(_ manager: CLLocationManager, didFailWithError error: any Error) {
|
|
262
|
+
let code = (error as? CLError)?.code.rawValue ?? -1
|
|
263
|
+
let message = error.localizedDescription
|
|
264
|
+
let id = ObjectIdentifier(manager)
|
|
265
|
+
MainActor.assumeIsolated { failed(code, message, from: id) }
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
private extension GeolocationPosition {
|
|
270
|
+
/// A CLLocation reduced to Sendable values where the delegate call arrives.
|
|
271
|
+
init(_ location: CLLocation) {
|
|
272
|
+
let vertical = location.verticalAccuracy > 0
|
|
273
|
+
self.init(
|
|
274
|
+
latitude: location.coordinate.latitude,
|
|
275
|
+
longitude: location.coordinate.longitude,
|
|
276
|
+
accuracy: location.horizontalAccuracy,
|
|
277
|
+
altitude: vertical ? location.ellipsoidalAltitude : nil,
|
|
278
|
+
altitudeAccuracy: vertical ? location.verticalAccuracy : nil,
|
|
279
|
+
heading: location.course >= 0 ? location.course : nil,
|
|
280
|
+
speed: location.speed >= 0 ? location.speed : nil,
|
|
281
|
+
timestamp: (location.timestamp.timeIntervalSince1970 * 1000).rounded()
|
|
282
|
+
)
|
|
283
|
+
}
|
|
284
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "geolocation",
|
|
3
|
+
"apiVersion": 1,
|
|
4
|
+
"methods": ["getCurrentPosition", "checkPermission", "requestPermission"],
|
|
5
|
+
"events": ["position", "highAccuracyPosition", "error"],
|
|
6
|
+
"coalesce": ["position", "highAccuracyPosition"],
|
|
7
|
+
"codegen": true,
|
|
8
|
+
"web": "./src/web.ts",
|
|
9
|
+
"desktop": null,
|
|
10
|
+
"ios": {
|
|
11
|
+
"sources": ["ios/*.swift"],
|
|
12
|
+
"class": "GeolocationPlugin",
|
|
13
|
+
"frameworks": ["CoreLocation"],
|
|
14
|
+
"infoPlist": {
|
|
15
|
+
"NSLocationWhenInUseUsageDescription": "Show where you are."
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"android": {
|
|
19
|
+
"sources": ["android/*.kt"],
|
|
20
|
+
"class": "com.akanjs.plugins.geolocation.GeolocationPlugin",
|
|
21
|
+
"permissions": ["android.permission.ACCESS_COARSE_LOCATION", "android.permission.ACCESS_FINE_LOCATION"]
|
|
22
|
+
}
|
|
23
|
+
}
|