listAvds function

Future<void> listAvds(
  1. Map<String, String> cmd
)

✅ Main Listing Function

Implementation

Future<void> listAvds(Map<String, String> cmd) async {
  // Get AVD home directory
  final avdHome = Platform.environment['ANDROID_AVD_HOME'] ??
      p.join(Platform.environment['HOME']!, '.android', 'avd');

  final avdDir = Directory(avdHome);

  if (!await avdDir.exists()) {
    print('❌ AVD directory not found at $avdHome');
    return;
  }

  // List all AVD directories
  final avdDirectories = avdDir.listSync().whereType<Directory>();
  final avdData = <Avd>[];

  // Fetch size for each AVD asynchronously and build Avd objects
  for (final avd in avdDirectories) {
    final name = p.basenameWithoutExtension(avd.path);
    final size = await _getDirectorySize(avd);
    final sizeStr = _formatSize(size);
    avdData.add(Avd(name, size, sizeStr));
  }

  // Minimum AVDs check
  if (avdData.isEmpty) {
    print('No AVDs found.');
    return;
  }

  // Extract command-line arguments
  final sortBy = cmd['sort'] ?? 'name';
  final minSizeStr = cmd['min-size'] ?? '0';
  final nameStr = cmd['name'] ?? 'list';

  // Skip size filtering if 'min-size' is '0'
  if (minSizeStr != '0' && minSizeStr.isNotEmpty) {
    try {
      final minBytes = parseSize(minSizeStr);
      avdData.removeWhere((avd) => avd.size <= minBytes);
      final remainingCount = avdData.length;
      if (remainingCount == 0) {
        print(
            'No AVDs found with size greater than ${minSizeStr.toUpperCase()}');
        return;
      } else {
        print(
            'Found $remainingCount AVD(s) with size greater than ${minSizeStr.toUpperCase()}:');
      }
      //sort list avds by name
      if (nameStr == 'list') {
        avdData.sort(
            (a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));
      } else if (nameStr == 'size') {
        avdData.sort((a, b) => a.size.compareTo(b.size));
      } else {
        print('Invalid sort option: $nameStr. Defaulting to sorting by name.');
        avdData.sort(
            (a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));
      }
    } catch (e) {
      print(
          '❌ Invalid size format: $minSizeStr. Use formats like 500MB or 1GB.');
      return;
    }
  }

  // Sort AVDs if 'sort' argument is provided
  if (sortBy == 'size') {
    avdData.sort((a, b) => a.size.compareTo(b.size));
  } else if (sortBy == 'name') {
    avdData
        .sort((a, b) => a.name.toLowerCase().compareTo(b.name.toLowerCase()));
  }

  // Loop and print the sorted AVD data
  for (final avd in avdData) {
    print('• ${avd.name} (AVD directory size: ${avd.sizeStr})');
  }
}