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,189 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { AkanNativeError } from "../../../packages/core/src/index.ts";
|
|
7
|
+
import { type DesktopContext, defineDesktopPlugin } from "../../../packages/desktop/src/plugin.ts";
|
|
8
|
+
import type { AutostartApi, AutostartState, AutostartStatus } from "./index.ts";
|
|
9
|
+
|
|
10
|
+
export interface ShellError {
|
|
11
|
+
reason: "alreadyRegistered" | "notRegistered" | "deniedByUser" | "invalidSignature" | "other";
|
|
12
|
+
code: number;
|
|
13
|
+
domain: string;
|
|
14
|
+
message: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface ShellAnswer {
|
|
18
|
+
status: AutostartStatus;
|
|
19
|
+
error?: ShellError | null;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const state = (status: AutostartStatus): AutostartState => ({ enabled: status === "enabled", status });
|
|
23
|
+
|
|
24
|
+
/** Where the user switches login items on and off. */
|
|
25
|
+
const SETTINGS_PAGE: Partial<Record<NodeJS.Platform, string>> = {
|
|
26
|
+
darwin: "System Settings › General › Login Items",
|
|
27
|
+
win32: "Settings › Apps › Startup",
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/** The error an enable/disable answer stands for, or null when the app is where it was asked to be. */
|
|
31
|
+
export function failure(
|
|
32
|
+
op: "enable" | "disable",
|
|
33
|
+
answer: ShellAnswer,
|
|
34
|
+
platform: NodeJS.Platform = process.platform,
|
|
35
|
+
): AkanNativeError | null {
|
|
36
|
+
const { status, error } = answer;
|
|
37
|
+
const page = SETTINGS_PAGE[platform] ?? SETTINGS_PAGE.darwin!;
|
|
38
|
+
if (op === "enable" && status === "requiresApproval") {
|
|
39
|
+
return new AkanNativeError(
|
|
40
|
+
"PERMISSION_DENIED",
|
|
41
|
+
`the app is switched off in ${page}; openSettings() opens that page`,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
if (op === "enable" ? status === "enabled" : status === "notRegistered" || status === "notFound") return null;
|
|
45
|
+
if (!error) return new AkanNativeError("INTERNAL", `${op} did not change the login item (status ${status})`);
|
|
46
|
+
const detail = `${error.message} (${error.domain} ${error.code})`;
|
|
47
|
+
switch (error.reason) {
|
|
48
|
+
case "deniedByUser":
|
|
49
|
+
return new AkanNativeError("PERMISSION_DENIED", `the user switched the app off in ${page}: ${detail}`);
|
|
50
|
+
case "invalidSignature":
|
|
51
|
+
return new AkanNativeError("INTERNAL", `macOS did not accept the app's code signature: ${detail}`);
|
|
52
|
+
default:
|
|
53
|
+
return new AkanNativeError("INTERNAL", `${op} failed: ${detail}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
type Env = Record<string, string | undefined>;
|
|
58
|
+
|
|
59
|
+
/** $XDG_CONFIG_HOME/autostart; the base directory must be absolute (XDG Base Directory spec). */
|
|
60
|
+
export function autostartDir(env: Env = process.env, home = homedir()): string {
|
|
61
|
+
const config = env.XDG_CONFIG_HOME?.startsWith("/") ? env.XDG_CONFIG_HOME : join(home, ".config");
|
|
62
|
+
return join(config, "autostart");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The Exec= value that runs `path`: one quoted argument (Desktop Entry spec, "The Exec key").
|
|
67
|
+
* Inside quotes `"`, `` ` ``, `$` and `\` take a backslash; then the string escaping of values
|
|
68
|
+
* doubles every backslash, and a literal `%` is `%%` (field codes).
|
|
69
|
+
*/
|
|
70
|
+
export function desktopExec(path: string): string {
|
|
71
|
+
const quoted = `"${path.replace(/["`$\\]/g, (c) => `\\${c}`)}"`;
|
|
72
|
+
return quoted.replace(/\\/g, "\\\\").replace(/%/g, "%%");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Values of the Desktop Entry spec's string type: no line breaks. */
|
|
76
|
+
const oneLine = (value: string) => value.replace(/[\r\n]+/g, " ");
|
|
77
|
+
|
|
78
|
+
export function desktopEntry(name: string, exec: string): string {
|
|
79
|
+
return [
|
|
80
|
+
"[Desktop Entry]",
|
|
81
|
+
"Type=Application",
|
|
82
|
+
"Version=1.5",
|
|
83
|
+
`Name=${oneLine(name)}`,
|
|
84
|
+
`Exec=${desktopExec(exec)}`,
|
|
85
|
+
"Terminal=false",
|
|
86
|
+
"X-GNOME-Autostart-enabled=true",
|
|
87
|
+
"",
|
|
88
|
+
].join("\n");
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* The state an entry stands for. Hidden=true (the spec's "deleted") or
|
|
93
|
+
* X-GNOME-Autostart-enabled=false (GNOME's startup settings) is an entry the user switched off.
|
|
94
|
+
*/
|
|
95
|
+
export function entryStatus(text: string | null): AutostartStatus {
|
|
96
|
+
if (text === null) return "notRegistered";
|
|
97
|
+
let group = "";
|
|
98
|
+
const keys = new Map<string, string>();
|
|
99
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
100
|
+
const line = raw.trim();
|
|
101
|
+
if (line.startsWith("[")) group = line;
|
|
102
|
+
else if (group === "[Desktop Entry]" && line.includes("=") && !line.startsWith("#")) {
|
|
103
|
+
const at = line.indexOf("=");
|
|
104
|
+
keys.set(line.slice(0, at).trim(), line.slice(at + 1).trim());
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
if (keys.get("Hidden") === "true" || keys.get("X-GNOME-Autostart-enabled") === "false") return "requiresApproval";
|
|
108
|
+
return "enabled";
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** `executable`: the file the entry starts; an AppImage's mount point changes at every start, $APPIMAGE does not. */
|
|
112
|
+
export function linuxAutostart(
|
|
113
|
+
dir: () => string = () => autostartDir(),
|
|
114
|
+
executable: () => string = () => process.env.APPIMAGE || process.execPath,
|
|
115
|
+
) {
|
|
116
|
+
const file = (ctx: DesktopContext) => join(dir(), `${ctx.app.id}.desktop`);
|
|
117
|
+
const read = (ctx: DesktopContext) => (existsSync(file(ctx)) ? readFileSync(file(ctx), "utf8") : null);
|
|
118
|
+
const answer = (status: AutostartStatus, error?: unknown): ShellAnswer => ({
|
|
119
|
+
status,
|
|
120
|
+
error: error
|
|
121
|
+
? { reason: "other", code: 0, domain: "filesystem", message: (error as Error).message ?? String(error) }
|
|
122
|
+
: null,
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
status: (ctx: DesktopContext): ShellAnswer => ({ status: entryStatus(read(ctx)) }),
|
|
126
|
+
|
|
127
|
+
enable(ctx: DesktopContext): ShellAnswer {
|
|
128
|
+
try {
|
|
129
|
+
mkdirSync(dir(), { recursive: true });
|
|
130
|
+
writeFileSync(`${file(ctx)}.tmp`, desktopEntry(ctx.app.name, executable()));
|
|
131
|
+
renameSync(`${file(ctx)}.tmp`, file(ctx));
|
|
132
|
+
} catch (error) {
|
|
133
|
+
return answer(entryStatus(read(ctx)), error);
|
|
134
|
+
}
|
|
135
|
+
return answer(entryStatus(read(ctx)));
|
|
136
|
+
},
|
|
137
|
+
disable(ctx: DesktopContext): ShellAnswer {
|
|
138
|
+
try {
|
|
139
|
+
rmSync(file(ctx), { force: true });
|
|
140
|
+
} catch (error) {
|
|
141
|
+
return answer(entryStatus(read(ctx)), error);
|
|
142
|
+
}
|
|
143
|
+
return answer(entryStatus(read(ctx)));
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
type Backend = {
|
|
149
|
+
status(ctx: DesktopContext): Promise<ShellAnswer>;
|
|
150
|
+
change(op: "enable" | "disable", ctx: DesktopContext): Promise<ShellAnswer>;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/** The shell's autostart.* ops (macOS, Windows); `id` names the Windows Run value. */
|
|
154
|
+
const shellBackend: Backend = {
|
|
155
|
+
status: async (ctx) => (await ctx.shell("autostart.status", { id: ctx.app.id })) as ShellAnswer,
|
|
156
|
+
change: async (op, ctx) => (await ctx.shell(`autostart.${op}`, { id: ctx.app.id })) as ShellAnswer,
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/** `platform` and `linux` are replaceable so tests can check every OS's path on any OS. */
|
|
160
|
+
export function createDesktopAutostart(platform: NodeJS.Platform = process.platform, linux = linuxAutostart()) {
|
|
161
|
+
const backend: Backend =
|
|
162
|
+
platform === "linux"
|
|
163
|
+
? {
|
|
164
|
+
status: async (ctx) => linux.status(ctx),
|
|
165
|
+
change: async (op, ctx) => (op === "enable" ? linux.enable(ctx) : linux.disable(ctx)),
|
|
166
|
+
}
|
|
167
|
+
: shellBackend;
|
|
168
|
+
const change = async (op: "enable" | "disable", ctx: DesktopContext): Promise<AutostartState> => {
|
|
169
|
+
const answer = await backend.change(op, ctx);
|
|
170
|
+
const error = failure(op, answer, platform);
|
|
171
|
+
if (error) throw error;
|
|
172
|
+
return state(answer.status);
|
|
173
|
+
};
|
|
174
|
+
return defineDesktopPlugin<AutostartApi>({
|
|
175
|
+
id: "autostart",
|
|
176
|
+
methods: {
|
|
177
|
+
enable: (_args, ctx) => change("enable", ctx),
|
|
178
|
+
disable: (_args, ctx) => change("disable", ctx),
|
|
179
|
+
isEnabled: async (_args, ctx) => state((await backend.status(ctx)).status),
|
|
180
|
+
openSettings: async (_args, ctx) => {
|
|
181
|
+
if (platform === "linux")
|
|
182
|
+
throw new AkanNativeError("UNSUPPORTED", "Linux desktops have no common settings page for startup apps");
|
|
183
|
+
await ctx.shell("autostart.openSettings");
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export default createDesktopAutostart();
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { definePlugin } from "../../../packages/core/src/index.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Launch the app when the user logs in (plugins.md §5).
|
|
5
|
+
*
|
|
6
|
+
* - macOS 13+: SMAppService.mainApp. The app itself becomes a login item under System Settings ›
|
|
7
|
+
* General › Login Items › "Open at Login"; no permission prompt, but macOS shows a "Login Item
|
|
8
|
+
* Added" notification. The user can switch it off there: then `status` is "requiresApproval"
|
|
9
|
+
* and enable() rejects with PERMISSION_DENIED; openSettings() takes the user to that page.
|
|
10
|
+
* - `status` is macOS's own (SMAppService.Status):
|
|
11
|
+
* "enabled": registered and will launch at login.
|
|
12
|
+
* "notRegistered": not registered (typically after disable()).
|
|
13
|
+
* "requiresApproval": registered, but switched off by the user in System Settings.
|
|
14
|
+
* "notFound": macOS has no login item record for this app, e.g. it never called enable().
|
|
15
|
+
* Seen on macOS 26 for an ad-hoc signed bundle that never registered; not an error.
|
|
16
|
+
* `enabled` is `status === "enabled"`.
|
|
17
|
+
* - The registration belongs to the app bundle: enable() it from the copy users run, normally
|
|
18
|
+
* the one in /Applications. A bundle whose signature macOS does not accept is refused
|
|
19
|
+
* (INTERNAL, "invalid signature").
|
|
20
|
+
* - enable() when enabled and disable() when not are no-ops that resolve.
|
|
21
|
+
* - Windows: a value named after the app id under HKCU\Software\Microsoft\Windows\CurrentVersion\Run
|
|
22
|
+
* that starts this .exe. The user can switch it off in Settings › Apps › Startup or Task Manager:
|
|
23
|
+
* then `status` is "requiresApproval" and enable() rejects with PERMISSION_DENIED; openSettings()
|
|
24
|
+
* opens that page. disable() removes the value and that switch. Never "notFound".
|
|
25
|
+
* - Linux: an XDG autostart entry, ~/.config/autostart/<app id>.desktop, that starts this
|
|
26
|
+
* executable ($APPIMAGE for an AppImage). An entry the user switched off (Hidden=true,
|
|
27
|
+
* X-GNOME-Autostart-enabled=false) reads "requiresApproval", and enable() switches it on again:
|
|
28
|
+
* Linux has no approval system. openSettings() is UNSUPPORTED (no common settings page). Never "notFound".
|
|
29
|
+
* - Web, iOS and Android: UNSUPPORTED.
|
|
30
|
+
*/
|
|
31
|
+
export type AutostartStatus = "enabled" | "notRegistered" | "requiresApproval" | "notFound";
|
|
32
|
+
|
|
33
|
+
export interface AutostartState {
|
|
34
|
+
enabled: boolean;
|
|
35
|
+
status: AutostartStatus;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface AutostartApi {
|
|
39
|
+
/** Registers the app to open at login. */
|
|
40
|
+
enable(): Promise<AutostartState>;
|
|
41
|
+
/** Stops opening at login. The running app keeps running. */
|
|
42
|
+
disable(): Promise<AutostartState>;
|
|
43
|
+
/** Reads the state without changing it. */
|
|
44
|
+
isEnabled(): Promise<AutostartState>;
|
|
45
|
+
/** Opens System Settings at Login Items, or Settings › Apps › Startup on Windows (to switch a "requiresApproval" item back on). */
|
|
46
|
+
openSettings(): Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const autostart = definePlugin<AutostartApi>("autostart", {
|
|
50
|
+
methods: ["enable", "disable", "isEnabled", "openSettings"],
|
|
51
|
+
});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import UserNotifications
|
|
2
|
+
|
|
3
|
+
/// The app icon badge through UNUserNotificationCenter.setBadgeCount (iOS 16), plugins.md §4.6.
|
|
4
|
+
/// - Not UIApplication.applicationIconBadgeNumber, which tao/src/platform_impl/ios/badge.rs:8-15 and
|
|
5
|
+
/// capacitor-plugins/local-notifications/.../LocalNotificationsPlugin.swift:635 set: it is
|
|
6
|
+
/// deprecated since iOS 17 and has no replacement getter, which is why there is no get().
|
|
7
|
+
/// - Badges belong to the notification permission. tao sets the number without looking and the
|
|
8
|
+
/// badge silently never appears; here set() checks the settings first and rejects
|
|
9
|
+
/// PERMISSION_DENIED, the way plugins/local-notifications answers schedule() without permission.
|
|
10
|
+
/// "granted" needs an authorization that shows badges: provisional authorization delivers quietly
|
|
11
|
+
/// without badges, so it counts as "prompt" (requestPermission asks for the full one).
|
|
12
|
+
/// - requestPermission asks for alerts, sounds and badges together, the set of
|
|
13
|
+
/// plugins/local-notifications and capacitor-plugins/push-notifications/.../PushNotificationsHandler.swift:9.
|
|
14
|
+
/// iOS prompts once per app, and the options of that first request are what the user grants, so a
|
|
15
|
+
/// badge-only request would leave a later notifications prompt without alerts.
|
|
16
|
+
/// - clear() resolves without the permission: no badge can be showing then.
|
|
17
|
+
/// Arguments arrive decoded by the generated BadgePluginSpec (PL-10); the range is checked here.
|
|
18
|
+
final class BadgePlugin: BadgePluginSpec {
|
|
19
|
+
static let id = "badge"
|
|
20
|
+
private static let maxCount = 2_147_483_647.0
|
|
21
|
+
|
|
22
|
+
init(context: AkanNativePluginContext) {}
|
|
23
|
+
|
|
24
|
+
func set(_ args: BadgeSetArgs, _ reply: AkanNativeReply<Void>) {
|
|
25
|
+
let value = args.count
|
|
26
|
+
guard value.rounded() == value, value >= 0, value <= Self.maxCount else {
|
|
27
|
+
return reply.reject(.invalidArgs, "count must be an integer from 0 to 2147483647")
|
|
28
|
+
}
|
|
29
|
+
let count = Int(value)
|
|
30
|
+
Task {
|
|
31
|
+
let center = UNUserNotificationCenter.current()
|
|
32
|
+
guard Self.state(await center.notificationSettings()) == .granted else {
|
|
33
|
+
return reply.reject(.permissionDenied, "badge permission is not granted (call requestPermission)")
|
|
34
|
+
}
|
|
35
|
+
do {
|
|
36
|
+
try await center.setBadgeCount(count)
|
|
37
|
+
reply.resolve()
|
|
38
|
+
} catch {
|
|
39
|
+
reply.reject(Self.code(error), "setting the badge failed: \(error.localizedDescription)")
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
func clear(_ reply: AkanNativeReply<Void>) {
|
|
45
|
+
Task {
|
|
46
|
+
let center = UNUserNotificationCenter.current()
|
|
47
|
+
guard Self.state(await center.notificationSettings()) == .granted else { return reply.resolve() }
|
|
48
|
+
do {
|
|
49
|
+
try await center.setBadgeCount(0)
|
|
50
|
+
reply.resolve()
|
|
51
|
+
} catch {
|
|
52
|
+
reply.reject(Self.code(error), "clearing the badge failed: \(error.localizedDescription)")
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
func checkPermission(_ reply: AkanNativeReply<BadgeCheckPermissionResult>) {
|
|
58
|
+
Task {
|
|
59
|
+
reply.resolve(BadgeCheckPermissionResult(badge: Self.state(await UNUserNotificationCenter.current().notificationSettings())))
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
func requestPermission(_ reply: AkanNativeReply<BadgeRequestPermissionResult>) {
|
|
64
|
+
Task {
|
|
65
|
+
let center = UNUserNotificationCenter.current()
|
|
66
|
+
let status = await center.notificationSettings().authorizationStatus
|
|
67
|
+
if status == .notDetermined || status == .provisional {
|
|
68
|
+
do {
|
|
69
|
+
_ = try await center.requestAuthorization(options: [.alert, .sound, .badge])
|
|
70
|
+
} catch {
|
|
71
|
+
return reply.reject(.internalError, "requestAuthorization failed: \(error.localizedDescription)")
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
reply.resolve(BadgeRequestPermissionResult(badge: Self.state(await center.notificationSettings())))
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
nonisolated private static func state(_ settings: UNNotificationSettings) -> BadgePermissionState {
|
|
79
|
+
switch settings.authorizationStatus {
|
|
80
|
+
case .notDetermined, .provisional:
|
|
81
|
+
return settings.badgeSetting == .enabled ? .granted : .prompt
|
|
82
|
+
case .denied:
|
|
83
|
+
return .denied
|
|
84
|
+
default: // authorized, ephemeral
|
|
85
|
+
return settings.badgeSetting == .enabled ? .granted : .denied // badges switched off in Settings
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
nonisolated private static func code(_ error: any Error) -> AkanNativeErrorCode {
|
|
90
|
+
(error as? UNError)?.code == .notificationsNotAllowed ? .permissionDenied : .internalError
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "badge",
|
|
3
|
+
"apiVersion": 1,
|
|
4
|
+
"methods": ["set", "clear", "checkPermission", "requestPermission"],
|
|
5
|
+
"events": [],
|
|
6
|
+
"codegen": true,
|
|
7
|
+
"web": "./src/web.ts",
|
|
8
|
+
"desktop": "./src/desktop.ts",
|
|
9
|
+
"ios": {
|
|
10
|
+
"sources": ["ios/*.swift"],
|
|
11
|
+
"class": "BadgePlugin",
|
|
12
|
+
"frameworks": ["UserNotifications"]
|
|
13
|
+
},
|
|
14
|
+
"android": null
|
|
15
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AkanNativeError } from "../../../packages/core/src/index.ts";
|
|
2
|
+
|
|
3
|
+
/** The largest count: badges are 32-bit integers on iOS (UNUserNotificationCenter.setBadgeCount takes an NSInteger, tauri clamps to i32). */
|
|
4
|
+
export const MAX_BADGE_COUNT = 2147483647;
|
|
5
|
+
|
|
6
|
+
/** Checks set()'s count; the native implementation checks the same range. */
|
|
7
|
+
export function checkCount(count: unknown): number {
|
|
8
|
+
if (typeof count !== "number" || !Number.isInteger(count) || count < 0 || count > MAX_BADGE_COUNT) {
|
|
9
|
+
throw new AkanNativeError("INVALID_ARGS", `count must be an integer from 0 to ${MAX_BADGE_COUNT}`);
|
|
10
|
+
}
|
|
11
|
+
return count;
|
|
12
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { defineDesktopPlugin } from "../../../packages/desktop/src/plugin.ts";
|
|
4
|
+
import { checkCount } from "./count.ts";
|
|
5
|
+
import type { BadgeApi } from "./index.ts";
|
|
6
|
+
|
|
7
|
+
export default defineDesktopPlugin<BadgeApi>({
|
|
8
|
+
id: "badge",
|
|
9
|
+
methods: {
|
|
10
|
+
async set(options, ctx) {
|
|
11
|
+
const count = checkCount(options?.count);
|
|
12
|
+
await ctx.shell("dock.setBadge", { label: count === 0 ? null : String(count) });
|
|
13
|
+
},
|
|
14
|
+
async clear(_args, ctx) {
|
|
15
|
+
await ctx.shell("dock.setBadge", { label: null });
|
|
16
|
+
},
|
|
17
|
+
async checkPermission() {
|
|
18
|
+
return { badge: "granted" as const };
|
|
19
|
+
},
|
|
20
|
+
async requestPermission() {
|
|
21
|
+
return { badge: "granted" as const };
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { definePlugin } from "../../../packages/core/src/index.ts";
|
|
2
|
+
import { web } from "./web.ts";
|
|
3
|
+
|
|
4
|
+
export { checkCount, MAX_BADGE_COUNT } from "./count.ts";
|
|
5
|
+
|
|
6
|
+
export type PermissionState = "granted" | "denied" | "prompt";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The number on the app icon (plugins.md §4.6).
|
|
10
|
+
*
|
|
11
|
+
* - iOS: UNUserNotificationCenter.setBadgeCount. Badges are part of the notification permission:
|
|
12
|
+
* set() rejects PERMISSION_DENIED until requestPermission() was granted, or when the user
|
|
13
|
+
* switched badges off for the app. The prompt asks for alerts, sounds and badges together
|
|
14
|
+
* (one prompt per app), the same set as @akanjs/native/plugins/local-notifications.
|
|
15
|
+
* - Web: the Badging API (navigator.setAppBadge), shown for installed web apps (Chromium PWAs;
|
|
16
|
+
* Safari home screen / Dock web apps, which also need the notification permission). Browsers
|
|
17
|
+
* without it reject UNSUPPORTED. The API has no permission of its own, so the permission
|
|
18
|
+
* methods answer "granted" there.
|
|
19
|
+
* - Desktop, through the dock plugin's badge (no permission, "granted"): the Dock tile's label on
|
|
20
|
+
* macOS; on Windows the taskbar buttons' overlay icon (counts over 99 as "99+"); on Linux the
|
|
21
|
+
* launcher entry's count, shown by docks that support it once the app is installed with its
|
|
22
|
+
* desktop file (@akanjs/native/plugins/dock).
|
|
23
|
+
* - Android has no badge API (launchers draw dots for notifications): every method rejects
|
|
24
|
+
* UNSUPPORTED there.
|
|
25
|
+
*/
|
|
26
|
+
export interface BadgeApi {
|
|
27
|
+
/** Shows `count` (an integer from 0 to 2147483647) on the app icon; 0 removes the badge. */
|
|
28
|
+
set(options: { count: number }): Promise<void>;
|
|
29
|
+
/** Removes the badge. Resolves without the permission as well (no badge can be shown then). */
|
|
30
|
+
clear(): Promise<void>;
|
|
31
|
+
/** Never prompts. */
|
|
32
|
+
checkPermission(): Promise<{ badge: PermissionState }>;
|
|
33
|
+
/** Prompts when the state is "prompt"; otherwise answers like checkPermission. */
|
|
34
|
+
requestPermission(): Promise<{ badge: PermissionState }>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const badge = definePlugin<BadgeApi>("badge", {
|
|
38
|
+
methods: ["set", "clear", "checkPermission", "requestPermission"],
|
|
39
|
+
web,
|
|
40
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { AkanNativeError, defineWebPlugin } from "../../../packages/core/src/index.ts";
|
|
2
|
+
import { checkCount } from "./count.ts";
|
|
3
|
+
import type { BadgeApi } from "./index.ts";
|
|
4
|
+
|
|
5
|
+
interface BadgingNavigator {
|
|
6
|
+
setAppBadge?: (count?: number) => Promise<void>;
|
|
7
|
+
clearAppBadge?: () => Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function badging(): Required<BadgingNavigator> {
|
|
11
|
+
const nav = (typeof navigator === "undefined" ? undefined : navigator) as BadgingNavigator | undefined;
|
|
12
|
+
if (typeof nav?.setAppBadge !== "function" || typeof nav.clearAppBadge !== "function") {
|
|
13
|
+
throw new AkanNativeError("UNSUPPORTED", "this browser has no Badging API (navigator.setAppBadge)");
|
|
14
|
+
}
|
|
15
|
+
return { setAppBadge: nav.setAppBadge.bind(nav), clearAppBadge: nav.clearAppBadge.bind(nav) };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const web = defineWebPlugin<BadgeApi>({
|
|
19
|
+
methods: {
|
|
20
|
+
async set(options) {
|
|
21
|
+
const count = checkCount(options?.count);
|
|
22
|
+
const api = badging();
|
|
23
|
+
await (count === 0 ? api.clearAppBadge() : api.setAppBadge(count));
|
|
24
|
+
},
|
|
25
|
+
async clear() {
|
|
26
|
+
await badging().clearAppBadge();
|
|
27
|
+
},
|
|
28
|
+
async checkPermission() {
|
|
29
|
+
badging();
|
|
30
|
+
return { badge: "granted" };
|
|
31
|
+
},
|
|
32
|
+
async requestPermission() {
|
|
33
|
+
badging();
|
|
34
|
+
return { badge: "granted" };
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
});
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
package com.akanjs.plugins.biometric
|
|
2
|
+
|
|
3
|
+
import android.app.Activity
|
|
4
|
+
import android.app.KeyguardManager
|
|
5
|
+
import android.content.pm.PackageManager
|
|
6
|
+
import android.hardware.biometrics.BiometricManager
|
|
7
|
+
import android.hardware.biometrics.BiometricManager.Authenticators.BIOMETRIC_WEAK
|
|
8
|
+
import android.hardware.biometrics.BiometricManager.Authenticators.DEVICE_CREDENTIAL
|
|
9
|
+
import android.hardware.biometrics.BiometricPrompt
|
|
10
|
+
import android.os.Build
|
|
11
|
+
import android.os.CancellationSignal
|
|
12
|
+
import com.akanjs.runtime.AkanNativeErrorCode
|
|
13
|
+
import com.akanjs.runtime.AkanNativePluginContext
|
|
14
|
+
import com.akanjs.runtime.AkanNativeReply
|
|
15
|
+
import com.akanjs.runtime.AkanNativeVoidReply
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Framework android.hardware.biometrics.BiometricPrompt instead of androidx.biometric (plugins.md §2).
|
|
19
|
+
* tauri-plugins-workspace/plugins/biometric/android needs a separate AppCompat BiometricActivity
|
|
20
|
+
* because the androidx prompt is a Fragment; the framework prompt is system UI started from any
|
|
21
|
+
* Context, so it runs straight from the shell's Activity. Kept from Tauri:
|
|
22
|
+
* - BIOMETRIC_WEAK (Class 2) like Tauri's status(): plain presence checks need no Class 3 sensor.
|
|
23
|
+
* BIOMETRIC_STRONG only matters for a CryptoObject-bound key, which this API does not offer.
|
|
24
|
+
* - A negative button cannot be combined with DEVICE_CREDENTIAL (the builder throws).
|
|
25
|
+
* - The sensor kind comes from PackageManager features (first of fingerprint, face, iris).
|
|
26
|
+
* - KeyguardManager.isDeviceSecure tells whether a PIN / pattern / password exists.
|
|
27
|
+
* USE_BIOMETRIC is a normal permission (granted at install).
|
|
28
|
+
* API 29 has one tier and no authenticator types (both 30): canAuthenticate() counts only strong
|
|
29
|
+
* biometrics and never the screen lock, so "credential allowed" is answered with isDeviceSecure, and
|
|
30
|
+
* without a usable biometric the screen lock is asked through KeyguardManager's confirm intent, as
|
|
31
|
+
* androidx.biometric does there (Tauri BiometricPlugin.kt:115-120, BiometricActivity.kt:56-65).
|
|
32
|
+
* Arguments arrive decoded and type-checked by the generated BiometricPluginSpec (PL-10).
|
|
33
|
+
*/
|
|
34
|
+
class BiometricPlugin(private val context: AkanNativePluginContext) : BiometricPluginSpec {
|
|
35
|
+
private var pending: CancellationSignal? = null
|
|
36
|
+
|
|
37
|
+
override fun isAvailable(reply: AkanNativeReply<BiometricStatus>) = reply.resolve(status())
|
|
38
|
+
|
|
39
|
+
override fun destroy() {
|
|
40
|
+
pending?.cancel()
|
|
41
|
+
pending = null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private val manager: BiometricManager? get() = context.activity.getSystemService(BiometricManager::class.java)
|
|
45
|
+
|
|
46
|
+
private fun sensor(): BiometricBiometryType {
|
|
47
|
+
val pm = context.activity.packageManager
|
|
48
|
+
return when {
|
|
49
|
+
pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT) -> BiometricBiometryType.FINGERPRINT
|
|
50
|
+
pm.hasSystemFeature(PackageManager.FEATURE_FACE) -> BiometricBiometryType.FACE
|
|
51
|
+
pm.hasSystemFeature(PackageManager.FEATURE_IRIS) -> BiometricBiometryType.IRIS
|
|
52
|
+
else -> BiometricBiometryType.NONE
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private fun deviceSecure(): Boolean = context.activity.getSystemService(KeyguardManager::class.java)?.isDeviceSecure == true
|
|
57
|
+
|
|
58
|
+
/** Biometrics only (BIOMETRIC_WEAK on 30+; API 29's single tier). */
|
|
59
|
+
private fun biometricCode(): Int {
|
|
60
|
+
val m = manager ?: return BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE
|
|
61
|
+
return if (Build.VERSION.SDK_INT >= 30) Api30.canAuthenticate(m, BIOMETRIC_WEAK) else @Suppress("DEPRECATION") m.canAuthenticate()
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private fun status(): BiometricStatus {
|
|
65
|
+
val code = biometricCode()
|
|
66
|
+
val reason = when (code) {
|
|
67
|
+
BiometricManager.BIOMETRIC_SUCCESS -> null
|
|
68
|
+
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> BiometricUnavailableReason.NOT_ENROLLED
|
|
69
|
+
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> BiometricUnavailableReason.NO_HARDWARE
|
|
70
|
+
BiometricManager.BIOMETRIC_ERROR_NOT_ENABLED_FOR_APPS -> BiometricUnavailableReason.DENIED // Settings: "use for apps" off
|
|
71
|
+
else -> BiometricUnavailableReason.UNAVAILABLE // HW_UNAVAILABLE, SECURITY_UPDATE_REQUIRED, IDENTITY_CHECK_NOT_ACTIVE
|
|
72
|
+
}
|
|
73
|
+
return BiometricStatus(
|
|
74
|
+
available = code == BiometricManager.BIOMETRIC_SUCCESS,
|
|
75
|
+
type = if (code == BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE) BiometricBiometryType.NONE else sensor(),
|
|
76
|
+
reason = reason,
|
|
77
|
+
deviceCredential = deviceSecure(),
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
override fun authenticate(args: BiometricAuthenticateOptions, reply: AkanNativeVoidReply) {
|
|
82
|
+
val reason = args.reason
|
|
83
|
+
if (reason.isEmpty()) return reply.reject(AkanNativeErrorCode.INVALID_ARGS, "reason must be a non-empty string")
|
|
84
|
+
if (pending != null) return reply.reject(AkanNativeErrorCode.CANCELLED, "another authentication is in progress")
|
|
85
|
+
val allowCredential = args.allowDeviceCredential == true
|
|
86
|
+
val authenticators = if (allowCredential) BIOMETRIC_WEAK or DEVICE_CREDENTIAL else BIOMETRIC_WEAK
|
|
87
|
+
val activity = context.activity
|
|
88
|
+
val title = args.title?.takeIf { it.isNotEmpty() }
|
|
89
|
+
val code = when {
|
|
90
|
+
Build.VERSION.SDK_INT >= 30 -> manager?.let { Api30.canAuthenticate(it, authenticators) } ?: BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE
|
|
91
|
+
else -> biometricCode()
|
|
92
|
+
}
|
|
93
|
+
if (code != BiometricManager.BIOMETRIC_SUCCESS) {
|
|
94
|
+
// API 29: the screen lock alone, when allowed and set up.
|
|
95
|
+
if (Build.VERSION.SDK_INT < 30 && allowCredential && deviceSecure()) return confirmCredential(activity, title, reason, reply)
|
|
96
|
+
val (error, message) = unavailable(code, allowCredential)
|
|
97
|
+
return reply.reject(error, message)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
val builder = BiometricPrompt.Builder(activity)
|
|
101
|
+
.setTitle(title ?: reason) // required: build() throws without a title
|
|
102
|
+
if (Build.VERSION.SDK_INT >= 30) Api30.allow(builder, authenticators)
|
|
103
|
+
else @Suppress("DEPRECATION") builder.setDeviceCredentialAllowed(allowCredential)
|
|
104
|
+
if (title != null) builder.setSubtitle(reason)
|
|
105
|
+
val signal = CancellationSignal()
|
|
106
|
+
var done = false
|
|
107
|
+
val finish = { settle: AkanNativeVoidReply.() -> Unit ->
|
|
108
|
+
if (!done) {
|
|
109
|
+
done = true
|
|
110
|
+
if (pending === signal) pending = null
|
|
111
|
+
reply.settle()
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (!allowCredential) {
|
|
115
|
+
val cancel = args.cancelTitle?.takeIf { it.isNotEmpty() } ?: activity.getString(android.R.string.cancel)
|
|
116
|
+
builder.setNegativeButton(cancel, activity.mainExecutor) { _, _ -> finish { reject(AkanNativeErrorCode.CANCELLED, "authentication was cancelled") } }
|
|
117
|
+
}
|
|
118
|
+
pending = signal
|
|
119
|
+
// The prompt belongs to its call: cancelled (AbortSignal) or with its page gone, it goes away.
|
|
120
|
+
reply.onCancel {
|
|
121
|
+
done = true
|
|
122
|
+
if (pending === signal) pending = null
|
|
123
|
+
signal.cancel()
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
builder.build().authenticate(signal, activity.mainExecutor, object : BiometricPrompt.AuthenticationCallback() {
|
|
127
|
+
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) = finish { resolve() }
|
|
128
|
+
|
|
129
|
+
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) =
|
|
130
|
+
finish { reject(errorFor(errorCode), errString.toString()) }
|
|
131
|
+
|
|
132
|
+
// onAuthenticationFailed: one attempt did not match; the prompt stays up for another try.
|
|
133
|
+
})
|
|
134
|
+
} catch (e: RuntimeException) { // IllegalArgumentException from the builder, SecurityException without USE_BIOMETRIC
|
|
135
|
+
finish { reject(AkanNativeErrorCode.INTERNAL, e.toString()) }
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** API 29 without a usable biometric: the system's screen lock confirmation. */
|
|
140
|
+
private fun confirmCredential(activity: Activity, title: String?, reason: String, reply: AkanNativeVoidReply) {
|
|
141
|
+
@Suppress("DEPRECATION")
|
|
142
|
+
val intent = activity.getSystemService(KeyguardManager::class.java)?.createConfirmDeviceCredentialIntent(title ?: reason, if (title != null) reason else null)
|
|
143
|
+
?: return reply.reject(AkanNativeErrorCode.PERMISSION_DENIED, "no screen lock is set up")
|
|
144
|
+
try {
|
|
145
|
+
context.startActivityForResult("credential", intent) { result, _ ->
|
|
146
|
+
if (result == Activity.RESULT_OK) reply.resolve() else reply.reject(AkanNativeErrorCode.CANCELLED, "authentication was cancelled")
|
|
147
|
+
}
|
|
148
|
+
} catch (e: RuntimeException) {
|
|
149
|
+
reply.reject(AkanNativeErrorCode.INTERNAL, e.toString())
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private object Api30 {
|
|
154
|
+
fun canAuthenticate(manager: BiometricManager, authenticators: Int): Int = manager.canAuthenticate(authenticators)
|
|
155
|
+
|
|
156
|
+
fun allow(builder: BiometricPrompt.Builder, authenticators: Int) {
|
|
157
|
+
builder.setAllowedAuthenticators(authenticators)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private fun unavailable(code: Int, allowCredential: Boolean): Pair<String, String> = when (code) {
|
|
162
|
+
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED ->
|
|
163
|
+
AkanNativeErrorCode.PERMISSION_DENIED to if (allowCredential) "no biometrics and no screen lock are set up" else "no biometrics are enrolled"
|
|
164
|
+
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> AkanNativeErrorCode.UNSUPPORTED to "this device has no biometric sensor"
|
|
165
|
+
BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE -> AkanNativeErrorCode.UNSUPPORTED to "the biometric sensor is unavailable"
|
|
166
|
+
BiometricManager.BIOMETRIC_ERROR_NOT_ENABLED_FOR_APPS -> AkanNativeErrorCode.PERMISSION_DENIED to "biometrics are turned off for apps"
|
|
167
|
+
else -> AkanNativeErrorCode.INTERNAL to "biometrics cannot be used (code $code)"
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private fun errorFor(code: Int): String = when (code) {
|
|
171
|
+
BiometricPrompt.BIOMETRIC_ERROR_USER_CANCELED, BiometricPrompt.BIOMETRIC_ERROR_CANCELED, BiometricPrompt.BIOMETRIC_ERROR_TIMEOUT ->
|
|
172
|
+
AkanNativeErrorCode.CANCELLED
|
|
173
|
+
BiometricPrompt.BIOMETRIC_ERROR_LOCKOUT, BiometricPrompt.BIOMETRIC_ERROR_LOCKOUT_PERMANENT, BiometricPrompt.BIOMETRIC_ERROR_NO_BIOMETRICS,
|
|
174
|
+
BiometricPrompt.BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL, BiometricPrompt.BIOMETRIC_ERROR_NOT_ENABLED_FOR_APPS ->
|
|
175
|
+
AkanNativeErrorCode.PERMISSION_DENIED
|
|
176
|
+
BiometricPrompt.BIOMETRIC_ERROR_HW_NOT_PRESENT, BiometricPrompt.BIOMETRIC_ERROR_HW_UNAVAILABLE -> AkanNativeErrorCode.UNSUPPORTED
|
|
177
|
+
else -> AkanNativeErrorCode.INTERNAL
|
|
178
|
+
}
|
|
179
|
+
}
|