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,77 @@
|
|
|
1
|
+
package com.akanjs.plugins.keyboard
|
|
2
|
+
|
|
3
|
+
import android.app.Activity
|
|
4
|
+
import android.os.Build
|
|
5
|
+
import android.view.WindowInsets
|
|
6
|
+
import android.view.inputmethod.InputMethodManager
|
|
7
|
+
import com.akanjs.runtime.AkanNativeInsets
|
|
8
|
+
import com.akanjs.runtime.AkanNativePluginContext
|
|
9
|
+
import com.akanjs.runtime.AkanNativeReply
|
|
10
|
+
import com.akanjs.runtime.AkanNativeVoidReply
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Soft keyboard from the IME window insets the shell tracks. height = ime.bottom − systemBars.bottom
|
|
14
|
+
* in dp (react-native ReactRootView uses the same definition). The shell pads the WebView by the
|
|
15
|
+
* IME, so the page itself is not covered.
|
|
16
|
+
* The result and event types come from the generated KeyboardPluginSpec (PL-10).
|
|
17
|
+
*/
|
|
18
|
+
class KeyboardPlugin(private val context: AkanNativePluginContext) : KeyboardPluginSpec {
|
|
19
|
+
private var listening = false
|
|
20
|
+
private var last: KeyboardState? = null
|
|
21
|
+
private val events = KeyboardEvents(context)
|
|
22
|
+
|
|
23
|
+
/** Events the page listens to (change, willShow, didShow, willHide, didHide). */
|
|
24
|
+
private val listened = HashSet<String>()
|
|
25
|
+
|
|
26
|
+
init {
|
|
27
|
+
context.onInsetsChanged { insets ->
|
|
28
|
+
val next = state(insets)
|
|
29
|
+
if (next == last) return@onInsetsChanged
|
|
30
|
+
last = next
|
|
31
|
+
if (listening) events.change(next)
|
|
32
|
+
}
|
|
33
|
+
context.onKeyboardTransition { t ->
|
|
34
|
+
if (t.phase !in listened) return@onKeyboardTransition
|
|
35
|
+
val data = KeyboardTransition(height = Math.round(t.height).toDouble(), duration = t.durationMs.toDouble())
|
|
36
|
+
when (t.phase) {
|
|
37
|
+
"willShow" -> events.willShow(data)
|
|
38
|
+
"didShow" -> events.didShow(data)
|
|
39
|
+
"willHide" -> events.willHide(data)
|
|
40
|
+
"didHide" -> events.didHide(data)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
override fun setResizeMode(args: KeyboardSetResizeModeArgs, reply: AkanNativeVoidReply) {
|
|
46
|
+
context.setImeResize(args.mode == KeyboardResizeMode.RESIZE)
|
|
47
|
+
reply.resolve()
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private fun state(insets: AkanNativeInsets) = KeyboardState(visible = insets.imeVisible, height = Math.round(insets.imeHeight).toDouble())
|
|
51
|
+
|
|
52
|
+
override fun getState(reply: AkanNativeReply<KeyboardState>) = reply.resolve(state(context.insets))
|
|
53
|
+
|
|
54
|
+
override fun hide(reply: AkanNativeVoidReply) {
|
|
55
|
+
val activity = context.activity
|
|
56
|
+
activity.getSystemService(InputMethodManager::class.java)?.hideSoftInputFromWindow(context.webView.windowToken, 0)
|
|
57
|
+
// API 29 has no insets controller; hideSoftInputFromWindow is what androidx does there.
|
|
58
|
+
if (Build.VERSION.SDK_INT >= 30) Api30.hideIme(activity)
|
|
59
|
+
// Hiding the IME keeps DOM focus; blur so the next tap reopens it.
|
|
60
|
+
context.webView.evaluateJavascript("document.activeElement&&document.activeElement.blur&&document.activeElement.blur()", null)
|
|
61
|
+
reply.resolve()
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
override fun startListening(event: String) {
|
|
65
|
+
if (event == "change") listening = true else listened.add(event)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
override fun stopListening(event: String) {
|
|
69
|
+
if (event == "change") listening = false else listened.remove(event)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private object Api30 {
|
|
73
|
+
fun hideIme(activity: Activity) {
|
|
74
|
+
activity.window.insetsController?.hide(WindowInsets.Type.ime())
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import UIKit
|
|
2
|
+
|
|
3
|
+
/// Soft keyboard: the part of the web view the keyboard covers, in points (== CSS px).
|
|
4
|
+
/// Measured from keyboardWillChangeFrame converted from screen to web view coordinates, so
|
|
5
|
+
/// floating/undocked iPad keyboards and other apps' keyboards come out right
|
|
6
|
+
/// (react-native RCTKeyboardObserver converts the same way).
|
|
7
|
+
/// The result and event types come from the generated KeyboardPluginSpec (PL-10).
|
|
8
|
+
final class KeyboardPlugin: KeyboardPluginSpec {
|
|
9
|
+
static let id = "keyboard"
|
|
10
|
+
private let context: AkanNativePluginContext
|
|
11
|
+
private var observers: [NSObjectProtocol] = []
|
|
12
|
+
private var state: (visible: Bool, height: Int) = (false, 0)
|
|
13
|
+
private lazy var events = KeyboardEvents(context)
|
|
14
|
+
|
|
15
|
+
init(context: AkanNativePluginContext) {
|
|
16
|
+
self.context = context
|
|
17
|
+
// Tracked from launch so getState() is right before anyone listens. The plugin lives as long as
|
|
18
|
+
// the app, so the observers are never removed.
|
|
19
|
+
for name in [UIResponder.keyboardWillChangeFrameNotification, UIResponder.keyboardWillHideNotification] {
|
|
20
|
+
observers.append(NotificationCenter.default.addObserver(forName: name, object: nil, queue: .main) { [weak self] note in
|
|
21
|
+
let info = UncheckedBox(note.userInfo ?? [:])
|
|
22
|
+
MainActor.assumeIsolated { self?.update(name, info.value) }
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
// O6-1: the transitions, before and after the keyboard's animation.
|
|
26
|
+
let phases: [(Notification.Name, String)] = [
|
|
27
|
+
(UIResponder.keyboardWillShowNotification, "willShow"), (UIResponder.keyboardDidShowNotification, "didShow"),
|
|
28
|
+
(UIResponder.keyboardWillHideNotification, "willHide"), (UIResponder.keyboardDidHideNotification, "didHide"),
|
|
29
|
+
]
|
|
30
|
+
for (name, phase) in phases {
|
|
31
|
+
observers.append(NotificationCenter.default.addObserver(forName: name, object: nil, queue: .main) { [weak self] note in
|
|
32
|
+
let info = UncheckedBox(note.userInfo ?? [:])
|
|
33
|
+
MainActor.assumeIsolated { self?.transition(phase, info.value) }
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// The covered height, measured against the shell's root view: in "resize" mode the web view itself
|
|
39
|
+
/// ends at the keyboard, so it is never covered.
|
|
40
|
+
private func cover(_ info: [AnyHashable: Any], hiding: Bool) -> CGFloat {
|
|
41
|
+
if let shell = context.viewController as? AkanNativeViewController { return shell.keyboardCover(info, hiding: hiding) }
|
|
42
|
+
guard !hiding, let webView = context.webView, let window = webView.window,
|
|
43
|
+
let end = (info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return 0 }
|
|
44
|
+
return max(0, webView.bounds.intersection(webView.convert(end, from: window.screen.coordinateSpace)).height)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private func update(_ name: Notification.Name, _ info: [AnyHashable: Any]) {
|
|
48
|
+
let covered = cover(info, hiding: name == UIResponder.keyboardWillHideNotification)
|
|
49
|
+
let next = (visible: covered > 0, height: Int(covered.rounded()))
|
|
50
|
+
guard next.visible != state.visible || next.height != state.height else { return } // hide sends two notifications
|
|
51
|
+
state = next
|
|
52
|
+
let duration = (info[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
|
|
53
|
+
// The event carries the animation duration too, which KeyboardEvents.change (KeyboardState) has no field for.
|
|
54
|
+
var data = current.akanNativeJSON
|
|
55
|
+
data["duration"] = duration
|
|
56
|
+
context.emit("change", data)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private func transition(_ phase: String, _ info: [AnyHashable: Any]) {
|
|
60
|
+
let hiding = phase == "willHide" || phase == "didHide"
|
|
61
|
+
let height = Double(Int(cover(info, hiding: hiding).rounded()))
|
|
62
|
+
let duration = ((info[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0) * 1000
|
|
63
|
+
// A floating iPad keyboard covers nothing: no show or hide for the page.
|
|
64
|
+
if !hiding && height == 0 { return }
|
|
65
|
+
let data = KeyboardTransition(height: height, duration: duration.rounded())
|
|
66
|
+
switch phase {
|
|
67
|
+
case "willShow": events.willShow(data)
|
|
68
|
+
case "didShow": events.didShow(data)
|
|
69
|
+
case "willHide": events.willHide(data)
|
|
70
|
+
default: events.didHide(data)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private var current: KeyboardState {
|
|
75
|
+
KeyboardState(visible: state.visible, height: Double(state.height))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func getState(_ reply: AkanNativeReply<KeyboardState>) {
|
|
79
|
+
reply.resolve(current)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
func hide(_ reply: AkanNativeReply<Void>) {
|
|
83
|
+
// endEditing hides the keyboard but keeps DOM focus on the input (verified): blur too.
|
|
84
|
+
context.webView?.evaluateJavaScript("document.activeElement && document.activeElement.blur && document.activeElement.blur()")
|
|
85
|
+
context.webView?.endEditing(true)
|
|
86
|
+
reply.resolve()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
func setResizeMode(_ args: KeyboardSetResizeModeArgs, _ reply: AkanNativeReply<Void>) {
|
|
90
|
+
(context.viewController as? AkanNativeViewController)?.keyboardResizes = args.mode == .resize
|
|
91
|
+
reply.resolve()
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "keyboard",
|
|
3
|
+
"apiVersion": 1,
|
|
4
|
+
"methods": ["getState", "hide", "setResizeMode"],
|
|
5
|
+
"events": ["change", "willShow", "didShow", "willHide", "didHide"],
|
|
6
|
+
"coalesce": ["change"],
|
|
7
|
+
"codegen": true,
|
|
8
|
+
"web": "./src/web.ts",
|
|
9
|
+
"desktop": null,
|
|
10
|
+
"ios": {
|
|
11
|
+
"sources": ["ios/*.swift"],
|
|
12
|
+
"class": "KeyboardPlugin"
|
|
13
|
+
},
|
|
14
|
+
"android": {
|
|
15
|
+
"sources": ["android/*.kt"],
|
|
16
|
+
"class": "com.akanjs.plugins.keyboard.KeyboardPlugin"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createLiveValue, definePlugin, shallowEqual } from "../../../packages/core/src/index.ts";
|
|
2
|
+
import { useLiveValue } from "../../../packages/react/src/index.ts";
|
|
3
|
+
import { web } from "./web.ts";
|
|
4
|
+
|
|
5
|
+
/** Soft (on-screen) keyboard state. `height` is in CSS pixels and covers the bottom of the page. */
|
|
6
|
+
export interface KeyboardState {
|
|
7
|
+
visible: boolean;
|
|
8
|
+
height: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* What the keyboard does to the page (akanjs readiness O6-1):
|
|
13
|
+
* - "resize" (default, or the app config's keyboard.resize): the page's viewport shrinks by the keyboard, so bottom-fixed UI stays above it
|
|
14
|
+
* (Android pads the WebView's container, iOS shortens the web view with the keyboard's animation).
|
|
15
|
+
* - "none": the page keeps its full size and the keyboard covers its bottom; the app moves its UI
|
|
16
|
+
* itself with the heights of the events. iOS still scrolls a focused field into view.
|
|
17
|
+
*/
|
|
18
|
+
export type KeyboardResizeMode = "resize" | "none";
|
|
19
|
+
|
|
20
|
+
/** A keyboard transition: its height in CSS pixels once it ends (0 when hiding) and its animation length in ms. */
|
|
21
|
+
export interface KeyboardTransition {
|
|
22
|
+
height: number;
|
|
23
|
+
duration: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface KeyboardApi {
|
|
27
|
+
getState(): Promise<KeyboardState>;
|
|
28
|
+
/** Dismisses the soft keyboard. */
|
|
29
|
+
hide(): Promise<void>;
|
|
30
|
+
/** "resize" or "none"; until the app ends (not stored). The app config's keyboard.resize is the mode at launch. */
|
|
31
|
+
setResizeMode(args: { mode: KeyboardResizeMode }): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface KeyboardEvents {
|
|
35
|
+
change: KeyboardState;
|
|
36
|
+
/** The keyboard starts to show (Android 11+ and iOS: before its animation; Android 10 and the web: together with didShow). */
|
|
37
|
+
willShow: KeyboardTransition;
|
|
38
|
+
didShow: KeyboardTransition;
|
|
39
|
+
willHide: KeyboardTransition;
|
|
40
|
+
didHide: KeyboardTransition;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const keyboard = definePlugin<KeyboardApi, KeyboardEvents>("keyboard", {
|
|
44
|
+
methods: ["getState", "hide", "setResizeMode"],
|
|
45
|
+
events: ["change", "willShow", "didShow", "willHide", "didHide"],
|
|
46
|
+
web,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const hidden: KeyboardState = { visible: false, height: 0 };
|
|
50
|
+
|
|
51
|
+
const current = createLiveValue<KeyboardState>(
|
|
52
|
+
hidden,
|
|
53
|
+
(set) => {
|
|
54
|
+
if (keyboard.eventImplementation("change") === "none") return;
|
|
55
|
+
let live = true;
|
|
56
|
+
const stop = keyboard.listen("change", set);
|
|
57
|
+
keyboard
|
|
58
|
+
.getState()
|
|
59
|
+
.then((state) => live && set(state))
|
|
60
|
+
.catch(() => {});
|
|
61
|
+
return () => {
|
|
62
|
+
live = false;
|
|
63
|
+
stop();
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
shallowEqual,
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
export interface UseKeyboard extends KeyboardState {
|
|
70
|
+
/** False where the platform has no soft keyboard support (desktop). */
|
|
71
|
+
supported: boolean;
|
|
72
|
+
hide(): Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function useKeyboard(): UseKeyboard {
|
|
76
|
+
const state = useLiveValue(current);
|
|
77
|
+
return { ...state, supported: keyboard.isSupported("getState"), hide: keyboard.hide };
|
|
78
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { defineWebPlugin } from "../../../packages/core/src/index.ts";
|
|
2
|
+
import type { KeyboardApi, KeyboardEvents, KeyboardState } from "./index.ts";
|
|
3
|
+
|
|
4
|
+
const MIN_KEYBOARD_HEIGHT = 100;
|
|
5
|
+
|
|
6
|
+
let last: KeyboardState = { visible: false, height: 0 };
|
|
7
|
+
|
|
8
|
+
function read(): KeyboardState {
|
|
9
|
+
const vv = window.visualViewport;
|
|
10
|
+
if (!vv) return last;
|
|
11
|
+
|
|
12
|
+
if (Math.abs(vv.scale - 1) > 0.01) return last;
|
|
13
|
+
const covered = Math.max(0, Math.round(window.innerHeight - vv.height));
|
|
14
|
+
last = covered >= MIN_KEYBOARD_HEIGHT ? { visible: true, height: covered } : { visible: false, height: 0 };
|
|
15
|
+
return last;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Calls `onChange(previous, next)` whenever the visual viewport shows another keyboard state. */
|
|
19
|
+
function watch(onChange: (previous: KeyboardState, next: KeyboardState) => void): () => void {
|
|
20
|
+
const vv = window.visualViewport;
|
|
21
|
+
if (!vv) return () => {};
|
|
22
|
+
let previous = read();
|
|
23
|
+
const check = () => {
|
|
24
|
+
const next = read();
|
|
25
|
+
if (next.visible === previous.visible && next.height === previous.height) return;
|
|
26
|
+
const before = previous;
|
|
27
|
+
previous = next;
|
|
28
|
+
onChange(before, next);
|
|
29
|
+
};
|
|
30
|
+
vv.addEventListener("resize", check);
|
|
31
|
+
return () => vv.removeEventListener("resize", check);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Browsers tell when the keyboard has changed, not before: will and did come together. */
|
|
35
|
+
const transition = (showing: boolean) => (emit: (t: { height: number; duration: number }) => void) =>
|
|
36
|
+
watch((previous, next) => {
|
|
37
|
+
if (next.visible === showing && previous.visible !== showing) emit({ height: next.height, duration: 0 });
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
export const web = defineWebPlugin<KeyboardApi, KeyboardEvents>({
|
|
41
|
+
methods: {
|
|
42
|
+
getState: async () => read(),
|
|
43
|
+
async hide() {
|
|
44
|
+
const el = document.activeElement;
|
|
45
|
+
if (el instanceof HTMLElement) el.blur();
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
async setResizeMode() {},
|
|
49
|
+
},
|
|
50
|
+
events: {
|
|
51
|
+
change: (emit) => watch((_, next) => emit(next)),
|
|
52
|
+
willShow: transition(true),
|
|
53
|
+
didShow: transition(true),
|
|
54
|
+
willHide: transition(false),
|
|
55
|
+
didHide: transition(false),
|
|
56
|
+
},
|
|
57
|
+
});
|
package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationReceiver.kt
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
package com.akanjs.plugins.localnotifications
|
|
2
|
+
|
|
3
|
+
import android.content.BroadcastReceiver
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.content.Intent
|
|
6
|
+
import android.util.Log
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Declared in the manifest (android.applicationXml, exported="false": only the system and this app
|
|
10
|
+
* reach it). It runs without the Activity, on the Context the system gives it:
|
|
11
|
+
* - FIRE: an alarm of LocalNotifications.arm went off
|
|
12
|
+
* - BOOT_COMPLETED: alarms do not survive a reboot (capacitor-plugins/local-notifications/android/
|
|
13
|
+
* .../LocalNotificationRestoreReceiver.java). LOCKED_BOOT_COMPLETED is not used: the store is in
|
|
14
|
+
* credential-encrypted storage, which is locked until the user unlocks (Capacitor listens for it
|
|
15
|
+
* and then returns early when the user is locked, :16-17).
|
|
16
|
+
* - MY_PACKAGE_REPLACED: re-arm after an update, in case the alarms went with the old version
|
|
17
|
+
* - RESTORE: the plugin creates one reflectively and calls onReceive with it on every app start
|
|
18
|
+
* (a force stop also clears alarms). That also keeps the constructor and onReceive in R8 release
|
|
19
|
+
* builds, which do not read the manifest (packages/cli/src/platforms/android.ts PROGUARD).
|
|
20
|
+
*/
|
|
21
|
+
class LocalNotificationReceiver : BroadcastReceiver() {
|
|
22
|
+
override fun onReceive(context: Context, intent: Intent) {
|
|
23
|
+
try {
|
|
24
|
+
when (intent.action) {
|
|
25
|
+
LocalNotifications.ACTION_FIRE -> {
|
|
26
|
+
val id = intent.getIntExtra(LocalNotifications.EXTRA_ID, Int.MIN_VALUE)
|
|
27
|
+
if (id != Int.MIN_VALUE || intent.hasExtra(LocalNotifications.EXTRA_ID)) LocalNotifications.fire(context, id)
|
|
28
|
+
}
|
|
29
|
+
Intent.ACTION_BOOT_COMPLETED, Intent.ACTION_MY_PACKAGE_REPLACED, LocalNotifications.ACTION_RESTORE ->
|
|
30
|
+
LocalNotifications.restore(context)
|
|
31
|
+
}
|
|
32
|
+
} catch (e: RuntimeException) {
|
|
33
|
+
Log.e(LocalNotifications.TAG, "local-notifications: ${intent.action} failed", e)
|
|
34
|
+
} catch (e: LinkageError) { // an API this Android lacks, reached without a version check
|
|
35
|
+
Log.e(LocalNotifications.TAG, "local-notifications: ${intent.action} needs a newer Android", e)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
package com.akanjs.plugins.localnotifications
|
|
2
|
+
|
|
3
|
+
import android.app.ActivityManager
|
|
4
|
+
import android.app.AlarmManager
|
|
5
|
+
import android.app.Notification
|
|
6
|
+
import android.app.NotificationChannel
|
|
7
|
+
import android.app.NotificationManager
|
|
8
|
+
import android.app.PendingIntent
|
|
9
|
+
import android.content.Context
|
|
10
|
+
import android.content.Intent
|
|
11
|
+
import android.os.Build
|
|
12
|
+
import android.os.Bundle
|
|
13
|
+
import android.util.Log
|
|
14
|
+
import java.util.Calendar
|
|
15
|
+
import org.json.JSONObject
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Scheduling shared by the plugin (Activity running) and the receiver (maybe no Activity at all:
|
|
19
|
+
* an alarm or a boot wakes only the process). Everything takes the Context it is given.
|
|
20
|
+
*
|
|
21
|
+
* - Scheduled items live in SharedPreferences, because alarms are gone after a reboot or a force
|
|
22
|
+
* stop; the receiver re-arms them on BOOT_COMPLETED and the plugin on every app start
|
|
23
|
+
* (capacitor-plugins/local-notifications/android/.../LocalNotificationRestoreReceiver.java:30-40).
|
|
24
|
+
* The alarm intent carries only the id and the receiver reads the item from the store, instead of
|
|
25
|
+
* a parceled Notification in the extras as Capacitor does (TimedNotificationPublisher.java:35):
|
|
26
|
+
* one source of truth, and a cancelled item cannot fire from a stale intent.
|
|
27
|
+
* - Exact alarms only when canScheduleExactAlarms() (SCHEDULE_EXACT_ALARM is not requested, and is
|
|
28
|
+
* denied by default for new installs targeting API 33+); otherwise setAndAllowWhileIdle
|
|
29
|
+
* (LocalNotificationManager.java:374-396 falls back the same way). Its delivery window is 75% of
|
|
30
|
+
* the lead time, capped at one hour (dumpsys alarm on the API 37 emulator): a reminder set 20 s
|
|
31
|
+
* ahead came 15 s late, a minute repeat up to 45 s late.
|
|
32
|
+
* - Repeats are chains of one-shot alarms: each delivery arms the next occurrence, so they can be
|
|
33
|
+
* exact, getPending knows the next time, and day/week keep the local time across DST. Capacitor
|
|
34
|
+
* and Tauri use setRepeating(RTC, ...), which is always inexact (LocalNotificationManager.java:357).
|
|
35
|
+
* - Framework Notification.Builder (no NotificationCompat). The APK has no resources, so the small
|
|
36
|
+
* icon is a framework drawable (ic_popup_reminder); Capacitor falls back to ic_dialog_info.
|
|
37
|
+
*/
|
|
38
|
+
internal object LocalNotifications {
|
|
39
|
+
const val TAG = "AkanNative"
|
|
40
|
+
const val DEFAULT_CHANNEL = "default"
|
|
41
|
+
const val ACTION_FIRE = "com.akanjs.plugins.localnotifications.FIRE"
|
|
42
|
+
const val ACTION_RESTORE = "com.akanjs.plugins.localnotifications.RESTORE"
|
|
43
|
+
const val EXTRA_ID = "akan-native.ln.id"
|
|
44
|
+
/** On the tap intent: the notification as JSON (the "action" event). */
|
|
45
|
+
const val EXTRA_TAP = "akan-native.ln.tap"
|
|
46
|
+
/**
|
|
47
|
+
* On the tap intent: a random token issued when the notification was posted and taken back by
|
|
48
|
+
* the tap. The launcher activity is exported, so any app can send it an intent with EXTRA_TAP;
|
|
49
|
+
* without a token on record that is no tap of ours. Single use: one tap is reported once.
|
|
50
|
+
*/
|
|
51
|
+
const val EXTRA_TOKEN = "akan-native.ln.token"
|
|
52
|
+
private const val TOKENS = "akan-native.localNotifications.taps"
|
|
53
|
+
private const val MAX_TOKENS = 64
|
|
54
|
+
/** In the notification extras: marks our notifications and keeps their data. */
|
|
55
|
+
const val EXTRA_MARKER = "akan-native.ln"
|
|
56
|
+
const val EXTRA_DATA = "akan-native.ln.data"
|
|
57
|
+
private const val STORE = "akan-native.localNotifications"
|
|
58
|
+
|
|
59
|
+
data class Item(
|
|
60
|
+
val id: Int,
|
|
61
|
+
val title: String,
|
|
62
|
+
val body: String,
|
|
63
|
+
val at: Long,
|
|
64
|
+
val every: String?,
|
|
65
|
+
val channelId: String?,
|
|
66
|
+
/** JSON object text. */
|
|
67
|
+
val data: String?,
|
|
68
|
+
) {
|
|
69
|
+
fun json(): JSONObject = JSONObject().put("id", id).put("title", title).put("body", body).put("at", at).apply {
|
|
70
|
+
if (every != null) put("every", every)
|
|
71
|
+
if (channelId != null) put("channelId", channelId)
|
|
72
|
+
if (data != null) put("data", JSONObject(data))
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** The "received" / "action" event. */
|
|
76
|
+
fun event(): JSONObject = JSONObject().put("id", id).put("title", title).put("body", body).apply {
|
|
77
|
+
if (data != null) put("data", JSONObject(data))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
companion object {
|
|
81
|
+
fun from(json: JSONObject): Item = Item(
|
|
82
|
+
id = json.getInt("id"),
|
|
83
|
+
title = json.getString("title"),
|
|
84
|
+
body = json.optString("body", ""),
|
|
85
|
+
at = json.getLong("at"),
|
|
86
|
+
every = json.optString("every").ifEmpty { null },
|
|
87
|
+
channelId = json.optString("channelId").ifEmpty { null },
|
|
88
|
+
data = json.optJSONObject("data")?.toString(),
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private fun store(context: Context) = context.getSharedPreferences(STORE, Context.MODE_PRIVATE)
|
|
94
|
+
|
|
95
|
+
fun pending(context: Context): List<Item> = store(context).all.values.mapNotNull { text ->
|
|
96
|
+
runCatching { Item.from(JSONObject(text as String)) }.getOrNull()
|
|
97
|
+
}.sortedBy { it.at }
|
|
98
|
+
|
|
99
|
+
private fun save(context: Context, item: Item) = store(context).edit().putString(item.id.toString(), item.json().toString()).apply()
|
|
100
|
+
|
|
101
|
+
private fun forget(context: Context, id: Int) = store(context).edit().remove(id.toString()).apply()
|
|
102
|
+
|
|
103
|
+
// ------------------------------------------------------------ schedule
|
|
104
|
+
|
|
105
|
+
fun schedule(context: Context, items: List<Item>) {
|
|
106
|
+
for (item in items) {
|
|
107
|
+
unarm(context, item.id)
|
|
108
|
+
if (item.every == null && item.at <= System.currentTimeMillis()) {
|
|
109
|
+
forget(context, item.id)
|
|
110
|
+
post(context, item)
|
|
111
|
+
} else {
|
|
112
|
+
save(context, item)
|
|
113
|
+
arm(context, item)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
fun cancel(context: Context, ids: List<Int>) {
|
|
119
|
+
for (id in ids) {
|
|
120
|
+
unarm(context, id)
|
|
121
|
+
forget(context, id)
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** An alarm went off: show the item and arm its next occurrence. */
|
|
126
|
+
fun fire(context: Context, id: Int) {
|
|
127
|
+
val text = store(context).getString(id.toString(), null) ?: return // cancelled meanwhile
|
|
128
|
+
val item = runCatching { Item.from(JSONObject(text)) }.getOrNull() ?: return forget(context, id)
|
|
129
|
+
val now = System.currentTimeMillis()
|
|
130
|
+
if (item.at > now + 1000) return arm(context, item) // a stale alarm of an item scheduled again for later
|
|
131
|
+
post(context, item)
|
|
132
|
+
if (item.every == null) {
|
|
133
|
+
forget(context, id)
|
|
134
|
+
} else {
|
|
135
|
+
val next = item.copy(at = nextOccurrence(item.at, item.every, now))
|
|
136
|
+
save(context, next)
|
|
137
|
+
arm(context, next)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* After a boot, a force stop or an update: arm everything again. One-shots that came due while
|
|
143
|
+
* the alarms were gone are shown now (Capacitor shows them 15 s after boot,
|
|
144
|
+
* LocalNotificationRestoreReceiver.java:33-38); missed repeats are skipped to the next occurrence.
|
|
145
|
+
*/
|
|
146
|
+
fun restore(context: Context) {
|
|
147
|
+
val now = System.currentTimeMillis()
|
|
148
|
+
for (item in pending(context)) {
|
|
149
|
+
when {
|
|
150
|
+
item.every != null -> {
|
|
151
|
+
val next = if (item.at > now) item else item.copy(at = nextOccurrence(item.at, item.every, now)).also { save(context, it) }
|
|
152
|
+
arm(context, next)
|
|
153
|
+
}
|
|
154
|
+
item.at > now -> arm(context, item)
|
|
155
|
+
else -> {
|
|
156
|
+
forget(context, item.id)
|
|
157
|
+
post(context, item)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private fun alarmIntent(context: Context, id: Int, flags: Int): PendingIntent? =
|
|
164
|
+
PendingIntent.getBroadcast(
|
|
165
|
+
context,
|
|
166
|
+
id,
|
|
167
|
+
Intent(context, LocalNotificationReceiver::class.java).setAction(ACTION_FIRE).putExtra(EXTRA_ID, id),
|
|
168
|
+
flags or PendingIntent.FLAG_IMMUTABLE,
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
private fun arm(context: Context, item: Item) {
|
|
172
|
+
val alarms = context.getSystemService(AlarmManager::class.java) ?: return
|
|
173
|
+
val pi = alarmIntent(context, item.id, PendingIntent.FLAG_UPDATE_CURRENT) ?: return
|
|
174
|
+
try {
|
|
175
|
+
// Exact alarms need no permission before API 31 (Capacitor LocalNotificationManager.java:374-397).
|
|
176
|
+
if (Build.VERSION.SDK_INT < 31 || Api31.canScheduleExactAlarms(alarms)) {
|
|
177
|
+
alarms.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, item.at, pi)
|
|
178
|
+
return
|
|
179
|
+
}
|
|
180
|
+
} catch (e: SecurityException) { // revoked between the check and the call
|
|
181
|
+
Log.w(TAG, "local-notifications: exact alarm refused, using an inexact one", e)
|
|
182
|
+
}
|
|
183
|
+
alarms.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, item.at, pi)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
private fun unarm(context: Context, id: Int) {
|
|
187
|
+
val pi = alarmIntent(context, id, PendingIntent.FLAG_NO_CREATE) ?: return
|
|
188
|
+
context.getSystemService(AlarmManager::class.java)?.cancel(pi)
|
|
189
|
+
pi.cancel()
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/** Minute and hour are fixed lengths; day and week keep the local time of day (schedule.ts addInterval). */
|
|
193
|
+
fun nextOccurrence(at: Long, every: String, after: Long): Long {
|
|
194
|
+
if (at > after) return at
|
|
195
|
+
val fixed = when (every) {
|
|
196
|
+
"minute" -> 60_000L
|
|
197
|
+
"hour" -> 3_600_000L
|
|
198
|
+
else -> 0L
|
|
199
|
+
}
|
|
200
|
+
if (fixed > 0) return at + ((after - at) / fixed + 1) * fixed
|
|
201
|
+
val days = if (every == "week") 7 else 1
|
|
202
|
+
val start = Calendar.getInstance().apply { timeInMillis = at }
|
|
203
|
+
var k = maxOf(1L, (after - at) / (days * 86_400_000L)).toInt()
|
|
204
|
+
fun nth(n: Int): Long = (start.clone() as Calendar).apply { add(Calendar.DAY_OF_MONTH, n * days) }.timeInMillis
|
|
205
|
+
while (k > 1 && nth(k - 1) > after) k--
|
|
206
|
+
while (nth(k) <= after) k++
|
|
207
|
+
return nth(k)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ------------------------------------------------------------ notifications
|
|
211
|
+
|
|
212
|
+
fun ensureDefaultChannel(manager: NotificationManager) {
|
|
213
|
+
if (manager.getNotificationChannel(DEFAULT_CHANNEL) != null) return
|
|
214
|
+
manager.createNotificationChannel(NotificationChannel(DEFAULT_CHANNEL, "Notifications", NotificationManager.IMPORTANCE_DEFAULT))
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
@Synchronized
|
|
218
|
+
private fun issueToken(context: Context): String {
|
|
219
|
+
val prefs = context.getSharedPreferences(TOKENS, Context.MODE_PRIVATE)
|
|
220
|
+
val token = java.util.UUID.randomUUID().toString()
|
|
221
|
+
// Oldest first ("<time> <token>"): the notifications behind old tokens are long gone.
|
|
222
|
+
val kept = (prefs.getStringSet("issued", emptySet()) ?: emptySet()).sorted().takeLast(MAX_TOKENS - 1)
|
|
223
|
+
prefs.edit().putStringSet("issued", (kept + "${System.currentTimeMillis()} $token").toSet()).apply()
|
|
224
|
+
return token
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Whether [token] was issued for a notification and not taken yet; takes it. */
|
|
228
|
+
@Synchronized
|
|
229
|
+
fun redeemToken(context: Context, token: String): Boolean {
|
|
230
|
+
val prefs = context.getSharedPreferences(TOKENS, Context.MODE_PRIVATE)
|
|
231
|
+
val issued = prefs.getStringSet("issued", emptySet()) ?: emptySet()
|
|
232
|
+
val entry = issued.firstOrNull { it.substringAfter(' ') == token } ?: return false
|
|
233
|
+
prefs.edit().putStringSet("issued", issued - entry).commit()
|
|
234
|
+
return true
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
fun post(context: Context, item: Item) {
|
|
238
|
+
val manager = context.getSystemService(NotificationManager::class.java) ?: return
|
|
239
|
+
if (!manager.areNotificationsEnabled()) {
|
|
240
|
+
Log.w(TAG, "local-notifications: notifications are off, ${item.id} not shown")
|
|
241
|
+
return
|
|
242
|
+
}
|
|
243
|
+
// A channel deleted since scheduling would drop the notification silently.
|
|
244
|
+
val channel = item.channelId?.takeIf { manager.getNotificationChannel(it) != null } ?: DEFAULT_CHANNEL.also { ensureDefaultChannel(manager) }
|
|
245
|
+
val postedAt = System.currentTimeMillis()
|
|
246
|
+
|
|
247
|
+
// Tap: the launcher activity (launchMode singleTask, so a running app gets onNewIntent)
|
|
248
|
+
// with the event in the extras. Immutable: nothing needs to fill it in (Capacitor uses
|
|
249
|
+
// FLAG_MUTABLE only for RemoteInput actions).
|
|
250
|
+
val launch = context.packageManager.getLaunchIntentForPackage(context.packageName)
|
|
251
|
+
val tap = launch?.let {
|
|
252
|
+
it.putExtra(EXTRA_TAP, item.event().toString()).putExtra(EXTRA_TOKEN, issueToken(context))
|
|
253
|
+
PendingIntent.getActivity(context, item.id, it, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
|
|
254
|
+
}
|
|
255
|
+
val extras = Bundle().apply {
|
|
256
|
+
putBoolean(EXTRA_MARKER, true)
|
|
257
|
+
if (item.data != null) putString(EXTRA_DATA, item.data)
|
|
258
|
+
}
|
|
259
|
+
val notification = Notification.Builder(context, channel)
|
|
260
|
+
.setSmallIcon(android.R.drawable.ic_popup_reminder)
|
|
261
|
+
.setContentTitle(item.title)
|
|
262
|
+
.setContentText(item.body)
|
|
263
|
+
.setStyle(Notification.BigTextStyle().bigText(item.body))
|
|
264
|
+
.setCategory(Notification.CATEGORY_REMINDER)
|
|
265
|
+
.setAutoCancel(true)
|
|
266
|
+
.setWhen(postedAt)
|
|
267
|
+
.setShowWhen(true)
|
|
268
|
+
.addExtras(extras)
|
|
269
|
+
.apply { if (tap != null) setContentIntent(tap) }
|
|
270
|
+
.build()
|
|
271
|
+
manager.notify(item.id, notification)
|
|
272
|
+
LocalNotificationsPlugin.delivered(context, item)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
fun isForeground(): Boolean {
|
|
276
|
+
val info = ActivityManager.RunningAppProcessInfo()
|
|
277
|
+
ActivityManager.getMyMemoryState(info)
|
|
278
|
+
return info.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
private object Api31 {
|
|
282
|
+
fun canScheduleExactAlarms(alarms: AlarmManager): Boolean = alarms.canScheduleExactAlarms()
|
|
283
|
+
}
|
|
284
|
+
}
|