addIntentFilterInManifest function
void
addIntentFilterInManifest({})
Implementation
void addIntentFilterInManifest({
required List<Map<String, dynamic>> actions,
required List<Map<String, dynamic>> categories,
required List<Map<String, dynamic>> data,
}) async {
if (actions.isEmpty && categories.isEmpty && data.isEmpty) return;
final file = File('android/app/src/main/AndroidManifest.xml');
final document = XmlDocument.parse(await file.readAsString());
final application = document.getElement('manifest')?.getElement('application');
final activity = application?.findElements('activity').first;
if (activity == null) return;
final exists = activity.findElements('intent-filter').any((filter) {
final hasAction = filter
.findElements('action')
.any((a) => a.getAttribute('android:name') == actions.first['value']);
final hasData = filter
.findElements('data')
.any((d) => d.getAttribute('android:host') == data.first['android:host']);
return hasAction && hasData;
});
if (exists) return;
final builder = XmlBuilder();
builder.element('intent-filter', nest: () {
actions.forEach((e) {
return builder.element('action', nest: () {
builder.attribute(e['key'], e['value']);
});
});
categories.forEach((e) {
return builder.element('category', nest: () {
builder.attribute(e['key'], e['value']);
});
});
data.forEach((e) {
return builder.element('data', nest: () {
builder.attribute(e['key'], e['value']);
});
});
});
activity.children.add(builder.buildFragment());
await file.writeAsString(document.toXmlString(pretty: true));
}