addIntentFilterInManifest function

void addIntentFilterInManifest({
  1. required List<Map<String, dynamic>> actions,
  2. required List<Map<String, dynamic>> categories,
  3. required List<Map<String, dynamic>> data,
})

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));
}