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 registered task for this file
    final taskId = await DownloadTaskRegistry.getTaskId(filename);
    debugPrint('ResumeChecker: TaskId for $filename: $taskId');

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

    // 4. Create a task object to check resume capability
    final task = DownloadTask(
      taskId: taskId,
      url: 'placeholder', // We don't need real URL for resume check
      filename: filename,
      group: UnifiedDownloadEngine.downloadGroup,
    );

    // 5. 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;
  }
}