@@ -153,24 +153,38 @@ internal static void InjectReceivers(string manifestPath, XmlDocument manifestXm
153
153
notificationRestartOnBootReceiver . SetAttribute ( "exported" , kAndroidNamespaceURI , "false" ) ;
154
154
}
155
155
156
- internal static void AppendAndroidPermissionField ( string manifestPath , XmlDocument xmlDoc , string name )
156
+ internal static void AppendAndroidPermissionField ( string manifestPath , XmlDocument xmlDoc , string name , string maxSdk = null )
157
157
{
158
158
var manifestNode = xmlDoc . SelectSingleNode ( "manifest" ) ;
159
159
if ( manifestNode == null )
160
160
throw new ArgumentException ( string . Format ( "Missing 'manifest' node in '{0}'." , manifestPath ) ) ;
161
161
162
+ XmlElement metaDataNode = null ;
162
163
foreach ( XmlNode node in manifestNode . ChildNodes )
163
164
{
164
165
if ( ! ( node is XmlElement ) || node . Name != "uses-permission" )
165
166
continue ;
166
167
167
- var elementName = ( ( XmlElement ) node ) . GetAttribute ( "name" , kAndroidNamespaceURI ) ;
168
+ var element = ( XmlElement ) node ;
169
+ var elementName = element . GetAttribute ( "name" , kAndroidNamespaceURI ) ;
168
170
if ( elementName == name )
169
- return ;
171
+ {
172
+ if ( maxSdk == null )
173
+ return ;
174
+ var maxSdkAttr = element . GetAttribute ( "maxSdkVersion" , kAndroidNamespaceURI ) ;
175
+ if ( ! string . IsNullOrEmpty ( maxSdkAttr ) )
176
+ return ;
177
+ metaDataNode = element ;
178
+ }
170
179
}
171
180
172
- XmlElement metaDataNode = xmlDoc . CreateElement ( "uses-permission" ) ;
173
- metaDataNode . SetAttribute ( "name" , kAndroidNamespaceURI , name ) ;
181
+ if ( metaDataNode == null )
182
+ {
183
+ metaDataNode = xmlDoc . CreateElement ( "uses-permission" ) ;
184
+ metaDataNode . SetAttribute ( "name" , kAndroidNamespaceURI , name ) ;
185
+ }
186
+ if ( maxSdk != null )
187
+ metaDataNode . SetAttribute ( "maxSdkVersion" , kAndroidNamespaceURI , maxSdk ) ;
174
188
175
189
manifestNode . AppendChild ( metaDataNode ) ;
176
190
}
0 commit comments