updateMinSdk method

OperationResult updateMinSdk(
  1. int version
)

Updates the minSdkVersion in the Android Gradle build file.

Implementation

OperationResult updateMinSdk(int version) {
  final gradleFile = File(_buildGradlePath);
  final gradleKtsFile = File(_buildGradleKtsPath);

  File targetFile;
  bool isKotlinDsl = false;

  if (gradleFile.existsSync()) {
    targetFile = gradleFile;
  } else if (gradleKtsFile.existsSync()) {
    targetFile = gradleKtsFile;
    isKotlinDsl = true;
  } else {
    return const Failure(
      'Could not find build.gradle or build.gradle.kts. '
      'Are you in a Flutter project root directory?',
    );
  }

  try {
    String content = targetFile.readAsStringSync();
    final originalContent = content;

    final patterns = isKotlinDsl
        ? [
            RegExp(r'minSdk\s*=\s*\d+'),
            RegExp(r'minSdk\s*=\s*[\w.]+'),
            RegExp(r'minSdkVersion\s*\(\s*\d+\s*\)'),
            RegExp(r'minSdkVersion\s*\(\s*[\w.]+\s*\)'),
          ]
        : [
            RegExp(r'minSdkVersion\s+\d+'),
            RegExp(r'minSdkVersion\s+[\w.]+'),
            RegExp(r"minSdkVersion\s*=\s*\d+"),
            RegExp(r"minSdkVersion\s*=\s*[\w.]+"),
          ];

    bool replaced = false;
    for (final pattern in patterns) {
      if (pattern.hasMatch(content)) {
        final replacement =
            isKotlinDsl ? 'minSdk = $version' : 'minSdkVersion $version';
        content = content.replaceFirst(pattern, replacement);
        replaced = true;
        break;
      }
    }

    if (!replaced) {
      return const Failure(
        'Could not find minSdkVersion in build.gradle. '
        'Please ensure the file has a valid Android configuration.',
      );
    }

    if (content == originalContent) {
      return Success('minSdkVersion is already set to $version.');
    }

    targetFile.writeAsStringSync(content);
    return Success(
      'Successfully updated minSdkVersion to $version in '
      '${isKotlinDsl ? "build.gradle.kts" : "build.gradle"}.',
    );
  } on FileSystemException catch (e) {
    return Failure('Failed to update build.gradle: ${e.message}');
  }
}