checkResumeStatus static method
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;
}
}