therms-device-tracker 1.0.0-rc.1
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/ARCHITECTURE.md +145 -0
- package/CHANGELOG.md +26 -0
- package/LICENSE +21 -0
- package/README.md +386 -0
- package/android/build.gradle +25 -0
- package/android/src/main/AndroidManifest.xml +23 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/ActivityRecognitionProvider.kt +109 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/GeofenceProvider.kt +184 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/GeofenceTransitionReceiver.kt +34 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/LocationProvider.kt +84 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/LocationStore.kt +150 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/ScheduleProvider.kt +55 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/SyncProvider.kt +292 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/ThermsDeviceTrackerModule.kt +726 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/ThermsDeviceTrackerModuleSharedObject.kt +23 -0
- package/android/src/main/java/expo/modules/thermsdevicetracker/ThermsLocationService.kt +129 -0
- package/app.plugin.js +1 -0
- package/build/DeviceSettings.d.ts +14 -0
- package/build/DeviceSettings.d.ts.map +1 -0
- package/build/DeviceSettings.js +24 -0
- package/build/DeviceSettings.js.map +1 -0
- package/build/Logger.d.ts +13 -0
- package/build/Logger.d.ts.map +1 -0
- package/build/Logger.js +27 -0
- package/build/Logger.js.map +1 -0
- package/build/NativeModule.d.ts +51 -0
- package/build/NativeModule.d.ts.map +1 -0
- package/build/NativeModule.js +159 -0
- package/build/NativeModule.js.map +1 -0
- package/build/ThermsDeviceTracker.types.d.ts +204 -0
- package/build/ThermsDeviceTracker.types.d.ts.map +1 -0
- package/build/ThermsDeviceTracker.types.js +34 -0
- package/build/ThermsDeviceTracker.types.js.map +1 -0
- package/build/ThermsDeviceTrackerModule.d.ts +43 -0
- package/build/ThermsDeviceTrackerModule.d.ts.map +1 -0
- package/build/ThermsDeviceTrackerModule.js +3 -0
- package/build/ThermsDeviceTrackerModule.js.map +1 -0
- package/build/ThermsDeviceTrackerModule.web.d.ts +47 -0
- package/build/ThermsDeviceTrackerModule.web.d.ts.map +1 -0
- package/build/ThermsDeviceTrackerModule.web.js +132 -0
- package/build/ThermsDeviceTrackerModule.web.js.map +1 -0
- package/build/ThermsDeviceTrackerModuleSharedObject.d.ts +46 -0
- package/build/ThermsDeviceTrackerModuleSharedObject.d.ts.map +1 -0
- package/build/ThermsDeviceTrackerModuleSharedObject.js +24 -0
- package/build/ThermsDeviceTrackerModuleSharedObject.js.map +1 -0
- package/build/index.d.ts +101 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +221 -0
- package/build/index.js.map +1 -0
- package/build/plugin/index.d.ts +14 -0
- package/build/plugin/index.d.ts.map +1 -0
- package/build/plugin/index.js +83 -0
- package/build/plugin/index.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -0
- package/expo-module.config.json +9 -0
- package/ios/GeofenceManager.swift +221 -0
- package/ios/LocationProvider.swift +32 -0
- package/ios/LocationStore.swift +98 -0
- package/ios/MotionActivityProvider.swift +109 -0
- package/ios/ProviderMonitor.swift +33 -0
- package/ios/ScheduleManager.swift +33 -0
- package/ios/SyncManager.swift +186 -0
- package/ios/ThermsDeviceTracker.podspec +24 -0
- package/ios/ThermsDeviceTrackerModule.swift +632 -0
- package/ios/ThermsDeviceTrackerModuleSharedObject.swift +17 -0
- package/ios/ThermsGeofenceTests.swift +474 -0
- package/package.json +95 -0
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThermsDeviceTracker - Main facade
|
|
3
|
+
*
|
|
4
|
+
* Architecture inspired by the excellent design in react-native-background-geolocation:
|
|
5
|
+
* - Clean static facade with named events and constants
|
|
6
|
+
* - Delegation to NativeModule abstraction
|
|
7
|
+
* - Compound config
|
|
8
|
+
* - ready() as primary initialization point
|
|
9
|
+
*
|
|
10
|
+
* Goal: readable, discoverable API with great DX and separation of concerns.
|
|
11
|
+
*/
|
|
12
|
+
import { ThermsConfig, LocationPoint, MotionChangeEvent, ActivityUpdate, ProviderChangeEvent, Geofence, GeofenceEvent, SyncEvent } from './ThermsDeviceTracker.types';
|
|
13
|
+
import { useThermsTracker } from './ThermsDeviceTrackerModuleSharedObject';
|
|
14
|
+
export { default as ThermsDeviceTrackerModule } from './ThermsDeviceTrackerModule';
|
|
15
|
+
export * from './ThermsDeviceTracker.types';
|
|
16
|
+
export { useThermsTracker } from './ThermsDeviceTrackerModuleSharedObject';
|
|
17
|
+
export { Logger } from './Logger';
|
|
18
|
+
export { deviceSettings, DeviceSettings } from './DeviceSettings';
|
|
19
|
+
export declare const EVENT_LOCATION: "onLocationUpdate";
|
|
20
|
+
export declare const EVENT_MOTION_CHANGE: "onMotionChange";
|
|
21
|
+
export declare const EVENT_ACTIVITY_CHANGE: "onActivityUpdate";
|
|
22
|
+
export declare const EVENT_PEDOMETER: "onPedometerUpdate";
|
|
23
|
+
export declare const EVENT_TRACKING_STATE_CHANGE: "onTrackingStateChange";
|
|
24
|
+
export declare const EVENT_PROVIDER_CHANGE: "onProviderChange";
|
|
25
|
+
export declare const EVENT_GEOFENCE: "onGeofence";
|
|
26
|
+
export declare const EVENT_GEOFENCES_CHANGE: "onGeofencesChange";
|
|
27
|
+
export declare const EVENT_SCHEDULE: "onSchedule";
|
|
28
|
+
export declare const EVENT_SYNC: "onSync";
|
|
29
|
+
export declare const EVENT_ERROR: "onError";
|
|
30
|
+
export declare const LogLevel: {
|
|
31
|
+
Off: number;
|
|
32
|
+
Error: number;
|
|
33
|
+
Warning: number;
|
|
34
|
+
Info: number;
|
|
35
|
+
Debug: number;
|
|
36
|
+
Verbose: number;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Main exported API - modeled after high-quality reference libraries.
|
|
40
|
+
*/
|
|
41
|
+
declare class ThermsDeviceTrackerClass {
|
|
42
|
+
static get EVENT_LOCATION(): "onLocationUpdate";
|
|
43
|
+
static get EVENT_MOTION_CHANGE(): "onMotionChange";
|
|
44
|
+
static get EVENT_ACTIVITY_CHANGE(): "onActivityUpdate";
|
|
45
|
+
static get EVENT_ERROR(): "onError";
|
|
46
|
+
static get EVENT_PROVIDER_CHANGE(): "onProviderChange";
|
|
47
|
+
static get EVENT_GEOFENCE(): "onGeofence";
|
|
48
|
+
static get EVENT_GEOFENCES_CHANGE(): "onGeofencesChange";
|
|
49
|
+
static get EVENT_SCHEDULE(): "onSchedule";
|
|
50
|
+
static get EVENT_SYNC(): "onSync";
|
|
51
|
+
/**
|
|
52
|
+
* Primary initialization method (strongly recommended pattern from reference).
|
|
53
|
+
* Register listeners *before* calling ready().
|
|
54
|
+
*/
|
|
55
|
+
static ready(config?: ThermsConfig): Promise<any>;
|
|
56
|
+
static start(config?: ThermsConfig): Promise<any>;
|
|
57
|
+
static stop(): Promise<any>;
|
|
58
|
+
static getState(): any;
|
|
59
|
+
static onLocation(success: (location: LocationPoint) => void, failure?: (error: any) => void): any;
|
|
60
|
+
static onMotionChange(callback: (event: MotionChangeEvent) => void): any;
|
|
61
|
+
static onActivityChange(callback: (activity: ActivityUpdate) => void): any;
|
|
62
|
+
static onError(callback: (error: any) => void): any;
|
|
63
|
+
static onProviderChange(callback: (event: ProviderChangeEvent) => void): any;
|
|
64
|
+
static onGeofence(callback: (event: GeofenceEvent) => void): any;
|
|
65
|
+
static onGeofencesChange(callback: (event: {
|
|
66
|
+
on: Geofence[];
|
|
67
|
+
off: Geofence[];
|
|
68
|
+
}) => void): any;
|
|
69
|
+
static onSchedule(callback: (event: any) => void): any;
|
|
70
|
+
static onSync(callback: (event: SyncEvent) => void): any;
|
|
71
|
+
static getProviderState(): any;
|
|
72
|
+
static getPermissionsAsync(): Promise<any>;
|
|
73
|
+
static requestPermissionsAsync(options?: {
|
|
74
|
+
background?: boolean;
|
|
75
|
+
}): Promise<any>;
|
|
76
|
+
static startTrackingAsync(options?: any): Promise<any>;
|
|
77
|
+
static stopTrackingAsync(): Promise<any>;
|
|
78
|
+
static getCurrentSessionHistory(): Promise<any>;
|
|
79
|
+
static addGeofence(geofence: Geofence): any;
|
|
80
|
+
static addGeofences(geofences: Geofence[]): any;
|
|
81
|
+
static removeGeofence(identifier: string): any;
|
|
82
|
+
static removeGeofences(identifiers?: string[]): any;
|
|
83
|
+
static getGeofences(): Promise<Geofence[]>;
|
|
84
|
+
static startGeofences(): any;
|
|
85
|
+
static getLocations(): any;
|
|
86
|
+
static getCount(): any;
|
|
87
|
+
static destroyLocations(): any;
|
|
88
|
+
static destroyLocation(uuid?: string): any;
|
|
89
|
+
static insertLocation(location: LocationPoint | Record<string, any>): any;
|
|
90
|
+
static startSchedule(): any;
|
|
91
|
+
static stopSchedule(): any;
|
|
92
|
+
static startSync(): any;
|
|
93
|
+
static stopSync(): any;
|
|
94
|
+
static removeAllListeners(): void;
|
|
95
|
+
static get useThermsTracker(): typeof useThermsTracker;
|
|
96
|
+
static get raw(): any;
|
|
97
|
+
}
|
|
98
|
+
declare const ThermsDeviceTracker: typeof ThermsDeviceTrackerClass;
|
|
99
|
+
export default ThermsDeviceTracker;
|
|
100
|
+
export { ThermsDeviceTrackerClass };
|
|
101
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ThermsDeviceTracker - Main facade
|
|
3
|
+
*
|
|
4
|
+
* Architecture inspired by the excellent design in react-native-background-geolocation:
|
|
5
|
+
* - Clean static facade with named events and constants
|
|
6
|
+
* - Delegation to NativeModule abstraction
|
|
7
|
+
* - Compound config
|
|
8
|
+
* - ready() as primary initialization point
|
|
9
|
+
*
|
|
10
|
+
* Goal: readable, discoverable API with great DX and separation of concerns.
|
|
11
|
+
*/
|
|
12
|
+
import { NativeModule } from './NativeModule'; // re-exported as alias
|
|
13
|
+
import { Event, DesiredAccuracy, ActivityTypeEnum, } from './ThermsDeviceTracker.types';
|
|
14
|
+
import ThermsDeviceTrackerModule from './ThermsDeviceTrackerModule';
|
|
15
|
+
import { useThermsTracker } from './ThermsDeviceTrackerModuleSharedObject';
|
|
16
|
+
// Re-export raw module for advanced use / backward compat
|
|
17
|
+
export { default as ThermsDeviceTrackerModule } from './ThermsDeviceTrackerModule';
|
|
18
|
+
export * from './ThermsDeviceTracker.types';
|
|
19
|
+
export { useThermsTracker } from './ThermsDeviceTrackerModuleSharedObject';
|
|
20
|
+
export { Logger } from './Logger';
|
|
21
|
+
export { deviceSettings, DeviceSettings } from './DeviceSettings';
|
|
22
|
+
// Event constants (reference-style)
|
|
23
|
+
export const EVENT_LOCATION = Event.Location;
|
|
24
|
+
export const EVENT_MOTION_CHANGE = Event.MotionChange;
|
|
25
|
+
export const EVENT_ACTIVITY_CHANGE = Event.ActivityChange;
|
|
26
|
+
export const EVENT_PEDOMETER = Event.Pedometer;
|
|
27
|
+
export const EVENT_TRACKING_STATE_CHANGE = Event.TrackingStateChange;
|
|
28
|
+
export const EVENT_PROVIDER_CHANGE = Event.ProviderChange;
|
|
29
|
+
export const EVENT_GEOFENCE = Event.Geofence;
|
|
30
|
+
export const EVENT_GEOFENCES_CHANGE = Event.GeofencesChange;
|
|
31
|
+
export const EVENT_SCHEDULE = Event.Schedule;
|
|
32
|
+
export const EVENT_SYNC = Event.Sync;
|
|
33
|
+
export const EVENT_ERROR = Event.Error;
|
|
34
|
+
// Enum namespaces (highly discoverable, like the reference)
|
|
35
|
+
export const LogLevel = {
|
|
36
|
+
Off: 0,
|
|
37
|
+
Error: 1,
|
|
38
|
+
Warning: 2,
|
|
39
|
+
Info: 3,
|
|
40
|
+
Debug: 4,
|
|
41
|
+
Verbose: 5,
|
|
42
|
+
};
|
|
43
|
+
// DesiredAccuracy and ActivityTypeEnum are re-exported via `export * from './ThermsDeviceTracker.types'` above
|
|
44
|
+
/**
|
|
45
|
+
* Main exported API - modeled after high-quality reference libraries.
|
|
46
|
+
*/
|
|
47
|
+
class ThermsDeviceTrackerClass {
|
|
48
|
+
// Static event names for easy reference
|
|
49
|
+
static get EVENT_LOCATION() {
|
|
50
|
+
return EVENT_LOCATION;
|
|
51
|
+
}
|
|
52
|
+
static get EVENT_MOTION_CHANGE() {
|
|
53
|
+
return EVENT_MOTION_CHANGE;
|
|
54
|
+
}
|
|
55
|
+
static get EVENT_ACTIVITY_CHANGE() {
|
|
56
|
+
return EVENT_ACTIVITY_CHANGE;
|
|
57
|
+
}
|
|
58
|
+
static get EVENT_ERROR() {
|
|
59
|
+
return EVENT_ERROR;
|
|
60
|
+
}
|
|
61
|
+
static get EVENT_PROVIDER_CHANGE() {
|
|
62
|
+
return EVENT_PROVIDER_CHANGE;
|
|
63
|
+
}
|
|
64
|
+
static get EVENT_GEOFENCE() {
|
|
65
|
+
return EVENT_GEOFENCE;
|
|
66
|
+
}
|
|
67
|
+
static get EVENT_GEOFENCES_CHANGE() {
|
|
68
|
+
return EVENT_GEOFENCES_CHANGE;
|
|
69
|
+
}
|
|
70
|
+
static get EVENT_SCHEDULE() {
|
|
71
|
+
return EVENT_SCHEDULE;
|
|
72
|
+
}
|
|
73
|
+
static get EVENT_SYNC() {
|
|
74
|
+
return EVENT_SYNC;
|
|
75
|
+
}
|
|
76
|
+
// Enums available via named imports from the package (DesiredAccuracy, ActivityTypeEnum)
|
|
77
|
+
/**
|
|
78
|
+
* Primary initialization method (strongly recommended pattern from reference).
|
|
79
|
+
* Register listeners *before* calling ready().
|
|
80
|
+
*/
|
|
81
|
+
static async ready(config) {
|
|
82
|
+
return NativeModule.ready(config);
|
|
83
|
+
}
|
|
84
|
+
static async start(config) {
|
|
85
|
+
return NativeModule.start(config);
|
|
86
|
+
}
|
|
87
|
+
static async stop() {
|
|
88
|
+
return NativeModule.stop();
|
|
89
|
+
}
|
|
90
|
+
static getState() {
|
|
91
|
+
return NativeModule.getState();
|
|
92
|
+
}
|
|
93
|
+
// High-level event listeners (excellent DX)
|
|
94
|
+
static onLocation(success, failure) {
|
|
95
|
+
return NativeModule.addListener(EVENT_LOCATION, success);
|
|
96
|
+
}
|
|
97
|
+
static onMotionChange(callback) {
|
|
98
|
+
return NativeModule.addListener(EVENT_MOTION_CHANGE, callback);
|
|
99
|
+
}
|
|
100
|
+
static onActivityChange(callback) {
|
|
101
|
+
return NativeModule.addListener(Event.ActivityChange, callback);
|
|
102
|
+
}
|
|
103
|
+
static onError(callback) {
|
|
104
|
+
return NativeModule.addListener(EVENT_ERROR, callback);
|
|
105
|
+
}
|
|
106
|
+
static onProviderChange(callback) {
|
|
107
|
+
return NativeModule.addListener(EVENT_PROVIDER_CHANGE, callback);
|
|
108
|
+
}
|
|
109
|
+
static onGeofence(callback) {
|
|
110
|
+
return NativeModule.addListener(EVENT_GEOFENCE, callback);
|
|
111
|
+
}
|
|
112
|
+
static onGeofencesChange(callback) {
|
|
113
|
+
return NativeModule.addListener(EVENT_GEOFENCES_CHANGE, callback);
|
|
114
|
+
}
|
|
115
|
+
static onSchedule(callback) {
|
|
116
|
+
return NativeModule.addListener(EVENT_SCHEDULE, callback);
|
|
117
|
+
}
|
|
118
|
+
static onSync(callback) {
|
|
119
|
+
return NativeModule.addListener(EVENT_SYNC, callback);
|
|
120
|
+
}
|
|
121
|
+
static getProviderState() {
|
|
122
|
+
return NativeModule.getProviderState?.() || NativeModule.getState?.();
|
|
123
|
+
}
|
|
124
|
+
// Forward permissions and legacy tracking methods to support documented + example usage
|
|
125
|
+
static async getPermissionsAsync() {
|
|
126
|
+
const mod = ThermsDeviceTrackerModule;
|
|
127
|
+
return mod.getPermissionsAsync
|
|
128
|
+
? mod.getPermissionsAsync()
|
|
129
|
+
: { status: 'undetermined', canAskAgain: true };
|
|
130
|
+
}
|
|
131
|
+
static async requestPermissionsAsync(options) {
|
|
132
|
+
const mod = ThermsDeviceTrackerModule;
|
|
133
|
+
return mod.requestPermissionsAsync
|
|
134
|
+
? mod.requestPermissionsAsync(options)
|
|
135
|
+
: { status: 'granted' };
|
|
136
|
+
}
|
|
137
|
+
static async startTrackingAsync(options) {
|
|
138
|
+
const mod = ThermsDeviceTrackerModule;
|
|
139
|
+
return mod.startTrackingAsync ? mod.startTrackingAsync(options) : this.start(options);
|
|
140
|
+
}
|
|
141
|
+
static async stopTrackingAsync() {
|
|
142
|
+
const mod = ThermsDeviceTrackerModule;
|
|
143
|
+
return mod.stopTrackingAsync ? mod.stopTrackingAsync() : this.stop();
|
|
144
|
+
}
|
|
145
|
+
static async getCurrentSessionHistory() {
|
|
146
|
+
const mod = ThermsDeviceTrackerModule;
|
|
147
|
+
return mod.getCurrentSessionHistory
|
|
148
|
+
? mod.getCurrentSessionHistory()
|
|
149
|
+
: NativeModule.getCurrentSessionHistory?.() || { locations: [], activities: [] };
|
|
150
|
+
}
|
|
151
|
+
// Geofencing (reference API)
|
|
152
|
+
static addGeofence(geofence) {
|
|
153
|
+
return NativeModule.addGeofence?.(geofence);
|
|
154
|
+
}
|
|
155
|
+
static addGeofences(geofences) {
|
|
156
|
+
return NativeModule.addGeofences?.(geofences);
|
|
157
|
+
}
|
|
158
|
+
static removeGeofence(identifier) {
|
|
159
|
+
return NativeModule.removeGeofence?.(identifier);
|
|
160
|
+
}
|
|
161
|
+
static removeGeofences(identifiers) {
|
|
162
|
+
return NativeModule.removeGeofences?.(identifiers);
|
|
163
|
+
}
|
|
164
|
+
static getGeofences() {
|
|
165
|
+
return NativeModule.getGeofences?.() || Promise.resolve([]);
|
|
166
|
+
}
|
|
167
|
+
static startGeofences() {
|
|
168
|
+
return NativeModule.startGeofences?.();
|
|
169
|
+
}
|
|
170
|
+
// Persistence (reference: getLocations, destroyLocations, insert for test)
|
|
171
|
+
static getLocations() {
|
|
172
|
+
return (NativeModule.getLocations?.() || NativeModule.getCurrentSessionHistory?.());
|
|
173
|
+
}
|
|
174
|
+
static getCount() {
|
|
175
|
+
return NativeModule.getCount?.() || Promise.resolve(0);
|
|
176
|
+
}
|
|
177
|
+
static destroyLocations() {
|
|
178
|
+
return NativeModule.destroyLocations?.();
|
|
179
|
+
}
|
|
180
|
+
static destroyLocation(uuid) {
|
|
181
|
+
return NativeModule.destroyLocation?.(uuid);
|
|
182
|
+
}
|
|
183
|
+
static insertLocation(location) {
|
|
184
|
+
return NativeModule.insertLocation?.(location);
|
|
185
|
+
}
|
|
186
|
+
// Scheduler
|
|
187
|
+
static startSchedule() {
|
|
188
|
+
return NativeModule.startSchedule?.();
|
|
189
|
+
}
|
|
190
|
+
static stopSchedule() {
|
|
191
|
+
return NativeModule.stopSchedule?.();
|
|
192
|
+
}
|
|
193
|
+
// Background sync (opt-in native HTTP via SyncManager/SyncProvider; config-driven primary, explicit for parity with schedule).
|
|
194
|
+
// Use ThermsDeviceTracker.onSync(...) to receive events (callback seam from native).
|
|
195
|
+
static startSync() {
|
|
196
|
+
return NativeModule.startSync?.();
|
|
197
|
+
}
|
|
198
|
+
static stopSync() {
|
|
199
|
+
return NativeModule.stopSync?.();
|
|
200
|
+
}
|
|
201
|
+
static removeAllListeners() {
|
|
202
|
+
NativeModule.removeAllListeners();
|
|
203
|
+
}
|
|
204
|
+
// Convenience access to live state via SharedObject
|
|
205
|
+
static get useThermsTracker() {
|
|
206
|
+
return useThermsTracker;
|
|
207
|
+
}
|
|
208
|
+
// Raw module escape hatch (for advanced use)
|
|
209
|
+
static get raw() {
|
|
210
|
+
return ThermsDeviceTrackerModule;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Attach discoverable enum namespaces on the default export class (ThermsDeviceTracker.DesiredAccuracy)
|
|
214
|
+
ThermsDeviceTrackerClass.DesiredAccuracy = DesiredAccuracy;
|
|
215
|
+
ThermsDeviceTrackerClass.ActivityTypeEnum = ActivityTypeEnum;
|
|
216
|
+
// Default export as the main class (like the reference)
|
|
217
|
+
const ThermsDeviceTracker = ThermsDeviceTrackerClass;
|
|
218
|
+
export default ThermsDeviceTracker;
|
|
219
|
+
// Also export the class and instance style for flexibility
|
|
220
|
+
export { ThermsDeviceTrackerClass };
|
|
221
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ThermsDeviceTracker - Main facade\n *\n * Architecture inspired by the excellent design in react-native-background-geolocation:\n * - Clean static facade with named events and constants\n * - Delegation to NativeModule abstraction\n * - Compound config\n * - ready() as primary initialization point\n *\n * Goal: readable, discoverable API with great DX and separation of concerns.\n */\n\nimport { NativeModule } from './NativeModule'; // re-exported as alias\nimport {\n ThermsConfig,\n Event,\n LocationPoint,\n MotionChangeEvent,\n ActivityUpdate,\n ProviderChangeEvent,\n Geofence,\n GeofenceEvent,\n SyncEvent,\n DesiredAccuracy,\n ActivityTypeEnum,\n} from './ThermsDeviceTracker.types';\nimport ThermsDeviceTrackerModule from './ThermsDeviceTrackerModule';\nimport { useThermsTracker } from './ThermsDeviceTrackerModuleSharedObject';\n\n// Re-export raw module for advanced use / backward compat\nexport { default as ThermsDeviceTrackerModule } from './ThermsDeviceTrackerModule';\nexport * from './ThermsDeviceTracker.types';\nexport { useThermsTracker } from './ThermsDeviceTrackerModuleSharedObject';\nexport { Logger } from './Logger';\nexport { deviceSettings, DeviceSettings } from './DeviceSettings';\n\n// Event constants (reference-style)\nexport const EVENT_LOCATION = Event.Location;\nexport const EVENT_MOTION_CHANGE = Event.MotionChange;\nexport const EVENT_ACTIVITY_CHANGE = Event.ActivityChange;\nexport const EVENT_PEDOMETER = Event.Pedometer;\nexport const EVENT_TRACKING_STATE_CHANGE = Event.TrackingStateChange;\nexport const EVENT_PROVIDER_CHANGE = Event.ProviderChange;\nexport const EVENT_GEOFENCE = Event.Geofence;\nexport const EVENT_GEOFENCES_CHANGE = Event.GeofencesChange;\nexport const EVENT_SCHEDULE = Event.Schedule;\nexport const EVENT_SYNC = Event.Sync;\nexport const EVENT_ERROR = Event.Error;\n\n// Enum namespaces (highly discoverable, like the reference)\nexport const LogLevel = {\n Off: 0,\n Error: 1,\n Warning: 2,\n Info: 3,\n Debug: 4,\n Verbose: 5,\n};\n\n// DesiredAccuracy and ActivityTypeEnum are re-exported via `export * from './ThermsDeviceTracker.types'` above\n\n/**\n * Main exported API - modeled after high-quality reference libraries.\n */\nclass ThermsDeviceTrackerClass {\n // Static event names for easy reference\n static get EVENT_LOCATION() {\n return EVENT_LOCATION;\n }\n static get EVENT_MOTION_CHANGE() {\n return EVENT_MOTION_CHANGE;\n }\n static get EVENT_ACTIVITY_CHANGE() {\n return EVENT_ACTIVITY_CHANGE;\n }\n static get EVENT_ERROR() {\n return EVENT_ERROR;\n }\n static get EVENT_PROVIDER_CHANGE() {\n return EVENT_PROVIDER_CHANGE;\n }\n static get EVENT_GEOFENCE() {\n return EVENT_GEOFENCE;\n }\n static get EVENT_GEOFENCES_CHANGE() {\n return EVENT_GEOFENCES_CHANGE;\n }\n static get EVENT_SCHEDULE() {\n return EVENT_SCHEDULE;\n }\n static get EVENT_SYNC() {\n return EVENT_SYNC;\n }\n\n // Enums available via named imports from the package (DesiredAccuracy, ActivityTypeEnum)\n\n /**\n * Primary initialization method (strongly recommended pattern from reference).\n * Register listeners *before* calling ready().\n */\n static async ready(config?: ThermsConfig) {\n return NativeModule.ready(config);\n }\n\n static async start(config?: ThermsConfig) {\n return NativeModule.start(config);\n }\n\n static async stop() {\n return NativeModule.stop();\n }\n\n static getState() {\n return NativeModule.getState();\n }\n\n // High-level event listeners (excellent DX)\n static onLocation(success: (location: LocationPoint) => void, failure?: (error: any) => void) {\n return NativeModule.addListener(EVENT_LOCATION as any, success);\n }\n\n static onMotionChange(callback: (event: MotionChangeEvent) => void) {\n return NativeModule.addListener(EVENT_MOTION_CHANGE as any, callback);\n }\n\n static onActivityChange(callback: (activity: ActivityUpdate) => void) {\n return NativeModule.addListener(Event.ActivityChange as any, callback);\n }\n\n static onError(callback: (error: any) => void) {\n return NativeModule.addListener(EVENT_ERROR as any, callback);\n }\n\n static onProviderChange(callback: (event: ProviderChangeEvent) => void) {\n return NativeModule.addListener(EVENT_PROVIDER_CHANGE as any, callback);\n }\n\n static onGeofence(callback: (event: GeofenceEvent) => void) {\n return NativeModule.addListener(EVENT_GEOFENCE as any, callback);\n }\n\n static onGeofencesChange(callback: (event: { on: Geofence[]; off: Geofence[] }) => void) {\n return NativeModule.addListener(EVENT_GEOFENCES_CHANGE as any, callback);\n }\n\n static onSchedule(callback: (event: any) => void) {\n return NativeModule.addListener(EVENT_SCHEDULE as any, callback);\n }\n\n static onSync(callback: (event: SyncEvent) => void) {\n return NativeModule.addListener(EVENT_SYNC as any, callback);\n }\n\n static getProviderState() {\n return (NativeModule as any).getProviderState?.() || (NativeModule as any).getState?.();\n }\n\n // Forward permissions and legacy tracking methods to support documented + example usage\n static async getPermissionsAsync() {\n const mod = ThermsDeviceTrackerModule as any;\n return mod.getPermissionsAsync\n ? mod.getPermissionsAsync()\n : { status: 'undetermined', canAskAgain: true };\n }\n\n static async requestPermissionsAsync(options?: { background?: boolean }) {\n const mod = ThermsDeviceTrackerModule as any;\n return mod.requestPermissionsAsync\n ? mod.requestPermissionsAsync(options)\n : { status: 'granted' };\n }\n\n static async startTrackingAsync(options?: any) {\n const mod = ThermsDeviceTrackerModule as any;\n return mod.startTrackingAsync ? mod.startTrackingAsync(options) : this.start(options);\n }\n\n static async stopTrackingAsync() {\n const mod = ThermsDeviceTrackerModule as any;\n return mod.stopTrackingAsync ? mod.stopTrackingAsync() : this.stop();\n }\n\n static async getCurrentSessionHistory() {\n const mod = ThermsDeviceTrackerModule as any;\n return mod.getCurrentSessionHistory\n ? mod.getCurrentSessionHistory()\n : (NativeModule as any).getCurrentSessionHistory?.() || { locations: [], activities: [] };\n }\n\n // Geofencing (reference API)\n static addGeofence(geofence: Geofence) {\n return (NativeModule as any).addGeofence?.(geofence);\n }\n\n static addGeofences(geofences: Geofence[]) {\n return (NativeModule as any).addGeofences?.(geofences);\n }\n\n static removeGeofence(identifier: string) {\n return (NativeModule as any).removeGeofence?.(identifier);\n }\n\n static removeGeofences(identifiers?: string[]) {\n return (NativeModule as any).removeGeofences?.(identifiers);\n }\n\n static getGeofences(): Promise<Geofence[]> {\n return (NativeModule as any).getGeofences?.() || Promise.resolve([]);\n }\n\n static startGeofences() {\n return (NativeModule as any).startGeofences?.();\n }\n\n // Persistence (reference: getLocations, destroyLocations, insert for test)\n static getLocations() {\n return (\n (NativeModule as any).getLocations?.() || (NativeModule as any).getCurrentSessionHistory?.()\n );\n }\n\n static getCount() {\n return (NativeModule as any).getCount?.() || Promise.resolve(0);\n }\n\n static destroyLocations() {\n return (NativeModule as any).destroyLocations?.();\n }\n\n static destroyLocation(uuid?: string) {\n return (NativeModule as any).destroyLocation?.(uuid);\n }\n\n static insertLocation(location: LocationPoint | Record<string, any>) {\n return (NativeModule as any).insertLocation?.(location);\n }\n\n // Scheduler\n static startSchedule() {\n return (NativeModule as any).startSchedule?.();\n }\n\n static stopSchedule() {\n return (NativeModule as any).stopSchedule?.();\n }\n\n // Background sync (opt-in native HTTP via SyncManager/SyncProvider; config-driven primary, explicit for parity with schedule).\n // Use ThermsDeviceTracker.onSync(...) to receive events (callback seam from native).\n static startSync() {\n return (NativeModule as any).startSync?.();\n }\n\n static stopSync() {\n return (NativeModule as any).stopSync?.();\n }\n\n static removeAllListeners() {\n NativeModule.removeAllListeners();\n }\n\n // Convenience access to live state via SharedObject\n static get useThermsTracker() {\n return useThermsTracker;\n }\n\n // Raw module escape hatch (for advanced use)\n static get raw(): any {\n return ThermsDeviceTrackerModule;\n }\n}\n\n// Attach discoverable enum namespaces on the default export class (ThermsDeviceTracker.DesiredAccuracy)\n(ThermsDeviceTrackerClass as any).DesiredAccuracy = DesiredAccuracy;\n(ThermsDeviceTrackerClass as any).ActivityTypeEnum = ActivityTypeEnum;\n\n// Default export as the main class (like the reference)\nconst ThermsDeviceTracker = ThermsDeviceTrackerClass;\n\nexport default ThermsDeviceTracker;\n\n// Also export the class and instance style for flexibility\nexport { ThermsDeviceTrackerClass };\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ConfigPlugin } from 'expo/config-plugins';
|
|
2
|
+
export interface ThermsDeviceTrackerPluginProps {
|
|
3
|
+
locationWhenInUsePermission?: string;
|
|
4
|
+
locationAlwaysAndWhenInUsePermission?: string;
|
|
5
|
+
locationAlwaysPermission?: string;
|
|
6
|
+
motionPermission?: string;
|
|
7
|
+
isIosBackgroundLocationEnabled?: boolean;
|
|
8
|
+
isAndroidBackgroundLocationEnabled?: boolean;
|
|
9
|
+
isAndroidForegroundServiceEnabled?: boolean;
|
|
10
|
+
iosBackgroundTaskIdentifier?: string;
|
|
11
|
+
}
|
|
12
|
+
declare const _default: ConfigPlugin<ThermsDeviceTrackerPluginProps>;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../plugin/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAIb,MAAM,qBAAqB,CAAC;AAM7B,MAAM,WAAW,8BAA8B;IAC7C,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,oCAAoC,CAAC,EAAE,MAAM,CAAC;IAC9C,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,iCAAiC,CAAC,EAAE,OAAO,CAAC;IAI5C,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;;AAiHD,wBAAmF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const config_plugins_1 = require("expo/config-plugins");
|
|
7
|
+
const package_json_1 = __importDefault(require("../../package.json"));
|
|
8
|
+
// @ts-ignore - JSON import
|
|
9
|
+
const pkg = package_json_1.default;
|
|
10
|
+
const DEFAULTS = {
|
|
11
|
+
locationWhenInUsePermission: 'Allow $(PRODUCT_NAME) to access your location while using the app.',
|
|
12
|
+
locationAlwaysAndWhenInUsePermission: 'Allow $(PRODUCT_NAME) to access your location in the background to track activity and location.',
|
|
13
|
+
motionPermission: 'Allow $(PRODUCT_NAME) to access your device motion and physical activity for tracking.',
|
|
14
|
+
};
|
|
15
|
+
const withThermsDeviceTracker = (config, props = {}) => {
|
|
16
|
+
const { locationWhenInUsePermission = DEFAULTS.locationWhenInUsePermission, locationAlwaysAndWhenInUsePermission = props.locationAlwaysPermission ?? DEFAULTS.locationAlwaysAndWhenInUsePermission, motionPermission = DEFAULTS.motionPermission, isIosBackgroundLocationEnabled = true, isAndroidBackgroundLocationEnabled = true, isAndroidForegroundServiceEnabled = true, iosBackgroundTaskIdentifier, } = props;
|
|
17
|
+
// iOS
|
|
18
|
+
config = (0, config_plugins_1.withInfoPlist)(config, (config) => {
|
|
19
|
+
const infoPlist = config.modResults;
|
|
20
|
+
infoPlist.NSLocationWhenInUseUsageDescription =
|
|
21
|
+
infoPlist.NSLocationWhenInUseUsageDescription ?? locationWhenInUsePermission;
|
|
22
|
+
infoPlist.NSLocationAlwaysAndWhenInUseUsageDescription =
|
|
23
|
+
infoPlist.NSLocationAlwaysAndWhenInUseUsageDescription ?? locationAlwaysAndWhenInUsePermission;
|
|
24
|
+
// Also set the older key for compatibility
|
|
25
|
+
infoPlist.NSLocationAlwaysUsageDescription =
|
|
26
|
+
infoPlist.NSLocationAlwaysUsageDescription ?? locationAlwaysAndWhenInUsePermission;
|
|
27
|
+
infoPlist.NSMotionUsageDescription =
|
|
28
|
+
infoPlist.NSMotionUsageDescription ?? motionPermission;
|
|
29
|
+
if (isIosBackgroundLocationEnabled) {
|
|
30
|
+
let currentModes = infoPlist.UIBackgroundModes ?? [];
|
|
31
|
+
if (!currentModes.includes('location')) {
|
|
32
|
+
currentModes = [...currentModes, 'location'];
|
|
33
|
+
}
|
|
34
|
+
// For bg sync (URLSession bg tasks + potential BGTaskScheduler), 'fetch' enables background data/network tasks.
|
|
35
|
+
if (!currentModes.includes('fetch')) {
|
|
36
|
+
currentModes = [...currentModes, 'fetch'];
|
|
37
|
+
}
|
|
38
|
+
infoPlist.UIBackgroundModes = currentModes;
|
|
39
|
+
if (iosBackgroundTaskIdentifier && iosBackgroundTaskIdentifier.length > 0) {
|
|
40
|
+
const existingIds = infoPlist.BGTaskSchedulerPermittedIdentifiers ?? [];
|
|
41
|
+
if (!existingIds.includes(iosBackgroundTaskIdentifier)) {
|
|
42
|
+
infoPlist.BGTaskSchedulerPermittedIdentifiers = [...existingIds, iosBackgroundTaskIdentifier];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return config;
|
|
47
|
+
});
|
|
48
|
+
// Android
|
|
49
|
+
config = (0, config_plugins_1.withAndroidManifest)(config, (config) => {
|
|
50
|
+
const androidManifest = config.modResults;
|
|
51
|
+
const { manifest } = androidManifest;
|
|
52
|
+
if (!manifest['uses-permission']) {
|
|
53
|
+
manifest['uses-permission'] = [];
|
|
54
|
+
}
|
|
55
|
+
const permissionsToAdd = [
|
|
56
|
+
'android.permission.ACCESS_FINE_LOCATION',
|
|
57
|
+
'android.permission.ACCESS_COARSE_LOCATION',
|
|
58
|
+
'android.permission.ACTIVITY_RECOGNITION',
|
|
59
|
+
'android.permission.INTERNET', // for opt-in native bg sync uploads
|
|
60
|
+
];
|
|
61
|
+
if (isAndroidForegroundServiceEnabled) {
|
|
62
|
+
permissionsToAdd.push('android.permission.FOREGROUND_SERVICE', 'android.permission.FOREGROUND_SERVICE_LOCATION');
|
|
63
|
+
}
|
|
64
|
+
if (isAndroidBackgroundLocationEnabled) {
|
|
65
|
+
permissionsToAdd.push('android.permission.ACCESS_BACKGROUND_LOCATION');
|
|
66
|
+
}
|
|
67
|
+
// Add permissions if not already present
|
|
68
|
+
for (const perm of permissionsToAdd) {
|
|
69
|
+
const already = manifest['uses-permission'].some((p) => p.$?.['android:name'] === perm);
|
|
70
|
+
if (!already) {
|
|
71
|
+
manifest['uses-permission'].push({
|
|
72
|
+
$: { 'android:name': perm },
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Foreground service declaration (merged from module AndroidManifest or host app prebuild)
|
|
77
|
+
// Full declaration added via withAndroidManifest + service helper when needed.
|
|
78
|
+
return config;
|
|
79
|
+
});
|
|
80
|
+
return config;
|
|
81
|
+
};
|
|
82
|
+
exports.default = (0, config_plugins_1.createRunOncePlugin)(withThermsDeviceTracker, pkg.name, pkg.version);
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../plugin/src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ConfigPlugin,\n createRunOncePlugin,\n withInfoPlist,\n withAndroidManifest,\n} from 'expo/config-plugins';\n\nimport pkgJson from '../../package.json';\n// @ts-ignore - JSON import\nconst pkg = pkgJson as { name: string; version: string };\n\nexport interface ThermsDeviceTrackerPluginProps {\n locationWhenInUsePermission?: string;\n locationAlwaysAndWhenInUsePermission?: string;\n locationAlwaysPermission?: string;\n motionPermission?: string;\n isIosBackgroundLocationEnabled?: boolean;\n isAndroidBackgroundLocationEnabled?: boolean;\n isAndroidForegroundServiceEnabled?: boolean;\n // iOS: Appends to BGTaskSchedulerPermittedIdentifiers for true periodic background sync\n // via BGTaskScheduler (see SyncManager.swift CRITICAL section). The plugin only handles\n // the plist entry; AppDelegate registration + task submission remains manual (or use expo-task-manager).\n iosBackgroundTaskIdentifier?: string;\n}\n\nconst DEFAULTS = {\n locationWhenInUsePermission:\n 'Allow $(PRODUCT_NAME) to access your location while using the app.',\n locationAlwaysAndWhenInUsePermission:\n 'Allow $(PRODUCT_NAME) to access your location in the background to track activity and location.',\n motionPermission:\n 'Allow $(PRODUCT_NAME) to access your device motion and physical activity for tracking.',\n};\n\nconst withThermsDeviceTracker: ConfigPlugin<ThermsDeviceTrackerPluginProps> = (\n config,\n props = {}\n) => {\n const {\n locationWhenInUsePermission = DEFAULTS.locationWhenInUsePermission,\n locationAlwaysAndWhenInUsePermission =\n props.locationAlwaysPermission ?? DEFAULTS.locationAlwaysAndWhenInUsePermission,\n motionPermission = DEFAULTS.motionPermission,\n isIosBackgroundLocationEnabled = true,\n isAndroidBackgroundLocationEnabled = true,\n isAndroidForegroundServiceEnabled = true,\n iosBackgroundTaskIdentifier,\n } = props;\n\n // iOS\n config = withInfoPlist(config, (config) => {\n const infoPlist = config.modResults;\n\n infoPlist.NSLocationWhenInUseUsageDescription =\n infoPlist.NSLocationWhenInUseUsageDescription ?? locationWhenInUsePermission;\n\n infoPlist.NSLocationAlwaysAndWhenInUseUsageDescription =\n infoPlist.NSLocationAlwaysAndWhenInUseUsageDescription ?? locationAlwaysAndWhenInUsePermission;\n\n // Also set the older key for compatibility\n infoPlist.NSLocationAlwaysUsageDescription =\n infoPlist.NSLocationAlwaysUsageDescription ?? locationAlwaysAndWhenInUsePermission;\n\n infoPlist.NSMotionUsageDescription =\n infoPlist.NSMotionUsageDescription ?? motionPermission;\n\n if (isIosBackgroundLocationEnabled) {\n let currentModes = (infoPlist.UIBackgroundModes as string[] | undefined) ?? [];\n if (!currentModes.includes('location')) {\n currentModes = [...currentModes, 'location'];\n }\n // For bg sync (URLSession bg tasks + potential BGTaskScheduler), 'fetch' enables background data/network tasks.\n if (!currentModes.includes('fetch')) {\n currentModes = [...currentModes, 'fetch'];\n }\n infoPlist.UIBackgroundModes = currentModes;\n\n if (iosBackgroundTaskIdentifier && iosBackgroundTaskIdentifier.length > 0) {\n const existingIds = (infoPlist.BGTaskSchedulerPermittedIdentifiers as string[] | undefined) ?? [];\n if (!existingIds.includes(iosBackgroundTaskIdentifier)) {\n infoPlist.BGTaskSchedulerPermittedIdentifiers = [...existingIds, iosBackgroundTaskIdentifier];\n }\n }\n }\n\n return config;\n });\n\n // Android\n config = withAndroidManifest(config, (config) => {\n const androidManifest = config.modResults;\n const { manifest } = androidManifest;\n\n if (!manifest['uses-permission']) {\n manifest['uses-permission'] = [];\n }\n\n const permissionsToAdd = [\n 'android.permission.ACCESS_FINE_LOCATION',\n 'android.permission.ACCESS_COARSE_LOCATION',\n 'android.permission.ACTIVITY_RECOGNITION',\n 'android.permission.INTERNET', // for opt-in native bg sync uploads\n ];\n\n if (isAndroidForegroundServiceEnabled) {\n permissionsToAdd.push(\n 'android.permission.FOREGROUND_SERVICE',\n 'android.permission.FOREGROUND_SERVICE_LOCATION'\n );\n }\n\n if (isAndroidBackgroundLocationEnabled) {\n permissionsToAdd.push('android.permission.ACCESS_BACKGROUND_LOCATION');\n }\n\n // Add permissions if not already present\n for (const perm of permissionsToAdd) {\n const already = manifest['uses-permission'].some(\n (p: any) => p.$?.['android:name'] === perm\n );\n if (!already) {\n manifest['uses-permission'].push({\n $: { 'android:name': perm },\n });\n }\n }\n\n // Foreground service declaration (merged from module AndroidManifest or host app prebuild)\n // Full declaration added via withAndroidManifest + service helper when needed.\n\n return config;\n });\n\n return config;\n};\n\nexport default createRunOncePlugin(withThermsDeviceTracker, pkg.name, pkg.version);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["../plugin/src/index.ts"],"version":"5.9.3"}
|