removePermission method

OperationResult removePermission(
  1. String permissionName
)

Removes a permission from the AndroidManifest.xml file.

Implementation

OperationResult removePermission(String permissionName) {
  final manifestFile = File(_manifestPath);

  if (!manifestFile.existsSync()) {
    return const Failure(
      'Could not find AndroidManifest.xml. '
      'Are you in a Flutter project root directory?',
    );
  }

  final fullPermission = permissionName.contains('.')
      ? permissionName
      : 'android.permission.$permissionName';

  try {
    final content = manifestFile.readAsStringSync();
    final document = XmlDocument.parse(content);

    final manifest = document.rootElement;

    if (manifest.name.local != 'manifest') {
      return const Failure(
        'Invalid AndroidManifest.xml: root element is not <manifest>.',
      );
    }

    const androidNs = 'http://schemas.android.com/apk/res/android';
    final existingPermissions =
        manifest.findAllElements('uses-permission').toList();

    XmlElement? elementToRemove;
    for (final permission in existingPermissions) {
      final nameAttr =
          permission.getAttribute('name', namespace: androidNs) ??
              permission.getAttribute('android:name');
      if (nameAttr == fullPermission) {
        elementToRemove = permission;
        break;
      }
    }

    if (elementToRemove == null) {
      return Failure('Permission $fullPermission not found in manifest.');
    }

    // Remove the element and any preceding whitespace
    final parent = elementToRemove.parent;
    if (parent != null) {
      final index = parent.children.indexOf(elementToRemove);
      parent.children.remove(elementToRemove);

      // Remove preceding whitespace if exists
      if (index > 0 && parent.children[index - 1] is XmlText) {
        final textNode = parent.children[index - 1] as XmlText;
        if (textNode.value.trim().isEmpty) {
          parent.children.removeAt(index - 1);
        }
      }
    }

    final output = document.toXmlString(pretty: true, indent: '    ');
    manifestFile.writeAsStringSync(output);

    return Success('Successfully removed permission: $fullPermission');
  } on XmlParserException catch (e) {
    return Failure('Failed to parse AndroidManifest.xml: ${e.message}');
  } on FileSystemException catch (e) {
    return Failure('Failed to update AndroidManifest.xml: ${e.message}');
  }
}