updateBuildGradleInApp function

void updateBuildGradleInApp()

Implementation

void updateBuildGradleInApp() {
  const gradlePath = 'android/app/build.gradle';
  const gradleKtsPath = 'android/app/build.gradle.kts';

  final gradleFile = File(gradlePath);
  final gradleKtsFile = File(gradleKtsPath);

  if (!gradleFile.existsSync() && !gradleKtsFile.existsSync()) {
    print('Error: Neither build.gradle nor build.gradle.kts exists.');
    return;
  }

  final isKts = gradleKtsFile.existsSync();
  final fileToEdit = isKts ? gradleKtsFile : gradleFile;

  List<String> gradleLines;

  try {
    gradleLines = fileToEdit.readAsLinesSync();
  } catch (e) {
    print('Error reading file: $e');
    return;
  }

  final newDeps = isKts
      ? [
          'coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")',
          'implementation("androidx.window:window:1.0.0")',
          'implementation("androidx.window:window-java:1.0.0")',
        ]
      : [
          "coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.4'",
          "implementation 'androidx.window:window:1.0.0'",
          "implementation 'androidx.window:window-java:1.0.0'",
        ];

  final dependenciesStart =
      gradleLines.indexWhere((line) => line.trim() == 'dependencies {');

  if (dependenciesStart == -1) {
    gradleLines.add('');
    gradleLines.add('dependencies {');
    gradleLines.addAll(newDeps.map((dep) => '    $dep'));
    gradleLines.add('}');
    print('Added new dependencies block with required dependencies.');
  } else {
    final alreadyAdded = newDeps.every(
        (dep) => gradleLines.any((line) => line.trim() == dep.trim()));

    if (!alreadyAdded) {
      gradleLines.insertAll(dependenciesStart + 1,
          newDeps.map((dep) => '    $dep'));
      print('Added dependencies inside existing dependencies block.');
    } else {
      print('Dependencies already exist in the file.');
    }
  }

  final defaultConfigStart =
      gradleLines.indexWhere((line) => line.trim() == 'defaultConfig {');

  if (defaultConfigStart != -1) {
    final defaultConfigEnd = _findBlockEnd(gradleLines, defaultConfigStart);

    final multiDexExists = gradleLines
        .sublist(defaultConfigStart, defaultConfigEnd)
        .any((line) => line.contains('multiDexEnabled'));

    if (!multiDexExists) {
      gradleLines.insert(defaultConfigStart + 1, isKts ?  '             multiDexEnabled = true' :'        multiDexEnabled true');
      print('multiDexEnabled added successfully.');
    } else {
      print('multiDexEnabled already set.');
    }
  } else {
    print('No defaultConfig block found!');
  }

  final compileOptionsStart =
      gradleLines.indexWhere((line) => line.trim() == 'compileOptions {');

  if (compileOptionsStart != -1) {
    final compileOptionsEnd = _findBlockEnd(gradleLines, compileOptionsStart);

    final desugaringEnabledExists = gradleLines
        .sublist(compileOptionsStart, compileOptionsEnd)
        .any((line) => line.contains('coreLibraryDesugaringEnabled'));

    if (!desugaringEnabledExists) {
      gradleLines.insert(
          compileOptionsStart + 1, isKts ? '             isCoreLibraryDesugaringEnabled = true'  :'        coreLibraryDesugaringEnabled true');
      print('coreLibraryDesugaringEnabled added successfully.');
    } else {
      print('coreLibraryDesugaringEnabled already set.');
    }
  } else {
    print('No compileOptions block found!');
  }

  try {
    fileToEdit.writeAsStringSync(gradleLines.join('\n'));
    print('build.gradle updated successfully.');
  } catch (e) {
    print('Failed to write build.gradle: $e');
  }
}