processAndroidCodeFileDirectory method

Future<void> processAndroidCodeFileDirectory({
  1. required String currentDirPath,
  2. required String newPackage,
})

Implementation

Future<void> processAndroidCodeFileDirectory({
  required String currentDirPath,
  required String newPackage,
}) async {
  if (newPackage.isEmpty) {
    log('Android processAndroidCodeFileDirectory, newPackage: $newPackage is empty');
    return;
  }

  final androidDir = Directory('$currentDirPath/android/app/src/main/');
  final androidMainAllFile = listAllFiles(androidDir)
      .where((element) => !element.contains('android/app/src/main/res/') && (element.endsWith('.java') || element.endsWith('.kt')))
      .toList();
  String mainActivityFilePath = '';
  String mainActivityFileName = 'MainActivity';
  String language = 'java';
  for (String element in androidMainAllFile) {
    String tmpFileName = p.basename(element);
    if (tmpFileName.startsWith(mainActivityFileName)) {
      mainActivityFilePath = element;
      if (tmpFileName.endsWith("$mainActivityFileName.kt")) {
        language = 'kotlin';
      }
      break;
    }
  }

  if (language == 'java') {
    mainActivityFileName += '.java';
  } else if (language == 'kotlin') {
    mainActivityFileName += '.kt';
  }

  if (mainActivityFilePath.isEmpty) {
    log('Android not found MainActivity file path');
    return;
  }

  String originalPackagePathString =
      mainActivityFilePath.replaceAll('${androidDir.path}$language/', '').replaceAll('/$mainActivityFileName', '');
  String newPakcagePathString = newPackage.split('.').join('/');
  if (originalPackagePathString == newPakcagePathString) {
    log('Android originalPackagePathString: $originalPackagePathString == newPakcagePathString: $newPakcagePathString');
    return;
  }

  // 修改引入头
  String originalPackageName = originalPackagePathString.split('/').join('.');
  for (var element in androidMainAllFile) {
    final fileType = await FileUtil.getFilePathEntityType(element);
    if (fileType == FileSystemEntityType.file) {
      final tmpFile = File(element);
      String tmpFileContent = tmpFile.readAsStringSync();
      if (tmpFileContent.contains(originalPackageName)) {
        tmpFileContent = tmpFileContent.replaceAll("package $originalPackageName", 'package $newPackage');
        tmpFile.writeAsStringSync(tmpFileContent);
      }
    }
  }

  final mainActivityFile = File(mainActivityFilePath);
  final mainActivityParentDir = mainActivityFile.parent;
  if (mainActivityParentDir.existsSync()) {
    final newDirPath = '${androidDir.path}$language/$newPakcagePathString';
    final newDir = Directory(newDirPath);
    if (!newDir.existsSync()) {
      newDir.createSync(recursive: true);
    }
    mainActivityParentDir.renameSync(newDirPath);
  }

  final needToDeleteDir = mainActivityParentDir.parent;
  if (needToDeleteDir.existsSync()) {
    needToDeleteDir.deleteSync();
  } else {
    log('Android needToDeleteDir.path --> ${needToDeleteDir.path} is not exist');
  }
}