react-native-step-tracker-pro 1.0.0

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.
Files changed (110) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/android/build.gradle +119 -0
  4. package/android/consumer-rules.pro +13 -0
  5. package/android/gradle.properties +3 -0
  6. package/android/src/main/AndroidManifest.xml +78 -0
  7. package/android/src/main/java/com/steptrackerpro/StepTrackerProModule.kt +598 -0
  8. package/android/src/main/java/com/steptrackerpro/StepTrackerProPackage.kt +26 -0
  9. package/android/src/main/java/com/steptrackerpro/core/DateKeys.kt +90 -0
  10. package/android/src/main/java/com/steptrackerpro/core/GoalTracker.kt +66 -0
  11. package/android/src/main/java/com/steptrackerpro/core/MetricsCalculator.kt +48 -0
  12. package/android/src/main/java/com/steptrackerpro/core/Models.kt +73 -0
  13. package/android/src/main/java/com/steptrackerpro/core/StepCounterEngine.kt +338 -0
  14. package/android/src/main/java/com/steptrackerpro/core/StepStateStore.kt +137 -0
  15. package/android/src/main/java/com/steptrackerpro/core/StepTrackerConfig.kt +184 -0
  16. package/android/src/main/java/com/steptrackerpro/core/StepTrackerCore.kt +280 -0
  17. package/android/src/main/java/com/steptrackerpro/db/Entities.kt +67 -0
  18. package/android/src/main/java/com/steptrackerpro/db/StepDao.kt +118 -0
  19. package/android/src/main/java/com/steptrackerpro/db/StepDatabase.kt +60 -0
  20. package/android/src/main/java/com/steptrackerpro/db/StepRepository.kt +146 -0
  21. package/android/src/main/java/com/steptrackerpro/health/HealthConnectManager.kt +198 -0
  22. package/android/src/main/java/com/steptrackerpro/health/HealthPermissionActivity.kt +99 -0
  23. package/android/src/main/java/com/steptrackerpro/service/BootReceiver.kt +54 -0
  24. package/android/src/main/java/com/steptrackerpro/service/NotificationActionReceiver.kt +17 -0
  25. package/android/src/main/java/com/steptrackerpro/service/NotificationFactory.kt +170 -0
  26. package/android/src/main/java/com/steptrackerpro/service/ServiceCommands.kt +42 -0
  27. package/android/src/main/java/com/steptrackerpro/service/StepTrackerService.kt +409 -0
  28. package/android/src/main/java/com/steptrackerpro/sync/SyncScheduler.kt +102 -0
  29. package/android/src/main/java/com/steptrackerpro/sync/SyncWorkers.kt +175 -0
  30. package/android/src/main/java/com/steptrackerpro/util/BatteryOptimizationHelper.kt +94 -0
  31. package/android/src/main/java/com/steptrackerpro/util/Bridge.kt +149 -0
  32. package/android/src/main/java/com/steptrackerpro/util/PermissionHelper.kt +92 -0
  33. package/android/src/main/java/com/steptrackerpro/util/StepEventBus.kt +53 -0
  34. package/android/src/main/res/drawable/stp_ic_steps.xml +9 -0
  35. package/android/src/main/res/values/strings.xml +9 -0
  36. package/android/src/main/res/values/styles.xml +8 -0
  37. package/android/src/newarch/java/com/steptrackerpro/StepTrackerProSpec.kt +10 -0
  38. package/android/src/oldarch/java/com/steptrackerpro/StepTrackerProSpec.kt +60 -0
  39. package/docs/API.md +329 -0
  40. package/docs/ARCHITECTURE.md +203 -0
  41. package/docs/INSTALLATION.md +175 -0
  42. package/docs/PLAY_STORE_COMPLIANCE.md +122 -0
  43. package/docs/TESTING.md +312 -0
  44. package/docs/TROUBLESHOOTING.md +96 -0
  45. package/lib/commonjs/NativeStepTrackerPro.js +14 -0
  46. package/lib/commonjs/NativeStepTrackerPro.js.map +1 -0
  47. package/lib/commonjs/StepTracker.js +290 -0
  48. package/lib/commonjs/StepTracker.js.map +1 -0
  49. package/lib/commonjs/constants.js +30 -0
  50. package/lib/commonjs/constants.js.map +1 -0
  51. package/lib/commonjs/errors.js +24 -0
  52. package/lib/commonjs/errors.js.map +1 -0
  53. package/lib/commonjs/hooks/index.js +20 -0
  54. package/lib/commonjs/hooks/index.js.map +1 -0
  55. package/lib/commonjs/hooks/useStepStats.js +51 -0
  56. package/lib/commonjs/hooks/useStepStats.js.map +1 -0
  57. package/lib/commonjs/hooks/useStepTracker.js +134 -0
  58. package/lib/commonjs/hooks/useStepTracker.js.map +1 -0
  59. package/lib/commonjs/index.js +64 -0
  60. package/lib/commonjs/index.js.map +1 -0
  61. package/lib/commonjs/package.json +1 -0
  62. package/lib/commonjs/types.js +2 -0
  63. package/lib/commonjs/types.js.map +1 -0
  64. package/lib/module/NativeStepTrackerPro.js +12 -0
  65. package/lib/module/NativeStepTrackerPro.js.map +1 -0
  66. package/lib/module/StepTracker.js +284 -0
  67. package/lib/module/StepTracker.js.map +1 -0
  68. package/lib/module/constants.js +26 -0
  69. package/lib/module/constants.js.map +1 -0
  70. package/lib/module/errors.js +18 -0
  71. package/lib/module/errors.js.map +1 -0
  72. package/lib/module/hooks/index.js +5 -0
  73. package/lib/module/hooks/index.js.map +1 -0
  74. package/lib/module/hooks/useStepStats.js +46 -0
  75. package/lib/module/hooks/useStepStats.js.map +1 -0
  76. package/lib/module/hooks/useStepTracker.js +129 -0
  77. package/lib/module/hooks/useStepTracker.js.map +1 -0
  78. package/lib/module/index.js +7 -0
  79. package/lib/module/index.js.map +1 -0
  80. package/lib/module/package.json +1 -0
  81. package/lib/module/types.js +2 -0
  82. package/lib/module/types.js.map +1 -0
  83. package/lib/typescript/NativeStepTrackerPro.d.ts +50 -0
  84. package/lib/typescript/NativeStepTrackerPro.d.ts.map +1 -0
  85. package/lib/typescript/StepTracker.d.ts +76 -0
  86. package/lib/typescript/StepTracker.d.ts.map +1 -0
  87. package/lib/typescript/constants.d.ts +10 -0
  88. package/lib/typescript/constants.d.ts.map +1 -0
  89. package/lib/typescript/errors.d.ts +8 -0
  90. package/lib/typescript/errors.d.ts.map +1 -0
  91. package/lib/typescript/hooks/index.d.ts +5 -0
  92. package/lib/typescript/hooks/index.d.ts.map +1 -0
  93. package/lib/typescript/hooks/useStepStats.d.ts +11 -0
  94. package/lib/typescript/hooks/useStepStats.d.ts.map +1 -0
  95. package/lib/typescript/hooks/useStepTracker.d.ts +26 -0
  96. package/lib/typescript/hooks/useStepTracker.d.ts.map +1 -0
  97. package/lib/typescript/index.d.ts +7 -0
  98. package/lib/typescript/index.d.ts.map +1 -0
  99. package/lib/typescript/types.d.ts +183 -0
  100. package/lib/typescript/types.d.ts.map +1 -0
  101. package/package.json +79 -0
  102. package/src/NativeStepTrackerPro.ts +66 -0
  103. package/src/StepTracker.ts +410 -0
  104. package/src/constants.ts +43 -0
  105. package/src/errors.ts +31 -0
  106. package/src/hooks/index.ts +4 -0
  107. package/src/hooks/useStepStats.ts +55 -0
  108. package/src/hooks/useStepTracker.ts +167 -0
  109. package/src/index.ts +27 -0
  110. package/src/types.ts +203 -0
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ export { StepTracker, StepTracker as default, isSupported } from './StepTracker';
4
+ export { StepTrackerError } from './errors';
5
+ export { DEFAULT_CONFIG, STRIDE_COEFFICIENT } from './constants';
6
+ export * from './hooks';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StepTracker","default","isSupported","StepTrackerError","DEFAULT_CONFIG","STRIDE_COEFFICIENT"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,WAAW,EAAEA,WAAW,IAAIC,OAAO,EAAEC,WAAW,QAAQ,eAAe;AAChF,SAASC,gBAAgB,QAAQ,UAAU;AAE3C,SAASC,cAAc,EAAEC,kBAAkB,QAAQ,aAAa;AAChE,cAAc,SAAS","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ import type { TurboModule } from 'react-native';
2
+ import type { UnsafeObject } from 'react-native/Libraries/Types/CodegenTypes';
3
+ /**
4
+ * Codegen spec. Everything crossing the bridge is an UnsafeObject so that a
5
+ * single native method can evolve without a codegen break; the strongly typed
6
+ * surface lives in `StepTracker.ts`, which is what consumers import.
7
+ */
8
+ export interface Spec extends TurboModule {
9
+ initialize(config: UnsafeObject): Promise<UnsafeObject>;
10
+ updateConfig(config: UnsafeObject): Promise<UnsafeObject>;
11
+ getConfig(): Promise<UnsafeObject>;
12
+ startTracking(): Promise<UnsafeObject>;
13
+ pauseTracking(): Promise<UnsafeObject>;
14
+ resumeTracking(): Promise<UnsafeObject>;
15
+ stopTracking(): Promise<UnsafeObject>;
16
+ getTrackingState(): Promise<UnsafeObject>;
17
+ isTracking(): Promise<boolean>;
18
+ getTodaySteps(): Promise<UnsafeObject>;
19
+ getStepsForDate(date: string): Promise<UnsafeObject>;
20
+ getYesterdaySteps(): Promise<UnsafeObject>;
21
+ getStatsForRange(startDate: string, endDate: string): Promise<UnsafeObject>;
22
+ getWeeklyStats(options: UnsafeObject): Promise<UnsafeObject>;
23
+ getMonthlyStats(options: UnsafeObject): Promise<UnsafeObject>;
24
+ getYearlyStats(options: UnsafeObject): Promise<UnsafeObject>;
25
+ getHistory(startDate: string, endDate: string): Promise<UnsafeObject>;
26
+ resetToday(): Promise<boolean>;
27
+ clearHistory(): Promise<boolean>;
28
+ pruneHistory(retentionDays: number): Promise<number>;
29
+ checkPermissions(): Promise<UnsafeObject>;
30
+ requestPermissions(): Promise<UnsafeObject>;
31
+ getDeviceCapabilities(): Promise<UnsafeObject>;
32
+ openAppSettings(): Promise<boolean>;
33
+ isBatteryOptimizationEnabled(): Promise<boolean>;
34
+ requestDisableBatteryOptimization(): Promise<boolean>;
35
+ openBatteryOptimizationSettings(): Promise<boolean>;
36
+ openManufacturerAutoStartSettings(): Promise<boolean>;
37
+ getHealthConnectStatus(): Promise<UnsafeObject>;
38
+ requestHealthConnectPermissions(): Promise<UnsafeObject>;
39
+ openHealthConnectSettings(): Promise<boolean>;
40
+ readHealthConnectSteps(startIso: string, endIso: string): Promise<UnsafeObject>;
41
+ writeHealthConnectSteps(date: string): Promise<boolean>;
42
+ syncWithHealthConnect(): Promise<UnsafeObject>;
43
+ getPendingSyncCount(): Promise<number>;
44
+ syncNow(): Promise<UnsafeObject>;
45
+ addListener(eventName: string): void;
46
+ removeListeners(count: number): void;
47
+ }
48
+ declare const _default: Spec | null;
49
+ export default _default;
50
+ //# sourceMappingURL=NativeStepTrackerPro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeStepTrackerPro.d.ts","sourceRoot":"","sources":["../../src/NativeStepTrackerPro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { DayRecord, DeviceCapabilities, EventSubscription, HealthConnectStatus, PermissionStatus, RangeOptions, RangeStats, StepSnapshot, StepTrackerConfig, StepTrackerEvent, StepTrackerEventMap, SyncEvent, TrackingState } from './types';
2
+ /** Android is the only supported platform; call this before anything else. */
3
+ export declare function isSupported(): boolean;
4
+ /**
5
+ * The public API. All methods reject with a `StepTrackerError` carrying a
6
+ * stable `code`, so callers can branch without string matching.
7
+ */
8
+ export declare const StepTracker: {
9
+ /**
10
+ * Loads config into the native layer and restores any persisted state.
11
+ * Safe to call on every app launch — it is idempotent.
12
+ */
13
+ initialize(config?: StepTrackerConfig): Promise<StepSnapshot>;
14
+ /** Patches config at runtime. Notification and goals update immediately. */
15
+ updateConfig(config: StepTrackerConfig): Promise<StepTrackerConfig>;
16
+ getConfig(): Promise<StepTrackerConfig>;
17
+ /** Starts the foreground service. Requires permissions to be granted first. */
18
+ startTracking(): Promise<StepSnapshot>;
19
+ /** Keeps the service and notification alive but ignores sensor deltas. */
20
+ pauseTracking(): Promise<StepSnapshot>;
21
+ resumeTracking(): Promise<StepSnapshot>;
22
+ /** Flushes to the database, unregisters sensors and kills the service. */
23
+ stopTracking(): Promise<StepSnapshot>;
24
+ getTrackingState(): Promise<TrackingState>;
25
+ isTracking(): Promise<boolean>;
26
+ getTodaySteps(): Promise<StepSnapshot>;
27
+ getYesterdaySteps(): Promise<DayRecord>;
28
+ /** @param date yyyy-MM-dd */
29
+ getStepsForDate(date: string): Promise<DayRecord>;
30
+ getWeeklyStats(options?: RangeOptions): Promise<RangeStats>;
31
+ getMonthlyStats(options?: RangeOptions): Promise<RangeStats>;
32
+ getYearlyStats(options?: RangeOptions): Promise<RangeStats>;
33
+ /** Inclusive on both ends. Dates are yyyy-MM-dd, and start must precede end. */
34
+ getStatsForRange(startDate: string, endDate: string): Promise<RangeStats>;
35
+ getHistory(startDate: string, endDate: string): Promise<DayRecord[]>;
36
+ /** Zeroes today's counter without touching history. Useful in QA builds. */
37
+ resetToday(): Promise<boolean>;
38
+ clearHistory(): Promise<boolean>;
39
+ /** Deletes rows older than `retentionDays`; returns rows removed. */
40
+ pruneHistory(retentionDays?: number): Promise<number>;
41
+ checkPermissions(): Promise<PermissionStatus>;
42
+ /** Shows the Android runtime dialogs. Must be called with an Activity attached. */
43
+ requestPermissions(): Promise<PermissionStatus>;
44
+ getDeviceCapabilities(): Promise<DeviceCapabilities>;
45
+ openAppSettings(): Promise<boolean>;
46
+ /** True when the OS is still applying doze restrictions to this app. */
47
+ isBatteryOptimizationEnabled(): Promise<boolean>;
48
+ /**
49
+ * Shows the system exemption dialog. Play policy requires an eligible use
50
+ * case — see docs/PLAY_STORE_COMPLIANCE.md before shipping this.
51
+ */
52
+ requestDisableBatteryOptimization(): Promise<boolean>;
53
+ /** Policy-safe alternative: opens the settings list, no direct prompt. */
54
+ openBatteryOptimizationSettings(): Promise<boolean>;
55
+ /** Best-effort deep link into Xiaomi/Oppo/Vivo/Huawei autostart screens. */
56
+ openManufacturerAutoStartSettings(): Promise<boolean>;
57
+ getHealthConnectStatus(): Promise<HealthConnectStatus>;
58
+ requestHealthConnectPermissions(): Promise<HealthConnectStatus>;
59
+ openHealthConnectSettings(): Promise<boolean>;
60
+ /** ISO-8601 instants, e.g. '2026-09-01T00:00:00Z'. */
61
+ readHealthConnectSteps(startIso: string, endIso: string): Promise<{
62
+ totalSteps: number;
63
+ records: DayRecord[];
64
+ }>;
65
+ /** Upserts one day's steps/distance/calories into Health Connect. */
66
+ writeHealthConnectSteps(date: string): Promise<boolean>;
67
+ syncWithHealthConnect(): Promise<SyncEvent>;
68
+ getPendingSyncCount(): Promise<number>;
69
+ /** Runs Health Connect + remote sync immediately instead of waiting for WorkManager. */
70
+ syncNow(): Promise<SyncEvent[]>;
71
+ addListener<E extends StepTrackerEvent>(event: E, listener: (payload: StepTrackerEventMap[E]) => void): EventSubscription;
72
+ /** Removes every listener for one event, or all events when omitted. */
73
+ removeListener(event?: StepTrackerEvent): void;
74
+ };
75
+ export default StepTracker;
76
+ //# sourceMappingURL=StepTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepTracker.d.ts","sourceRoot":"","sources":["../../src/StepTracker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,aAAa,EACd,MAAM,SAAS,CAAC;AAqBjB,8EAA8E;AAC9E,wBAAgB,WAAW,IAAI,OAAO,CAKrC;AAqGD;;;GAGG;AACH,eAAO,MAAM,WAAW;IACtB;;;OAGG;wBACsB,iBAAiB,GAAQ,OAAO,CAAC,YAAY,CAAC;IAOvE,4EAA4E;yBACjD,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;iBAmBtD,OAAO,CAAC,iBAAiB,CAAC;IAI7C,+EAA+E;qBACxD,OAAO,CAAC,YAAY,CAAC;IAI5C,0EAA0E;qBACnD,OAAO,CAAC,YAAY,CAAC;sBAIpB,OAAO,CAAC,YAAY,CAAC;IAI7C,0EAA0E;oBACpD,OAAO,CAAC,YAAY,CAAC;wBAIjB,OAAO,CAAC,aAAa,CAAC;kBAO5B,OAAO,CAAC,OAAO,CAAC;qBAMb,OAAO,CAAC,YAAY,CAAC;yBAIjB,OAAO,CAAC,SAAS,CAAC;IAI7C,6BAA6B;0BACD,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;6BAIzB,YAAY,GAAQ,OAAO,CAAC,UAAU,CAAC;8BAItC,YAAY,GAAQ,OAAO,CAAC,UAAU,CAAC;6BAIxC,YAAY,GAAQ,OAAO,CAAC,UAAU,CAAC;IAIrE,gFAAgF;gCAC9C,MAAM,WAAW,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;0BAOnD,MAAM,WAAW,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAU1E,4EAA4E;kBACxD,OAAO,CAAC,OAAO,CAAC;oBAId,OAAO,CAAC,OAAO,CAAC;IAItC,qEAAqE;iCAClC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;wBAUjC,OAAO,CAAC,gBAAgB,CAAC;IAInD,mFAAmF;0BACvD,OAAO,CAAC,gBAAgB,CAAC;6BAItB,OAAO,CAAC,kBAAkB,CAAC;uBAMjC,OAAO,CAAC,OAAO,CAAC;IAMzC,wEAAwE;oCAClC,OAAO,CAAC,OAAO,CAAC;IAItD;;;OAGG;yCACwC,OAAO,CAAC,OAAO,CAAC;IAI3D,0EAA0E;uCACjC,OAAO,CAAC,OAAO,CAAC;IAIzD,4EAA4E;yCACjC,OAAO,CAAC,OAAO,CAAC;8BAM3B,OAAO,CAAC,mBAAmB,CAAC;uCAMnB,OAAO,CAAC,mBAAmB,CAAC;iCAMlC,OAAO,CAAC,OAAO,CAAC;IAInD,sDAAsD;qCAE1C,MAAM,UACR,MAAM,GACb,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,EAAE,CAAA;KAAE,CAAC;IAMxD,qEAAqE;kCACjC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;6BAI9B,OAAO,CAAC,SAAS,CAAC;2BAMpB,OAAO,CAAC,MAAM,CAAC;IAI5C,wFAAwF;eACvE,OAAO,CAAC,SAAS,EAAE,CAAC;gBASzB,CAAC,SAAS,gBAAgB,SAC7B,CAAC,YACE,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,IAAI,GAClD,iBAAiB;IAMpB,wEAAwE;2BACjD,gBAAgB,GAAG,IAAI;CAkB/C,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { StepTrackerConfig } from './types';
2
+ export declare const MODULE_NAME = "StepTrackerPro";
3
+ export declare const DEFAULT_CONFIG: Required<Pick<StepTrackerConfig, 'height' | 'weight' | 'sex' | 'dailyGoal' | 'calorieCoefficient' | 'historyRetentionDays' | 'notificationActions' | 'notificationThrottleMs' | 'eventThrottleMs' | 'persistEveryNSteps' | 'healthConnectEnabled' | 'healthConnectSyncIntervalMinutes' | 'autoStartOnBoot'>>;
4
+ /** Stride length = height(cm) * coefficient / 100. */
5
+ export declare const STRIDE_COEFFICIENT: {
6
+ readonly male: 0.415;
7
+ readonly female: 0.413;
8
+ readonly unspecified: 0.414;
9
+ };
10
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,eAAO,MAAM,WAAW,mBAAmB,CAAC;AAE5C,eAAO,MAAM,cAAc,EAAE,QAAQ,CACnC,IAAI,CACF,iBAAiB,EACf,QAAQ,GACR,QAAQ,GACR,KAAK,GACL,WAAW,GACX,oBAAoB,GACpB,sBAAsB,GACtB,qBAAqB,GACrB,wBAAwB,GACxB,iBAAiB,GACjB,oBAAoB,GACpB,sBAAsB,GACtB,kCAAkC,GAClC,iBAAiB,CACpB,CAeF,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,kBAAkB;;;;CAIrB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type StepTrackerErrorCode = 'E_UNSUPPORTED_PLATFORM' | 'E_NO_SENSOR' | 'E_NOT_INITIALIZED' | 'E_PERMISSION_DENIED' | 'E_SERVICE_START_FAILED' | 'E_HEALTH_CONNECT_UNAVAILABLE' | 'E_HEALTH_CONNECT_DENIED' | 'E_DATABASE' | 'E_INVALID_CONFIG' | 'E_NO_ACTIVITY' | 'E_NOT_TRACKING' | 'E_UNKNOWN';
2
+ export declare class StepTrackerError extends Error {
3
+ readonly code: StepTrackerErrorCode;
4
+ constructor(code: StepTrackerErrorCode, message: string);
5
+ }
6
+ /** Normalises rejections coming off the native bridge. */
7
+ export declare function toStepTrackerError(error: unknown): StepTrackerError;
8
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAC5B,wBAAwB,GACxB,aAAa,GACb,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,8BAA8B,GAC9B,yBAAyB,GACzB,YAAY,GACZ,kBAAkB,GAClB,eAAe,GACf,gBAAgB,GAChB,WAAW,CAAC;AAEhB,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;gBAExB,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM;CAKxD;AAED,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAKnE"}
@@ -0,0 +1,5 @@
1
+ export { useStepTracker } from './useStepTracker';
2
+ export type { UseStepTrackerOptions, UseStepTrackerResult } from './useStepTracker';
3
+ export { useStepStats } from './useStepStats';
4
+ export type { StatsPeriod, UseStepStatsResult } from './useStepStats';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { RangeOptions, RangeStats } from '../types';
2
+ export type StatsPeriod = 'week' | 'month' | 'year';
3
+ export interface UseStepStatsResult {
4
+ stats: RangeStats | null;
5
+ loading: boolean;
6
+ error: Error | null;
7
+ reload: () => Promise<void>;
8
+ }
9
+ /** Fetches a windowed summary and refreshes it when the day rolls over. */
10
+ export declare function useStepStats(period: StatsPeriod, options?: RangeOptions): UseStepStatsResult;
11
+ //# sourceMappingURL=useStepStats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStepStats.d.ts","sourceRoot":"","sources":["../../../src/hooks/useStepStats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,YAAiB,GACzB,kBAAkB,CAqCpB"}
@@ -0,0 +1,26 @@
1
+ import type { GoalReachedEvent, StepSnapshot, StepTrackerConfig, TrackingState } from '../types';
2
+ export interface UseStepTrackerOptions extends StepTrackerConfig {
3
+ /** Initialise and start tracking as soon as permissions allow. Default false. */
4
+ autoStart?: boolean;
5
+ /** Refetch the snapshot when the app returns to the foreground. Default true. */
6
+ refreshOnForeground?: boolean;
7
+ onGoalReached?: (event: GoalReachedEvent) => void;
8
+ }
9
+ export interface UseStepTrackerResult {
10
+ snapshot: StepSnapshot | null;
11
+ state: TrackingState;
12
+ ready: boolean;
13
+ error: Error | null;
14
+ start: () => Promise<void>;
15
+ pause: () => Promise<void>;
16
+ resume: () => Promise<void>;
17
+ stop: () => Promise<void>;
18
+ refresh: () => Promise<void>;
19
+ requestPermissions: () => Promise<boolean>;
20
+ }
21
+ /**
22
+ * Wires the tracker into a component: initialises once, subscribes to
23
+ * `stepsChanged`, and re-reads the snapshot when the app is foregrounded.
24
+ */
25
+ export declare function useStepTracker(options?: UseStepTrackerOptions): UseStepTrackerResult;
26
+ //# sourceMappingURL=useStepTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStepTracker.d.ts","sourceRoot":"","sources":["../../../src/hooks/useStepTracker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACd,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,qBAAsB,SAAQ,iBAAiB;IAC9D,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iFAAiF;IACjF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,kBAAkB,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,GAAE,qBAA0B,GAClC,oBAAoB,CAiItB"}
@@ -0,0 +1,7 @@
1
+ export { StepTracker, StepTracker as default, isSupported } from './StepTracker';
2
+ export { StepTrackerError } from './errors';
3
+ export type { StepTrackerErrorCode } from './errors';
4
+ export { DEFAULT_CONFIG, STRIDE_COEFFICIENT } from './constants';
5
+ export * from './hooks';
6
+ export type { DayChangedEvent, DayRecord, DeviceCapabilities, EventSubscription, GoalProgressEvent, GoalReachedEvent, HealthConnectStatus, PermissionStatus, RangeOptions, RangeStats, SensorSource, Sex, StepSnapshot, StepTrackerConfig, StepTrackerEvent, StepTrackerEventMap, StepsChangedEvent, SyncEvent, TrackingState, TrackingStateEvent, } from './types';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,IAAI,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjE,cAAc,SAAS,CAAC;AACxB,YAAY,EACV,eAAe,EACf,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,GAAG,EACH,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,SAAS,EACT,aAAa,EACb,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Public type definitions for react-native-step-tracker-pro.
3
+ */
4
+ /** Biological sex is only used to pick a stride-length coefficient. */
5
+ export type Sex = 'male' | 'female' | 'unspecified';
6
+ /** Which hardware sensor the service ended up using. */
7
+ export type SensorSource = 'step_counter' | 'step_detector' | 'none';
8
+ export type TrackingState = 'idle' | 'running' | 'paused' | 'stopped' | 'unsupported';
9
+ export interface StepTrackerConfig {
10
+ /** Height in centimetres. Used for stride length. Default 170. */
11
+ height?: number;
12
+ /** Weight in kilograms. Used for calorie estimation. Default 70. */
13
+ weight?: number;
14
+ /**
15
+ * Overrides the derived stride length, in metres. Leave unset to derive it
16
+ * from `height` and `sex`.
17
+ */
18
+ strideLength?: number;
19
+ sex?: Sex;
20
+ /** Steps. Default 10000. */
21
+ dailyGoal?: number;
22
+ /** Steps. Defaults to dailyGoal * 7. */
23
+ weeklyGoal?: number;
24
+ /** Steps. Defaults to dailyGoal * 30. */
25
+ monthlyGoal?: number;
26
+ /** kcal per kg per km of walking. Default 0.57. */
27
+ calorieCoefficient?: number;
28
+ /** How many days of history to keep on device. Default 35. */
29
+ historyRetentionDays?: number;
30
+ /** Notification title. Supports {steps}, {goal}, {percent}, {distance}, {calories}. */
31
+ notificationTitle?: string;
32
+ notificationText?: string;
33
+ /** Drawable name in the host app, e.g. 'ic_stat_steps'. Falls back to a bundled icon. */
34
+ notificationIcon?: string;
35
+ /** Notification channel name shown in Android settings. */
36
+ notificationChannelName?: string;
37
+ /** Show Pause/Resume actions on the notification. Default true. */
38
+ notificationActions?: boolean;
39
+ /** Minimum ms between notification redraws. Default 1000. */
40
+ notificationThrottleMs?: number;
41
+ /** Minimum ms between JS `stepsChanged` events. Default 500. */
42
+ eventThrottleMs?: number;
43
+ /** Persist to SQLite after this many steps. Default 10. */
44
+ persistEveryNSteps?: number;
45
+ /** Mirror data into Health Connect when permissions are granted. Default true. */
46
+ healthConnectEnabled?: boolean;
47
+ /** Auto-write today's totals to Health Connect every N minutes. Default 30. 0 disables. */
48
+ healthConnectSyncIntervalMinutes?: number;
49
+ /** Optional HTTPS endpoint that unsynced day records get POSTed to. */
50
+ remoteSyncUrl?: string;
51
+ remoteSyncHeaders?: Record<string, string>;
52
+ /** Restart tracking automatically after device reboot. Default true. */
53
+ autoStartOnBoot?: boolean;
54
+ }
55
+ export interface StepSnapshot {
56
+ /** yyyy-MM-dd in the device timezone. */
57
+ date: string;
58
+ steps: number;
59
+ /** Metres. */
60
+ distance: number;
61
+ /** Kilocalories. */
62
+ calories: number;
63
+ dailyGoal: number;
64
+ /** 0..1, clamped. */
65
+ goalProgress: number;
66
+ goalReached: boolean;
67
+ state: TrackingState;
68
+ source: SensorSource;
69
+ /** Epoch ms of the last sensor sample. */
70
+ timestamp: number;
71
+ }
72
+ export interface DayRecord {
73
+ date: string;
74
+ steps: number;
75
+ distance: number;
76
+ calories: number;
77
+ /** Mirrored into Health Connect. */
78
+ synced: boolean;
79
+ /** Uploaded to `remoteSyncUrl`. Always false when no endpoint is configured. */
80
+ syncedRemote: boolean;
81
+ }
82
+ export interface RangeStats {
83
+ /** Inclusive yyyy-MM-dd. */
84
+ startDate: string;
85
+ /** Inclusive yyyy-MM-dd. */
86
+ endDate: string;
87
+ totalSteps: number;
88
+ totalDistance: number;
89
+ totalCalories: number;
90
+ averageSteps: number;
91
+ /** Days with at least one recorded step. */
92
+ activeDays: number;
93
+ bestDay: DayRecord | null;
94
+ /** Every day in the range, zero-filled, ascending. */
95
+ days: DayRecord[];
96
+ /** Present for weekly/monthly windows when a goal is configured. */
97
+ goal?: number;
98
+ goalProgress?: number;
99
+ }
100
+ export interface RangeOptions {
101
+ /**
102
+ * 'calendar' snaps to the current week (Mon–Sun), month or year.
103
+ * 'rolling' uses the last 7 / 30 / 365 days ending today.
104
+ * Default 'calendar'.
105
+ */
106
+ mode?: 'calendar' | 'rolling';
107
+ /** 0 = current period, 1 = previous period, and so on. Only for 'calendar'. */
108
+ offset?: number;
109
+ }
110
+ export interface PermissionStatus {
111
+ activityRecognition: boolean;
112
+ postNotifications: boolean;
113
+ /** True on API < 34 where the permission does not exist. */
114
+ foregroundServiceHealth: boolean;
115
+ /** All permissions required to start tracking are granted. */
116
+ allGranted: boolean;
117
+ }
118
+ export interface HealthConnectStatus {
119
+ /** Health Connect SDK is available on the device. */
120
+ available: boolean;
121
+ /** The user must install or update the Health Connect provider. */
122
+ requiresUpdate: boolean;
123
+ granted: boolean;
124
+ grantedPermissions: string[];
125
+ }
126
+ export interface DeviceCapabilities {
127
+ hasStepCounter: boolean;
128
+ hasStepDetector: boolean;
129
+ supported: boolean;
130
+ sdkInt: number;
131
+ manufacturer: string;
132
+ model: string;
133
+ }
134
+ export interface StepsChangedEvent extends StepSnapshot {
135
+ }
136
+ export interface GoalReachedEvent {
137
+ type: 'daily' | 'weekly' | 'monthly';
138
+ goal: number;
139
+ steps: number;
140
+ date: string;
141
+ timestamp: number;
142
+ }
143
+ export interface GoalProgressEvent {
144
+ type: 'daily' | 'weekly' | 'monthly';
145
+ goal: number;
146
+ steps: number;
147
+ progress: number;
148
+ date: string;
149
+ }
150
+ export interface TrackingStateEvent {
151
+ state: TrackingState;
152
+ source: SensorSource;
153
+ reason?: string;
154
+ }
155
+ export interface SyncEvent {
156
+ target: 'health_connect' | 'remote';
157
+ syncedRecords: number;
158
+ failedRecords: number;
159
+ success: boolean;
160
+ error?: string;
161
+ }
162
+ export interface DayChangedEvent {
163
+ previousDate: string;
164
+ currentDate: string;
165
+ previousDaySteps: number;
166
+ }
167
+ export interface StepTrackerEventMap {
168
+ stepsChanged: StepsChangedEvent;
169
+ goalReached: GoalReachedEvent;
170
+ goalProgressChanged: GoalProgressEvent;
171
+ trackingStateChanged: TrackingStateEvent;
172
+ dayChanged: DayChangedEvent;
173
+ syncCompleted: SyncEvent;
174
+ error: {
175
+ code: string;
176
+ message: string;
177
+ };
178
+ }
179
+ export type StepTrackerEvent = keyof StepTrackerEventMap;
180
+ export interface EventSubscription {
181
+ remove(): void;
182
+ }
183
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "react-native-step-tracker-pro",
3
+ "version": "1.0.0",
4
+ "description": "Production-grade Android step tracking for React Native: hardware step counter, foreground service, Room storage, Health Connect sync, boot recovery and goals.",
5
+ "main": "lib/commonjs/index.js",
6
+ "module": "lib/module/index.js",
7
+ "types": "lib/typescript/index.d.ts",
8
+ "react-native": "src/index.ts",
9
+ "source": "src/index.ts",
10
+ "files": [
11
+ "src",
12
+ "lib",
13
+ "android",
14
+ "!android/build",
15
+ "!android/.gradle",
16
+ "!android/gradle",
17
+ "!android/gradlew*",
18
+ "!android/local.properties",
19
+ "!android/settings.gradle",
20
+ "!android/schemas",
21
+ "!android/src/androidTest",
22
+ "!**/__tests__",
23
+ "docs",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "scripts": {
28
+ "typecheck": "tsc --noEmit",
29
+ "build": "bob build",
30
+ "clean": "rimraf lib android/build",
31
+ "prepack": "bob build"
32
+ },
33
+ "keywords": [
34
+ "react-native",
35
+ "android",
36
+ "pedometer",
37
+ "step-counter",
38
+ "steps",
39
+ "fitness",
40
+ "health-connect",
41
+ "foreground-service",
42
+ "turbo-module"
43
+ ],
44
+ "license": "MIT",
45
+ "author": "Helper <sachinkumarq87@gmail.com>",
46
+ "peerDependencies": {
47
+ "react": ">=18.0.0",
48
+ "react-native": ">=0.74.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/react": "^18.2.0",
52
+ "react": "18.3.1",
53
+ "react-native": "0.76.5",
54
+ "react-native-builder-bob": "^0.30.0",
55
+ "typescript": "^5.4.0"
56
+ },
57
+ "codegenConfig": {
58
+ "name": "RNStepTrackerProSpec",
59
+ "type": "modules",
60
+ "jsSrcsDir": "src",
61
+ "android": {
62
+ "javaPackageName": "com.steptrackerpro"
63
+ }
64
+ },
65
+ "react-native-builder-bob": {
66
+ "source": "src",
67
+ "output": "lib",
68
+ "targets": [
69
+ "commonjs",
70
+ "module",
71
+ [
72
+ "typescript",
73
+ {
74
+ "project": "tsconfig.build.json"
75
+ }
76
+ ]
77
+ ]
78
+ }
79
+ }
@@ -0,0 +1,66 @@
1
+ import type { TurboModule } from 'react-native';
2
+ import { TurboModuleRegistry } from 'react-native';
3
+ import type { UnsafeObject } from 'react-native/Libraries/Types/CodegenTypes';
4
+
5
+ /**
6
+ * Codegen spec. Everything crossing the bridge is an UnsafeObject so that a
7
+ * single native method can evolve without a codegen break; the strongly typed
8
+ * surface lives in `StepTracker.ts`, which is what consumers import.
9
+ */
10
+ export interface Spec extends TurboModule {
11
+ // ---- lifecycle -------------------------------------------------------
12
+ initialize(config: UnsafeObject): Promise<UnsafeObject>;
13
+ updateConfig(config: UnsafeObject): Promise<UnsafeObject>;
14
+ getConfig(): Promise<UnsafeObject>;
15
+ startTracking(): Promise<UnsafeObject>;
16
+ pauseTracking(): Promise<UnsafeObject>;
17
+ resumeTracking(): Promise<UnsafeObject>;
18
+ stopTracking(): Promise<UnsafeObject>;
19
+ getTrackingState(): Promise<UnsafeObject>;
20
+ isTracking(): Promise<boolean>;
21
+
22
+ // ---- reads -----------------------------------------------------------
23
+ getTodaySteps(): Promise<UnsafeObject>;
24
+ getStepsForDate(date: string): Promise<UnsafeObject>;
25
+ getYesterdaySteps(): Promise<UnsafeObject>;
26
+ getStatsForRange(startDate: string, endDate: string): Promise<UnsafeObject>;
27
+ getWeeklyStats(options: UnsafeObject): Promise<UnsafeObject>;
28
+ getMonthlyStats(options: UnsafeObject): Promise<UnsafeObject>;
29
+ getYearlyStats(options: UnsafeObject): Promise<UnsafeObject>;
30
+ getHistory(startDate: string, endDate: string): Promise<UnsafeObject>;
31
+
32
+ // ---- writes ----------------------------------------------------------
33
+ resetToday(): Promise<boolean>;
34
+ clearHistory(): Promise<boolean>;
35
+ pruneHistory(retentionDays: number): Promise<number>;
36
+
37
+ // ---- permissions -----------------------------------------------------
38
+ checkPermissions(): Promise<UnsafeObject>;
39
+ requestPermissions(): Promise<UnsafeObject>;
40
+ getDeviceCapabilities(): Promise<UnsafeObject>;
41
+ openAppSettings(): Promise<boolean>;
42
+
43
+ // ---- battery ---------------------------------------------------------
44
+ isBatteryOptimizationEnabled(): Promise<boolean>;
45
+ requestDisableBatteryOptimization(): Promise<boolean>;
46
+ openBatteryOptimizationSettings(): Promise<boolean>;
47
+ openManufacturerAutoStartSettings(): Promise<boolean>;
48
+
49
+ // ---- health connect --------------------------------------------------
50
+ getHealthConnectStatus(): Promise<UnsafeObject>;
51
+ requestHealthConnectPermissions(): Promise<UnsafeObject>;
52
+ openHealthConnectSettings(): Promise<boolean>;
53
+ readHealthConnectSteps(startIso: string, endIso: string): Promise<UnsafeObject>;
54
+ writeHealthConnectSteps(date: string): Promise<boolean>;
55
+ syncWithHealthConnect(): Promise<UnsafeObject>;
56
+
57
+ // ---- sync ------------------------------------------------------------
58
+ getPendingSyncCount(): Promise<number>;
59
+ syncNow(): Promise<UnsafeObject>;
60
+
61
+ // ---- event emitter plumbing -----------------------------------------
62
+ addListener(eventName: string): void;
63
+ removeListeners(count: number): void;
64
+ }
65
+
66
+ export default TurboModuleRegistry.get<Spec>('StepTrackerPro');