Skip to content

Commit 80d0eac

Browse files
committed
added fallback file, moved out types to d.ts
1 parent bf7e8bd commit 80d0eac

6 files changed

Lines changed: 164 additions & 114 deletions

File tree

example/App.tsx

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,37 @@
11
import * as MotionActivityTracker from "motion-activity-tracker";
22
import React, { useEffect, useState } from "react";
33
import { Text, View, Button, StyleSheet, Platform } from "react-native";
4-
4+
import {PermissionStatus,HistoricalActivity,TrackingStatus,ActivityType, ActivityChangeEvent, TransitionType, Confidence} from "motion-activity-tracker/types"
5+
import { isGooglePlayServicesAvailable } from "react-native-motion-activity-tracker";
56
export default function App() {
7+
console.log("PermissionStatus!!!!!!!!!!",PermissionStatus.NOT_DETERMINED)
68
const [message, setMessage] = useState("Initializing..."),
79
[tracking, setTracking] = useState(false),
810
[data, setData] = useState<
9-
MotionActivityTracker.HistoricalActivity[] | undefined
11+
HistoricalActivity[] | undefined
1012
>(),
1113
[permissionStatus, setPermissionStatus] =
12-
useState<MotionActivityTracker.PermissionStatus>(
13-
MotionActivityTracker.PermissionStatus.NOT_DETERMINED,
14+
useState<PermissionStatus>(
15+
PermissionStatus.NOT_DETERMINED,
1416
),
1517
[trackingStatus, setTrackingStatus] =
16-
useState<MotionActivityTracker.TrackingStatus>(
17-
MotionActivityTracker.TrackingStatus.STOPPED,
18+
useState<TrackingStatus>(
19+
TrackingStatus.STOPPED,
1820
),
1921
[enterTransition, setEnterTransition] =
20-
useState<MotionActivityTracker.ActivityType>(
21-
MotionActivityTracker.ActivityType.UNKNOWN,
22+
useState<ActivityType>(
23+
ActivityType.UNKNOWN,
2224
),
2325
[exitTransition, setExitTransition] =
24-
useState<MotionActivityTracker.ActivityType>(
25-
MotionActivityTracker.ActivityType.UNKNOWN,
26+
useState<ActivityType>(
27+
ActivityType.UNKNOWN,
2628
),
2729
startDate = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
2830
endDate = new Date();
2931

3032
useEffect(() => {
3133
const setActivityHistoricalData = async () => {
32-
const data = await MotionActivityTracker.getHistoricalDataIos(
34+
const data = await MotionActivityTracker.getHistoricalData(
3335
startDate,
3436
endDate,
3537
);
@@ -99,10 +101,10 @@ export default function App() {
99101
};
100102

101103
const handleSimulateTransition = () => {
102-
const event: MotionActivityTracker.ActivityChangeEvent = {
103-
activityType: MotionActivityTracker.ActivityType.WALKING,
104-
transitionType: MotionActivityTracker.TransitionType.ENTER,
105-
confidence: MotionActivityTracker.Confidence.UNKNOWN,
104+
const event: ActivityChangeEvent = {
105+
activityType: ActivityType.WALKING,
106+
transitionType: TransitionType.ENTER,
107+
confidence: Confidence.UNKNOWN,
106108
timestamp: new Date().getTime(),
107109
};
108110

@@ -113,7 +115,7 @@ export default function App() {
113115
<View style={styles.container}>
114116
<Text
115117
style={styles.text}
116-
>{`Is Google Play available: ${MotionActivityTracker.isGooglePlayServicesAvailable}`}</Text>
118+
>{`Is Google Play available: ${isGooglePlayServicesAvailable}`}</Text>
117119
<Text
118120
style={styles.text}
119121
>{`Permission Status: ${permissionStatus}`}</Text>
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import { EventEmitter, Subscription } from "expo-modules-core";
2+
import { PermissionsAndroid, Platform } from "react-native";
3+
4+
import {
5+
PermissionStatus,
6+
ActivityChangeEvent,
7+
TrackingStatus,
8+
HistoricalActivity,
9+
EventPayload,
10+
} from "./types";
11+
import MotionActivityTrackerModule from "./MotionActivityTrackerModule";
12+
13+
14+
15+
export const isGooglePlayServicesAvailable: boolean =
16+
MotionActivityTrackerModule.isGooglePlayServicesAvailable ?? false;
17+
18+
export async function getPermissionStatusAsync(): Promise<PermissionStatus> {
19+
return MotionActivityTrackerModule.getPermissionStatus();
20+
}
21+
22+
export async function requestPermissionsAsyncAndroid(): Promise<PermissionStatus> {
23+
if (Platform.OS === "android") {
24+
const permissionStatus: PermissionStatus = await getPermissionStatusAsync();
25+
26+
if (permissionStatus === PermissionStatus.AUTHORIZED) {
27+
return permissionStatus;
28+
}
29+
30+
try {
31+
await PermissionsAndroid.request(
32+
PermissionsAndroid.PERMISSIONS.ACTIVITY_RECOGNITION,
33+
{
34+
title: "Activity Recognition Permission",
35+
message:
36+
"This app wants access to activity recognition to track your movements.",
37+
buttonNegative: "Cancel",
38+
buttonPositive: "OK",
39+
},
40+
);
41+
42+
const newPermissionStatus: PermissionStatus =
43+
await getPermissionStatusAsync();
44+
45+
if (newPermissionStatus === PermissionStatus.AUTHORIZED) {
46+
return newPermissionStatus;
47+
}
48+
49+
return PermissionStatus.DENIED;
50+
} catch (err) {
51+
console.warn(err);
52+
return PermissionStatus.NOT_DETERMINED;
53+
}
54+
}
55+
56+
return PermissionStatus.PLATFORM_NOT_SUPPORTED;
57+
}
58+
59+
const emitter = new EventEmitter(MotionActivityTrackerModule);
60+
61+
export function addMotionStateChangeListener(
62+
listener: (payload: EventPayload) => void,
63+
): Subscription {
64+
return emitter.addListener<EventPayload>("onMotionStateChange", listener);
65+
}
66+
67+
export async function startTracking(): Promise<TrackingStatus> {
68+
return MotionActivityTrackerModule.startTracking();
69+
}
70+
71+
export async function stopTracking(): Promise<TrackingStatus> {
72+
return MotionActivityTrackerModule.stopTracking();
73+
}
74+
75+
export function simulateActivityTransition(event: ActivityChangeEvent): void {
76+
return MotionActivityTrackerModule.simulateActivityTransition(
77+
event.activityType,
78+
event.transitionType,
79+
event.timestamp.toString(),
80+
event.confidence,
81+
);
82+
}
83+
84+
/**
85+
* Get historical motion activity data from the device for iOS.
86+
* Only supported on iOS. On other platforms, it will return a warning and an empty array.
87+
* @param startDate - The start date of the historical data to fetch.
88+
* @param endDate - The end date of the historical data to fetch. Defaults to the current date.
89+
* @returns A promise that resolves to an array of historical motion activity data.
90+
*/
91+
92+
export async function getHistoricalData(
93+
startDate: Date,
94+
endDate: Date = new Date(),
95+
): Promise<HistoricalActivity[]> {
96+
const startTimestamp = startDate.getTime(),
97+
endTimestamp = endDate.getTime();
98+
99+
if (Platform.OS === "ios") {
100+
return await MotionActivityTrackerModule.getHistoricalData(
101+
startTimestamp,
102+
endTimestamp,
103+
);
104+
}
105+
106+
console.warn(
107+
"getHistoricalData is only supported on iOS",
108+
);
109+
110+
return [];
111+
}

src/MotionActivityTracker.ts

Lines changed: 34 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,34 @@
1-
import { EventEmitter, Subscription } from "expo-modules-core";
2-
import { PermissionsAndroid, Platform } from "react-native";
3-
4-
import {
5-
PermissionStatus,
6-
ActivityChangeEvent,
7-
TrackingStatus,
8-
HistoricalActivity,
9-
EventPayload,
10-
} from "./MotionActivityTracker.types";
11-
import MotionActivityTrackerModule from "./MotionActivityTrackerModule";
12-
13-
export const isGooglePlayServicesAvailable: boolean =
14-
MotionActivityTrackerModule.isGooglePlayServicesAvailable ?? false;
15-
16-
export async function getPermissionStatusAsync(): Promise<PermissionStatus> {
17-
return MotionActivityTrackerModule.getPermissionStatus();
18-
}
19-
20-
export async function requestPermissionsAsyncAndroid(): Promise<PermissionStatus> {
21-
if (Platform.OS === "android") {
22-
const permissionStatus: PermissionStatus = await getPermissionStatusAsync();
23-
24-
if (permissionStatus === PermissionStatus.AUTHORIZED) {
25-
return permissionStatus;
26-
}
27-
28-
try {
29-
await PermissionsAndroid.request(
30-
PermissionsAndroid.PERMISSIONS.ACTIVITY_RECOGNITION,
31-
{
32-
title: "Activity Recognition Permission",
33-
message:
34-
"This app wants access to activity recognition to track your movements.",
35-
buttonNegative: "Cancel",
36-
buttonPositive: "OK",
37-
},
38-
);
39-
40-
const newPermissionStatus: PermissionStatus =
41-
await getPermissionStatusAsync();
42-
43-
if (newPermissionStatus === PermissionStatus.AUTHORIZED) {
44-
return newPermissionStatus;
45-
}
46-
47-
return PermissionStatus.DENIED;
48-
} catch (err) {
49-
console.warn(err);
50-
return PermissionStatus.NOT_DETERMINED;
51-
}
52-
}
53-
54-
return PermissionStatus.PLATFORM_NOT_SUPPORTED;
55-
}
56-
57-
const emitter = new EventEmitter(MotionActivityTrackerModule);
58-
59-
export function addMotionStateChangeListener(
60-
listener: (payload: EventPayload) => void,
61-
): Subscription {
62-
return emitter.addListener<EventPayload>("onMotionStateChange", listener);
63-
}
64-
65-
export async function startTracking(): Promise<TrackingStatus> {
66-
return MotionActivityTrackerModule.startTracking();
67-
}
68-
69-
export async function stopTracking(): Promise<TrackingStatus> {
70-
return MotionActivityTrackerModule.stopTracking();
71-
}
72-
73-
export function simulateActivityTransition(event: ActivityChangeEvent): void {
74-
return MotionActivityTrackerModule.simulateActivityTransition(
75-
event.activityType,
76-
event.transitionType,
77-
event.timestamp.toString(),
78-
event.confidence,
79-
);
80-
}
81-
82-
export async function getHistoricalDataIos(
83-
startDate: Date,
84-
endDate: Date,
85-
): Promise<HistoricalActivity[]> {
86-
const startTimestamp = startDate.getTime(),
87-
endTimestamp = endDate.getTime();
88-
89-
if (Platform.OS === "ios") {
90-
return await MotionActivityTrackerModule.getHistoricalData(
91-
startTimestamp,
92-
endTimestamp,
93-
);
94-
}
95-
96-
return [];
97-
}
1+
import { Platform } from "react-native";
2+
3+
function UnavailableFn<T = unknown>(retVal: T) {
4+
let hasWarned = false;
5+
return () => {
6+
if (!hasWarned) {
7+
console.warn(
8+
`MotionActivityTracker is not available on platform "${Platform.OS}"`,
9+
);
10+
hasWarned = true;
11+
}
12+
return retVal;
13+
};
14+
}
15+
16+
17+
export const getPermissionStatusAsync = UnavailableFn(
18+
Promise.resolve("PLATFORM_NOT_SUPPORTED"),
19+
);
20+
21+
export const startTracking = UnavailableFn(Promise.resolve("FAILED"));
22+
export const stopTracking = UnavailableFn(Promise.resolve("FAILED"));
23+
export const getHistoricalData = UnavailableFn(Promise.resolve([]));
24+
export const simulateActivityTransition = UnavailableFn(undefined);
25+
export const requestPermissionsAsyncAndroid = UnavailableFn(
26+
Promise.resolve("PLATFORM_NOT_SUPPORTED"),
27+
);
28+
29+
export function addMotionStateChangeListener() {
30+
console.warn(
31+
"Motion state change listeners are not supported on this platform.",
32+
);
33+
return { remove: () => {} };
34+
}

src/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
export * from "./MotionActivityTracker";
2-
export * from "./MotionActivityTracker.types";

src/types/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./MotionActivityTracker.types";

0 commit comments

Comments
 (0)