Skip to content

Commit cc6c354

Browse files
committed
added a check before adding it to the manifest and updated the test
1 parent 4655783 commit cc6c354

2 files changed

Lines changed: 52 additions & 10 deletions

File tree

config-plugin/withMotionActivityPermissions.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,21 @@ const withMotionActivityPermissions: ConfigPlugin = (config) => {
1717
config = withAndroidManifest(config, (config) => {
1818
const androidManifest = config.modResults;
1919
const permissions = androidManifest.manifest["uses-permission"] || [];
20-
permissions.push({
21-
$: { "android:name": "android.permission.ACTIVITY_RECOGNITION" },
22-
});
20+
21+
// Check if the permission already exists
22+
const hasActivityRecognitionPermission = permissions.some(
23+
(permission) =>
24+
permission.$["android:name"] ===
25+
"android.permission.ACTIVITY_RECOGNITION",
26+
);
27+
28+
// Add the permission only if it doesn't exist
29+
if (!hasActivityRecognitionPermission) {
30+
permissions.push({
31+
$: { "android:name": "android.permission.ACTIVITY_RECOGNITION" },
32+
});
33+
}
34+
2335
androidManifest.manifest["uses-permission"] = permissions;
2436
return config;
2537
});

tests/withMotionActivityPermissions.test.ts

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { withInfoPlist, withAndroidManifest } from "@expo/config-plugins";
2-
import withMotionActivityPermissions from "../config-plugin/withMotionActivityPermissions";
32
import type { ExpoConfig } from "@expo/config-types";
43

4+
import withMotionActivityPermissions from "../config-plugin/withMotionActivityPermissions";
5+
56
interface ExpoConfigWithModResults extends ExpoConfig {
67
modResults?: {
78
// For iOS
89
NSMotionUsageDescription?: string;
910
// For Android
1011
manifest?: {
11-
"uses-permission"?: Array<{ $: { "android:name": string } }>;
12+
"uses-permission"?: { $: { "android:name": string } }[];
1213
};
1314
};
1415
}
@@ -19,7 +20,7 @@ jest.mock("@expo/config-plugins", () => ({
1920
...config,
2021
modResults: {
2122
...config.modResults,
22-
NSMotionUsageDescription: undefined,
23+
NSMotionUsageDescription: undefined,
2324
},
2425
};
2526
const modifiedConfig = callback(updatedConfig);
@@ -35,7 +36,7 @@ jest.mock("@expo/config-plugins", () => ({
3536
...config.modResults,
3637
manifest: {
3738
...config.modResults?.manifest,
38-
"uses-permission": [],
39+
"uses-permission": [],
3940
},
4041
},
4142
};
@@ -61,13 +62,13 @@ describe("withMotionActivityPermissions", () => {
6162
withMotionActivityPermissions(config);
6263

6364
expect(updatedConfig.modResults?.NSMotionUsageDescription).toBe(
64-
"This app uses motion activity tracking."
65+
"This app uses motion activity tracking.",
6566
);
6667

6768
expect(withInfoPlist).toHaveBeenCalled();
6869
});
6970

70-
it("should add Android motion activity recognition permission", () => {
71+
it("should add Android motion activity recognition permission if it does not exist", () => {
7172
const config: ExpoConfigWithModResults = {
7273
name: "mock-app",
7374
slug: "mock-app",
@@ -85,7 +86,36 @@ describe("withMotionActivityPermissions", () => {
8586
expect(permissions).toEqual(
8687
expect.arrayContaining([
8788
{ $: { "android:name": "android.permission.ACTIVITY_RECOGNITION" } },
88-
])
89+
]),
90+
);
91+
92+
expect(withAndroidManifest).toHaveBeenCalled();
93+
});
94+
95+
it("should not add duplicate Android motion activity recognition permission", () => {
96+
const config: ExpoConfigWithModResults = {
97+
name: "mock-app",
98+
slug: "mock-app",
99+
modResults: {
100+
manifest: {
101+
"uses-permission": [
102+
{
103+
$: { "android:name": "android.permission.ACTIVITY_RECOGNITION" },
104+
},
105+
],
106+
},
107+
},
108+
};
109+
110+
const updatedConfig: ExpoConfigWithModResults =
111+
withMotionActivityPermissions(config);
112+
113+
const permissions = updatedConfig.modResults?.manifest?.["uses-permission"];
114+
expect(permissions).toHaveLength(1); // Ensure no duplicates are added
115+
expect(permissions).toEqual(
116+
expect.arrayContaining([
117+
{ $: { "android:name": "android.permission.ACTIVITY_RECOGNITION" } },
118+
]),
89119
);
90120

91121
expect(withAndroidManifest).toHaveBeenCalled();

0 commit comments

Comments
 (0)