removePermission method
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}');
}
}