feat: network requirement option for upload (#20302)

* wifi toggle

* feat: network requirement option for upload

* chore: put back holding queue previous config numbers

* options

* backup option page

* pr feedback
This commit is contained in:
Alex 2025-07-30 11:43:20 -05:00 committed by GitHub
parent 47a025f39f
commit 10e9c278ee
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 220 additions and 14 deletions

View file

@ -12,11 +12,13 @@ import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/infrastructure/repositories/backup.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/storage.repository.dart';
import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/providers/backup/drift_backup.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/storage.provider.dart';
import 'package:immich_mobile/repositories/upload.repository.dart';
import 'package:immich_mobile/services/api.service.dart';
import 'package:immich_mobile/services/app_settings.service.dart';
import 'package:path/path.dart' as p;
final uploadServiceProvider = Provider((ref) {
@ -25,6 +27,7 @@ final uploadServiceProvider = Provider((ref) {
ref.watch(backupRepositoryProvider),
ref.watch(storageRepositoryProvider),
ref.watch(localAssetRepository),
ref.watch(appSettingsServiceProvider),
);
ref.onDispose(service.dispose);
@ -32,7 +35,13 @@ final uploadServiceProvider = Provider((ref) {
});
class UploadService {
UploadService(this._uploadRepository, this._backupRepository, this._storageRepository, this._localAssetRepository) {
UploadService(
this._uploadRepository,
this._backupRepository,
this._storageRepository,
this._localAssetRepository,
this._appSettingsService,
) {
_uploadRepository.onUploadStatus = _onUploadCallback;
_uploadRepository.onTaskProgress = _onTaskProgressCallback;
}
@ -41,6 +50,7 @@ class UploadService {
final DriftBackupRepository _backupRepository;
final StorageRepository _storageRepository;
final DriftLocalAssetRepository _localAssetRepository;
final AppSettingsService _appSettingsService;
final StreamController<TaskStatusUpdate> _taskStatusController = StreamController<TaskStatusUpdate>.broadcast();
final StreamController<TaskProgressUpdate> _taskProgressController = StreamController<TaskProgressUpdate>.broadcast();
@ -240,6 +250,14 @@ class UploadService {
livePhotoVideoId: '',
).toJson();
bool requiresWiFi = true;
if (asset.isVideo && _appSettingsService.getSetting(AppSettingsEnum.useCellularForUploadVideos)) {
requiresWiFi = false;
} else if (!asset.isVideo && _appSettingsService.getSetting(AppSettingsEnum.useCellularForUploadPhotos)) {
requiresWiFi = false;
}
return buildUploadTask(
file,
originalFileName: originalFileName,
@ -248,6 +266,7 @@ class UploadService {
group: group,
priority: priority,
isFavorite: asset.isFavorite,
requiresWiFi: requiresWiFi,
);
}
@ -284,12 +303,12 @@ class UploadService {
String? metadata,
int? priority,
bool? isFavorite,
bool requiresWiFi = true,
}) async {
final serverEndpoint = Store.get(StoreKey.serverEndpoint);
final url = Uri.parse('$serverEndpoint/assets').toString();
final headers = ApiService.getRequestHeaders();
final deviceId = Store.get(StoreKey.deviceId);
final (baseDirectory, directory, filename) = await Task.split(filePath: file.path);
final stats = await file.stat();
final fileCreatedAt = stats.changed;
@ -318,6 +337,7 @@ class UploadService {
fileField: 'assetData',
metaData: metadata ?? '',
group: group,
requiresWiFi: requiresWiFi,
priority: priority ?? 5,
updates: Updates.statusAndProgress,
retries: 3,