diff --git a/apps/docs/src/config/llmsCustomSets.ts b/apps/docs/src/config/llmsCustomSets.ts index 4d5b57625..ff2caa647 100644 --- a/apps/docs/src/config/llmsCustomSets.ts +++ b/apps/docs/src/config/llmsCustomSets.ts @@ -43,6 +43,7 @@ Plugin Home Indicator|iOS home indicator visibility control plugin|docs/plugins/ Plugin iBeacon|iBeacon proximity detection plugin|docs/plugins/ibeacon/** Plugin InAppBrowser|in-app browser plugin for opening web content|docs/plugins/inappbrowser/** Plugin In App Review|in-app review prompt plugin for app store ratings|docs/plugins/in-app-review/** +Plugin Incoming Call Kit|native incoming call presentation with iOS CallKit and Android full-screen notifications|docs/plugins/incoming-call-kit/** Plugin Intent Launcher|Android intent launcher plugin|docs/plugins/intent-launcher/** Plugin Intercom|Intercom customer messaging and support plugin for native in-app chat|docs/plugins/intercom/** Plugin Is Root|root/jailbreak detection plugin|docs/plugins/is-root/** diff --git a/apps/docs/src/config/sidebar.mjs b/apps/docs/src/config/sidebar.mjs index be825aeb5..34e669358 100644 --- a/apps/docs/src/config/sidebar.mjs +++ b/apps/docs/src/config/sidebar.mjs @@ -90,6 +90,7 @@ const pluginEntries = [ ['iBeacon', 'ibeacon'], ['In App Review', 'in-app-review'], ['InAppBrowser', 'inappbrowser'], + ['Incoming Call Kit', 'incoming-call-kit', [linkItem('iOS', '/docs/plugins/incoming-call-kit/ios'), linkItem('Android', '/docs/plugins/incoming-call-kit/android')]], ['Intent Launcher', 'intent-launcher'], ['Intercom', 'intercom'], ['Is Root', 'is-root'], diff --git a/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/android.mdx b/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/android.mdx new file mode 100644 index 000000000..22cbc0b29 --- /dev/null +++ b/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/android.mdx @@ -0,0 +1,77 @@ +--- +title: Android +description: Configure notifications, full-screen intents, and Android-specific incoming-call behavior. +sidebar: + order: 4 +--- + +## How Android behavior works + +On Android, the plugin posts a high-priority incoming-call notification and can raise a full-screen activity when the platform and user settings allow it. + +The plugin manifest already includes: + +```xml + + +``` + +After installation, `cap sync` is enough to merge that configuration into your host app. + +## Runtime permissions + +Call these methods during onboarding or before you rely on incoming-call presentation: + +```ts +import { IncomingCallKit } from '@capgo/capacitor-incoming-call-kit'; + +await IncomingCallKit.requestPermissions(); +await IncomingCallKit.requestFullScreenIntentPermission(); +``` + +- `requestPermissions()` requests notification permission on Android 13 and later. +- `requestFullScreenIntentPermission()` opens the Android 14 and later settings page for full-screen intents when needed. + +## Basic example + +```ts +import { IncomingCallKit } from '@capgo/capacitor-incoming-call-kit'; + +await IncomingCallKit.showIncomingCall({ + callId: 'call-42', + callerName: 'Ada Lovelace', + appName: 'Capgo Phone', + timeoutMs: 45_000, + android: { + channelId: 'calls', + channelName: 'Incoming Calls', + showFullScreen: true, + isHighPriority: true, + accentColor: '#0F766E', + }, +}); +``` + +## Android-specific options + +- `channelId`: identifier for the notification channel +- `channelName`: user-visible channel name +- `showFullScreen`: request the full-screen activity +- `isHighPriority`: keep the notification disruptive enough for ringing flows +- `accentColor`: tint compatible notification surfaces +- `ringtoneUri`: point at a custom Android ringtone resource or URI + +## Behavior notes + +- Full-screen presentation is best-effort. If the device or user settings block it, Android still shows the incoming-call notification. +- Timeout handling is best-effort. The plugin tracks `timeoutMs` and emits `callTimedOut`, but your backend should still reconcile missed calls on its side. +- Accept, decline, and end actions are emitted back through Capacitor listeners so your app can join or clean up the real call session. + +## Recommended production model + +Use Android push or your calling SDK for transport, then let this plugin handle the last mile of native ringing UI. Keep these responsibilities outside the plugin: + +- FCM registration and token management +- Media session lifecycle +- Backend call state +- Retry and missed-call business logic diff --git a/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/getting-started.mdx b/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/getting-started.mdx new file mode 100644 index 000000000..e24512f5f --- /dev/null +++ b/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/getting-started.mdx @@ -0,0 +1,117 @@ +--- +title: Getting Started +description: Install and wire incoming call presentation in Capacitor with a transport-agnostic API. +sidebar: + order: 2 +--- + +import { PackageManagers } from 'starlight-package-managers' +import { Steps } from '@astrojs/starlight/components'; + + +1. **Install the package** + + +2. **Sync native projects** + + +3. **Choose your ring source** + Decide whether the incoming-call event comes from your backend, an SDK such as Twilio or Stream, or a native push path such as FCM or PushKit. + + +## How the integration fits together + +This plugin only owns native incoming-call presentation. Your app still owns transport, authentication, and the actual media session. + +The common production pattern is: + +1. Your backend or calling SDK emits a ring event. +2. Your app calls `showIncomingCall()`. +3. The plugin presents native incoming-call UI. +4. `callAccepted` tells your app to join the actual room or VoIP session. +5. `callDeclined`, `callEnded`, or `callTimedOut` tells your app to clean up remote state. + +## Minimal integration + +```ts +import { IncomingCallKit } from '@capgo/capacitor-incoming-call-kit'; + +await IncomingCallKit.requestPermissions(); +await IncomingCallKit.requestFullScreenIntentPermission(); + +await IncomingCallKit.addListener('callAccepted', async ({ call }) => { + console.log('Accepted', call.callId, call.extra); + // Start or join your real call session here. +}); + +await IncomingCallKit.addListener('callDeclined', ({ call }) => { + console.log('Declined', call.callId); + // Tell your backend or SDK that the user declined. +}); + +await IncomingCallKit.addListener('callTimedOut', ({ call }) => { + console.log('Timed out', call.callId); + // Clear ringing state in your backend or SDK. +}); + +await IncomingCallKit.showIncomingCall({ + callId: 'call-42', + callerName: 'Ada Lovelace', + handle: '+39 555 010 020', + appName: 'Capgo Phone', + hasVideo: true, + timeoutMs: 45_000, + extra: { + roomId: 'room-42', + callerUserId: 'user_ada', + }, + android: { + channelId: 'calls', + channelName: 'Incoming Calls', + showFullScreen: true, + }, + ios: { + handleType: 'phoneNumber', + }, +}); +``` + +## Important options + +- `callId`: stable identifier reused later with `endCall()` +- `timeoutMs`: best-effort unanswered timeout +- `extra`: arbitrary JSON echoed back in listener payloads +- `android.channelId` and `android.channelName`: Android notification channel tuning +- `android.showFullScreen`: requests the Android full-screen incoming-call activity +- `ios.handleType`: choose `generic`, `phoneNumber`, or `emailAddress` for CallKit + +## Managing active calls + +```ts +const { calls } = await IncomingCallKit.getActiveCalls(); + +await IncomingCallKit.endCall({ + callId: 'call-42', + reason: 'remote-ended', +}); + +await IncomingCallKit.endAllCalls({ + reason: 'session-reset', +}); +``` + +## Event model + +- `incomingCallDisplayed`: native UI was shown successfully +- `callAccepted`: user accepted from the native UI +- `callDeclined`: user declined before joining +- `callEnded`: your app or the platform ended the tracked call +- `callTimedOut`: the call stayed unanswered until `timeoutMs` + +Each event carries the normalized `call` payload and your original `extra` object. + +## Platform notes + +- Read the [iOS guide](/docs/plugins/incoming-call-kit/ios/) before wiring CallKit into a PushKit or APNs flow. +- Read the [Android guide](/docs/plugins/incoming-call-kit/android/) before relying on full-screen intents on Android 14 and later. +- Web is not supported. diff --git a/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/index.mdx b/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/index.mdx new file mode 100644 index 000000000..35e70f325 --- /dev/null +++ b/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/index.mdx @@ -0,0 +1,68 @@ +--- +title: "@capgo/capacitor-incoming-call-kit" +description: Native incoming call presentation for Capacitor with iOS CallKit and Android full-screen notifications. +tableOfContents: false +next: false +prev: false +sidebar: + order: 1 + label: "Introduction" +hero: + tagline: Present native incoming-call UI in Capacitor with iOS CallKit and Android full-screen notifications while keeping your push and media stack under your control. + image: + file: ~public/icons/plugins/incoming-call-kit.svg + actions: + - text: Get started + link: /docs/plugins/incoming-call-kit/getting-started/ + icon: right-arrow + variant: primary + - text: GitHub + link: https://github.com/Cap-go/capacitor-incoming-call-kit/ + icon: external + variant: minimal +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +## Overview + +`@capgo/capacitor-incoming-call-kit` gives your Capacitor app the native ringing surface for incoming calls without forcing a specific VoIP vendor, push transport, or backend architecture. + +Use it when you already have your own signaling flow, SIP stack, Twilio integration, Stream integration, FCM delivery, or PushKit delivery and want the platform-native incoming-call experience layered onto that flow. + + + + Report incoming calls to CallKit and react to accepted, declined, ended, and timed-out events. + + + Show a high-priority notification and raise a full-screen activity when Android allows it. + + + User actions are retained until the Capacitor bridge consumes them, which helps when JavaScript starts late. + + + Bring your own FCM, APNs, PushKit, SIP, or backend event flow. The plugin focuses on presentation, not transport. + + + Use one small API to show calls, end calls, inspect active calls, and listen for state changes. + + + Start with the [Getting started guide](/docs/plugins/incoming-call-kit/getting-started/), then read the [iOS guide](/docs/plugins/incoming-call-kit/ios/) and [Android guide](/docs/plugins/incoming-call-kit/android/). + + + +## What the plugin handles + +- Native incoming-call presentation +- Active call tracking +- Accept, decline, end, and timeout events +- Android notification and full-screen intent wiring +- iOS CallKit reporting + +## What the plugin does not handle + +- FCM, APNs, or PushKit registration +- Starting or managing the real audio or video session +- Vendor-specific call logic from Twilio, Stream, Daily, Agora, SIP, or WebRTC SDKs + +If you need a complete communications stack, use this plugin as the native incoming-call surface and keep transport plus media sessions in your existing backend or SDK. diff --git a/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/ios.mdx b/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/ios.mdx new file mode 100644 index 000000000..57e893b20 --- /dev/null +++ b/apps/docs/src/content/docs/docs/plugins/incoming-call-kit/ios.mdx @@ -0,0 +1,69 @@ +--- +title: iOS +description: Configure CallKit behavior and understand production limits on iOS. +sidebar: + order: 3 +--- + +## How iOS behavior works + +On iOS, the plugin reports the incoming call to CallKit. That gives you the system incoming-call sheet and standardized call actions without building your own native incoming-call UI. + +`requestPermissions()` resolves immediately on iOS because CallKit itself does not require a runtime permission dialog. + +## Basic example + +```ts +import { IncomingCallKit } from '@capgo/capacitor-incoming-call-kit'; + +await IncomingCallKit.showIncomingCall({ + callId: 'call-42', + callerName: 'Ada Lovelace', + handle: '+1 555 010 020', + ios: { + handleType: 'phoneNumber', + supportsHolding: true, + supportsDTMF: false, + }, +}); +``` + +## Handle types + +Use `ios.handleType` to control how CallKit formats the handle: + +- `generic` for app-specific identifiers +- `phoneNumber` for real phone numbers +- `emailAddress` for email-based identities + +## Background incoming calls + +This plugin does not register PushKit or APNs for you. + +For true background or terminated-state ringing on iOS, your host app still needs the native Apple push setup that matches your transport strategy: + +1. Enable Push Notifications when your transport uses Apple push delivery. +2. Enable the Voice over IP background mode when your app uses a VoIP push flow. +3. Deliver the incoming-call event to your app and invoke this plugin as soon as the Capacitor bridge is available. + +If your ring event exists only in JavaScript, you will get the best experience while the app is already running in the foreground. + +## Microphone and camera permissions + +CallKit does not replace your media SDK. If the real call session uses microphone or camera access, those usage descriptions still belong in your app: + +```xml +NSMicrophoneUsageDescription +This app uses the microphone for calls. +NSCameraUsageDescription +This app uses the camera for video calls. +``` + +Add only the keys your real calling flow needs. + +## Keep these responsibilities in your app layer + +- PushKit and APNs registration +- Authentication and token refresh +- Joining the real room or VoIP session after `callAccepted` +- Ending or reconciling remote call state when the plugin emits `callDeclined`, `callEnded`, or `callTimedOut` diff --git a/apps/web/public/icons/plugins/incoming-call-kit.svg b/apps/web/public/icons/plugins/incoming-call-kit.svg new file mode 100644 index 000000000..e8b3c04a3 --- /dev/null +++ b/apps/web/public/icons/plugins/incoming-call-kit.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/web/src/config/plugins.ts b/apps/web/src/config/plugins.ts index fd50c63d6..570bb63cb 100644 --- a/apps/web/src/config/plugins.ts +++ b/apps/web/src/config/plugins.ts @@ -92,6 +92,7 @@ const actionDefinitionRows = @capgo/capacitor-age-range|github.com/Cap-go|Cross-platform age range detection using Google Play Age Signals (Android) and Apple DeclaredAgeRange (iOS)|https://github.com/Cap-go/capacitor-age-range/|Age Range @capgo/capacitor-persona|github.com/Cap-go|Launch Persona identity verification inquiries with native iOS and Android SDKs|https://github.com/Cap-go/capacitor-persona/|Persona @capgo/capacitor-intune|github.com/Cap-go|Microsoft Intune MAM, app protection policy, app config, and MSAL authentication for Capacitor|https://github.com/Cap-go/capacitor-intune/|Intune +@capgo/capacitor-incoming-call-kit|github.com/Cap-go|Present native incoming-call UI with iOS CallKit and Android full-screen notifications|https://github.com/Cap-go/capacitor-incoming-call-kit/|Incoming Call Kit @capgo/capacitor-android-age-signals|github.com/Cap-go|Google Play Age Signals API wrapper - detect supervised accounts and verified users|https://github.com/Cap-go/capacitor-android-age-signals/|Age Signals @capgo/capacitor-barometer|github.com/Cap-go|Access device barometer for atmospheric pressure and altitude readings|https://github.com/Cap-go/capacitor-barometer/|Barometer @capgo/capacitor-accelerometer|github.com/Cap-go|Read device accelerometer for motion detection and orientation tracking|https://github.com/Cap-go/capacitor-accelerometer/|Accelerometer @@ -214,6 +215,7 @@ const pluginIconsByName: Record = { '@capgo/capacitor-age-range': 'UserGroup', '@capgo/capacitor-persona': 'UserCircle', '@capgo/capacitor-intune': 'ShieldCheck', + '@capgo/capacitor-incoming-call-kit': 'Phone', '@capgo/capacitor-android-age-signals': 'UserGroup', '@capgo/capacitor-barometer': 'ChartBar', '@capgo/capacitor-accelerometer': 'ArrowsPointingOut', diff --git a/apps/web/src/content/plugins-tutorials/en/capacitor-incoming-call-kit.md b/apps/web/src/content/plugins-tutorials/en/capacitor-incoming-call-kit.md new file mode 100644 index 000000000..47577df1d --- /dev/null +++ b/apps/web/src/content/plugins-tutorials/en/capacitor-incoming-call-kit.md @@ -0,0 +1,98 @@ +--- +locale: en +--- + +# Using @capgo/capacitor-incoming-call-kit + +The `@capgo/capacitor-incoming-call-kit` package adds the native incoming-call presentation layer to Capacitor apps. It gives you CallKit on iOS, high-priority incoming-call notifications on Android, and a typed JavaScript API that stays independent from any specific calling vendor. + +## Installation + +```bash +bun add @capgo/capacitor-incoming-call-kit +bunx cap sync +``` + +## When to use it + +This plugin is a good fit when your app already has signaling and media handled elsewhere, for example with: + +- your own backend event flow +- Twilio, Stream, Daily, Agora, or SIP infrastructure +- FCM or PushKit delivery + +The plugin only owns the native ringing layer. Your app still owns push transport, authentication, and the actual audio or video session. + +## Quick start + +```ts +import { IncomingCallKit } from '@capgo/capacitor-incoming-call-kit'; + +await IncomingCallKit.requestPermissions(); +await IncomingCallKit.requestFullScreenIntentPermission(); + +await IncomingCallKit.addListener('callAccepted', async ({ call }) => { + console.log('Accepted', call.callId); + // Join the real room or VoIP session here. +}); + +await IncomingCallKit.addListener('callDeclined', ({ call }) => { + console.log('Declined', call.callId); +}); + +await IncomingCallKit.showIncomingCall({ + callId: 'call-42', + callerName: 'Ada Lovelace', + handle: '+39 555 010 020', + appName: 'Capgo Phone', + hasVideo: true, + timeoutMs: 45_000, + extra: { + roomId: 'room-42', + }, + android: { + channelId: 'calls', + channelName: 'Incoming Calls', + showFullScreen: true, + }, + ios: { + handleType: 'phoneNumber', + }, +}); +``` + +## Event flow + +The common production pattern looks like this: + +1. Your backend or communications SDK emits a ring event. +2. Your Capacitor app calls `showIncomingCall()`. +3. The plugin presents native incoming-call UI. +4. `callAccepted` tells your app to join the actual call. +5. `callDeclined`, `callEnded`, or `callTimedOut` tells your app to clean up remote state. + +## Platform notes + +### iOS + +- Uses CallKit for the system incoming-call sheet. +- Does not register PushKit or APNs for you. +- `requestPermissions()` resolves immediately because CallKit has no runtime prompt. + +### Android + +- Uses a high-priority notification and optional full-screen activity. +- Requests notification permission on Android 13 and later. +- Can open the Android 14 full-screen intent settings page when needed. + +## Useful APIs + +- `showIncomingCall()` to present the native UI +- `endCall()` to end a single tracked call +- `endAllCalls()` to clear all tracked calls +- `getActiveCalls()` to inspect what the native layer still considers active + +## Learn more + +- Docs: [Incoming Call Kit](https://capgo.app/docs/plugins/incoming-call-kit/) +- GitHub: [Cap-go/capacitor-incoming-call-kit](https://github.com/Cap-go/capacitor-incoming-call-kit) diff --git a/apps/web/src/data/npm-downloads.json b/apps/web/src/data/npm-downloads.json index 3afb256a7..534ff91d2 100644 --- a/apps/web/src/data/npm-downloads.json +++ b/apps/web/src/data/npm-downloads.json @@ -1,120 +1,121 @@ { - "@capgo/native-market": 12531, - "@capgo/capacitor-native-biometric": 487600, - "@capgo/camera-preview": 38060, - "@capgo/capacitor-updater": 712894, - "@capgo/electron-updater": 1048, - "@capgo/capacitor-uploader": 13408, - "@revenuecat/purchases-capacitor": 716640, - "@capgo/capacitor-flash": 34656, - "@capgo/capacitor-screen-recorder": 15945, - "@capgo/capacitor-crisp": 11671, - "@capgo/capacitor-intercom": 470, - "@capgo/capacitor-appsflyer": 256, - "@capgo/nativegeocoder": 21217, - "@capgo/inappbrowser": 346536, - "@capgo/capacitor-mqtt": 80, - "@capgo/capacitor-mute": 35981, - "@capgo/native-audio": 40729, - "@capgo/capacitor-shake": 28087, - "@capgo/capacitor-navigation-bar": 136696, - "@capgo/ivs-player": 535, - "@capgo/home-indicator": 19133, - "@capgo/native-purchases": 84890, - "@capgo/capacitor-data-storage-sqlite": 7464, - "@capgo/capacitor-android-usagestatsmanager": 5828, + "@capgo/native-market": 12273, + "@capgo/capacitor-native-biometric": 502697, + "@capgo/camera-preview": 40403, + "@capgo/capacitor-updater": 747030, + "@capgo/electron-updater": 1143, + "@capgo/capacitor-uploader": 14078, + "@revenuecat/purchases-capacitor": 759139, + "@capgo/capacitor-flash": 35730, + "@capgo/capacitor-screen-recorder": 15842, + "@capgo/capacitor-crisp": 11813, + "@capgo/capacitor-intercom": 701, + "@capgo/capacitor-appsflyer": 506, + "@capgo/nativegeocoder": 21666, + "@capgo/inappbrowser": 344742, + "@capgo/capacitor-mqtt": 400, + "@capgo/capacitor-mute": 35652, + "@capgo/native-audio": 42019, + "@capgo/capacitor-shake": 28763, + "@capgo/capacitor-navigation-bar": 139877, + "@capgo/ivs-player": 639, + "@capgo/home-indicator": 20051, + "@capgo/native-purchases": 93023, + "@capgo/capacitor-data-storage-sqlite": 7780, + "@capgo/capacitor-android-usagestatsmanager": 6098, "@capgo/capacitor-streamcall": 0, - "@capgo/capacitor-autofill-save-password": 27456, - "@capgo/capacitor-social-login": 486872, - "@capgo/capacitor-jw-player": 1828, + "@capgo/capacitor-autofill-save-password": 27704, + "@capgo/capacitor-social-login": 514658, + "@capgo/capacitor-jw-player": 1781, "@capgo/capacitor-ricoh360-camera-plugin": 0, - "@capgo/capacitor-admob": 2642, - "@capgo/capacitor-alarm": 898, - "@capgo/capacitor-android-inline-install": 3215, - "@capgo/capacitor-android-kiosk": 1082, - "@capgo/capacitor-appinsights": 0, - "@capgo/capacitor-app-attest": 1475, + "@capgo/capacitor-admob": 2848, + "@capgo/capacitor-alarm": 1020, + "@capgo/capacitor-android-inline-install": 3662, + "@capgo/capacitor-android-kiosk": 1153, + "@capgo/capacitor-appinsights": 61, + "@capgo/capacitor-app-attest": 1902, "@capgo/capacitor-audiosession": 0, "@capgo/capacitor-background-geolocation": 0, - "@capgo/capacitor-document-scanner": 21680, - "@capgo/capacitor-downloader": 4622, - "@capgo/capacitor-env": 5300, - "@capgo/capacitor-ffmpeg": 636, - "@capgo/capacitor-gtm": 1863, + "@capgo/capacitor-document-scanner": 24573, + "@capgo/capacitor-downloader": 4805, + "@capgo/capacitor-env": 5414, + "@capgo/capacitor-ffmpeg": 657, + "@capgo/capacitor-gtm": 2003, "@capgo/capacitor-rudderstack": 0, - "@capgo/capacitor-health": 65288, - "@capgo/capacitor-is-root": 6266, - "@capgo/capacitor-app-tracking-transparency": 6036, - "@capgo/capacitor-launch-navigator": 9576, + "@capgo/capacitor-health": 71739, + "@capgo/capacitor-is-root": 7175, + "@capgo/capacitor-app-tracking-transparency": 7710, + "@capgo/capacitor-launch-navigator": 10650, "@capgo/capacitor-live-activities": 0, - "@capgo/capacitor-live-reload": 1031, - "@capgo/capacitor-llm": 1529, - "@capgo/capacitor-media-session": 10546, - "@capgo/capacitor-mux-player": 1041, - "@capgo/capacitor-pay": 7144, + "@capgo/capacitor-live-reload": 1087, + "@capgo/capacitor-llm": 1744, + "@capgo/capacitor-media-session": 11483, + "@capgo/capacitor-mux-player": 1091, + "@capgo/capacitor-pay": 7314, "@capgo/capacitor-passkey": 40, - "@capgo/capacitor-privacy-screen": 85, - "@capgo/capacitor-pdf-generator": 4011, - "@capgo/capacitor-persistent-account": 13383, - "@capgo/capacitor-photo-library": 1566, - "@capgo/capacitor-sim": 3926, - "@capgo/capacitor-speech-recognition": 27479, - "@capgo/capacitor-textinteraction": 2200, + "@capgo/capacitor-privacy-screen": 238, + "@capgo/capacitor-pdf-generator": 4182, + "@capgo/capacitor-persistent-account": 13423, + "@capgo/capacitor-photo-library": 1496, + "@capgo/capacitor-sim": 3996, + "@capgo/capacitor-speech-recognition": 30813, + "@capgo/capacitor-textinteraction": 2458, "@capgo/capacitor-twilio-video": 0, - "@capgo/capacitor-twilio-voice": 49584, - "@capgo/capacitor-video-player": 6199, - "@capgo/capacitor-volume-buttons": 999, - "@capgo/capacitor-youtube-player": 4050, - "@capgo/capacitor-wechat": 2631, - "@capgo/capacitor-ibeacon": 3981, - "@capgo/capacitor-nfc": 19703, - "@capgo/capacitor-age-range": 475, - "@capgo/capacitor-persona": 227, - "@capgo/capacitor-intune": 53, - "@capgo/capacitor-android-age-signals": 1034, - "@capgo/capacitor-barometer": 1925, - "@capgo/capacitor-accelerometer": 2570, - "@capgo/capacitor-contacts": 4645, - "@capgo/capacitor-audio-recorder": 24365, - "@capgo/capacitor-share-target": 13254, - "@capgo/capacitor-realtimekit": 2175, - "@capgo/capacitor-pedometer": 6444, - "@capgo/capacitor-fast-sql": 2905, - "@capgo/capacitor-file-compressor": 3181, - "@capgo/capacitor-speech-synthesis": 2455, - "@capgo/capacitor-ssl-pinning": 59, - "@capgo/capacitor-printer": 17988, - "@capgo/capacitor-zip": 1901, - "@capgo/capacitor-zebra-datawedge": 55, - "@capgo/capacitor-wifi": 9050, - "@capgo/capacitor-screen-orientation": 9845, - "@capgo/capacitor-webview-guardian": 1722, - "@capgo/capacitor-webview-version-checker": 277, - "@capgo/capacitor-firebase-analytics": 766, - "@capgo/capacitor-firebase-app": 33, - "@capgo/capacitor-firebase-app-check": 34, - "@capgo/capacitor-firebase-authentication": 566, - "@capgo/capacitor-firebase-crashlytics": 748, - "@capgo/capacitor-firebase-firestore": 39, - "@capgo/capacitor-firebase-functions": 38, - "@capgo/capacitor-firebase-messaging": 521, - "@capgo/capacitor-firebase-performance": 509, - "@capgo/capacitor-firebase-remote-config": 30, - "@capgo/capacitor-firebase-storage": 346, - "@capacitor-plus/core": 588, - "@capacitor-plus/cli": 524, - "@capacitor-plus/android": 537, - "@capacitor-plus/ios": 395, - "@capgo/capacitor-compass": 5899, - "@capgo/capacitor-file": 3163, - "@capgo/capacitor-bluetooth-low-energy": 3962, - "@capgo/capacitor-keep-awake": 2296, - "@capgo/capacitor-in-app-review": 17550, - "@capgo/capacitor-file-picker": 5253, - "@capgo/capacitor-watch": 1766, + "@capgo/capacitor-twilio-voice": 51226, + "@capgo/capacitor-video-player": 6524, + "@capgo/capacitor-volume-buttons": 901, + "@capgo/capacitor-youtube-player": 4230, + "@capgo/capacitor-wechat": 2711, + "@capgo/capacitor-ibeacon": 4094, + "@capgo/capacitor-nfc": 21638, + "@capgo/capacitor-age-range": 630, + "@capgo/capacitor-persona": 232, + "@capgo/capacitor-intune": 251, + "@capgo/capacitor-incoming-call-kit": 255, + "@capgo/capacitor-android-age-signals": 1124, + "@capgo/capacitor-barometer": 2197, + "@capgo/capacitor-accelerometer": 2657, + "@capgo/capacitor-contacts": 5430, + "@capgo/capacitor-audio-recorder": 27825, + "@capgo/capacitor-share-target": 15721, + "@capgo/capacitor-realtimekit": 2238, + "@capgo/capacitor-pedometer": 6954, + "@capgo/capacitor-fast-sql": 3219, + "@capgo/capacitor-file-compressor": 3337, + "@capgo/capacitor-speech-synthesis": 2530, + "@capgo/capacitor-ssl-pinning": 98, + "@capgo/capacitor-printer": 19249, + "@capgo/capacitor-zip": 2195, + "@capgo/capacitor-zebra-datawedge": 65, + "@capgo/capacitor-wifi": 9362, + "@capgo/capacitor-screen-orientation": 9788, + "@capgo/capacitor-webview-guardian": 1950, + "@capgo/capacitor-webview-version-checker": 442, + "@capgo/capacitor-firebase-analytics": 824, + "@capgo/capacitor-firebase-app": 34, + "@capgo/capacitor-firebase-app-check": 37, + "@capgo/capacitor-firebase-authentication": 524, + "@capgo/capacitor-firebase-crashlytics": 780, + "@capgo/capacitor-firebase-firestore": 42, + "@capgo/capacitor-firebase-functions": 40, + "@capgo/capacitor-firebase-messaging": 547, + "@capgo/capacitor-firebase-performance": 534, + "@capgo/capacitor-firebase-remote-config": 37, + "@capgo/capacitor-firebase-storage": 298, + "@capacitor-plus/core": 274, + "@capacitor-plus/cli": 253, + "@capacitor-plus/android": 264, + "@capacitor-plus/ios": 130, + "@capgo/capacitor-compass": 6086, + "@capgo/capacitor-file": 3259, + "@capgo/capacitor-bluetooth-low-energy": 4582, + "@capgo/capacitor-keep-awake": 2484, + "@capgo/capacitor-in-app-review": 18918, + "@capgo/capacitor-file-picker": 5893, + "@capgo/capacitor-watch": 2040, "@capgo/capacitor-widget-kit": 0, - "@capgo/capacitor-brightness": 1611, - "@capgo/capacitor-light-sensor": 716, - "@capgo/capacitor-video-thumbnails": 1701, - "@capgo/capacitor-intent-launcher": 2829 + "@capgo/capacitor-brightness": 1709, + "@capgo/capacitor-light-sensor": 761, + "@capgo/capacitor-video-thumbnails": 1702, + "@capgo/capacitor-intent-launcher": 3026 }