11import { withInfoPlist , withAndroidManifest } from "@expo/config-plugins" ;
2- import withMotionActivityPermissions from "../config-plugin/withMotionActivityPermissions" ;
32import type { ExpoConfig } from "@expo/config-types" ;
43
4+ import withMotionActivityPermissions from "../config-plugin/withMotionActivityPermissions" ;
5+
56interface 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