@elizaos/capacitor-mobile-signals 1.0.0 → 2.0.3-beta.2
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/LICENSE +21 -0
- package/README.md +120 -0
- package/android/build.gradle +17 -3
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/ai/eliza/plugins/mobilesignals/MobileSignalsPlugin.kt +151 -5
- package/dist/esm/definitions.d.ts +28 -1
- package/dist/esm/definitions.d.ts.map +1 -1
- package/dist/esm/web.d.ts.map +1 -1
- package/dist/esm/web.js +50 -9
- package/dist/esm/web.test.js +108 -66
- package/dist/plugin.cjs.js +50 -9
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +50 -9
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/MobileSignalsPlugin/MobileSignalsPlugin.swift +232 -113
- package/ios/Sources/MobileSignalsPlugin/ScreenTimeSupport.swift +100 -9
- package/package.json +14 -11
- package/scripts/validate-ios-screen-time.mjs +157 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Shaw Walters and elizaOS Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# @elizaos/capacitor-mobile-signals
|
|
2
|
+
|
|
3
|
+
A Capacitor plugin that surfaces native mobile device state — wake/sleep, lock screen, battery, screen time, and health biometrics — to Eliza agents running in iOS and Android apps.
|
|
4
|
+
|
|
5
|
+
## What it does
|
|
6
|
+
|
|
7
|
+
On iOS and Android the plugin reads native signals that are unavailable to ordinary web APIs:
|
|
8
|
+
|
|
9
|
+
- **Device state** — whether the screen is active, idle, locked, or the app is backgrounded; battery charging status.
|
|
10
|
+
- **Health data** — current sleep stage, biometrics (heart rate, HRV, respiratory rate, blood oxygen) from HealthKit (iOS) or Health Connect (Android).
|
|
11
|
+
- **Screen time** — per-app usage summaries via Apple's DeviceActivity framework (iOS) or `UsageStatsManager` (Android).
|
|
12
|
+
|
|
13
|
+
In browser environments a web fallback is provided using `document.visibilityState`, `window.focus/blur`, and the Battery Status API. Health and screen-time capabilities return `false` on the web fallback.
|
|
14
|
+
|
|
15
|
+
## Capabilities
|
|
16
|
+
|
|
17
|
+
| Capability | iOS | Android | Web |
|
|
18
|
+
|---|---|---|---|
|
|
19
|
+
| Device state (active/idle/locked) | Yes | Yes | Partial (visibility/focus only) |
|
|
20
|
+
| Battery on/off charging | Yes | Yes | Yes (Battery Status API) |
|
|
21
|
+
| Sleep stage / biometrics | HealthKit | Health Connect | No |
|
|
22
|
+
| Screen time / usage | DeviceActivity + FamilyControls | `PACKAGE_USAGE_STATS` | No |
|
|
23
|
+
| Background refresh | Not available (foreground monitoring only) | Not available | No |
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install @elizaos/capacitor-mobile-signals
|
|
29
|
+
npx cap sync
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The plugin is registered automatically by Capacitor on iOS and Android. No manual `registerPlugin` call is needed in application code — import `MobileSignals` from the package and call its methods directly.
|
|
33
|
+
|
|
34
|
+
## Usage
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { MobileSignals } from "@elizaos/capacitor-mobile-signals";
|
|
38
|
+
|
|
39
|
+
// Check permissions before monitoring
|
|
40
|
+
const status = await MobileSignals.checkPermissions();
|
|
41
|
+
console.log(status.engine); // "healthkit-screen-time" | "health-connect-usage-stats" | "web-fallback"
|
|
42
|
+
|
|
43
|
+
// Request permissions (triggers native dialogs)
|
|
44
|
+
if (status.status === "not-determined") {
|
|
45
|
+
await MobileSignals.requestPermissions({ target: "all" });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Start streaming signals
|
|
49
|
+
await MobileSignals.startMonitoring({ emitInitial: true });
|
|
50
|
+
|
|
51
|
+
await MobileSignals.addListener("signal", (signal) => {
|
|
52
|
+
if (signal.source === "mobile_device") {
|
|
53
|
+
console.log("Device state:", signal.state); // "active" | "idle" | "background" | "locked" | "sleeping"
|
|
54
|
+
console.log("On battery:", signal.onBattery);
|
|
55
|
+
}
|
|
56
|
+
if (signal.source === "mobile_health") {
|
|
57
|
+
console.log("Sleeping:", signal.sleep.isSleeping);
|
|
58
|
+
console.log("Heart rate:", signal.biometrics.heartRateBpm);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// One-shot read without streaming
|
|
63
|
+
const { snapshot, healthSnapshot } = await MobileSignals.getSnapshot();
|
|
64
|
+
|
|
65
|
+
// Stop when done
|
|
66
|
+
await MobileSignals.stopMonitoring();
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Permissions
|
|
70
|
+
|
|
71
|
+
### iOS
|
|
72
|
+
|
|
73
|
+
Add to `Info.plist`:
|
|
74
|
+
|
|
75
|
+
```xml
|
|
76
|
+
<key>NSHealthShareUsageDescription</key>
|
|
77
|
+
<string>Used to read sleep and biometric data for your agent.</string>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Screen Time features additionally require:
|
|
81
|
+
|
|
82
|
+
- The `com.apple.developer.family-controls` entitlement (provisioned by Apple — requires a special request).
|
|
83
|
+
- `DeviceActivityMonitorExtension` and `DeviceActivityReportExtension` app-extension targets in the Xcode project.
|
|
84
|
+
- The `FamilyControls` and `DeviceActivity` frameworks linked via the podspec.
|
|
85
|
+
|
|
86
|
+
Validate the iOS build wiring:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
bun run --cwd plugins/plugin-native-mobile-signals validate:ios-screen-time
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Android
|
|
93
|
+
|
|
94
|
+
Add to `AndroidManifest.xml`:
|
|
95
|
+
|
|
96
|
+
```xml
|
|
97
|
+
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
|
|
98
|
+
tools:ignore="ProtectedPermissions" />
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Usage Access cannot be granted via a normal permission dialog. Direct the user to the system settings page:
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
await MobileSignals.openSettings({ target: "usageAccess" });
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Environment variables (build-time only)
|
|
108
|
+
|
|
109
|
+
| Variable | Description |
|
|
110
|
+
|---|---|
|
|
111
|
+
| `MOBILE_SIGNALS_IOS_PROVISIONING_PROFILE` | Path to a `.mobileprovision` to inspect for Screen Time entitlements during `validate:ios-screen-time`. |
|
|
112
|
+
| `MOBILE_SIGNALS_REQUIRE_IOS_PROVISIONING_PROFILE` | Set to `"1"` to fail validation when no provisioning profile is supplied. |
|
|
113
|
+
|
|
114
|
+
## Platform notes
|
|
115
|
+
|
|
116
|
+
- **Node (desktop):** No native integration. The web fallback applies.
|
|
117
|
+
- **iOS:** Full support. Requires Xcode target with correct entitlements for screen time features.
|
|
118
|
+
- **Android:** Full support for device state and Health Connect. Usage stats require manual user grant via settings.
|
|
119
|
+
- **Web:** Graceful fallback only. Health and screen-time capabilities are unavailable.
|
|
120
|
+
|
package/android/build.gradle
CHANGED
|
@@ -8,6 +8,16 @@ ext {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
apply plugin: 'com.android.library'
|
|
11
|
+
// Explicitly apply the Kotlin Android plugin. The kotlin-gradle-plugin is on
|
|
12
|
+
// the root buildscript classpath, but without applying it here AGP 8.13 falls
|
|
13
|
+
// back to its "built-in Kotlin" compile path (build/intermediates/
|
|
14
|
+
// built_in_kotlinc), which compiles the .kt sources but does NOT bundle the
|
|
15
|
+
// resulting .class files into the *release* library jar. The app's
|
|
16
|
+
// :app:assembleRelease then links a library AAR with zero plugin classes, so
|
|
17
|
+
// the Capacitor plugin (and any manifest-declared component) is absent from
|
|
18
|
+
// the release dex. Applying the standard Kotlin plugin wires Kotlin
|
|
19
|
+
// compilation into both the debug and release jar-bundling tasks.
|
|
20
|
+
apply plugin: 'org.jetbrains.kotlin.android'
|
|
11
21
|
android {
|
|
12
22
|
namespace = "ai.eliza.plugins.mobilesignals"
|
|
13
23
|
compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34
|
|
@@ -26,8 +36,12 @@ android {
|
|
|
26
36
|
}
|
|
27
37
|
|
|
28
38
|
compileOptions {
|
|
29
|
-
sourceCompatibility JavaVersion.
|
|
30
|
-
targetCompatibility JavaVersion.
|
|
39
|
+
sourceCompatibility JavaVersion.VERSION_21
|
|
40
|
+
targetCompatibility JavaVersion.VERSION_21
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
kotlinOptions {
|
|
44
|
+
jvmTarget = "21"
|
|
31
45
|
}
|
|
32
46
|
|
|
33
47
|
}
|
|
@@ -35,7 +49,7 @@ android {
|
|
|
35
49
|
repositories {
|
|
36
50
|
google()
|
|
37
51
|
maven {
|
|
38
|
-
url = uri(rootProject.ext.mavenCentralMirrorUrl)
|
|
52
|
+
url = uri(rootProject.ext.has('mavenCentralMirrorUrl') ? rootProject.ext.mavenCentralMirrorUrl : 'https://repo.maven.apache.org/maven2')
|
|
39
53
|
}
|
|
40
54
|
mavenCentral()
|
|
41
55
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
package ai.eliza.plugins.mobilesignals
|
|
2
2
|
|
|
3
|
+
import android.Manifest
|
|
3
4
|
import android.app.AppOpsManager
|
|
5
|
+
import android.app.NotificationManager
|
|
4
6
|
import android.app.usage.UsageStatsManager
|
|
5
7
|
import android.app.KeyguardManager
|
|
6
8
|
import android.content.BroadcastReceiver
|
|
@@ -29,8 +31,11 @@ import com.getcapacitor.JSObject
|
|
|
29
31
|
import com.getcapacitor.Plugin
|
|
30
32
|
import com.getcapacitor.PluginCall
|
|
31
33
|
import com.getcapacitor.PluginMethod
|
|
34
|
+
import com.getcapacitor.PermissionState
|
|
32
35
|
import com.getcapacitor.annotation.ActivityCallback
|
|
33
36
|
import com.getcapacitor.annotation.CapacitorPlugin
|
|
37
|
+
import com.getcapacitor.annotation.Permission
|
|
38
|
+
import com.getcapacitor.annotation.PermissionCallback
|
|
34
39
|
import kotlinx.coroutines.CoroutineScope
|
|
35
40
|
import kotlinx.coroutines.Dispatchers
|
|
36
41
|
import kotlinx.coroutines.SupervisorJob
|
|
@@ -42,8 +47,17 @@ import org.json.JSONObject
|
|
|
42
47
|
private const val HEALTH_CONNECT_PACKAGE = "com.google.android.apps.healthdata"
|
|
43
48
|
private const val FAMILY_CONTROLS_ENTITLEMENT = "com.apple.developer.family-controls"
|
|
44
49
|
private const val PACKAGE_USAGE_STATS_PERMISSION = "android.permission.PACKAGE_USAGE_STATS"
|
|
45
|
-
|
|
46
|
-
|
|
50
|
+
private const val NOTIFICATION_PERMISSION_ALIAS = "notifications"
|
|
51
|
+
|
|
52
|
+
@CapacitorPlugin(
|
|
53
|
+
name = "MobileSignals",
|
|
54
|
+
permissions = [
|
|
55
|
+
Permission(
|
|
56
|
+
alias = NOTIFICATION_PERMISSION_ALIAS,
|
|
57
|
+
strings = [Manifest.permission.POST_NOTIFICATIONS],
|
|
58
|
+
),
|
|
59
|
+
],
|
|
60
|
+
)
|
|
47
61
|
class MobileSignalsPlugin : Plugin() {
|
|
48
62
|
private val tag = "MobileSignalsPlugin"
|
|
49
63
|
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
|
|
@@ -115,6 +129,31 @@ class MobileSignalsPlugin : Plugin() {
|
|
|
115
129
|
|
|
116
130
|
@PluginMethod
|
|
117
131
|
override fun requestPermissions(call: PluginCall) {
|
|
132
|
+
val target = call.getString("target") ?: "all"
|
|
133
|
+
if (target == "notifications") {
|
|
134
|
+
requestNotificationPermission(call)
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
if (target == "screenTime") {
|
|
138
|
+
val (_, intent) = settingsIntentFor("usageAccess")
|
|
139
|
+
try {
|
|
140
|
+
val starter = activity
|
|
141
|
+
if (starter != null) {
|
|
142
|
+
starter.startActivity(intent)
|
|
143
|
+
} else {
|
|
144
|
+
context.startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
|
|
145
|
+
}
|
|
146
|
+
scope.launch {
|
|
147
|
+
call.resolve(resolvePermissionResult("Opened Android Usage Access settings."))
|
|
148
|
+
}
|
|
149
|
+
} catch (error: Throwable) {
|
|
150
|
+
scope.launch {
|
|
151
|
+
call.resolve(resolvePermissionResult("Failed to open Android Usage Access settings: ${error.message}"))
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return
|
|
155
|
+
}
|
|
156
|
+
|
|
118
157
|
val sdkStatus = HealthConnectClient.getSdkStatus(context, HEALTH_CONNECT_PACKAGE)
|
|
119
158
|
if (sdkStatus != HealthConnectClient.SDK_AVAILABLE) {
|
|
120
159
|
call.resolve(buildPermissionResult(sdkStatus))
|
|
@@ -134,6 +173,55 @@ class MobileSignalsPlugin : Plugin() {
|
|
|
134
173
|
startActivityForResult(call, intent, "handleHealthConnectPermissionResult")
|
|
135
174
|
}
|
|
136
175
|
|
|
176
|
+
private fun requestNotificationPermission(call: PluginCall) {
|
|
177
|
+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
|
|
178
|
+
openNotificationSettingsOrResolve(call)
|
|
179
|
+
return
|
|
180
|
+
}
|
|
181
|
+
val current = notificationPermissionStatus()
|
|
182
|
+
if (current.status == "granted") {
|
|
183
|
+
scope.launch {
|
|
184
|
+
call.resolve(resolvePermissionResult())
|
|
185
|
+
}
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
if (!current.canRequest) {
|
|
189
|
+
openNotificationSettingsOrResolve(call)
|
|
190
|
+
return
|
|
191
|
+
}
|
|
192
|
+
requestPermissionForAlias(
|
|
193
|
+
NOTIFICATION_PERMISSION_ALIAS,
|
|
194
|
+
call,
|
|
195
|
+
"handleNotificationsPermissionResult",
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private fun openNotificationSettingsOrResolve(call: PluginCall) {
|
|
200
|
+
val (_, intent) = settingsIntentFor("notification")
|
|
201
|
+
try {
|
|
202
|
+
val starter = activity
|
|
203
|
+
if (starter != null) {
|
|
204
|
+
starter.startActivity(intent)
|
|
205
|
+
} else {
|
|
206
|
+
context.startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
|
|
207
|
+
}
|
|
208
|
+
scope.launch {
|
|
209
|
+
call.resolve(resolvePermissionResult("Opened Android notification settings."))
|
|
210
|
+
}
|
|
211
|
+
} catch (error: Throwable) {
|
|
212
|
+
scope.launch {
|
|
213
|
+
call.resolve(resolvePermissionResult("Failed to open Android notification settings: ${error.message}"))
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
@PermissionCallback
|
|
219
|
+
private fun handleNotificationsPermissionResult(call: PluginCall) {
|
|
220
|
+
scope.launch {
|
|
221
|
+
call.resolve(resolvePermissionResult())
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
137
225
|
@PluginMethod
|
|
138
226
|
fun openSettings(call: PluginCall) {
|
|
139
227
|
val requestedTarget = call.getString("target") ?: "app"
|
|
@@ -273,6 +361,10 @@ class MobileSignalsPlugin : Plugin() {
|
|
|
273
361
|
return JSObject().apply {
|
|
274
362
|
put("status", status)
|
|
275
363
|
put("canRequest", canRequest)
|
|
364
|
+
put("canOpenSettings", true)
|
|
365
|
+
put("settingsTarget", if (status == "granted") JSONObject.NULL else "healthConnect")
|
|
366
|
+
put("engine", "health-connect-usage-stats")
|
|
367
|
+
put("capabilities", mobileSignalsCapabilities(sdkStatus))
|
|
276
368
|
if (statusReason != null) {
|
|
277
369
|
put("reason", statusReason)
|
|
278
370
|
}
|
|
@@ -285,6 +377,15 @@ class MobileSignalsPlugin : Plugin() {
|
|
|
285
377
|
}
|
|
286
378
|
}
|
|
287
379
|
|
|
380
|
+
private fun mobileSignalsCapabilities(sdkStatus: Int): JSObject {
|
|
381
|
+
return JSObject().apply {
|
|
382
|
+
put("health", sdkStatus == HealthConnectClient.SDK_AVAILABLE)
|
|
383
|
+
put("screenTime", true)
|
|
384
|
+
put("notifications", true)
|
|
385
|
+
put("settings", true)
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
288
389
|
private fun computeIdleTimeSeconds(locked: Boolean, interactive: Boolean): Long? {
|
|
289
390
|
if (!hasUsageStatsAccess()) {
|
|
290
391
|
return null
|
|
@@ -641,6 +742,50 @@ class MobileSignalsPlugin : Plugin() {
|
|
|
641
742
|
}
|
|
642
743
|
}
|
|
643
744
|
|
|
745
|
+
private data class NotificationPermissionStatus(
|
|
746
|
+
val status: String,
|
|
747
|
+
val canRequest: Boolean,
|
|
748
|
+
val reason: String?,
|
|
749
|
+
)
|
|
750
|
+
|
|
751
|
+
private fun notificationPermissionStatus(): NotificationPermissionStatus {
|
|
752
|
+
val appNotificationsEnabled = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
753
|
+
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
|
754
|
+
manager.areNotificationsEnabled()
|
|
755
|
+
} else {
|
|
756
|
+
true
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
val runtimeState = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
|
760
|
+
getPermissionState(NOTIFICATION_PERMISSION_ALIAS)
|
|
761
|
+
} else {
|
|
762
|
+
PermissionState.GRANTED
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
if (runtimeState == PermissionState.GRANTED && appNotificationsEnabled) {
|
|
766
|
+
return NotificationPermissionStatus("granted", false, null)
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && runtimeState != PermissionState.GRANTED) {
|
|
770
|
+
val canRequest = runtimeState != PermissionState.DENIED
|
|
771
|
+
return NotificationPermissionStatus(
|
|
772
|
+
if (runtimeState == PermissionState.DENIED) "denied" else "not-determined",
|
|
773
|
+
canRequest,
|
|
774
|
+
if (canRequest) {
|
|
775
|
+
"Allow notifications when LifeOps needs to remind or prompt you."
|
|
776
|
+
} else {
|
|
777
|
+
"Notifications are denied for Eliza. Open Android settings to enable reminders and prompts."
|
|
778
|
+
},
|
|
779
|
+
)
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
return NotificationPermissionStatus(
|
|
783
|
+
"denied",
|
|
784
|
+
false,
|
|
785
|
+
"Notifications are disabled for Eliza. Open Android settings to enable reminders and prompts.",
|
|
786
|
+
)
|
|
787
|
+
}
|
|
788
|
+
|
|
644
789
|
private fun buildSetupActions(
|
|
645
790
|
healthStatus: String,
|
|
646
791
|
healthCanRequest: Boolean,
|
|
@@ -690,14 +835,15 @@ class MobileSignalsPlugin : Plugin() {
|
|
|
690
835
|
},
|
|
691
836
|
)
|
|
692
837
|
})
|
|
838
|
+
val notifications = notificationPermissionStatus()
|
|
693
839
|
actions.add(JSObject().apply {
|
|
694
840
|
put("id", "notification_settings")
|
|
695
841
|
put("label", "Notifications")
|
|
696
|
-
put("status", "needs-action")
|
|
697
|
-
put("canRequest",
|
|
842
|
+
put("status", if (notifications.status == "granted") "ready" else "needs-action")
|
|
843
|
+
put("canRequest", notifications.canRequest)
|
|
698
844
|
put("canOpenSettings", true)
|
|
699
845
|
put("settingsTarget", "notification")
|
|
700
|
-
put("reason",
|
|
846
|
+
put("reason", notifications.reason ?: JSONObject.NULL)
|
|
701
847
|
})
|
|
702
848
|
actions.add(JSObject().apply {
|
|
703
849
|
put("id", "battery_optimization")
|
|
@@ -3,6 +3,13 @@ export type MobileSignalsPlatform = "android" | "ios" | "web";
|
|
|
3
3
|
export type MobileSignalsSource = "mobile_device" | "mobile_health";
|
|
4
4
|
export type MobileSignalsState = "active" | "idle" | "background" | "locked" | "sleeping";
|
|
5
5
|
export type MobileSignalsHealthSource = "healthkit" | "health_connect";
|
|
6
|
+
export type MobileSignalsEngine = "healthkit-screen-time" | "health-connect-usage-stats" | "web-fallback";
|
|
7
|
+
export interface MobileSignalsCapabilities {
|
|
8
|
+
health: boolean;
|
|
9
|
+
screenTime: boolean;
|
|
10
|
+
notifications: boolean;
|
|
11
|
+
settings: boolean;
|
|
12
|
+
}
|
|
6
13
|
export type MobileSignalsSettingsTarget = "app" | "health" | "healthConnect" | "screenTime" | "usageAccess" | "notification" | "batteryOptimization" | "localNetwork" | "deviceSettings";
|
|
7
14
|
export type MobileSignalsSetupActionStatus = "ready" | "needs-action" | "unavailable";
|
|
8
15
|
export interface MobileSignalsSetupAction {
|
|
@@ -17,6 +24,10 @@ export interface MobileSignalsSetupAction {
|
|
|
17
24
|
export interface MobileSignalsOpenSettingsOptions {
|
|
18
25
|
target?: MobileSignalsSettingsTarget;
|
|
19
26
|
}
|
|
27
|
+
export type MobileSignalsPermissionTarget = "all" | "health" | "screenTime" | "notifications";
|
|
28
|
+
export interface MobileSignalsRequestPermissionsOptions {
|
|
29
|
+
target?: MobileSignalsPermissionTarget;
|
|
30
|
+
}
|
|
20
31
|
export interface MobileSignalsOpenSettingsResult {
|
|
21
32
|
opened: boolean;
|
|
22
33
|
target: MobileSignalsSettingsTarget;
|
|
@@ -32,6 +43,8 @@ export interface MobileSignalsScreenTimeStatus {
|
|
|
32
43
|
frameworks: string[];
|
|
33
44
|
deviceActivityReportExtension: boolean;
|
|
34
45
|
deviceActivityMonitorExtension: boolean;
|
|
46
|
+
deviceActivityReportExtensionPoint?: string;
|
|
47
|
+
deviceActivityMonitorExtensionPoint?: string;
|
|
35
48
|
android?: {
|
|
36
49
|
usageStatsPermission: string;
|
|
37
50
|
usageAccessSettingsAction: string;
|
|
@@ -49,6 +62,16 @@ export interface MobileSignalsScreenTimeStatus {
|
|
|
49
62
|
status: "approved" | "denied" | "not-determined" | "unavailable";
|
|
50
63
|
canRequest: boolean;
|
|
51
64
|
};
|
|
65
|
+
extensions?: {
|
|
66
|
+
deviceActivityReportExtension: boolean;
|
|
67
|
+
deviceActivityMonitorExtension: boolean;
|
|
68
|
+
inspected: "bundle-plug-ins";
|
|
69
|
+
bundles: Array<{
|
|
70
|
+
bundleIdentifier: string;
|
|
71
|
+
extensionPoint: string | null;
|
|
72
|
+
path: string;
|
|
73
|
+
}>;
|
|
74
|
+
};
|
|
52
75
|
reportAvailable: boolean;
|
|
53
76
|
coarseSummaryAvailable: boolean;
|
|
54
77
|
thresholdEventsAvailable: boolean;
|
|
@@ -138,7 +161,7 @@ export interface MobileSignalsCancelBackgroundRefreshResult {
|
|
|
138
161
|
}
|
|
139
162
|
export interface MobileSignalsPlugin {
|
|
140
163
|
checkPermissions(): Promise<MobileSignalsPermissionStatus>;
|
|
141
|
-
requestPermissions(): Promise<MobileSignalsPermissionStatus>;
|
|
164
|
+
requestPermissions(options?: MobileSignalsRequestPermissionsOptions): Promise<MobileSignalsPermissionStatus>;
|
|
142
165
|
openSettings(options?: MobileSignalsOpenSettingsOptions): Promise<MobileSignalsOpenSettingsResult>;
|
|
143
166
|
startMonitoring(options?: MobileSignalsStartOptions): Promise<MobileSignalsStartResult>;
|
|
144
167
|
stopMonitoring(): Promise<MobileSignalsStopResult>;
|
|
@@ -151,6 +174,10 @@ export interface MobileSignalsPlugin {
|
|
|
151
174
|
export interface MobileSignalsPermissionStatus {
|
|
152
175
|
status: "granted" | "denied" | "not-determined" | "not-applicable";
|
|
153
176
|
canRequest: boolean;
|
|
177
|
+
canOpenSettings: boolean;
|
|
178
|
+
settingsTarget: MobileSignalsSettingsTarget | null;
|
|
179
|
+
engine: MobileSignalsEngine;
|
|
180
|
+
capabilities: MobileSignalsCapabilities;
|
|
154
181
|
reason?: string;
|
|
155
182
|
screenTime: MobileSignalsScreenTimeStatus;
|
|
156
183
|
setupActions: MobileSignalsSetupAction[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/web.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAEV,gCAAgC,EAChC,+BAA+B,EAC/B,6BAA6B,EAE7B,mBAAmB,EACnB,6BAA6B,
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAEV,gCAAgC,EAChC,+BAA+B,EAC/B,6BAA6B,EAE7B,mBAAmB,EACnB,6BAA6B,EAI7B,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,eAAe,CAAC;AAqDvB,iBAAS,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,6BAA6B,CA6B5E;AAqID,qBAAa,gBAAiB,SAAQ,SAAU,YAAW,mBAAmB;IAC5E,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAiB;IAE1B,gBAAgB,IAAI,OAAO,CAAC,6BAA6B,CAAC;IA2B1D,kBAAkB,IAAI,OAAO,CAAC,6BAA6B,CAAC;IAI5D,YAAY,CAChB,OAAO,GAAE,gCAAqC,GAC7C,OAAO,CAAC,+BAA+B,CAAC;IAU3C,OAAO,CAAC,UAAU,CAKhB;IAEF,OAAO,CAAC,eAAe;IAoCvB,OAAO,CAAC,cAAc;IAOhB,eAAe,CACnB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC;IAqB9B,cAAc,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAMlD,WAAW,IAAI,OAAO,CAAC,2BAA2B,CAAC;IASnD,yBAAyB,IAAI,OAAO,CAAC;QACzC,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IAOI,uBAAuB,IAAI,OAAO,CAAC;QACvC,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CAMH;AAED,eAAO,MAAM,UAAU;;CAEtB,CAAC"}
|
package/dist/esm/web.js
CHANGED
|
@@ -11,6 +11,25 @@ const SCREEN_TIME_REQUIREMENTS = {
|
|
|
11
11
|
usageAccessSettingsAction: "android.settings.USAGE_ACCESS_SETTINGS",
|
|
12
12
|
},
|
|
13
13
|
};
|
|
14
|
+
const SETTINGS_TARGETS = new Set([
|
|
15
|
+
"app",
|
|
16
|
+
"health",
|
|
17
|
+
"healthConnect",
|
|
18
|
+
"screenTime",
|
|
19
|
+
"usageAccess",
|
|
20
|
+
"notification",
|
|
21
|
+
"batteryOptimization",
|
|
22
|
+
"localNetwork",
|
|
23
|
+
"deviceSettings",
|
|
24
|
+
]);
|
|
25
|
+
function normalizeSettingsTarget(target) {
|
|
26
|
+
if (target === undefined)
|
|
27
|
+
return "app";
|
|
28
|
+
if (typeof target !== "string" || !SETTINGS_TARGETS.has(target)) {
|
|
29
|
+
throw new Error("target must be a valid mobile settings target");
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
}
|
|
14
33
|
function getPlatform() {
|
|
15
34
|
if (typeof navigator === "undefined") {
|
|
16
35
|
return "web";
|
|
@@ -82,13 +101,21 @@ async function getBatterySnapshot() {
|
|
|
82
101
|
if (!nav || typeof nav.getBattery !== "function") {
|
|
83
102
|
return { onBattery: null, batteryLevel: null, isCharging: null };
|
|
84
103
|
}
|
|
85
|
-
|
|
104
|
+
let battery;
|
|
105
|
+
try {
|
|
106
|
+
battery = await nav.getBattery();
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return { onBattery: null, batteryLevel: null, isCharging: null };
|
|
110
|
+
}
|
|
111
|
+
const charging = typeof battery.charging === "boolean" ? battery.charging : null;
|
|
112
|
+
const level = typeof battery.level === "number" && Number.isFinite(battery.level)
|
|
113
|
+
? Math.max(0, Math.min(1, battery.level))
|
|
114
|
+
: null;
|
|
86
115
|
return {
|
|
87
|
-
onBattery: !
|
|
88
|
-
batteryLevel:
|
|
89
|
-
|
|
90
|
-
: null,
|
|
91
|
-
isCharging: battery.charging,
|
|
116
|
+
onBattery: charging === null ? null : !charging,
|
|
117
|
+
batteryLevel: level,
|
|
118
|
+
isCharging: charging,
|
|
92
119
|
};
|
|
93
120
|
}
|
|
94
121
|
async function buildSnapshot(reason) {
|
|
@@ -175,6 +202,15 @@ export class MobileSignalsWeb extends WebPlugin {
|
|
|
175
202
|
return {
|
|
176
203
|
status: "not-applicable",
|
|
177
204
|
canRequest: false,
|
|
205
|
+
canOpenSettings: false,
|
|
206
|
+
settingsTarget: null,
|
|
207
|
+
engine: "web-fallback",
|
|
208
|
+
capabilities: {
|
|
209
|
+
health: false,
|
|
210
|
+
screenTime: false,
|
|
211
|
+
notifications: false,
|
|
212
|
+
settings: false,
|
|
213
|
+
},
|
|
178
214
|
screenTime: buildScreenTimeStatus("Web fallback has no Family Controls or DeviceActivity access."),
|
|
179
215
|
setupActions: buildSetupActions("Web fallback has no HealthKit or Health Connect access."),
|
|
180
216
|
permissions: {
|
|
@@ -188,22 +224,27 @@ export class MobileSignalsWeb extends WebPlugin {
|
|
|
188
224
|
return this.checkPermissions();
|
|
189
225
|
}
|
|
190
226
|
async openSettings(options = {}) {
|
|
227
|
+
const target = normalizeSettingsTarget(options.target);
|
|
191
228
|
return {
|
|
192
229
|
opened: false,
|
|
193
|
-
target
|
|
230
|
+
target,
|
|
194
231
|
actualTarget: "app",
|
|
195
232
|
reason: "Web fallback cannot open native device settings.",
|
|
196
233
|
};
|
|
197
234
|
}
|
|
198
235
|
attachListeners() {
|
|
199
|
-
if (typeof document !== "undefined"
|
|
236
|
+
if (typeof document !== "undefined" &&
|
|
237
|
+
typeof document.addEventListener === "function" &&
|
|
238
|
+
typeof document.removeEventListener === "function") {
|
|
200
239
|
const handleVisibilityChange = () => {
|
|
201
240
|
void this.emitSignal("visibilitychange");
|
|
202
241
|
};
|
|
203
242
|
document.addEventListener("visibilitychange", handleVisibilityChange);
|
|
204
243
|
this.cleanup.push(() => document.removeEventListener("visibilitychange", handleVisibilityChange));
|
|
205
244
|
}
|
|
206
|
-
if (typeof window !== "undefined"
|
|
245
|
+
if (typeof window !== "undefined" &&
|
|
246
|
+
typeof window.addEventListener === "function" &&
|
|
247
|
+
typeof window.removeEventListener === "function") {
|
|
207
248
|
const handleFocus = () => {
|
|
208
249
|
void this.emitSignal("focus");
|
|
209
250
|
};
|