checkResumeStatus static method

Future<ResumeStatus> checkResumeStatus(
  1. String filename
)

Check resume status for a single file

filename - The model filename (e.g., 'gemma-2b-it.bin') Returns ResumeStatus indicating what action should be taken

Implementation

static Future<ResumeStatus> checkResumeStatus(String filename) async {
  try {
    debugPrint('ResumeChecker: Checking resume status for $filename');

    // 1. Check if file exists and get its state
    final filePath = await ModelFileSystemManager.getModelFilePath(filename);
    final file = File(filePath);

    debugPrint('ResumeChecker: Checking file path: $filePath');

    // List directory contents for debugging
    try {
      final directory = file.parent;
      final directoryExists = await directory.exists();
      debugPrint('ResumeChecker: Directory exists: $directoryExists - ${directory.path}');

      if (directoryExists) {
        final files = await directory.list().toList();
        debugPrint('ResumeChecker: Directory contents (${files.length} items):');
        for (final item in files) {
          final name = item.path.split('/').last;
          final isFile = item is File;
          final size = isFile ? await item.length() : 0;
          debugPrint('  - $name ${isFile ? "($size bytes)" : "(directory)"}');
        }
      }
    } catch (e) {
      debugPrint('ResumeChecker: Failed to list directory: $e');
    }

    final fileExists = await file.exists();
    debugPrint('ResumeChecker: File exists: $fileExists for $filename');

    if (!fileExists) {
      debugPrint('ResumeChecker: File not found: $filename at path: $filePath');
      return ResumeStatus.fileNotFound;
    }

    // 2. Check if file is already complete
    final fileSize = await file.length();
    final isValid = await ModelFileSystemManager.isFileValid(filePath);

    debugPrint('ResumeChecker: File size: $fileSize, isValid: $isValid for $filename');

    if (isValid && fileSize > 0) {
      debugPrint('ResumeChecker: File is already complete: $filename');
      return ResumeStatus.fileComplete;
    }

    // 3. Check if we have a tracked task for this file in FileDownloader
    // First check active tasks
    final allTasks = await _downloader.allTasks(
      group: 'flutter_gemma_downloads',
      includeTasksWaitingToRetry: true,
    );

    Task? task = allTasks.cast<Task?>().firstWhere(
      (t) => t?.filename == filename,
      orElse: () => null,
    );

    // If not in active tasks, check database records
    if (task == null) {
      final records = await _downloader.database.allRecords();
      final record = records.cast<TaskRecord?>().firstWhere(
        (r) => r?.task.filename == filename,
        orElse: () => null,
      );
      task = record?.task;
    }

    if (task == null) {
      debugPrint('ResumeChecker: No tracked task for $filename - returning noTask status');
      return ResumeStatus.noTask;
    }

    debugPrint('ResumeChecker: Found task for $filename: ${task.taskId}');

    // 4. Check if background_downloader thinks this task can be resumed
    final canResume = await _downloader.taskCanResume(task);
    if (canResume) {
      debugPrint('ResumeChecker: File can be resumed: $filename');
      return ResumeStatus.canResume;
    } else {
      debugPrint('ResumeChecker: File cannot be resumed: $filename');
      return ResumeStatus.cannotResume;
    }

  } catch (e) {
    debugPrint('ResumeChecker: Error checking resume status for $filename: $e');
    return ResumeStatus.error;
  }
}