renameAndroidNames function

void renameAndroidNames(
  1. RenameConfig config
)

Renames the Android app names and labels in the strings.xml and AndroidManifest.xml files.

This function creates or updates the res/values/strings.xml file with the app name, launcher name, and activity name from the config. It also updates the AndroidManifest.xml to reference these string resources for labels.

config - The configuration containing the new app names.

Implementation

void renameAndroidNames(RenameConfig config) {
  // 1️⃣ Ensure res/values/strings.xml exists
  final valuesDir =
      Directory(p.join('android', 'app', 'src', 'main', 'res', 'values'));
  if (!valuesDir.existsSync()) valuesDir.createSync(recursive: true);

  final stringsFile = File(p.join(valuesDir.path, 'strings.xml'));
  stringsFile.writeAsStringSync('''<?xml version='1.0' encoding='utf-8'?>
<resources>
    <string name="app_name">${config.name}</string>
    <string name="launcher_name">${config.shortName}</string>
    <string name="activity_name">@string/launcher_name</string>
</resources>
''');
  Logger.success('✅ Android strings.xml created/updated');

  // 2️⃣ Update AndroidManifest.xml
  final manifestPath =
      p.join('android', 'app', 'src', 'main', 'AndroidManifest.xml');
  final manifestFile = File(manifestPath);
  if (!manifestFile.existsSync()) {
    Logger.warn('AndroidManifest.xml not found at $manifestPath');
    return;
  }

  String content = manifestFile.readAsStringSync();

  // 2a. Update <application> android:label and android:name
  content = content.replaceAllMapped(
    RegExp(r'<application([^>]*)>'),
    (m) {
      var attrs = m.group(1)!;
      // Add/replace android:label
      if (attrs.contains('android:label=')) {
        attrs = attrs.replaceAll(RegExp(r'android:label="[^"]*"'),
            'android:label="@string/app_name"');
      } else {
        attrs += ' android:label="@string/app_name"';
      }
      return '<application$attrs>';
    },
  );

  // 2b. Update <activity> android:label
  content = content.replaceAllMapped(
    RegExp(r'<activity([^>]*)>'),
    (m) {
      var attrs = m.group(1)!;
      if (attrs.contains('android:label=')) {
        attrs = attrs.replaceAll(RegExp(r'android:label="[^"]*"'),
            'android:label="@string/activity_name"');
      } else {
        attrs += ' android:label="@string/activity_name"';
      }
      return '<activity$attrs>';
    },
  );

  // 2c. Update <intent-filter> android:label
  content = content.replaceAllMapped(
    RegExp(r'<intent-filter([^>]*)>'),
    (m) {
      var attrs = m.group(1)!;
      if (attrs.contains('android:label=')) {
        attrs = attrs.replaceAll(RegExp(r'android:label="[^"]*"'),
            'android:label="@string/launcher_name"');
      } else {
        attrs += ' android:label="@string/launcher_name"';
      }
      return '<intent-filter$attrs>';
    },
  );

  manifestFile.writeAsStringSync(content);
  Logger.success('✅ AndroidManifest.xml updated with labels and namespace');
}