Skip to content

commit ff0d544

abduznik edited this page May 23, 2026 · 1 revision

fix: align with RomM 4.8.0 API and implement robust "Force Push" save sync

Commit: ff0d544bd9426eff156086c63b50425b56423a39

Author: abduznik

Date: 2026-04-18

Message

  • Update RommService to use the new bulk delete endpoint (POST /api/saves/delete), resolving 405 errors
  • Remove trailing slashes from all API endpoints to match strict RomM 4.8.0 routing
  • Fix multipart field name for screenshot uploads (screenshotFile)
  • Correct query parameters (game_id -> rom_id) for save-related GET requests
  • Refactor SaveSyncService to ensure unique content hashes for every push by wrapping data in unique ZIPs with fresh sync metadata
  • Update SaveFile model and associated unit tests for compatibility
  • Regenerate all test mocks to reflect updated service signatures

Why: Fixes a bug or regression in the existing codebase.

Files Changed

lib/core/romm/romm_models.dart                     |   8 +-
 lib/core/romm/romm_service.dart                    |  85 +++-
 lib/core/save/save_sync_service.dart               |  77 +--
 test/unit/firmware_service_test.mocks.dart         | 520 +++++++++++++-------
 test/unit/paginated_games_provider_test.mocks.dart |  29 +-
 test/unit/romm_models_test.dart                    |   6 +-
 test/unit/save_sync_service_test.dart              |  24 +-
 test/unit/save_sync_service_test.mocks.dart        | 520 +++++++++++++-------
 test/unit/strategy_registry_test.mocks.dart        | 306 ++++++++----
 test/widgets/library_screen_test.mocks.dart        | 468 +++++++++++-------
 test/widgets/settings_screen_test.mocks.dart       | 536 +++++++++++++--------
 11 files changed, 1694 insertions(+), 885 deletions(-)
  • lib/core/romm/romm_models.dart
  • lib/core/romm/romm_service.dart
  • lib/core/save/save_sync_service.dart
  • test/unit/firmware_service_test.mocks.dart
  • test/unit/paginated_games_provider_test.mocks.dart
  • test/unit/romm_models_test.dart
  • test/unit/save_sync_service_test.dart
  • test/unit/save_sync_service_test.mocks.dart
  • test/unit/strategy_registry_test.mocks.dart
  • test/widgets/library_screen_test.mocks.dart
  • test/widgets/settings_screen_test.mocks.dart

Diff

diff --git a/lib/core/romm/romm_models.dart b/lib/core/romm/romm_models.dart
index fe13798..7ee1873 100644
--- a/lib/core/romm/romm_models.dart
+++ b/lib/core/romm/romm_models.dart
@@ -307,20 +307,20 @@ class RomNote {
 
 class SaveFile {
   final String id;
-  final String gameId;
+  final String romId;
   final String url;
 
   SaveFile({
     required this.id,
-    required this.gameId,
+    required this.romId,
     required this.url,
   });
 
   factory SaveFile.fromJson(Map<String, dynamic> json) {
     return SaveFile(
       id: json['id']?.toString() ?? '',
-      gameId: json['game_id']?.toString() ?? '',
-      url: json['url']?.toString() ?? '',
+      romId: (json['rom_id'] ?? json['game_id'])?.toString() ?? '',
+      url: (json['url'] ?? json['download_path'])?.toString() ?? '',
     );
   }
 }
diff --git a/lib/core/romm/romm_service.dart b/lib/core/romm/romm_service.dart
index 0181350..0895025 100644
--- a/lib/core/romm/romm_service.dart
+++ b/lib/core/romm/romm_service.dart
@@ -142,14 +142,14 @@ class RommService {
 
   Future<Game?> getGame(String id) async {
     try {
-      final response = await _dio.get('/api/roms/$id/', options: _authOptions);
+      final response = await _dio.get('/api/roms/$id', options: _authOptions);
       if (response.statusCode == 200) return Game.fromJson(response.data);
       return null;
     } catch (_) { return null; }
   }
 
   Future<List<Platform>> getPlatforms() async {
-    final response = await _dio.get('/api/platforms/', options: _authOptions);
+    final response = await _dio.get('/api/platforms', options: _authOptions);
     if (response.statusCode == 200) {
       final List<dynamic> items = (response.data is Map && response.data.containsKey('items')) 
           ? response.data['items'] : response.data as List<dynamic>;
@@ -160,7 +160,7 @@ class RommService {
 
   Future<List<Map<String, dynamic>>> getCollections() async {
     try {
-      final response = await _dio.get('/api/collections/', options: _authOptions);
+      final response = await _dio.get('/api/collections', options: _authOptions);
       if (response.statusCode == 200) {
         final List<dynamic> data = response.data is List ? response.data : [];
         return data.map((e) => e as Map<String, dynamic>).toList();
@@ -192,7 +192,7 @@ class RommService {
 
   Future<List<Game>> getRecentlyPlayed({int limit = 15}) async {
     try {
-      final response = await _dio.get('/api/roms/', queryParameters: {'limit': limit, 'order_by': 'last_played', 'order_dir': 'desc', 'last_played': true, 'with_char_index': false, 'with_filter_values': false}, options: _authOptions);
+      final response = await _dio.get('/api/roms', queryParameters: {'limit': limit, 'order_by': 'last_played', 'order_dir': 'desc', 'last_played': true, 'with_char_index': false, 'with_filter_values': false}, options: _authOptions);
       if (response.statusCode == 200) {
         final List<dynamic> items = response.data is Map ? (response.data['items'] ?? []) : (response.data is List ? response.data : []);
         return items.map((e) => Game.fromJson(e as Map<String, dynamic>)).toList();
@@ -212,7 +212,7 @@ class RommService {
     if (collections.isNotEmpty) params['collection_id'] = int.tryParse(collections.first);
     if (statuses.isNotEmpty) { params['statuses'] = statuses; params['statuses_logic'] = 'any'; }
 
-    final response = await _dio.get('/api/roms/', queryParameters: params, options: _authOptions);
+    final response = await _dio.get('/api/roms', queryParameters: params, options: _authOptions);
     if (response.statusCode == 200) {
       final Map<String, dynamic> data = response.data is Map ? response.data : {'items': response.data};
       final List<dynamic> items = data['items'] ?? [];
@@ -225,7 +225,7 @@ class RommService {
   Future<List<Game>> _fetchPaginatedGames(Map<String, dynamic> params) async {
     int offset = 0; const int limit = 100; List<Game> allGames = []; int total = 0;
     do {
-      final response = await _dio.get('/api/roms/', queryParameters: {...params, 'limit': limit, 'offset': offset}, options: _authOptions);
+      final response = await _dio.get('/api/roms', queryParameters: {...params, 'limit': limit, 'offset': offset}, options: _authOptions);
       if (response.statusCode == 200) {
         final Map<String, dynamic> data = response.data is Map ? response.data : {'items': response.data};
         final List<dynamic> items = data['items'] ?? [];
@@ -239,18 +239,18 @@ class RommService {
 
   Future<Game?> getRandomGame() async {
     try {
-      final countResponse = await _dio.get('/api/roms/', queryParameters: {'limit': 1, 'offset': 0, 'order_by': 'name', 'order_dir': 'asc', 'with_char_index': false, 'with_filter_values': false}, options: _authOptions);
+      final countResponse = await _dio.get('/api/roms', queryParameters: {'limit': 1, 'offset': 0, 'order_by': 'name', 'order_dir': 'asc', 'with_char_index': false, 'with_filter_values': false}, options: _authOptions);
       if (countResponse.statusCode != 200) return null;
       final total = (countResponse.data is Map ? countResponse.data['total'] : null) as int? ?? 0;
       if (total == 0) return null;
-      final response = await _dio.get('/api/roms/', queryParameters: {'limit': 1, 'offset': Random().nextInt(total), 'order_by': 'name', 'order_dir': 'asc', 'with_char_index': false, 'with_filter_values': false}, options: _authOptions);
+      final response = await _dio.get('/api/roms', queryParameters: {'limit': 1, 'offset': Random().nextInt(total), 'order_by': 'name', 'order_dir': 'asc', 'with_char_index': false, 'with_filter_values': false}, options: _authOptions);
       final items = (response.data is Map ? response.data['items'] : null) as List<dynamic>? ?? [];
       return items.isEmpty ? null : Game.fromJson(items.first as Map<String, dynamic>);
     } catch (_) { return null; }
   }
 
   Future<List<SaveFile>> getSaves(String gameId) async {
-    final response = await _dio.get('/api/saves/', queryParameters: {'game_id': gameId}, options: _authOptions);
+    final response = await _dio.get('/api/saves', queryParameters: {'rom_id': gameId}, options: _authOptions);
     if (response.statusCode == 200) {
       final List<dynamic> items = (response.data is Map && response.data.containsKey('items')) ? response.data['items'] : response.data as List<dynamic>;
       return items.map((item) => SaveFile.fromJson(item)).toList();
@@ -279,18 +279,45 @@ class RommService {
     return 'Basic ${base64Encode(utf8.encode('${_config.username}:${_config.password}'))}';
   }
 
-  Future<bool> uploadSave(String gameId, io.File saveFile, {String? slot, io.File? screenshotFile}) async {
+  Future<bool> uploadSave(String gameId, io.File saveFile, {String? slot, io.File? screenshotFile, String? overrideFilename}) async {
     try {
       final now = DateTime.now(); final ts = '${now.year}-${now.month.toString().padLeft(2, '0')}-${now.day.toString().padLeft(2, '0')}_${now.hour.toString().padLeft(2, '0')}-${now.minute.toString().padLeft(2, '0')}-${now.second.toString().padLeft(2, '0')}';
       final effectiveSlot = slot ?? 'freegosy-srm_$ts';
-      final boundary = '----FreegosyBoundary${DateTime.now().millisecondsSinceEpoch}';
-      final formDataMap = {'saveFile': await MultipartFile.fromFile(saveFile.path, filename: saveFile.uri.pathSegments.last)};
+      final uploadFilename = overrideFilename ?? saveFile.uri.pathSegments.last;
+      
+      final formDataMap = <String, dynamic>{
+        'saveFile': await MultipartFile.fromFile(saveFile.path, filename: uploadFilename)
+      };
       if (screenshotFile != null && await screenshotFile.exists()) {
-        formDataMap['stateScreenshot'] = await MultipartFile.fromFile(screenshotFile.path, filename: screenshotFile.uri.pathSegments.last);
+        formDataMap['screenshotFile'] = await MultipartFile.fromFile(screenshotFile.path, filename: screenshotFile.uri.pathSegments.last);
       }
-      final response = await _dio.post('/api/saves/', queryParameters: {'rom_id': gameId, 'emulator': 'freegosy', 'slot': effectiveSlot}, data: FormData.fromMap(formDataMap), options: _authOptions.copyWith(headers: {..._authOptions.headers ?? {}, 'Content-Type': 'multipart/form-data; boundary=$boundary'}));
+      
+      final response = await _dio.post(
+        '/api/saves', 
+        queryParameters: {'rom_id': gameId, 'emulator': 'freegosy', 'slot': effectiveSlot}, 
+        data: FormData.fromMap(formDataMap), 
+        options: _authOptions.copyWith()
+      );
       return response.statusCode != null && response.statusCode! >= 200 && response.statusCode! < 300;
-    } catch (_) { return false; }
+    } catch (e) { 
+      debugPrint('[RomM] uploadSave error: $e');
+      return false; 
+    }
+  }
+
+  Future<bool> deleteSaves(List<int> saveIds) async {
+    if (saveIds.isEmpty) return true;
+    try {
+      final response = await _dio.post(
+        '/api/saves/delete',
+        data: {'saves': saveIds},
+        options: _authOptions.copyWith(contentType: 'application/json'),
+      );
+      return response.statusCode != null && response.statusCode! >= 200 && response.statusCode! < 300;
+    } catch (e) {
+      debugPrint('[RomM] deleteSaves error: $e');
+      return false;
+    }
   }
 
   Future<void> pruneOldSaves(String gameId, {int keepCount = 5}) async {
@@ -298,15 +325,25 @@ class RommService {
       final saves = await getSavesList(gameId);
       final freegosySaves = saves.where((s) => (s['emulator']?.toString() ?? '') == 'freegosy').toList();
       if (freegosySaves.length <= keepCount) return;
-      for (final save in freegosySaves.sublist(keepCount)) {
-        if (save['id'] != null) await _dio.delete('/api/saves/${save['id']}/', options: _authOptions);
+      
+      final toDelete = freegosySaves.sublist(keepCount);
+      final idsToDelete = toDelete
+          .map((s) => int.tryParse(s['id']?.toString() ?? ''))
+          .whereType<int>()
+          .toList();
+
+      if (idsToDelete.isNotEmpty) {
+        debugPrint('[RomM] Pruning ${idsToDelete.length} old saves for game $gameId');
+        await deleteSaves(idsToDelete);
       }
-    } catch (_) {}
+    } catch (e) {
+      debugPrint('[RomM] pruneOldSaves error: $e');
+    }
   }
 
   Future<List<Map<String, dynamic>>> getSavesList(String gameId) async {
     try {
-      final response = await _dio.get('/api/saves/', queryParameters: {'rom_id': gameId}, options: _authOptions);
+      final response = await _dio.get('/api/saves', queryParameters: {'rom_id': gameId}, options: _authOptions);
       if (response.statusCode != 200) return [];
       final List<dynamic> items = (response.data is Map && response.data.containsKey('items')) ? response.data['items'] : (response.data is List ? response.data : []);
       final sorted = List<Map<String, dynamic>>.from(items.whereType<Map<String, dynamic>>());
@@ -334,7 +371,7 @@ class RommService {
 
   Future<List<Firmware>> getFirmware({String? platformId}) async {
     final params = platformId != null ? {'platform_id': platformId} : <String, dynamic>{};
-    final response = await _dio.get('/api/firmware/', queryParameters: params, options: _authOptions);
+    final response = await _dio.get('/api/firmware', queryParameters: params, options: _authOptions);
     if (response.statusCode == 200) {
       final List<dynamic> items = (response.data is Map && response.data.containsKey('items')) ? response.data['items'] : response.data as List<dynamic>;
       return items.map((item) => Firmware.fromJson(item)).toList();
@@ -364,14 +401,14 @@ class RommService {
       if (rating != null) data['rating'] = rating;
       if (status != null) data['status'] = status;
       if (completion != null) data['completion'] = completion;
-      final response = await _dio.put('/api/roms/$romId/props/', data: {'data': data, 'update_last_played': false, 'remove_last_played': false}, options: Options(headers: Map<String, dynamic>.from(_authOptions.headers ?? {})..['Content-Type'] = 'application/json', validateStatus: (status) => status != null && status < 500));
+      final response = await _dio.put('/api/roms/$romId/props', data: {'data': data, 'update_last_played': false, 'remove_last_played': false}, options: Options(headers: Map<String, dynamic>.from(_authOptions.headers ?? {})..['Content-Type'] = 'application/json', validateStatus: (status) => status != null && status < 500));
       return response.statusCode == 200 || response.statusCode == 204;
     } catch (_) { return false; }
   }
 
   Future<List<RomNote>> getRomNotes(String romId) async {
     try {
-      final response = await _dio.get('/api/roms/$romId/notes/', options: _authOptions);
+      final response = await _dio.get('/api/roms/$romId/notes', options: _authOptions);
       if (response.statusCode == 200) {
         final List<dynamic> items = (response.data is Map && response.data.containsKey('items')) ? response.data['items'] : response.data as List<dynamic>;
         return items.map((item) => RomNote.fromJson(item)).toList();
@@ -382,14 +419,14 @@ class RommService {
 
   Future<bool> createRomNote(String romId, String title, String content) async {
     try {
-      final response = await _dio.post('/api/roms/$romId/notes/', data: {'title': title, 'content': content, 'is_public': true, 'tags': []}, options: _authOptions.copyWith(contentType: 'application/json'));
+      final response = await _dio.post('/api/roms/$romId/notes', data: {'title': title, 'content': content, 'is_public': true, 'tags': []}, options: _authOptions.copyWith(contentType: 'application/json'));
       return response.statusCode == 200 || response.statusCode == 201;
     } catch (_) { return false; }
   }
 
   Future<bool> deleteRomNote(String romId, int noteId) async {
     try {
-      final response = await _dio.delete('/api/roms/$romId/notes/$noteId/', options: _authOptions);
+      final response = await _dio.delete('/api/roms/$romId/notes/$noteId', options: _authOptions);
       return response.statusCode == 200 || response.statusCode == 204;
     } catch (_) { return false; }
   }
diff --git a/lib/core/save/save_sync_service.dart b/lib/core/save/save_sync_service.dart
index 5094e29..c615a48 100644
--- a/lib/core/save/save_sync_service.dart
+++ b/lib/core/save/save_sync_service.dart
@@ -10,6 +10,7 @@ import 'strategies/retroarch_save_strategy.dart';
 import 'strategies/dolphin_save_strategy.dart';
 import 'strategies/eden_save_strategy.dart';
 import 'package:archive/archive_io.dart';
+import 'package:path/path.dart' as p;
 import 'strategies/windows_save_strategy.dart';
 import 'strategies/pcsx2_save_strategy.dart';
 import 'strategies/rpcs3_save_strategy.dart';
@@ -246,49 +247,64 @@ class SaveSyncService {
       if (filesMap.isEmpty) return false;
 
       int uploaded = 0;
+      final displayStem = game.displayName;
+      final tempDir = await _directoryService.getEmulatorDirectory('temp');
+      if (!await Directory(tempDir).exists()) {
+        await Directory(tempDir).create(recursive: true);
+      }
+
       for (final entry in filesMap.entries) {
         final file = entry.key;
         final screenshotFile = entry.value;
-        File uploadFile = file;
-        bool isTempZip = false;
+        
+        final String localHash = await _hashFile(file);
+        final String uploadFilename = '$displayStem.zip';
+        final String? storedHash = await _getStoredHash(game.id, uploadFilename);
 
-        if (await FileSystemEntity.isDirectory(file.path)) {
-          final zipPath = '${file.path}.zip';
-          // Write a temp metadata file into the save dir before zipping.
-          // This gives each zip a unique content hash so RomM won't deduplicate.
-          final metaFile = File('${file.path}/.freegosy_sync');
-          await metaFile.writeAsString(DateTime.now().toIso8601String());
-          final encoder = ZipFileEncoder();
-          encoder.create(zipPath);
-          await encoder.addDirectory(Directory(file.path));
-          encoder.close();
-          // Clean up the temp meta file
-          if (await metaFile.exists()) await metaFile.delete();
-          uploadFile = File(zipPath);
-          isTempZip = true;
+        // Local deduplication check (only for automatic syncs)
+        if (!force && storedHash != null && localHash == storedHash) {
+          debugPrint('[Sync] Skipping upload for $displayStem: hash matches local cache ($localHash)');
+          continue;
         }
 
-        final filename = uploadFile.path
-            .split(RegExp(r'[/\\]'))
-            .last;
+        // --- Prepare unique ZIP to bypass server-side deduplication ---
+        final zipPath = p.join(tempDir, '$displayStem.${DateTime.now().millisecondsSinceEpoch}.zip');
+        final encoder = ZipFileEncoder();
+        encoder.create(zipPath);
 
-        final localHash = await _hashFile(uploadFile);
-        final storedHash = await _getStoredHash(game.id, filename);
+        // 1. Write fresh sync metadata
+        final metaFile = File(p.join(tempDir, 'freegosy_sync.txt'));
+        await metaFile.writeAsString(DateTime.now().toIso8601String());
+        await encoder.addFile(metaFile);
 
-        if (!force && storedHash != null && localHash == storedHash) {
-          if (isTempZip && await uploadFile.exists()) {
-            await uploadFile.delete();
-          }
-          continue;
+        // 2. Add the actual save content
+        if (await FileSystemEntity.isDirectory(file.path)) {
+          // It's a directory (e.g., Eden, Dolphin Wii)
+          await encoder.addDirectory(Directory(file.path), includeDirName: false);
+        } else {
+          // It's a file (e.g., single .sav or pre-zipped PPSSPP/PSP folder)
+          await encoder.addFile(file, p.basename(file.path));
         }
 
-        final ok = await _rommService.uploadSave(game.id, uploadFile, screenshotFile: screenshotFile);
+        encoder.close();
+        if (await metaFile.exists()) await metaFile.delete();
+
+        final uploadFile = File(zipPath);
+        final ok = await _rommService.uploadSave(
+          game.id, 
+          uploadFile, 
+          screenshotFile: screenshotFile,
+          overrideFilename: uploadFilename,
+        );
+        
         if (ok) {
           uploaded++;
-          await _storeHash(game.id, filename, localHash);
+          // Store the hash of the ORIGINAL source (file or dir) to track local changes
+          await _storeHash(game.id, uploadFilename, localHash);
+          debugPrint('[Sync] Successfully pushed save for $displayStem (forced: $force)');
         }
 
-        if (isTempZip && await uploadFile.exists()) {
+        if (await uploadFile.exists()) {
           await uploadFile.delete();
         }
       }
@@ -298,7 +314,8 @@ class SaveSyncService {
       }
       return uploaded > 0;
     } catch (e) {
-      rethrow;
+      debugPrint('[Sync] Error in pushSaves: $e');
+      return false;
     }
   }
 
diff --git a/test/unit/firmware_service_test.mocks.dart b/test/unit/firmware_service_test.mocks.dart
index fcae33c..39ed124 100644
--- a/test/unit/firmware_service_test.mocks.dart
+++ b/test/unit/firmware_service_test.mocks.dart
@@ -3,17 +3,19 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i6;
-import 'dart:io' as _i7;
-import 'dart:typed_data' as _i8;
-
-import 'package:freegosy/core/emulator/emulator_strategy.dart' as _i10;
-import 'package:freegosy/core/emulator/strategy_registry.dart' as _i9;
+import 'dart:async' as _i7;
+import 'dart:io' as _i8;
+import 'dart:typed_data' as _i9;
+
+import 'package:freegosy/core/emulator/emulator_strategy.dart' as _i11;
+import 'package:freegosy/core/emulator/linux_strategies/linux_environment_strategy.dart'
+    as _i4;
+import 'package:freegosy/core/emulator/strategy_registry.dart' as _i10;
 import 'package:freegosy/core/romm/romm_models.dart' as _i2;
-import 'package:freegosy/core/romm/romm_service.dart' as _i4;
+import 'package:freegosy/core/romm/romm_service.dart' as _i5;
 import 'package:freegosy/core/storage/directory_service.dart' as _i3;
 import 'package:mockito/mockito.dart' as _i1;
-import 'package:mockito/src/dummies.dart' as _i5;
+import 'package:mockito/src/dummies.dart' as _i6;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -40,10 +42,16 @@ class _FakeStorageStatus_1 extends _i1.SmartFake implements _i3.StorageStatus {
     : super(parent, parentInvocation);
 }
 
+class _FakeLinuxEnvironmentStrategy_2 extends _i1.SmartFake
+    implements _i4.LinuxEnvironmentStrategy {
+  _FakeLinuxEnvironmentStrategy_2(Object parent, Invocation parentInvocation)
+    : super(parent, parentInvocation);
+}
+
 /// A class which mocks [RommService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockRommService extends _i1.Mock implements _i4.RommService {
+class MockRommService extends _i1.Mock implements _i5.RommService {
   MockRommService() {
     _i1.throwOnMissingStub(this);
   }
@@ -60,7 +68,7 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
   String get authHeader =>
       (super.noSuchMethod(
             Invocation.getter(#authHeader),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#authHeader),
             ),
@@ -68,31 +76,45 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String);
 
   @override
-  _i6.Future<void> refreshToken() =>
+  void updateConfig(_i2.RomMConfig? newConfig) => super.noSuchMethod(
+    Invocation.method(#updateConfig, [newConfig]),
+    returnValueForMissingStub: null,
+  );
+
+  @override
+  _i7.Future<void> refreshToken() =>
       (super.noSuchMethod(
             Invocation.method(#refreshToken, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<List<_i2.Platform>> getPlatforms() =>
+  _i7.Future<_i2.Game?> getGame(String? id) =>
+      (super.noSuchMethod(
+            Invocation.method(#getGame, [id]),
+            returnValue: _i7.Future<_i2.Game?>.value(),
+          )
+          as _i7.Future<_i2.Game?>);
+
+  @override
+  _i7.Future<List<_i2.Platform>> getPlatforms() =>
       (super.noSuchMethod(
             Invocation.method(#getPlatforms, []),
-            returnValue: _i6.Future<List<_i2.Platform>>.value(<_i2.Platform>[]),
+            returnValue: _i7.Future<List<_i2.Platform>>.value(<_i2.Platform>[]),
           )
-          as _i6.Future<List<_i2.Platform>>);
+          as _i7.Future<List<_i2.Platform>>);
 
   @override
-  _i6.Future<List<Map<String, dynamic>>> getCollections() =>
+  _i7.Future<List<Map<String, dynamic>>> getCollections() =>
       (super.noSuchMethod(
             Invocation.method(#getCollections, []),
-            returnValue: _i6.Future<List<Map<String, dynamic>>>.value(
+            returnValue: _i7.Future<List<Map<String, dynamic>>>.value(
               <Map<String, dynamic>>[],
             ),
           )
-          as _i6.Future<List<Map<String, dynamic>>>);
+          as _i7.Future<List<Map<String, dynamic>>>);
 
   @override
   String? resolveCoverUrl(_i2.Game? game) =>
@@ -100,31 +122,31 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String?);
 
   @override
-  _i6.Future<List<_i2.Game>> getGames(String? platformId) =>
+  _i7.Future<List<_i2.Game>> getGames(String? platformId) =>
       (super.noSuchMethod(
             Invocation.method(#getGames, [platformId]),
-            returnValue: _i6.Future<List<_i2.Game>>.value(<_i2.Game>[]),
+            returnValue: _i7.Future<List<_i2.Game>>.value(<_i2.Game>[]),
           )
-          as _i6.Future<List<_i2.Game>>);
+          as _i7.Future<List<_i2.Game>>);
 
   @override
-  _i6.Future<List<_i2.Game>> getAllGames({String? platformId}) =>
+  _i7.Future<List<_i2.Game>> getAllGames({String? platformId}) =>
       (super.noSuchMethod(
             Invocation.method(#getAllGames, [], {#platformId: platformId}),
-            returnValue: _i6.Future<List<_i2.Game>>.value(<_i2.Game>[]),
+            returnValue: _i7.Future<List<_i2.Game>>.value(<_i2.Game>[]),
           )
-          as _i6.Future<List<_i2.Game>>);
+          as _i7.Future<List<_i2.Game>>);
 
   @override
-  _i6.Future<List<_i2.Game>> getRecentlyPlayed({int? limit = 15}) =>
+  _i7.Future<List<_i2.Game>> getRecentlyPlayed({int? limit = 15}) =>
       (super.noSuchMethod(
             Invocation.method(#getRecentlyPlayed, [], {#limit: limit}),
-            returnValue: _i6.Future<List<_i2.Game>>.value(<_i2.Game>[]),
+            returnValue: _i7.Future<List<_i2.Game>>.value(<_i2.Game>[]),
           )
-          as _i6.Future<List<_i2.Game>>);
+          as _i7.Future<List<_i2.Game>>);
 
   @override
-  _i6.Future<({List<_i2.Game> games, int total})> getGamesPage({
+  _i7.Future<({List<_i2.Game> games, int total})> getGamesPage({
     int? offset = 0,
     int? limit = 50,
     String? platformId,
@@ -153,34 +175,34 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
               #withCharIndex: withCharIndex,
               #withFilterValues: withFilterValues,
             }),
-            returnValue: _i6.Future<({List<_i2.Game> games, int total})>.value((
+            returnValue: _i7.Future<({List<_i2.Game> games, int total})>.value((
               games: <_i2.Game>[],
               total: 0,
             )),
           )
-          as _i6.Future<({List<_i2.Game> games, int total})>);
+          as _i7.Future<({List<_i2.Game> games, int total})>);
 
   @override
-  _i6.Future<_i2.Game?> getRandomGame() =>
+  _i7.Future<_i2.Game?> getRandomGame() =>
       (super.noSuchMethod(
             Invocation.method(#getRandomGame, []),
-            returnValue: _i6.Future<_i2.Game?>.value(),
+            returnValue: _i7.Future<_i2.Game?>.value(),
           )
-          as _i6.Future<_i2.Game?>);
+          as _i7.Future<_i2.Game?>);
 
   @override
-  _i6.Future<List<_i2.SaveFile>> getSaves(String? gameId) =>
+  _i7.Future<List<_i2.SaveFile>> getSaves(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getSaves, [gameId]),
-            returnValue: _i6.Future<List<_i2.SaveFile>>.value(<_i2.SaveFile>[]),
+            returnValue: _i7.Future<List<_i2.SaveFile>>.value(<_i2.SaveFile>[]),
           )
-          as _i6.Future<List<_i2.SaveFile>>);
+          as _i7.Future<List<_i2.SaveFile>>);
 
   @override
   String getDownloadUrl(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getDownloadUrl, [game]),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.method(#getDownloadUrl, [game]),
             ),
@@ -188,74 +210,79 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String);
 
   @override
-  _i6.Future<bool> uploadSave(
+  _i7.Future<bool> uploadSave(
     String? gameId,
-    _i7.File? saveFile, {
+    _i8.File? saveFile, {
     String? slot,
-    _i7.File? screenshotFile,
+    _i8.File? screenshotFile,
+    String? overrideFilename,
   }) =>
       (super.noSuchMethod(
             Invocation.method(
               #uploadSave,
               [gameId, saveFile],
-              {#slot: slot, #screenshotFile: screenshotFile},
+              {
+                #slot: slot,
+                #screenshotFile: screenshotFile,
+                #overrideFilename: overrideFilename,
+              },
             ),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
-  _i6.Future<void> pruneOldSaves(String? gameId, {int? keepCount = 5}) =>
+  _i7.Future<void> pruneOldSaves(String? gameId, {int? keepCount = 5}) =>
       (super.noSuchMethod(
             Invocation.method(
               #pruneOldSaves,
               [gameId],
               {#keepCount: keepCount},
             ),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<List<Map<String, dynamic>>> getSavesList(String? gameId) =>
+  _i7.Future<List<Map<String, dynamic>>> getSavesList(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getSavesList, [gameId]),
-            returnValue: _i6.Future<List<Map<String, dynamic>>>.value(
+            returnValue: _i7.Future<List<Map<String, dynamic>>>.value(
               <Map<String, dynamic>>[],
             ),
           )
-          as _i6.Future<List<Map<String, dynamic>>>);
+          as _i7.Future<List<Map<String, dynamic>>>);
 
   @override
-  _i6.Future<Map<String, dynamic>?> getLatestSave(String? gameId) =>
+  _i7.Future<Map<String, dynamic>?> getLatestSave(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getLatestSave, [gameId]),
-            returnValue: _i6.Future<Map<String, dynamic>?>.value(),
+            returnValue: _i7.Future<Map<String, dynamic>?>.value(),
           )
-          as _i6.Future<Map<String, dynamic>?>);
+          as _i7.Future<Map<String, dynamic>?>);
 
   @override
-  _i6.Future<_i8.Uint8List?> downloadSave(String? saveUrl) =>
+  _i7.Future<_i9.Uint8List?> downloadSave(String? saveUrl) =>
       (super.noSuchMethod(
             Invocation.method(#downloadSave, [saveUrl]),
-            returnValue: _i6.Future<_i8.Uint8List?>.value(),
+            returnValue: _i7.Future<_i9.Uint8List?>.value(),
           )
-          as _i6.Future<_i8.Uint8List?>);
+          as _i7.Future<_i9.Uint8List?>);
 
   @override
-  _i6.Future<List<_i2.Firmware>> getFirmware({String? platformId}) =>
+  _i7.Future<List<_i2.Firmware>> getFirmware({String? platformId}) =>
       (super.noSuchMethod(
             Invocation.method(#getFirmware, [], {#platformId: platformId}),
-            returnValue: _i6.Future<List<_i2.Firmware>>.value(<_i2.Firmware>[]),
+            returnValue: _i7.Future<List<_i2.Firmware>>.value(<_i2.Firmware>[]),
           )
-          as _i6.Future<List<_i2.Firmware>>);
+          as _i7.Future<List<_i2.Firmware>>);
 
   @override
   String getFirmwareDownloadUrl(_i2.Firmware? firmware) =>
       (super.noSuchMethod(
             Invocation.method(#getFirmwareDownloadUrl, [firmware]),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.method(#getFirmwareDownloadUrl, [firmware]),
             ),
@@ -263,7 +290,7 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String);
 
   @override
-  _i6.Future<_i8.Uint8List?> downloadFirmware(
+  _i7.Future<_i9.Uint8List?> downloadFirmware(
     _i2.Firmware? firmware, {
     void Function(int, int)? onProgress,
   }) =>
@@ -273,12 +300,12 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
               [firmware],
               {#onProgress: onProgress},
             ),
-            returnValue: _i6.Future<_i8.Uint8List?>.value(),
+            returnValue: _i7.Future<_i9.Uint8List?>.value(),
           )
-          as _i6.Future<_i8.Uint8List?>);
+          as _i7.Future<_i9.Uint8List?>);
 
   @override
-  _i6.Future<bool> updateRomProps(
+  _i7.Future<bool> updateRomProps(
     String? romId, {
     bool? backlogged,
     bool? nowPlaying,
@@ -298,29 +325,37 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
                 #completion: completion,
               },
             ),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
-  _i6.Future<List<_i2.RomNote>> getRomNotes(String? romId) =>
+  _i7.Future<List<_i2.RomNote>> getRomNotes(String? romId) =>
       (super.noSuchMethod(
             Invocation.method(#getRomNotes, [romId]),
-            returnValue: _i6.Future<List<_i2.RomNote>>.value(<_i2.RomNote>[]),
+            returnValue: _i7.Future<List<_i2.RomNote>>.value(<_i2.RomNote>[]),
           )
-          as _i6.Future<List<_i2.RomNote>>);
+          as _i7.Future<List<_i2.RomNote>>);
 
   @override
-  _i6.Future<bool> createRomNote(
+  _i7.Future<bool> createRomNote(
     String? romId,
     String? title,
     String? content,
   ) =>
       (super.noSuchMethod(
             Invocation.method(#createRomNote, [romId, title, content]),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
+
+  @override
+  _i7.Future<bool> deleteRomNote(String? romId, int? noteId) =>
+      (super.noSuchMethod(
+            Invocation.method(#deleteRomNote, [romId, noteId]),
+            returnValue: _i7.Future<bool>.value(false),
+          )
+          as _i7.Future<bool>);
 }
 
 /// A class which mocks [DirectoryService].
@@ -335,7 +370,7 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   String get romsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#romsRootPath),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#romsRootPath),
             ),
@@ -346,7 +381,7 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   String get emulatorsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#emulatorsRootPath),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#emulatorsRootPath),
             ),
@@ -357,7 +392,7 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   String get linuxSyncPreset =>
       (super.noSuchMethod(
             Invocation.getter(#linuxSyncPreset),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#linuxSyncPreset),
             ),
@@ -372,6 +407,22 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
           )
           as _i3.StorageStatus);
 
+  @override
+  bool get isSteamDeck =>
+      (super.noSuchMethod(Invocation.getter(#isSteamDeck), returnValue: false)
+          as bool);
+
+  @override
+  _i4.LinuxEnvironmentStrategy get activeLinuxEnvironment =>
+      (super.noSuchMethod(
+            Invocation.getter(#activeLinuxEnvironment),
+            returnValue: _FakeLinuxEnvironmentStrategy_2(
+              this,
+              Invocation.getter(#activeLinuxEnvironment),
+            ),
+          )
+          as _i4.LinuxEnvironmentStrategy);
+
   @override
   set romsRootPath(String? value) => super.noSuchMethod(
     Invocation.setter(#romsRootPath, value),
@@ -403,50 +454,89 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   );
 
   @override
-  _i6.Future<_i3.StorageStatus> initialize() =>
+  _i7.Future<String?> detectEmuDeckRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#detectEmuDeckRoot, []),
+            returnValue: _i7.Future<String?>.value(),
+          )
+          as _i7.Future<String?>);
+
+  @override
+  _i7.Future<_i3.StorageStatus> initialize() =>
       (super.noSuchMethod(
             Invocation.method(#initialize, []),
-            returnValue: _i6.Future<_i3.StorageStatus>.value(
+            returnValue: _i7.Future<_i3.StorageStatus>.value(
               _FakeStorageStatus_1(this, Invocation.method(#initialize, [])),
             ),
           )
-          as _i6.Future<_i3.StorageStatus>);
+          as _i7.Future<_i3.StorageStatus>);
+
+  @override
+  _i7.Future<String> getDefaultBase() =>
+      (super.noSuchMethod(
+            Invocation.method(#getDefaultBase, []),
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
+                this,
+                Invocation.method(#getDefaultBase, []),
+              ),
+            ),
+          )
+          as _i7.Future<String>);
+
+  @override
+  _i7.Future<void> resetRomsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetRomsRoot, []),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setLinuxSyncPreset(String? preset) =>
+  _i7.Future<void> resetEmulatorsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetEmulatorsRoot, []),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<void> setLinuxSyncPreset(String? preset) =>
       (super.noSuchMethod(
             Invocation.method(#setLinuxSyncPreset, [preset]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setEmudeckRoot(String? path) =>
+  _i7.Future<void> setEmudeckRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmudeckRoot, [path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> loadEmulatorPathOverrides() =>
+  _i7.Future<void> loadEmulatorPathOverrides() =>
       (super.noSuchMethod(
             Invocation.method(#loadEmulatorPathOverrides, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
+  _i7.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorPathOverride, [emulatorId, path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
   String? getEmulatorPathOverride(String? emulatorId) =>
@@ -456,111 +546,111 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
           as String?);
 
   @override
-  _i6.Future<void> setRomsRoot(String? path) =>
+  _i7.Future<void> setRomsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setRomsRoot, [path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setEmulatorsRoot(String? path) =>
+  _i7.Future<void> setEmulatorsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorsRoot, [path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<String> getRomsDirectory() =>
+  _i7.Future<String> getRomsDirectory() =>
       (super.noSuchMethod(
             Invocation.method(#getRomsDirectory, []),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getRomsDirectory, []),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<Set<String>> getAllDownloadedFileNames() =>
+  _i7.Future<Set<String>> getAllDownloadedFileNames() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNames, []),
-            returnValue: _i6.Future<Set<String>>.value(<String>{}),
+            returnValue: _i7.Future<Set<String>>.value(<String>{}),
           )
-          as _i6.Future<Set<String>>);
+          as _i7.Future<Set<String>>);
 
   @override
-  _i6.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
+  _i7.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNamesByPlatform, []),
-            returnValue: _i6.Future<Map<String, Set<String>>>.value(
+            returnValue: _i7.Future<Map<String, Set<String>>>.value(
               <String, Set<String>>{},
             ),
           )
-          as _i6.Future<Map<String, Set<String>>>);
+          as _i7.Future<Map<String, Set<String>>>);
 
   @override
-  _i6.Future<String> getRomDirectory(_i2.Game? game) =>
+  _i7.Future<String> getRomDirectory(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomDirectory, [game]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getRomDirectory, [game]),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getRomFilePath(_i2.Game? game) =>
+  _i7.Future<String> getRomFilePath(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomFilePath, [game]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getRomFilePath, [game]),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String?> findExistingRomPath(_i2.Game? game) =>
+  _i7.Future<String?> findExistingRomPath(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#findExistingRomPath, [game]),
-            returnValue: _i6.Future<String?>.value(),
+            returnValue: _i7.Future<String?>.value(),
           )
-          as _i6.Future<String?>);
+          as _i7.Future<String?>);
 
   @override
-  _i6.Future<String?> resolveSevenZipPath() =>
+  _i7.Future<String?> resolveSevenZipPath() =>
       (super.noSuchMethod(
             Invocation.method(#resolveSevenZipPath, []),
-            returnValue: _i6.Future<String?>.value(),
+            returnValue: _i7.Future<String?>.value(),
           )
-          as _i6.Future<String?>);
+          as _i7.Future<String?>);
 
   @override
-  _i6.Future<String> getEmulatorDirectory(String? emulatorId) =>
+  _i7.Future<String> getEmulatorDirectory(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#getEmulatorDirectory, [emulatorId]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorDirectory, [emulatorId]),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getEmulatorAppSupportDirectory(
+  _i7.Future<String> getEmulatorAppSupportDirectory(
     String? emulatorName, {
     String? platformSlug,
   }) =>
@@ -570,8 +660,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               [emulatorName],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorAppSupportDirectory,
@@ -581,10 +671,10 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getEmulatorBiosDirectory(
+  _i7.Future<String> getEmulatorBiosDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -594,8 +684,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorBiosDirectory,
@@ -605,10 +695,10 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getEmulatorSystemDirectory(
+  _i7.Future<String> getEmulatorSystemDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -618,8 +708,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorSystemDirectory,
@@ -629,19 +719,19 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<void> deleteEmulator(String? emulatorId) =>
+  _i7.Future<void> deleteEmulator(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#deleteEmulator, [emulatorId]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<String> getEmulatorExecutable(
+  _i7.Future<String> getEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -650,8 +740,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorExecutable, [
                   emulatorId,
@@ -660,10 +750,10 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String?> findEmulatorExecutable(
+  _i7.Future<String?> findEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -672,12 +762,12 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i6.Future<String?>.value(),
+            returnValue: _i7.Future<String?>.value(),
           )
-          as _i6.Future<String?>);
+          as _i7.Future<String?>);
 
   @override
-  _i6.Future<bool> isEmulatorInstalled(
+  _i7.Future<bool> isEmulatorInstalled(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -686,17 +776,17 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
-  _i6.Future<bool> isRomDownloaded(_i2.Game? game) =>
+  _i7.Future<bool> isRomDownloaded(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#isRomDownloaded, [game]),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
   bool isEmuLaunchScript(String? path) =>
@@ -707,30 +797,84 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
           as bool);
 
   @override
-  _i6.Future<void> deleteRom(_i2.Game? game) =>
+  _i7.Future<void> launchGame(
+    _i2.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGame,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<_i8.Process?> launchGameWithHandle(
+    _i2.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGameWithHandle,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i7.Future<_i8.Process?>.value(),
+          )
+          as _i7.Future<_i8.Process?>);
+
+  @override
+  _i7.Future<void> launchStandalone(
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchStandalone,
+              [emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<void> deleteRom(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#deleteRom, [game]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 }
 
 /// A class which mocks [StrategyRegistry].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockStrategyRegistry extends _i1.Mock implements _i9.StrategyRegistry {
+class MockStrategyRegistry extends _i1.Mock implements _i10.StrategyRegistry {
   MockStrategyRegistry() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  Map<String, List<_i10.EmulatorStrategy>> detectConflicts() =>
+  Map<String, List<_i11.EmulatorStrategy>> detectConflicts() =>
       (super.noSuchMethod(
             Invocation.method(#detectConflicts, []),
-            returnValue: <String, List<_i10.EmulatorStrategy>>{},
+            returnValue: <String, List<_i11.EmulatorStrategy>>{},
           )
-          as Map<String, List<_i10.EmulatorStrategy>>);
+          as Map<String, List<_i11.EmulatorStrategy>>);
 
   @override
   String? getPreferredEmulatorId(String? slug) =>
@@ -738,43 +882,49 @@ class MockStrategyRegistry extends _i1.Mock implements _i9.StrategyRegistry {
           as String?);
 
   @override
-  _i6.Future<void> loadPreferences() =>
+  _i7.Future<void> loadPreferences() =>
       (super.noSuchMethod(
             Invocation.method(#loadPreferences, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setPreference(String? canonicalSlug, String? emulatorId) =>
+  _i7.Future<void> setPreference(String? canonicalSlug, String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#setPreference, [canonicalSlug, emulatorId]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> clearPreferences() =>
+  _i7.Future<void> clearPreferences() =>
       (super.noSuchMethod(
             Invocation.method(#clearPreferences, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i10.EmulatorStrategy? getStrategyForSlug(String? platformSlug) =>
+  _i11.EmulatorStrategy? getStrategyForSlug(String? platformSlug) =>
       (super.noSuchMethod(
             Invocation.method(#getStrategyForSlug, [platformSlug]),
           )
-          as _i10.EmulatorStrategy?);
+          as _i11.EmulatorStrategy?);
 
   @override
-  _i10.EmulatorStrategy? getStrategyById(String? id) =>
+  _i11.EmulatorStrategy? getStrategyById(String? id) =>
       (super.noSuchMethod(Invocation.method(#getStrategyById, [id]))
-          as _i10.EmulatorStrategy?);
+          as _i11.EmulatorStrategy?);
+
+  @override
+  void setNdsCore(String? core) => super.noSuchMethod(
+    Invocation.method(#setNdsCore, [core]),
+    returnValueForMissingStub: null,
+  );
 
   @override
   Map<String, dynamic>? getDefinition(String? emulatorId) =>
diff --git a/test/unit/paginated_games_provider_test.mocks.dart b/test/unit/paginated_games_provider_test.mocks.dart
index ad2e8ea..09e9203 100644
--- a/test/unit/paginated_games_provider_test.mocks.dart
+++ b/test/unit/paginated_games_provider_test.mocks.dart
@@ -59,6 +59,12 @@ class MockRommService extends _i1.Mock implements _i3.RommService {
           )
           as String);
 
+  @override
+  void updateConfig(_i2.RomMConfig? newConfig) => super.noSuchMethod(
+    Invocation.method(#updateConfig, [newConfig]),
+    returnValueForMissingStub: null,
+  );
+
   @override
   _i5.Future<void> refreshToken() =>
       (super.noSuchMethod(
@@ -68,6 +74,14 @@ class MockRommService extends _i1.Mock implements _i3.RommService {
           )
           as _i5.Future<void>);
 
+  @override
+  _i5.Future<_i2.Game?> getGame(String? id) =>
+      (super.noSuchMethod(
+            Invocation.method(#getGame, [id]),
+            returnValue: _i5.Future<_i2.Game?>.value(),
+          )
+          as _i5.Future<_i2.Game?>);
+
   @override
   _i5.Future<List<_i2.Platform>> getPlatforms() =>
       (super.noSuchMethod(
@@ -185,12 +199,17 @@ class MockRommService extends _i1.Mock implements _i3.RommService {
     _i6.File? saveFile, {
     String? slot,
     _i6.File? screenshotFile,
+    String? overrideFilename,
   }) =>
       (super.noSuchMethod(
             Invocation.method(
               #uploadSave,
               [gameId, saveFile],
-              {#slot: slot, #screenshotFile: screenshotFile},
+              {
+                #slot: slot,
+                #screenshotFile: screenshotFile,
+                #overrideFilename: overrideFilename,
+              },
             ),
             returnValue: _i5.Future<bool>.value(false),
           )
@@ -313,4 +332,12 @@ class MockRommService extends _i1.Mock implements _i3.RommService {
             returnValue: _i5.Future<bool>.value(false),
           )
           as _i5.Future<bool>);
+
+  @override
+  _i5.Future<bool> deleteRomNote(String? romId, int? noteId) =>
+      (super.noSuchMethod(
+            Invocation.method(#deleteRomNote, [romId, noteId]),
+            returnValue: _i5.Future<bool>.value(false),
+          )
+          as _i5.Future<bool>);
 }
diff --git a/test/unit/romm_models_test.dart b/test/unit/romm_models_test.dart
index e737b12..0b8aadb 100644
--- a/test/unit/romm_models_test.dart
+++ b/test/unit/romm_models_test.dart
@@ -84,12 +84,12 @@ void main() {
     test('SaveFile.fromJson parses all fields', () {
       final json = {
         'id': '456',
-        'game_id': '123',
-        'url': 'https://example.com/save',
+        'rom_id': '123',
+        'download_path': 'https://example.com/save',
       };
       final save = SaveFile.fromJson(json);
       expect(save.id, '456');
-      expect(save.gameId, '123');
+      expect(save.romId, '123');
       expect(save.url, 'https://example.com/save');
     });
 
diff --git a/test/unit/save_sync_service_test.dart b/test/unit/save_sync_service_test.dart
index 3fa190c..459ab3f 100644
--- a/test/unit/save_sync_service_test.dart
+++ b/test/unit/save_sync_service_test.dart
@@ -31,6 +31,10 @@ void main() {
     // Ensure that on Linux tests we don't accidentally pick up a real system directory or a mock that returns empty string
     when(mockDirectoryService.getEmulatorAppSupportDirectory(any))
         .thenAnswer((_) async => '/nonexistent_directory_for_testing');
+
+    final sysTemp = Directory.systemTemp.path;
+    when(mockDirectoryService.getEmulatorDirectory('temp'))
+        .thenAnswer((_) async => sysTemp);
     
     service = SaveSyncService(mockRommService, mockDirectoryService, mockStrategyRegistry);
   });
@@ -53,13 +57,19 @@ void main() {
 
       final game = Game(id: 'game1', name: 'game', platformSlug: 'gba', fileSize: 0);
 
-      when(mockRommService.uploadSave(any, any)).thenAnswer((_) async => true);
+      when(mockRommService.uploadSave(
+        any, 
+        any, 
+        slot: anyNamed('slot'), 
+        screenshotFile: anyNamed('screenshotFile'), 
+        overrideFilename: anyNamed('overrideFilename')
+      )).thenAnswer((_) async => true);
       when(mockRommService.pruneOldSaves(any)).thenAnswer((_) async => {});
 
       final ok = await service.pushSaves(game, romPath);
       
       expect(ok, isTrue, reason: 'Should have found and uploaded game.sav');
-      verify(mockRommService.uploadSave('game1', any)).called(1);
+      verify(mockRommService.uploadSave('game1', any, slot: anyNamed('slot'), screenshotFile: anyNamed('screenshotFile'), overrideFilename: anyNamed('overrideFilename'))).called(1);
       
       await tempDir.delete(recursive: true);
     });
@@ -73,11 +83,17 @@ void main() {
       final game = Game(id: 'game1', name: 'game', platformSlug: 'gba', fileSize: 0);
 
       // Mock upload to be sure it's called first time
-      when(mockRommService.uploadSave(any, any)).thenAnswer((_) async => true);
+      when(mockRommService.uploadSave(
+        any, 
+        any, 
+        slot: anyNamed('slot'), 
+        screenshotFile: anyNamed('screenshotFile'), 
+        overrideFilename: anyNamed('overrideFilename')
+      )).thenAnswer((_) async => true);
       when(mockRommService.pruneOldSaves(any)).thenAnswer((_) async => {});
 
       await service.pushSaves(game, romPath);
-      verify(mockRommService.uploadSave('game1', any)).called(1);
+      verify(mockRommService.uploadSave('game1', any, slot: anyNamed('slot'), screenshotFile: anyNamed('screenshotFile'), overrideFilename: anyNamed('overrideFilename'))).called(1);
 
       // Second time should skip
       clearInteractions(mockRommService);
diff --git a/test/unit/save_sync_service_test.mocks.dart b/test/unit/save_sync_service_test.mocks.dart
index 44d02f4..73a7aa7 100644
--- a/test/unit/save_sync_service_test.mocks.dart
+++ b/test/unit/save_sync_service_test.mocks.dart
@@ -3,17 +3,19 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i6;
-import 'dart:io' as _i7;
-import 'dart:typed_data' as _i8;
-
-import 'package:freegosy/core/emulator/emulator_strategy.dart' as _i10;
-import 'package:freegosy/core/emulator/strategy_registry.dart' as _i9;
+import 'dart:async' as _i7;
+import 'dart:io' as _i8;
+import 'dart:typed_data' as _i9;
+
+import 'package:freegosy/core/emulator/emulator_strategy.dart' as _i11;
+import 'package:freegosy/core/emulator/linux_strategies/linux_environment_strategy.dart'
+    as _i4;
+import 'package:freegosy/core/emulator/strategy_registry.dart' as _i10;
 import 'package:freegosy/core/romm/romm_models.dart' as _i2;
-import 'package:freegosy/core/romm/romm_service.dart' as _i4;
+import 'package:freegosy/core/romm/romm_service.dart' as _i5;
 import 'package:freegosy/core/storage/directory_service.dart' as _i3;
 import 'package:mockito/mockito.dart' as _i1;
-import 'package:mockito/src/dummies.dart' as _i5;
+import 'package:mockito/src/dummies.dart' as _i6;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -40,10 +42,16 @@ class _FakeStorageStatus_1 extends _i1.SmartFake implements _i3.StorageStatus {
     : super(parent, parentInvocation);
 }
 
+class _FakeLinuxEnvironmentStrategy_2 extends _i1.SmartFake
+    implements _i4.LinuxEnvironmentStrategy {
+  _FakeLinuxEnvironmentStrategy_2(Object parent, Invocation parentInvocation)
+    : super(parent, parentInvocation);
+}
+
 /// A class which mocks [RommService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockRommService extends _i1.Mock implements _i4.RommService {
+class MockRommService extends _i1.Mock implements _i5.RommService {
   MockRommService() {
     _i1.throwOnMissingStub(this);
   }
@@ -60,7 +68,7 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
   String get authHeader =>
       (super.noSuchMethod(
             Invocation.getter(#authHeader),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#authHeader),
             ),
@@ -68,31 +76,45 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String);
 
   @override
-  _i6.Future<void> refreshToken() =>
+  void updateConfig(_i2.RomMConfig? newConfig) => super.noSuchMethod(
+    Invocation.method(#updateConfig, [newConfig]),
+    returnValueForMissingStub: null,
+  );
+
+  @override
+  _i7.Future<void> refreshToken() =>
       (super.noSuchMethod(
             Invocation.method(#refreshToken, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<List<_i2.Platform>> getPlatforms() =>
+  _i7.Future<_i2.Game?> getGame(String? id) =>
+      (super.noSuchMethod(
+            Invocation.method(#getGame, [id]),
+            returnValue: _i7.Future<_i2.Game?>.value(),
+          )
+          as _i7.Future<_i2.Game?>);
+
+  @override
+  _i7.Future<List<_i2.Platform>> getPlatforms() =>
       (super.noSuchMethod(
             Invocation.method(#getPlatforms, []),
-            returnValue: _i6.Future<List<_i2.Platform>>.value(<_i2.Platform>[]),
+            returnValue: _i7.Future<List<_i2.Platform>>.value(<_i2.Platform>[]),
           )
-          as _i6.Future<List<_i2.Platform>>);
+          as _i7.Future<List<_i2.Platform>>);
 
   @override
-  _i6.Future<List<Map<String, dynamic>>> getCollections() =>
+  _i7.Future<List<Map<String, dynamic>>> getCollections() =>
       (super.noSuchMethod(
             Invocation.method(#getCollections, []),
-            returnValue: _i6.Future<List<Map<String, dynamic>>>.value(
+            returnValue: _i7.Future<List<Map<String, dynamic>>>.value(
               <Map<String, dynamic>>[],
             ),
           )
-          as _i6.Future<List<Map<String, dynamic>>>);
+          as _i7.Future<List<Map<String, dynamic>>>);
 
   @override
   String? resolveCoverUrl(_i2.Game? game) =>
@@ -100,31 +122,31 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String?);
 
   @override
-  _i6.Future<List<_i2.Game>> getGames(String? platformId) =>
+  _i7.Future<List<_i2.Game>> getGames(String? platformId) =>
       (super.noSuchMethod(
             Invocation.method(#getGames, [platformId]),
-            returnValue: _i6.Future<List<_i2.Game>>.value(<_i2.Game>[]),
+            returnValue: _i7.Future<List<_i2.Game>>.value(<_i2.Game>[]),
           )
-          as _i6.Future<List<_i2.Game>>);
+          as _i7.Future<List<_i2.Game>>);
 
   @override
-  _i6.Future<List<_i2.Game>> getAllGames({String? platformId}) =>
+  _i7.Future<List<_i2.Game>> getAllGames({String? platformId}) =>
       (super.noSuchMethod(
             Invocation.method(#getAllGames, [], {#platformId: platformId}),
-            returnValue: _i6.Future<List<_i2.Game>>.value(<_i2.Game>[]),
+            returnValue: _i7.Future<List<_i2.Game>>.value(<_i2.Game>[]),
           )
-          as _i6.Future<List<_i2.Game>>);
+          as _i7.Future<List<_i2.Game>>);
 
   @override
-  _i6.Future<List<_i2.Game>> getRecentlyPlayed({int? limit = 15}) =>
+  _i7.Future<List<_i2.Game>> getRecentlyPlayed({int? limit = 15}) =>
       (super.noSuchMethod(
             Invocation.method(#getRecentlyPlayed, [], {#limit: limit}),
-            returnValue: _i6.Future<List<_i2.Game>>.value(<_i2.Game>[]),
+            returnValue: _i7.Future<List<_i2.Game>>.value(<_i2.Game>[]),
           )
-          as _i6.Future<List<_i2.Game>>);
+          as _i7.Future<List<_i2.Game>>);
 
   @override
-  _i6.Future<({List<_i2.Game> games, int total})> getGamesPage({
+  _i7.Future<({List<_i2.Game> games, int total})> getGamesPage({
     int? offset = 0,
     int? limit = 50,
     String? platformId,
@@ -153,34 +175,34 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
               #withCharIndex: withCharIndex,
               #withFilterValues: withFilterValues,
             }),
-            returnValue: _i6.Future<({List<_i2.Game> games, int total})>.value((
+            returnValue: _i7.Future<({List<_i2.Game> games, int total})>.value((
               games: <_i2.Game>[],
               total: 0,
             )),
           )
-          as _i6.Future<({List<_i2.Game> games, int total})>);
+          as _i7.Future<({List<_i2.Game> games, int total})>);
 
   @override
-  _i6.Future<_i2.Game?> getRandomGame() =>
+  _i7.Future<_i2.Game?> getRandomGame() =>
       (super.noSuchMethod(
             Invocation.method(#getRandomGame, []),
-            returnValue: _i6.Future<_i2.Game?>.value(),
+            returnValue: _i7.Future<_i2.Game?>.value(),
           )
-          as _i6.Future<_i2.Game?>);
+          as _i7.Future<_i2.Game?>);
 
   @override
-  _i6.Future<List<_i2.SaveFile>> getSaves(String? gameId) =>
+  _i7.Future<List<_i2.SaveFile>> getSaves(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getSaves, [gameId]),
-            returnValue: _i6.Future<List<_i2.SaveFile>>.value(<_i2.SaveFile>[]),
+            returnValue: _i7.Future<List<_i2.SaveFile>>.value(<_i2.SaveFile>[]),
           )
-          as _i6.Future<List<_i2.SaveFile>>);
+          as _i7.Future<List<_i2.SaveFile>>);
 
   @override
   String getDownloadUrl(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getDownloadUrl, [game]),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.method(#getDownloadUrl, [game]),
             ),
@@ -188,74 +210,79 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String);
 
   @override
-  _i6.Future<bool> uploadSave(
+  _i7.Future<bool> uploadSave(
     String? gameId,
-    _i7.File? saveFile, {
+    _i8.File? saveFile, {
     String? slot,
-    _i7.File? screenshotFile,
+    _i8.File? screenshotFile,
+    String? overrideFilename,
   }) =>
       (super.noSuchMethod(
             Invocation.method(
               #uploadSave,
               [gameId, saveFile],
-              {#slot: slot, #screenshotFile: screenshotFile},
+              {
+                #slot: slot,
+                #screenshotFile: screenshotFile,
+                #overrideFilename: overrideFilename,
+              },
             ),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
-  _i6.Future<void> pruneOldSaves(String? gameId, {int? keepCount = 5}) =>
+  _i7.Future<void> pruneOldSaves(String? gameId, {int? keepCount = 5}) =>
       (super.noSuchMethod(
             Invocation.method(
               #pruneOldSaves,
               [gameId],
               {#keepCount: keepCount},
             ),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<List<Map<String, dynamic>>> getSavesList(String? gameId) =>
+  _i7.Future<List<Map<String, dynamic>>> getSavesList(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getSavesList, [gameId]),
-            returnValue: _i6.Future<List<Map<String, dynamic>>>.value(
+            returnValue: _i7.Future<List<Map<String, dynamic>>>.value(
               <Map<String, dynamic>>[],
             ),
           )
-          as _i6.Future<List<Map<String, dynamic>>>);
+          as _i7.Future<List<Map<String, dynamic>>>);
 
   @override
-  _i6.Future<Map<String, dynamic>?> getLatestSave(String? gameId) =>
+  _i7.Future<Map<String, dynamic>?> getLatestSave(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getLatestSave, [gameId]),
-            returnValue: _i6.Future<Map<String, dynamic>?>.value(),
+            returnValue: _i7.Future<Map<String, dynamic>?>.value(),
           )
-          as _i6.Future<Map<String, dynamic>?>);
+          as _i7.Future<Map<String, dynamic>?>);
 
   @override
-  _i6.Future<_i8.Uint8List?> downloadSave(String? saveUrl) =>
+  _i7.Future<_i9.Uint8List?> downloadSave(String? saveUrl) =>
       (super.noSuchMethod(
             Invocation.method(#downloadSave, [saveUrl]),
-            returnValue: _i6.Future<_i8.Uint8List?>.value(),
+            returnValue: _i7.Future<_i9.Uint8List?>.value(),
           )
-          as _i6.Future<_i8.Uint8List?>);
+          as _i7.Future<_i9.Uint8List?>);
 
   @override
-  _i6.Future<List<_i2.Firmware>> getFirmware({String? platformId}) =>
+  _i7.Future<List<_i2.Firmware>> getFirmware({String? platformId}) =>
       (super.noSuchMethod(
             Invocation.method(#getFirmware, [], {#platformId: platformId}),
-            returnValue: _i6.Future<List<_i2.Firmware>>.value(<_i2.Firmware>[]),
+            returnValue: _i7.Future<List<_i2.Firmware>>.value(<_i2.Firmware>[]),
           )
-          as _i6.Future<List<_i2.Firmware>>);
+          as _i7.Future<List<_i2.Firmware>>);
 
   @override
   String getFirmwareDownloadUrl(_i2.Firmware? firmware) =>
       (super.noSuchMethod(
             Invocation.method(#getFirmwareDownloadUrl, [firmware]),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.method(#getFirmwareDownloadUrl, [firmware]),
             ),
@@ -263,7 +290,7 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String);
 
   @override
-  _i6.Future<_i8.Uint8List?> downloadFirmware(
+  _i7.Future<_i9.Uint8List?> downloadFirmware(
     _i2.Firmware? firmware, {
     void Function(int, int)? onProgress,
   }) =>
@@ -273,12 +300,12 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
               [firmware],
               {#onProgress: onProgress},
             ),
-            returnValue: _i6.Future<_i8.Uint8List?>.value(),
+            returnValue: _i7.Future<_i9.Uint8List?>.value(),
           )
-          as _i6.Future<_i8.Uint8List?>);
+          as _i7.Future<_i9.Uint8List?>);
 
   @override
-  _i6.Future<bool> updateRomProps(
+  _i7.Future<bool> updateRomProps(
     String? romId, {
     bool? backlogged,
     bool? nowPlaying,
@@ -298,29 +325,37 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
                 #completion: completion,
               },
             ),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
-  _i6.Future<List<_i2.RomNote>> getRomNotes(String? romId) =>
+  _i7.Future<List<_i2.RomNote>> getRomNotes(String? romId) =>
       (super.noSuchMethod(
             Invocation.method(#getRomNotes, [romId]),
-            returnValue: _i6.Future<List<_i2.RomNote>>.value(<_i2.RomNote>[]),
+            returnValue: _i7.Future<List<_i2.RomNote>>.value(<_i2.RomNote>[]),
           )
-          as _i6.Future<List<_i2.RomNote>>);
+          as _i7.Future<List<_i2.RomNote>>);
 
   @override
-  _i6.Future<bool> createRomNote(
+  _i7.Future<bool> createRomNote(
     String? romId,
     String? title,
     String? content,
   ) =>
       (super.noSuchMethod(
             Invocation.method(#createRomNote, [romId, title, content]),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
+
+  @override
+  _i7.Future<bool> deleteRomNote(String? romId, int? noteId) =>
+      (super.noSuchMethod(
+            Invocation.method(#deleteRomNote, [romId, noteId]),
+            returnValue: _i7.Future<bool>.value(false),
+          )
+          as _i7.Future<bool>);
 }
 
 /// A class which mocks [DirectoryService].
@@ -335,7 +370,7 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   String get romsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#romsRootPath),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#romsRootPath),
             ),
@@ -346,7 +381,7 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   String get emulatorsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#emulatorsRootPath),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#emulatorsRootPath),
             ),
@@ -357,7 +392,7 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   String get linuxSyncPreset =>
       (super.noSuchMethod(
             Invocation.getter(#linuxSyncPreset),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#linuxSyncPreset),
             ),
@@ -372,6 +407,22 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
           )
           as _i3.StorageStatus);
 
+  @override
+  bool get isSteamDeck =>
+      (super.noSuchMethod(Invocation.getter(#isSteamDeck), returnValue: false)
+          as bool);
+
+  @override
+  _i4.LinuxEnvironmentStrategy get activeLinuxEnvironment =>
+      (super.noSuchMethod(
+            Invocation.getter(#activeLinuxEnvironment),
+            returnValue: _FakeLinuxEnvironmentStrategy_2(
+              this,
+              Invocation.getter(#activeLinuxEnvironment),
+            ),
+          )
+          as _i4.LinuxEnvironmentStrategy);
+
   @override
   set romsRootPath(String? value) => super.noSuchMethod(
     Invocation.setter(#romsRootPath, value),
@@ -403,50 +454,89 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   );
 
   @override
-  _i6.Future<_i3.StorageStatus> initialize() =>
+  _i7.Future<String?> detectEmuDeckRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#detectEmuDeckRoot, []),
+            returnValue: _i7.Future<String?>.value(),
+          )
+          as _i7.Future<String?>);
+
+  @override
+  _i7.Future<_i3.StorageStatus> initialize() =>
       (super.noSuchMethod(
             Invocation.method(#initialize, []),
-            returnValue: _i6.Future<_i3.StorageStatus>.value(
+            returnValue: _i7.Future<_i3.StorageStatus>.value(
               _FakeStorageStatus_1(this, Invocation.method(#initialize, [])),
             ),
           )
-          as _i6.Future<_i3.StorageStatus>);
+          as _i7.Future<_i3.StorageStatus>);
+
+  @override
+  _i7.Future<String> getDefaultBase() =>
+      (super.noSuchMethod(
+            Invocation.method(#getDefaultBase, []),
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
+                this,
+                Invocation.method(#getDefaultBase, []),
+              ),
+            ),
+          )
+          as _i7.Future<String>);
+
+  @override
+  _i7.Future<void> resetRomsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetRomsRoot, []),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setLinuxSyncPreset(String? preset) =>
+  _i7.Future<void> resetEmulatorsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetEmulatorsRoot, []),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<void> setLinuxSyncPreset(String? preset) =>
       (super.noSuchMethod(
             Invocation.method(#setLinuxSyncPreset, [preset]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setEmudeckRoot(String? path) =>
+  _i7.Future<void> setEmudeckRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmudeckRoot, [path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> loadEmulatorPathOverrides() =>
+  _i7.Future<void> loadEmulatorPathOverrides() =>
       (super.noSuchMethod(
             Invocation.method(#loadEmulatorPathOverrides, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
+  _i7.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorPathOverride, [emulatorId, path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
   String? getEmulatorPathOverride(String? emulatorId) =>
@@ -456,111 +546,111 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
           as String?);
 
   @override
-  _i6.Future<void> setRomsRoot(String? path) =>
+  _i7.Future<void> setRomsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setRomsRoot, [path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setEmulatorsRoot(String? path) =>
+  _i7.Future<void> setEmulatorsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorsRoot, [path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<String> getRomsDirectory() =>
+  _i7.Future<String> getRomsDirectory() =>
       (super.noSuchMethod(
             Invocation.method(#getRomsDirectory, []),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getRomsDirectory, []),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<Set<String>> getAllDownloadedFileNames() =>
+  _i7.Future<Set<String>> getAllDownloadedFileNames() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNames, []),
-            returnValue: _i6.Future<Set<String>>.value(<String>{}),
+            returnValue: _i7.Future<Set<String>>.value(<String>{}),
           )
-          as _i6.Future<Set<String>>);
+          as _i7.Future<Set<String>>);
 
   @override
-  _i6.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
+  _i7.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNamesByPlatform, []),
-            returnValue: _i6.Future<Map<String, Set<String>>>.value(
+            returnValue: _i7.Future<Map<String, Set<String>>>.value(
               <String, Set<String>>{},
             ),
           )
-          as _i6.Future<Map<String, Set<String>>>);
+          as _i7.Future<Map<String, Set<String>>>);
 
   @override
-  _i6.Future<String> getRomDirectory(_i2.Game? game) =>
+  _i7.Future<String> getRomDirectory(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomDirectory, [game]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getRomDirectory, [game]),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getRomFilePath(_i2.Game? game) =>
+  _i7.Future<String> getRomFilePath(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomFilePath, [game]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getRomFilePath, [game]),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String?> findExistingRomPath(_i2.Game? game) =>
+  _i7.Future<String?> findExistingRomPath(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#findExistingRomPath, [game]),
-            returnValue: _i6.Future<String?>.value(),
+            returnValue: _i7.Future<String?>.value(),
           )
-          as _i6.Future<String?>);
+          as _i7.Future<String?>);
 
   @override
-  _i6.Future<String?> resolveSevenZipPath() =>
+  _i7.Future<String?> resolveSevenZipPath() =>
       (super.noSuchMethod(
             Invocation.method(#resolveSevenZipPath, []),
-            returnValue: _i6.Future<String?>.value(),
+            returnValue: _i7.Future<String?>.value(),
           )
-          as _i6.Future<String?>);
+          as _i7.Future<String?>);
 
   @override
-  _i6.Future<String> getEmulatorDirectory(String? emulatorId) =>
+  _i7.Future<String> getEmulatorDirectory(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#getEmulatorDirectory, [emulatorId]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorDirectory, [emulatorId]),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getEmulatorAppSupportDirectory(
+  _i7.Future<String> getEmulatorAppSupportDirectory(
     String? emulatorName, {
     String? platformSlug,
   }) =>
@@ -570,8 +660,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               [emulatorName],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorAppSupportDirectory,
@@ -581,10 +671,10 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getEmulatorBiosDirectory(
+  _i7.Future<String> getEmulatorBiosDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -594,8 +684,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorBiosDirectory,
@@ -605,10 +695,10 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getEmulatorSystemDirectory(
+  _i7.Future<String> getEmulatorSystemDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -618,8 +708,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorSystemDirectory,
@@ -629,19 +719,19 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<void> deleteEmulator(String? emulatorId) =>
+  _i7.Future<void> deleteEmulator(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#deleteEmulator, [emulatorId]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<String> getEmulatorExecutable(
+  _i7.Future<String> getEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -650,8 +740,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorExecutable, [
                   emulatorId,
@@ -660,10 +750,10 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String?> findEmulatorExecutable(
+  _i7.Future<String?> findEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -672,12 +762,12 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i6.Future<String?>.value(),
+            returnValue: _i7.Future<String?>.value(),
           )
-          as _i6.Future<String?>);
+          as _i7.Future<String?>);
 
   @override
-  _i6.Future<bool> isEmulatorInstalled(
+  _i7.Future<bool> isEmulatorInstalled(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -686,17 +776,17 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
-  _i6.Future<bool> isRomDownloaded(_i2.Game? game) =>
+  _i7.Future<bool> isRomDownloaded(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#isRomDownloaded, [game]),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
   bool isEmuLaunchScript(String? path) =>
@@ -707,30 +797,84 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
           as bool);
 
   @override
-  _i6.Future<void> deleteRom(_i2.Game? game) =>
+  _i7.Future<void> launchGame(
+    _i2.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGame,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<_i8.Process?> launchGameWithHandle(
+    _i2.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGameWithHandle,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i7.Future<_i8.Process?>.value(),
+          )
+          as _i7.Future<_i8.Process?>);
+
+  @override
+  _i7.Future<void> launchStandalone(
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchStandalone,
+              [emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<void> deleteRom(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#deleteRom, [game]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 }
 
 /// A class which mocks [StrategyRegistry].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockStrategyRegistry extends _i1.Mock implements _i9.StrategyRegistry {
+class MockStrategyRegistry extends _i1.Mock implements _i10.StrategyRegistry {
   MockStrategyRegistry() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  Map<String, List<_i10.EmulatorStrategy>> detectConflicts() =>
+  Map<String, List<_i11.EmulatorStrategy>> detectConflicts() =>
       (super.noSuchMethod(
             Invocation.method(#detectConflicts, []),
-            returnValue: <String, List<_i10.EmulatorStrategy>>{},
+            returnValue: <String, List<_i11.EmulatorStrategy>>{},
           )
-          as Map<String, List<_i10.EmulatorStrategy>>);
+          as Map<String, List<_i11.EmulatorStrategy>>);
 
   @override
   String? getPreferredEmulatorId(String? slug) =>
@@ -738,43 +882,49 @@ class MockStrategyRegistry extends _i1.Mock implements _i9.StrategyRegistry {
           as String?);
 
   @override
-  _i6.Future<void> loadPreferences() =>
+  _i7.Future<void> loadPreferences() =>
       (super.noSuchMethod(
             Invocation.method(#loadPreferences, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setPreference(String? canonicalSlug, String? emulatorId) =>
+  _i7.Future<void> setPreference(String? canonicalSlug, String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#setPreference, [canonicalSlug, emulatorId]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> clearPreferences() =>
+  _i7.Future<void> clearPreferences() =>
       (super.noSuchMethod(
             Invocation.method(#clearPreferences, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i10.EmulatorStrategy? getStrategyForSlug(String? platformSlug) =>
+  _i11.EmulatorStrategy? getStrategyForSlug(String? platformSlug) =>
       (super.noSuchMethod(
             Invocation.method(#getStrategyForSlug, [platformSlug]),
           )
-          as _i10.EmulatorStrategy?);
+          as _i11.EmulatorStrategy?);
 
   @override
-  _i10.EmulatorStrategy? getStrategyById(String? id) =>
+  _i11.EmulatorStrategy? getStrategyById(String? id) =>
       (super.noSuchMethod(Invocation.method(#getStrategyById, [id]))
-          as _i10.EmulatorStrategy?);
+          as _i11.EmulatorStrategy?);
+
+  @override
+  void setNdsCore(String? core) => super.noSuchMethod(
+    Invocation.method(#setNdsCore, [core]),
+    returnValueForMissingStub: null,
+  );
 
   @override
   Map<String, dynamic>? getDefinition(String? emulatorId) =>
diff --git a/test/unit/strategy_registry_test.mocks.dart b/test/unit/strategy_registry_test.mocks.dart
index 8c1d865..1112b25 100644
--- a/test/unit/strategy_registry_test.mocks.dart
+++ b/test/unit/strategy_registry_test.mocks.dart
@@ -3,12 +3,15 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i4;
+import 'dart:async' as _i5;
+import 'dart:io' as _i7;
 
-import 'package:freegosy/core/romm/romm_models.dart' as _i5;
+import 'package:freegosy/core/emulator/linux_strategies/linux_environment_strategy.dart'
+    as _i3;
+import 'package:freegosy/core/romm/romm_models.dart' as _i6;
 import 'package:freegosy/core/storage/directory_service.dart' as _i2;
 import 'package:mockito/mockito.dart' as _i1;
-import 'package:mockito/src/dummies.dart' as _i3;
+import 'package:mockito/src/dummies.dart' as _i4;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -30,6 +33,12 @@ class _FakeStorageStatus_0 extends _i1.SmartFake implements _i2.StorageStatus {
     : super(parent, parentInvocation);
 }
 
+class _FakeLinuxEnvironmentStrategy_1 extends _i1.SmartFake
+    implements _i3.LinuxEnvironmentStrategy {
+  _FakeLinuxEnvironmentStrategy_1(Object parent, Invocation parentInvocation)
+    : super(parent, parentInvocation);
+}
+
 /// A class which mocks [DirectoryService].
 ///
 /// See the documentation for Mockito's code generation for more information.
@@ -42,7 +51,7 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
   String get romsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#romsRootPath),
-            returnValue: _i3.dummyValue<String>(
+            returnValue: _i4.dummyValue<String>(
               this,
               Invocation.getter(#romsRootPath),
             ),
@@ -53,7 +62,7 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
   String get emulatorsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#emulatorsRootPath),
-            returnValue: _i3.dummyValue<String>(
+            returnValue: _i4.dummyValue<String>(
               this,
               Invocation.getter(#emulatorsRootPath),
             ),
@@ -64,7 +73,7 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
   String get linuxSyncPreset =>
       (super.noSuchMethod(
             Invocation.getter(#linuxSyncPreset),
-            returnValue: _i3.dummyValue<String>(
+            returnValue: _i4.dummyValue<String>(
               this,
               Invocation.getter(#linuxSyncPreset),
             ),
@@ -79,6 +88,22 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
           )
           as _i2.StorageStatus);
 
+  @override
+  bool get isSteamDeck =>
+      (super.noSuchMethod(Invocation.getter(#isSteamDeck), returnValue: false)
+          as bool);
+
+  @override
+  _i3.LinuxEnvironmentStrategy get activeLinuxEnvironment =>
+      (super.noSuchMethod(
+            Invocation.getter(#activeLinuxEnvironment),
+            returnValue: _FakeLinuxEnvironmentStrategy_1(
+              this,
+              Invocation.getter(#activeLinuxEnvironment),
+            ),
+          )
+          as _i3.LinuxEnvironmentStrategy);
+
   @override
   set romsRootPath(String? value) => super.noSuchMethod(
     Invocation.setter(#romsRootPath, value),
@@ -110,50 +135,89 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
   );
 
   @override
-  _i4.Future<_i2.StorageStatus> initialize() =>
+  _i5.Future<String?> detectEmuDeckRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#detectEmuDeckRoot, []),
+            returnValue: _i5.Future<String?>.value(),
+          )
+          as _i5.Future<String?>);
+
+  @override
+  _i5.Future<_i2.StorageStatus> initialize() =>
       (super.noSuchMethod(
             Invocation.method(#initialize, []),
-            returnValue: _i4.Future<_i2.StorageStatus>.value(
+            returnValue: _i5.Future<_i2.StorageStatus>.value(
               _FakeStorageStatus_0(this, Invocation.method(#initialize, [])),
             ),
           )
-          as _i4.Future<_i2.StorageStatus>);
+          as _i5.Future<_i2.StorageStatus>);
+
+  @override
+  _i5.Future<String> getDefaultBase() =>
+      (super.noSuchMethod(
+            Invocation.method(#getDefaultBase, []),
+            returnValue: _i5.Future<String>.value(
+              _i4.dummyValue<String>(
+                this,
+                Invocation.method(#getDefaultBase, []),
+              ),
+            ),
+          )
+          as _i5.Future<String>);
 
   @override
-  _i4.Future<void> setLinuxSyncPreset(String? preset) =>
+  _i5.Future<void> resetRomsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetRomsRoot, []),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
+          )
+          as _i5.Future<void>);
+
+  @override
+  _i5.Future<void> resetEmulatorsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetEmulatorsRoot, []),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
+          )
+          as _i5.Future<void>);
+
+  @override
+  _i5.Future<void> setLinuxSyncPreset(String? preset) =>
       (super.noSuchMethod(
             Invocation.method(#setLinuxSyncPreset, [preset]),
-            returnValue: _i4.Future<void>.value(),
-            returnValueForMissingStub: _i4.Future<void>.value(),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
           )
-          as _i4.Future<void>);
+          as _i5.Future<void>);
 
   @override
-  _i4.Future<void> setEmudeckRoot(String? path) =>
+  _i5.Future<void> setEmudeckRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmudeckRoot, [path]),
-            returnValue: _i4.Future<void>.value(),
-            returnValueForMissingStub: _i4.Future<void>.value(),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
           )
-          as _i4.Future<void>);
+          as _i5.Future<void>);
 
   @override
-  _i4.Future<void> loadEmulatorPathOverrides() =>
+  _i5.Future<void> loadEmulatorPathOverrides() =>
       (super.noSuchMethod(
             Invocation.method(#loadEmulatorPathOverrides, []),
-            returnValue: _i4.Future<void>.value(),
-            returnValueForMissingStub: _i4.Future<void>.value(),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
           )
-          as _i4.Future<void>);
+          as _i5.Future<void>);
 
   @override
-  _i4.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
+  _i5.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorPathOverride, [emulatorId, path]),
-            returnValue: _i4.Future<void>.value(),
-            returnValueForMissingStub: _i4.Future<void>.value(),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
           )
-          as _i4.Future<void>);
+          as _i5.Future<void>);
 
   @override
   String? getEmulatorPathOverride(String? emulatorId) =>
@@ -163,111 +227,111 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
           as String?);
 
   @override
-  _i4.Future<void> setRomsRoot(String? path) =>
+  _i5.Future<void> setRomsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setRomsRoot, [path]),
-            returnValue: _i4.Future<void>.value(),
-            returnValueForMissingStub: _i4.Future<void>.value(),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
           )
-          as _i4.Future<void>);
+          as _i5.Future<void>);
 
   @override
-  _i4.Future<void> setEmulatorsRoot(String? path) =>
+  _i5.Future<void> setEmulatorsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorsRoot, [path]),
-            returnValue: _i4.Future<void>.value(),
-            returnValueForMissingStub: _i4.Future<void>.value(),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
           )
-          as _i4.Future<void>);
+          as _i5.Future<void>);
 
   @override
-  _i4.Future<String> getRomsDirectory() =>
+  _i5.Future<String> getRomsDirectory() =>
       (super.noSuchMethod(
             Invocation.method(#getRomsDirectory, []),
-            returnValue: _i4.Future<String>.value(
-              _i3.dummyValue<String>(
+            returnValue: _i5.Future<String>.value(
+              _i4.dummyValue<String>(
                 this,
                 Invocation.method(#getRomsDirectory, []),
               ),
             ),
           )
-          as _i4.Future<String>);
+          as _i5.Future<String>);
 
   @override
-  _i4.Future<Set<String>> getAllDownloadedFileNames() =>
+  _i5.Future<Set<String>> getAllDownloadedFileNames() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNames, []),
-            returnValue: _i4.Future<Set<String>>.value(<String>{}),
+            returnValue: _i5.Future<Set<String>>.value(<String>{}),
           )
-          as _i4.Future<Set<String>>);
+          as _i5.Future<Set<String>>);
 
   @override
-  _i4.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
+  _i5.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNamesByPlatform, []),
-            returnValue: _i4.Future<Map<String, Set<String>>>.value(
+            returnValue: _i5.Future<Map<String, Set<String>>>.value(
               <String, Set<String>>{},
             ),
           )
-          as _i4.Future<Map<String, Set<String>>>);
+          as _i5.Future<Map<String, Set<String>>>);
 
   @override
-  _i4.Future<String> getRomDirectory(_i5.Game? game) =>
+  _i5.Future<String> getRomDirectory(_i6.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomDirectory, [game]),
-            returnValue: _i4.Future<String>.value(
-              _i3.dummyValue<String>(
+            returnValue: _i5.Future<String>.value(
+              _i4.dummyValue<String>(
                 this,
                 Invocation.method(#getRomDirectory, [game]),
               ),
             ),
           )
-          as _i4.Future<String>);
+          as _i5.Future<String>);
 
   @override
-  _i4.Future<String> getRomFilePath(_i5.Game? game) =>
+  _i5.Future<String> getRomFilePath(_i6.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomFilePath, [game]),
-            returnValue: _i4.Future<String>.value(
-              _i3.dummyValue<String>(
+            returnValue: _i5.Future<String>.value(
+              _i4.dummyValue<String>(
                 this,
                 Invocation.method(#getRomFilePath, [game]),
               ),
             ),
           )
-          as _i4.Future<String>);
+          as _i5.Future<String>);
 
   @override
-  _i4.Future<String?> findExistingRomPath(_i5.Game? game) =>
+  _i5.Future<String?> findExistingRomPath(_i6.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#findExistingRomPath, [game]),
-            returnValue: _i4.Future<String?>.value(),
+            returnValue: _i5.Future<String?>.value(),
           )
-          as _i4.Future<String?>);
+          as _i5.Future<String?>);
 
   @override
-  _i4.Future<String?> resolveSevenZipPath() =>
+  _i5.Future<String?> resolveSevenZipPath() =>
       (super.noSuchMethod(
             Invocation.method(#resolveSevenZipPath, []),
-            returnValue: _i4.Future<String?>.value(),
+            returnValue: _i5.Future<String?>.value(),
           )
-          as _i4.Future<String?>);
+          as _i5.Future<String?>);
 
   @override
-  _i4.Future<String> getEmulatorDirectory(String? emulatorId) =>
+  _i5.Future<String> getEmulatorDirectory(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#getEmulatorDirectory, [emulatorId]),
-            returnValue: _i4.Future<String>.value(
-              _i3.dummyValue<String>(
+            returnValue: _i5.Future<String>.value(
+              _i4.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorDirectory, [emulatorId]),
               ),
             ),
           )
-          as _i4.Future<String>);
+          as _i5.Future<String>);
 
   @override
-  _i4.Future<String> getEmulatorAppSupportDirectory(
+  _i5.Future<String> getEmulatorAppSupportDirectory(
     String? emulatorName, {
     String? platformSlug,
   }) =>
@@ -277,8 +341,8 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               [emulatorName],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i4.Future<String>.value(
-              _i3.dummyValue<String>(
+            returnValue: _i5.Future<String>.value(
+              _i4.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorAppSupportDirectory,
@@ -288,10 +352,10 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               ),
             ),
           )
-          as _i4.Future<String>);
+          as _i5.Future<String>);
 
   @override
-  _i4.Future<String> getEmulatorBiosDirectory(
+  _i5.Future<String> getEmulatorBiosDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -301,8 +365,8 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i4.Future<String>.value(
-              _i3.dummyValue<String>(
+            returnValue: _i5.Future<String>.value(
+              _i4.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorBiosDirectory,
@@ -312,10 +376,10 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               ),
             ),
           )
-          as _i4.Future<String>);
+          as _i5.Future<String>);
 
   @override
-  _i4.Future<String> getEmulatorSystemDirectory(
+  _i5.Future<String> getEmulatorSystemDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -325,8 +389,8 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i4.Future<String>.value(
-              _i3.dummyValue<String>(
+            returnValue: _i5.Future<String>.value(
+              _i4.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorSystemDirectory,
@@ -336,19 +400,19 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               ),
             ),
           )
-          as _i4.Future<String>);
+          as _i5.Future<String>);
 
   @override
-  _i4.Future<void> deleteEmulator(String? emulatorId) =>
+  _i5.Future<void> deleteEmulator(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#deleteEmulator, [emulatorId]),
-            returnValue: _i4.Future<void>.value(),
-            returnValueForMissingStub: _i4.Future<void>.value(),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
           )
-          as _i4.Future<void>);
+          as _i5.Future<void>);
 
   @override
-  _i4.Future<String> getEmulatorExecutable(
+  _i5.Future<String> getEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -357,8 +421,8 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i4.Future<String>.value(
-              _i3.dummyValue<String>(
+            returnValue: _i5.Future<String>.value(
+              _i4.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorExecutable, [
                   emulatorId,
@@ -367,10 +431,10 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               ),
             ),
           )
-          as _i4.Future<String>);
+          as _i5.Future<String>);
 
   @override
-  _i4.Future<String?> findEmulatorExecutable(
+  _i5.Future<String?> findEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -379,12 +443,12 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i4.Future<String?>.value(),
+            returnValue: _i5.Future<String?>.value(),
           )
-          as _i4.Future<String?>);
+          as _i5.Future<String?>);
 
   @override
-  _i4.Future<bool> isEmulatorInstalled(
+  _i5.Future<bool> isEmulatorInstalled(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -393,17 +457,17 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i4.Future<bool>.value(false),
+            returnValue: _i5.Future<bool>.value(false),
           )
-          as _i4.Future<bool>);
+          as _i5.Future<bool>);
 
   @override
-  _i4.Future<bool> isRomDownloaded(_i5.Game? game) =>
+  _i5.Future<bool> isRomDownloaded(_i6.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#isRomDownloaded, [game]),
-            returnValue: _i4.Future<bool>.value(false),
+            returnValue: _i5.Future<bool>.value(false),
           )
-          as _i4.Future<bool>);
+          as _i5.Future<bool>);
 
   @override
   bool isEmuLaunchScript(String? path) =>
@@ -414,11 +478,65 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
           as bool);
 
   @override
-  _i4.Future<void> deleteRom(_i5.Game? game) =>
+  _i5.Future<void> launchGame(
+    _i6.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGame,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
+          )
+          as _i5.Future<void>);
+
+  @override
+  _i5.Future<_i7.Process?> launchGameWithHandle(
+    _i6.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGameWithHandle,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i5.Future<_i7.Process?>.value(),
+          )
+          as _i5.Future<_i7.Process?>);
+
+  @override
+  _i5.Future<void> launchStandalone(
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchStandalone,
+              [emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
+          )
+          as _i5.Future<void>);
+
+  @override
+  _i5.Future<void> deleteRom(_i6.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#deleteRom, [game]),
-            returnValue: _i4.Future<void>.value(),
-            returnValueForMissingStub: _i4.Future<void>.value(),
+            returnValue: _i5.Future<void>.value(),
+            returnValueForMissingStub: _i5.Future<void>.value(),
           )
-          as _i4.Future<void>);
+          as _i5.Future<void>);
 }
diff --git a/test/widgets/library_screen_test.mocks.dart b/test/widgets/library_screen_test.mocks.dart
index c3f32da..5c695ba 100644
--- a/test/widgets/library_screen_test.mocks.dart
+++ b/test/widgets/library_screen_test.mocks.dart
@@ -3,15 +3,17 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i6;
-import 'dart:io' as _i7;
-import 'dart:typed_data' as _i8;
+import 'dart:async' as _i7;
+import 'dart:io' as _i8;
+import 'dart:typed_data' as _i9;
 
+import 'package:freegosy/core/emulator/linux_strategies/linux_environment_strategy.dart'
+    as _i4;
 import 'package:freegosy/core/romm/romm_models.dart' as _i2;
-import 'package:freegosy/core/romm/romm_service.dart' as _i4;
+import 'package:freegosy/core/romm/romm_service.dart' as _i5;
 import 'package:freegosy/core/storage/directory_service.dart' as _i3;
 import 'package:mockito/mockito.dart' as _i1;
-import 'package:mockito/src/dummies.dart' as _i5;
+import 'package:mockito/src/dummies.dart' as _i6;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -38,10 +40,16 @@ class _FakeStorageStatus_1 extends _i1.SmartFake implements _i3.StorageStatus {
     : super(parent, parentInvocation);
 }
 
+class _FakeLinuxEnvironmentStrategy_2 extends _i1.SmartFake
+    implements _i4.LinuxEnvironmentStrategy {
+  _FakeLinuxEnvironmentStrategy_2(Object parent, Invocation parentInvocation)
+    : super(parent, parentInvocation);
+}
+
 /// A class which mocks [RommService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockRommService extends _i1.Mock implements _i4.RommService {
+class MockRommService extends _i1.Mock implements _i5.RommService {
   MockRommService() {
     _i1.throwOnMissingStub(this);
   }
@@ -58,7 +66,7 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
   String get authHeader =>
       (super.noSuchMethod(
             Invocation.getter(#authHeader),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#authHeader),
             ),
@@ -66,31 +74,45 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String);
 
   @override
-  _i6.Future<void> refreshToken() =>
+  void updateConfig(_i2.RomMConfig? newConfig) => super.noSuchMethod(
+    Invocation.method(#updateConfig, [newConfig]),
+    returnValueForMissingStub: null,
+  );
+
+  @override
+  _i7.Future<void> refreshToken() =>
       (super.noSuchMethod(
             Invocation.method(#refreshToken, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<_i2.Game?> getGame(String? id) =>
+      (super.noSuchMethod(
+            Invocation.method(#getGame, [id]),
+            returnValue: _i7.Future<_i2.Game?>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<_i2.Game?>);
 
   @override
-  _i6.Future<List<_i2.Platform>> getPlatforms() =>
+  _i7.Future<List<_i2.Platform>> getPlatforms() =>
       (super.noSuchMethod(
             Invocation.method(#getPlatforms, []),
-            returnValue: _i6.Future<List<_i2.Platform>>.value(<_i2.Platform>[]),
+            returnValue: _i7.Future<List<_i2.Platform>>.value(<_i2.Platform>[]),
           )
-          as _i6.Future<List<_i2.Platform>>);
+          as _i7.Future<List<_i2.Platform>>);
 
   @override
-  _i6.Future<List<Map<String, dynamic>>> getCollections() =>
+  _i7.Future<List<Map<String, dynamic>>> getCollections() =>
       (super.noSuchMethod(
             Invocation.method(#getCollections, []),
-            returnValue: _i6.Future<List<Map<String, dynamic>>>.value(
+            returnValue: _i7.Future<List<Map<String, dynamic>>>.value(
               <Map<String, dynamic>>[],
             ),
           )
-          as _i6.Future<List<Map<String, dynamic>>>);
+          as _i7.Future<List<Map<String, dynamic>>>);
 
   @override
   String? resolveCoverUrl(_i2.Game? game) =>
@@ -98,31 +120,31 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String?);
 
   @override
-  _i6.Future<List<_i2.Game>> getGames(String? platformId) =>
+  _i7.Future<List<_i2.Game>> getGames(String? platformId) =>
       (super.noSuchMethod(
             Invocation.method(#getGames, [platformId]),
-            returnValue: _i6.Future<List<_i2.Game>>.value(<_i2.Game>[]),
+            returnValue: _i7.Future<List<_i2.Game>>.value(<_i2.Game>[]),
           )
-          as _i6.Future<List<_i2.Game>>);
+          as _i7.Future<List<_i2.Game>>);
 
   @override
-  _i6.Future<List<_i2.Game>> getAllGames({String? platformId}) =>
+  _i7.Future<List<_i2.Game>> getAllGames({String? platformId}) =>
       (super.noSuchMethod(
             Invocation.method(#getAllGames, [], {#platformId: platformId}),
-            returnValue: _i6.Future<List<_i2.Game>>.value(<_i2.Game>[]),
+            returnValue: _i7.Future<List<_i2.Game>>.value(<_i2.Game>[]),
           )
-          as _i6.Future<List<_i2.Game>>);
+          as _i7.Future<List<_i2.Game>>);
 
   @override
-  _i6.Future<List<_i2.Game>> getRecentlyPlayed({int? limit = 15}) =>
+  _i7.Future<List<_i2.Game>> getRecentlyPlayed({int? limit = 15}) =>
       (super.noSuchMethod(
             Invocation.method(#getRecentlyPlayed, [], {#limit: limit}),
-            returnValue: _i6.Future<List<_i2.Game>>.value(<_i2.Game>[]),
+            returnValue: _i7.Future<List<_i2.Game>>.value(<_i2.Game>[]),
           )
-          as _i6.Future<List<_i2.Game>>);
+          as _i7.Future<List<_i2.Game>>);
 
   @override
-  _i6.Future<({List<_i2.Game> games, int total})> getGamesPage({
+  _i7.Future<({List<_i2.Game> games, int total})> getGamesPage({
     int? offset = 0,
     int? limit = 50,
     String? platformId,
@@ -151,34 +173,34 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
               #withCharIndex: withCharIndex,
               #withFilterValues: withFilterValues,
             }),
-            returnValue: _i6.Future<({List<_i2.Game> games, int total})>.value((
+            returnValue: _i7.Future<({List<_i2.Game> games, int total})>.value((
               games: <_i2.Game>[],
               total: 0,
             )),
           )
-          as _i6.Future<({List<_i2.Game> games, int total})>);
+          as _i7.Future<({List<_i2.Game> games, int total})>);
 
   @override
-  _i6.Future<_i2.Game?> getRandomGame() =>
+  _i7.Future<_i2.Game?> getRandomGame() =>
       (super.noSuchMethod(
             Invocation.method(#getRandomGame, []),
-            returnValue: _i6.Future<_i2.Game?>.value(),
+            returnValue: _i7.Future<_i2.Game?>.value(),
           )
-          as _i6.Future<_i2.Game?>);
+          as _i7.Future<_i2.Game?>);
 
   @override
-  _i6.Future<List<_i2.SaveFile>> getSaves(String? gameId) =>
+  _i7.Future<List<_i2.SaveFile>> getSaves(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getSaves, [gameId]),
-            returnValue: _i6.Future<List<_i2.SaveFile>>.value(<_i2.SaveFile>[]),
+            returnValue: _i7.Future<List<_i2.SaveFile>>.value(<_i2.SaveFile>[]),
           )
-          as _i6.Future<List<_i2.SaveFile>>);
+          as _i7.Future<List<_i2.SaveFile>>);
 
   @override
   String getDownloadUrl(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getDownloadUrl, [game]),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.method(#getDownloadUrl, [game]),
             ),
@@ -186,74 +208,79 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String);
 
   @override
-  _i6.Future<bool> uploadSave(
+  _i7.Future<bool> uploadSave(
     String? gameId,
-    _i7.File? saveFile, {
+    _i8.File? saveFile, {
     String? slot,
-    _i7.File? screenshotFile,
+    _i8.File? screenshotFile,
+    String? overrideFilename,
   }) =>
       (super.noSuchMethod(
             Invocation.method(
               #uploadSave,
               [gameId, saveFile],
-              {#slot: slot, #screenshotFile: screenshotFile},
+              {
+                #slot: slot,
+                #screenshotFile: screenshotFile,
+                #overrideFilename: overrideFilename,
+              },
             ),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
-  _i6.Future<void> pruneOldSaves(String? gameId, {int? keepCount = 5}) =>
+  _i7.Future<void> pruneOldSaves(String? gameId, {int? keepCount = 5}) =>
       (super.noSuchMethod(
             Invocation.method(
               #pruneOldSaves,
               [gameId],
               {#keepCount: keepCount},
             ),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<List<Map<String, dynamic>>> getSavesList(String? gameId) =>
+  _i7.Future<List<Map<String, dynamic>>> getSavesList(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getSavesList, [gameId]),
-            returnValue: _i6.Future<List<Map<String, dynamic>>>.value(
+            returnValue: _i7.Future<List<Map<String, dynamic>>>.value(
               <Map<String, dynamic>>[],
             ),
           )
-          as _i6.Future<List<Map<String, dynamic>>>);
+          as _i7.Future<List<Map<String, dynamic>>>);
 
   @override
-  _i6.Future<Map<String, dynamic>?> getLatestSave(String? gameId) =>
+  _i7.Future<Map<String, dynamic>?> getLatestSave(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getLatestSave, [gameId]),
-            returnValue: _i6.Future<Map<String, dynamic>?>.value(),
+            returnValue: _i7.Future<Map<String, dynamic>?>.value(),
           )
-          as _i6.Future<Map<String, dynamic>?>);
+          as _i7.Future<Map<String, dynamic>?>);
 
   @override
-  _i6.Future<_i8.Uint8List?> downloadSave(String? saveUrl) =>
+  _i7.Future<_i9.Uint8List?> downloadSave(String? saveUrl) =>
       (super.noSuchMethod(
             Invocation.method(#downloadSave, [saveUrl]),
-            returnValue: _i6.Future<_i8.Uint8List?>.value(),
+            returnValue: _i7.Future<_i9.Uint8List?>.value(),
           )
-          as _i6.Future<_i8.Uint8List?>);
+          as _i7.Future<_i9.Uint8List?>);
 
   @override
-  _i6.Future<List<_i2.Firmware>> getFirmware({String? platformId}) =>
+  _i7.Future<List<_i2.Firmware>> getFirmware({String? platformId}) =>
       (super.noSuchMethod(
             Invocation.method(#getFirmware, [], {#platformId: platformId}),
-            returnValue: _i6.Future<List<_i2.Firmware>>.value(<_i2.Firmware>[]),
+            returnValue: _i7.Future<List<_i2.Firmware>>.value(<_i2.Firmware>[]),
           )
-          as _i6.Future<List<_i2.Firmware>>);
+          as _i7.Future<List<_i2.Firmware>>);
 
   @override
   String getFirmwareDownloadUrl(_i2.Firmware? firmware) =>
       (super.noSuchMethod(
             Invocation.method(#getFirmwareDownloadUrl, [firmware]),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.method(#getFirmwareDownloadUrl, [firmware]),
             ),
@@ -261,7 +288,7 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
           as String);
 
   @override
-  _i6.Future<_i8.Uint8List?> downloadFirmware(
+  _i7.Future<_i9.Uint8List?> downloadFirmware(
     _i2.Firmware? firmware, {
     void Function(int, int)? onProgress,
   }) =>
@@ -271,12 +298,12 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
               [firmware],
               {#onProgress: onProgress},
             ),
-            returnValue: _i6.Future<_i8.Uint8List?>.value(),
+            returnValue: _i7.Future<_i9.Uint8List?>.value(),
           )
-          as _i6.Future<_i8.Uint8List?>);
+          as _i7.Future<_i9.Uint8List?>);
 
   @override
-  _i6.Future<bool> updateRomProps(
+  _i7.Future<bool> updateRomProps(
     String? romId, {
     bool? backlogged,
     bool? nowPlaying,
@@ -296,29 +323,37 @@ class MockRommService extends _i1.Mock implements _i4.RommService {
                 #completion: completion,
               },
             ),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
-  _i6.Future<List<_i2.RomNote>> getRomNotes(String? romId) =>
+  _i7.Future<List<_i2.RomNote>> getRomNotes(String? romId) =>
       (super.noSuchMethod(
             Invocation.method(#getRomNotes, [romId]),
-            returnValue: _i6.Future<List<_i2.RomNote>>.value(<_i2.RomNote>[]),
+            returnValue: _i7.Future<List<_i2.RomNote>>.value(<_i2.RomNote>[]),
           )
-          as _i6.Future<List<_i2.RomNote>>);
+          as _i7.Future<List<_i2.RomNote>>);
 
   @override
-  _i6.Future<bool> createRomNote(
+  _i7.Future<bool> createRomNote(
     String? romId,
     String? title,
     String? content,
   ) =>
       (super.noSuchMethod(
             Invocation.method(#createRomNote, [romId, title, content]),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
+
+  @override
+  _i7.Future<bool> deleteRomNote(String? romId, int? noteId) =>
+      (super.noSuchMethod(
+            Invocation.method(#deleteRomNote, [romId, noteId]),
+            returnValue: _i7.Future<bool>.value(false),
+          )
+          as _i7.Future<bool>);
 }
 
 /// A class which mocks [DirectoryService].
@@ -333,7 +368,7 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   String get romsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#romsRootPath),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#romsRootPath),
             ),
@@ -344,7 +379,7 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   String get emulatorsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#emulatorsRootPath),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#emulatorsRootPath),
             ),
@@ -355,7 +390,7 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   String get linuxSyncPreset =>
       (super.noSuchMethod(
             Invocation.getter(#linuxSyncPreset),
-            returnValue: _i5.dummyValue<String>(
+            returnValue: _i6.dummyValue<String>(
               this,
               Invocation.getter(#linuxSyncPreset),
             ),
@@ -370,6 +405,22 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
           )
           as _i3.StorageStatus);
 
+  @override
+  bool get isSteamDeck =>
+      (super.noSuchMethod(Invocation.getter(#isSteamDeck), returnValue: false)
+          as bool);
+
+  @override
+  _i4.LinuxEnvironmentStrategy get activeLinuxEnvironment =>
+      (super.noSuchMethod(
+            Invocation.getter(#activeLinuxEnvironment),
+            returnValue: _FakeLinuxEnvironmentStrategy_2(
+              this,
+              Invocation.getter(#activeLinuxEnvironment),
+            ),
+          )
+          as _i4.LinuxEnvironmentStrategy);
+
   @override
   set romsRootPath(String? value) => super.noSuchMethod(
     Invocation.setter(#romsRootPath, value),
@@ -401,50 +452,89 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
   );
 
   @override
-  _i6.Future<_i3.StorageStatus> initialize() =>
+  _i7.Future<String?> detectEmuDeckRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#detectEmuDeckRoot, []),
+            returnValue: _i7.Future<String?>.value(),
+          )
+          as _i7.Future<String?>);
+
+  @override
+  _i7.Future<_i3.StorageStatus> initialize() =>
       (super.noSuchMethod(
             Invocation.method(#initialize, []),
-            returnValue: _i6.Future<_i3.StorageStatus>.value(
+            returnValue: _i7.Future<_i3.StorageStatus>.value(
               _FakeStorageStatus_1(this, Invocation.method(#initialize, [])),
             ),
           )
-          as _i6.Future<_i3.StorageStatus>);
+          as _i7.Future<_i3.StorageStatus>);
 
   @override
-  _i6.Future<void> setLinuxSyncPreset(String? preset) =>
+  _i7.Future<String> getDefaultBase() =>
+      (super.noSuchMethod(
+            Invocation.method(#getDefaultBase, []),
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
+                this,
+                Invocation.method(#getDefaultBase, []),
+              ),
+            ),
+          )
+          as _i7.Future<String>);
+
+  @override
+  _i7.Future<void> resetRomsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetRomsRoot, []),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<void> resetEmulatorsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetEmulatorsRoot, []),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<void> setLinuxSyncPreset(String? preset) =>
       (super.noSuchMethod(
             Invocation.method(#setLinuxSyncPreset, [preset]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setEmudeckRoot(String? path) =>
+  _i7.Future<void> setEmudeckRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmudeckRoot, [path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> loadEmulatorPathOverrides() =>
+  _i7.Future<void> loadEmulatorPathOverrides() =>
       (super.noSuchMethod(
             Invocation.method(#loadEmulatorPathOverrides, []),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
+  _i7.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorPathOverride, [emulatorId, path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
   String? getEmulatorPathOverride(String? emulatorId) =>
@@ -454,111 +544,111 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
           as String?);
 
   @override
-  _i6.Future<void> setRomsRoot(String? path) =>
+  _i7.Future<void> setRomsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setRomsRoot, [path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<void> setEmulatorsRoot(String? path) =>
+  _i7.Future<void> setEmulatorsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorsRoot, [path]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<String> getRomsDirectory() =>
+  _i7.Future<String> getRomsDirectory() =>
       (super.noSuchMethod(
             Invocation.method(#getRomsDirectory, []),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getRomsDirectory, []),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<Set<String>> getAllDownloadedFileNames() =>
+  _i7.Future<Set<String>> getAllDownloadedFileNames() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNames, []),
-            returnValue: _i6.Future<Set<String>>.value(<String>{}),
+            returnValue: _i7.Future<Set<String>>.value(<String>{}),
           )
-          as _i6.Future<Set<String>>);
+          as _i7.Future<Set<String>>);
 
   @override
-  _i6.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
+  _i7.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNamesByPlatform, []),
-            returnValue: _i6.Future<Map<String, Set<String>>>.value(
+            returnValue: _i7.Future<Map<String, Set<String>>>.value(
               <String, Set<String>>{},
             ),
           )
-          as _i6.Future<Map<String, Set<String>>>);
+          as _i7.Future<Map<String, Set<String>>>);
 
   @override
-  _i6.Future<String> getRomDirectory(_i2.Game? game) =>
+  _i7.Future<String> getRomDirectory(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomDirectory, [game]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getRomDirectory, [game]),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getRomFilePath(_i2.Game? game) =>
+  _i7.Future<String> getRomFilePath(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomFilePath, [game]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getRomFilePath, [game]),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String?> findExistingRomPath(_i2.Game? game) =>
+  _i7.Future<String?> findExistingRomPath(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#findExistingRomPath, [game]),
-            returnValue: _i6.Future<String?>.value(),
+            returnValue: _i7.Future<String?>.value(),
           )
-          as _i6.Future<String?>);
+          as _i7.Future<String?>);
 
   @override
-  _i6.Future<String?> resolveSevenZipPath() =>
+  _i7.Future<String?> resolveSevenZipPath() =>
       (super.noSuchMethod(
             Invocation.method(#resolveSevenZipPath, []),
-            returnValue: _i6.Future<String?>.value(),
+            returnValue: _i7.Future<String?>.value(),
           )
-          as _i6.Future<String?>);
+          as _i7.Future<String?>);
 
   @override
-  _i6.Future<String> getEmulatorDirectory(String? emulatorId) =>
+  _i7.Future<String> getEmulatorDirectory(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#getEmulatorDirectory, [emulatorId]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorDirectory, [emulatorId]),
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getEmulatorAppSupportDirectory(
+  _i7.Future<String> getEmulatorAppSupportDirectory(
     String? emulatorName, {
     String? platformSlug,
   }) =>
@@ -568,8 +658,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               [emulatorName],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorAppSupportDirectory,
@@ -579,10 +669,10 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getEmulatorBiosDirectory(
+  _i7.Future<String> getEmulatorBiosDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -592,8 +682,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorBiosDirectory,
@@ -603,10 +693,10 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String> getEmulatorSystemDirectory(
+  _i7.Future<String> getEmulatorSystemDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -616,8 +706,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorSystemDirectory,
@@ -627,19 +717,19 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<void> deleteEmulator(String? emulatorId) =>
+  _i7.Future<void> deleteEmulator(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#deleteEmulator, [emulatorId]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 
   @override
-  _i6.Future<String> getEmulatorExecutable(
+  _i7.Future<String> getEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -648,8 +738,8 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i6.Future<String>.value(
-              _i5.dummyValue<String>(
+            returnValue: _i7.Future<String>.value(
+              _i6.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorExecutable, [
                   emulatorId,
@@ -658,10 +748,10 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               ),
             ),
           )
-          as _i6.Future<String>);
+          as _i7.Future<String>);
 
   @override
-  _i6.Future<String?> findEmulatorExecutable(
+  _i7.Future<String?> findEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -670,12 +760,12 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i6.Future<String?>.value(),
+            returnValue: _i7.Future<String?>.value(),
           )
-          as _i6.Future<String?>);
+          as _i7.Future<String?>);
 
   @override
-  _i6.Future<bool> isEmulatorInstalled(
+  _i7.Future<bool> isEmulatorInstalled(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -684,17 +774,17 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
-  _i6.Future<bool> isRomDownloaded(_i2.Game? game) =>
+  _i7.Future<bool> isRomDownloaded(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#isRomDownloaded, [game]),
-            returnValue: _i6.Future<bool>.value(false),
+            returnValue: _i7.Future<bool>.value(false),
           )
-          as _i6.Future<bool>);
+          as _i7.Future<bool>);
 
   @override
   bool isEmuLaunchScript(String? path) =>
@@ -705,11 +795,65 @@ class MockDirectoryService extends _i1.Mock implements _i3.DirectoryService {
           as bool);
 
   @override
-  _i6.Future<void> deleteRom(_i2.Game? game) =>
+  _i7.Future<void> launchGame(
+    _i2.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGame,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<_i8.Process?> launchGameWithHandle(
+    _i2.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGameWithHandle,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i7.Future<_i8.Process?>.value(),
+          )
+          as _i7.Future<_i8.Process?>);
+
+  @override
+  _i7.Future<void> launchStandalone(
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchStandalone,
+              [emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
+          )
+          as _i7.Future<void>);
+
+  @override
+  _i7.Future<void> deleteRom(_i2.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#deleteRom, [game]),
-            returnValue: _i6.Future<void>.value(),
-            returnValueForMissingStub: _i6.Future<void>.value(),
+            returnValue: _i7.Future<void>.value(),
+            returnValueForMissingStub: _i7.Future<void>.value(),
           )
-          as _i6.Future<void>);
+          as _i7.Future<void>);
 }
diff --git a/test/widgets/settings_screen_test.mocks.dart b/test/widgets/settings_screen_test.mocks.dart
index 4c02c21..db64fda 100644
--- a/test/widgets/settings_screen_test.mocks.dart
+++ b/test/widgets/settings_screen_test.mocks.dart
@@ -3,17 +3,19 @@
 // Do not manually edit this file.
 
 // ignore_for_file: no_leading_underscores_for_library_prefixes
-import 'dart:async' as _i5;
+import 'dart:async' as _i6;
 import 'dart:io' as _i7;
-import 'dart:typed_data' as _i8;
-
-import 'package:freegosy/core/emulator/emulator_strategy.dart' as _i10;
-import 'package:freegosy/core/emulator/strategy_registry.dart' as _i9;
-import 'package:freegosy/core/romm/romm_models.dart' as _i3;
-import 'package:freegosy/core/romm/romm_service.dart' as _i6;
+import 'dart:typed_data' as _i9;
+
+import 'package:freegosy/core/emulator/emulator_strategy.dart' as _i11;
+import 'package:freegosy/core/emulator/linux_strategies/linux_environment_strategy.dart'
+    as _i3;
+import 'package:freegosy/core/emulator/strategy_registry.dart' as _i10;
+import 'package:freegosy/core/romm/romm_models.dart' as _i4;
+import 'package:freegosy/core/romm/romm_service.dart' as _i8;
 import 'package:freegosy/core/storage/directory_service.dart' as _i2;
 import 'package:mockito/mockito.dart' as _i1;
-import 'package:mockito/src/dummies.dart' as _i4;
+import 'package:mockito/src/dummies.dart' as _i5;
 
 // ignore_for_file: type=lint
 // ignore_for_file: avoid_redundant_argument_values
@@ -35,8 +37,14 @@ class _FakeStorageStatus_0 extends _i1.SmartFake implements _i2.StorageStatus {
     : super(parent, parentInvocation);
 }
 
-class _FakeRomMConfig_1 extends _i1.SmartFake implements _i3.RomMConfig {
-  _FakeRomMConfig_1(Object parent, Invocation parentInvocation)
+class _FakeLinuxEnvironmentStrategy_1 extends _i1.SmartFake
+    implements _i3.LinuxEnvironmentStrategy {
+  _FakeLinuxEnvironmentStrategy_1(Object parent, Invocation parentInvocation)
+    : super(parent, parentInvocation);
+}
+
+class _FakeRomMConfig_2 extends _i1.SmartFake implements _i4.RomMConfig {
+  _FakeRomMConfig_2(Object parent, Invocation parentInvocation)
     : super(parent, parentInvocation);
 }
 
@@ -52,7 +60,7 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
   String get romsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#romsRootPath),
-            returnValue: _i4.dummyValue<String>(
+            returnValue: _i5.dummyValue<String>(
               this,
               Invocation.getter(#romsRootPath),
             ),
@@ -63,7 +71,7 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
   String get emulatorsRootPath =>
       (super.noSuchMethod(
             Invocation.getter(#emulatorsRootPath),
-            returnValue: _i4.dummyValue<String>(
+            returnValue: _i5.dummyValue<String>(
               this,
               Invocation.getter(#emulatorsRootPath),
             ),
@@ -74,7 +82,7 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
   String get linuxSyncPreset =>
       (super.noSuchMethod(
             Invocation.getter(#linuxSyncPreset),
-            returnValue: _i4.dummyValue<String>(
+            returnValue: _i5.dummyValue<String>(
               this,
               Invocation.getter(#linuxSyncPreset),
             ),
@@ -89,6 +97,22 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
           )
           as _i2.StorageStatus);
 
+  @override
+  bool get isSteamDeck =>
+      (super.noSuchMethod(Invocation.getter(#isSteamDeck), returnValue: false)
+          as bool);
+
+  @override
+  _i3.LinuxEnvironmentStrategy get activeLinuxEnvironment =>
+      (super.noSuchMethod(
+            Invocation.getter(#activeLinuxEnvironment),
+            returnValue: _FakeLinuxEnvironmentStrategy_1(
+              this,
+              Invocation.getter(#activeLinuxEnvironment),
+            ),
+          )
+          as _i3.LinuxEnvironmentStrategy);
+
   @override
   set romsRootPath(String? value) => super.noSuchMethod(
     Invocation.setter(#romsRootPath, value),
@@ -120,50 +144,89 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
   );
 
   @override
-  _i5.Future<_i2.StorageStatus> initialize() =>
+  _i6.Future<String?> detectEmuDeckRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#detectEmuDeckRoot, []),
+            returnValue: _i6.Future<String?>.value(),
+          )
+          as _i6.Future<String?>);
+
+  @override
+  _i6.Future<_i2.StorageStatus> initialize() =>
       (super.noSuchMethod(
             Invocation.method(#initialize, []),
-            returnValue: _i5.Future<_i2.StorageStatus>.value(
+            returnValue: _i6.Future<_i2.StorageStatus>.value(
               _FakeStorageStatus_0(this, Invocation.method(#initialize, [])),
             ),
           )
-          as _i5.Future<_i2.StorageStatus>);
+          as _i6.Future<_i2.StorageStatus>);
 
   @override
-  _i5.Future<void> setLinuxSyncPreset(String? preset) =>
+  _i6.Future<String> getDefaultBase() =>
+      (super.noSuchMethod(
+            Invocation.method(#getDefaultBase, []),
+            returnValue: _i6.Future<String>.value(
+              _i5.dummyValue<String>(
+                this,
+                Invocation.method(#getDefaultBase, []),
+              ),
+            ),
+          )
+          as _i6.Future<String>);
+
+  @override
+  _i6.Future<void> resetRomsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetRomsRoot, []),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
+          )
+          as _i6.Future<void>);
+
+  @override
+  _i6.Future<void> resetEmulatorsRoot() =>
+      (super.noSuchMethod(
+            Invocation.method(#resetEmulatorsRoot, []),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
+          )
+          as _i6.Future<void>);
+
+  @override
+  _i6.Future<void> setLinuxSyncPreset(String? preset) =>
       (super.noSuchMethod(
             Invocation.method(#setLinuxSyncPreset, [preset]),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<void> setEmudeckRoot(String? path) =>
+  _i6.Future<void> setEmudeckRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmudeckRoot, [path]),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<void> loadEmulatorPathOverrides() =>
+  _i6.Future<void> loadEmulatorPathOverrides() =>
       (super.noSuchMethod(
             Invocation.method(#loadEmulatorPathOverrides, []),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
+  _i6.Future<void> setEmulatorPathOverride(String? emulatorId, String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorPathOverride, [emulatorId, path]),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
   String? getEmulatorPathOverride(String? emulatorId) =>
@@ -173,111 +236,111 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
           as String?);
 
   @override
-  _i5.Future<void> setRomsRoot(String? path) =>
+  _i6.Future<void> setRomsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setRomsRoot, [path]),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<void> setEmulatorsRoot(String? path) =>
+  _i6.Future<void> setEmulatorsRoot(String? path) =>
       (super.noSuchMethod(
             Invocation.method(#setEmulatorsRoot, [path]),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<String> getRomsDirectory() =>
+  _i6.Future<String> getRomsDirectory() =>
       (super.noSuchMethod(
             Invocation.method(#getRomsDirectory, []),
-            returnValue: _i5.Future<String>.value(
-              _i4.dummyValue<String>(
+            returnValue: _i6.Future<String>.value(
+              _i5.dummyValue<String>(
                 this,
                 Invocation.method(#getRomsDirectory, []),
               ),
             ),
           )
-          as _i5.Future<String>);
+          as _i6.Future<String>);
 
   @override
-  _i5.Future<Set<String>> getAllDownloadedFileNames() =>
+  _i6.Future<Set<String>> getAllDownloadedFileNames() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNames, []),
-            returnValue: _i5.Future<Set<String>>.value(<String>{}),
+            returnValue: _i6.Future<Set<String>>.value(<String>{}),
           )
-          as _i5.Future<Set<String>>);
+          as _i6.Future<Set<String>>);
 
   @override
-  _i5.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
+  _i6.Future<Map<String, Set<String>>> getAllDownloadedFileNamesByPlatform() =>
       (super.noSuchMethod(
             Invocation.method(#getAllDownloadedFileNamesByPlatform, []),
-            returnValue: _i5.Future<Map<String, Set<String>>>.value(
+            returnValue: _i6.Future<Map<String, Set<String>>>.value(
               <String, Set<String>>{},
             ),
           )
-          as _i5.Future<Map<String, Set<String>>>);
+          as _i6.Future<Map<String, Set<String>>>);
 
   @override
-  _i5.Future<String> getRomDirectory(_i3.Game? game) =>
+  _i6.Future<String> getRomDirectory(_i4.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomDirectory, [game]),
-            returnValue: _i5.Future<String>.value(
-              _i4.dummyValue<String>(
+            returnValue: _i6.Future<String>.value(
+              _i5.dummyValue<String>(
                 this,
                 Invocation.method(#getRomDirectory, [game]),
               ),
             ),
           )
-          as _i5.Future<String>);
+          as _i6.Future<String>);
 
   @override
-  _i5.Future<String> getRomFilePath(_i3.Game? game) =>
+  _i6.Future<String> getRomFilePath(_i4.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getRomFilePath, [game]),
-            returnValue: _i5.Future<String>.value(
-              _i4.dummyValue<String>(
+            returnValue: _i6.Future<String>.value(
+              _i5.dummyValue<String>(
                 this,
                 Invocation.method(#getRomFilePath, [game]),
               ),
             ),
           )
-          as _i5.Future<String>);
+          as _i6.Future<String>);
 
   @override
-  _i5.Future<String?> findExistingRomPath(_i3.Game? game) =>
+  _i6.Future<String?> findExistingRomPath(_i4.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#findExistingRomPath, [game]),
-            returnValue: _i5.Future<String?>.value(),
+            returnValue: _i6.Future<String?>.value(),
           )
-          as _i5.Future<String?>);
+          as _i6.Future<String?>);
 
   @override
-  _i5.Future<String?> resolveSevenZipPath() =>
+  _i6.Future<String?> resolveSevenZipPath() =>
       (super.noSuchMethod(
             Invocation.method(#resolveSevenZipPath, []),
-            returnValue: _i5.Future<String?>.value(),
+            returnValue: _i6.Future<String?>.value(),
           )
-          as _i5.Future<String?>);
+          as _i6.Future<String?>);
 
   @override
-  _i5.Future<String> getEmulatorDirectory(String? emulatorId) =>
+  _i6.Future<String> getEmulatorDirectory(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#getEmulatorDirectory, [emulatorId]),
-            returnValue: _i5.Future<String>.value(
-              _i4.dummyValue<String>(
+            returnValue: _i6.Future<String>.value(
+              _i5.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorDirectory, [emulatorId]),
               ),
             ),
           )
-          as _i5.Future<String>);
+          as _i6.Future<String>);
 
   @override
-  _i5.Future<String> getEmulatorAppSupportDirectory(
+  _i6.Future<String> getEmulatorAppSupportDirectory(
     String? emulatorName, {
     String? platformSlug,
   }) =>
@@ -287,8 +350,8 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               [emulatorName],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i5.Future<String>.value(
-              _i4.dummyValue<String>(
+            returnValue: _i6.Future<String>.value(
+              _i5.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorAppSupportDirectory,
@@ -298,10 +361,10 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               ),
             ),
           )
-          as _i5.Future<String>);
+          as _i6.Future<String>);
 
   @override
-  _i5.Future<String> getEmulatorBiosDirectory(
+  _i6.Future<String> getEmulatorBiosDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -311,8 +374,8 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i5.Future<String>.value(
-              _i4.dummyValue<String>(
+            returnValue: _i6.Future<String>.value(
+              _i5.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorBiosDirectory,
@@ -322,10 +385,10 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               ),
             ),
           )
-          as _i5.Future<String>);
+          as _i6.Future<String>);
 
   @override
-  _i5.Future<String> getEmulatorSystemDirectory(
+  _i6.Future<String> getEmulatorSystemDirectory(
     String? emulatorId, {
     String? platformSlug,
   }) =>
@@ -335,8 +398,8 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               [emulatorId],
               {#platformSlug: platformSlug},
             ),
-            returnValue: _i5.Future<String>.value(
-              _i4.dummyValue<String>(
+            returnValue: _i6.Future<String>.value(
+              _i5.dummyValue<String>(
                 this,
                 Invocation.method(
                   #getEmulatorSystemDirectory,
@@ -346,19 +409,19 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               ),
             ),
           )
-          as _i5.Future<String>);
+          as _i6.Future<String>);
 
   @override
-  _i5.Future<void> deleteEmulator(String? emulatorId) =>
+  _i6.Future<void> deleteEmulator(String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#deleteEmulator, [emulatorId]),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<String> getEmulatorExecutable(
+  _i6.Future<String> getEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -367,8 +430,8 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i5.Future<String>.value(
-              _i4.dummyValue<String>(
+            returnValue: _i6.Future<String>.value(
+              _i5.dummyValue<String>(
                 this,
                 Invocation.method(#getEmulatorExecutable, [
                   emulatorId,
@@ -377,10 +440,10 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               ),
             ),
           )
-          as _i5.Future<String>);
+          as _i6.Future<String>);
 
   @override
-  _i5.Future<String?> findEmulatorExecutable(
+  _i6.Future<String?> findEmulatorExecutable(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -389,12 +452,12 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i5.Future<String?>.value(),
+            returnValue: _i6.Future<String?>.value(),
           )
-          as _i5.Future<String?>);
+          as _i6.Future<String?>);
 
   @override
-  _i5.Future<bool> isEmulatorInstalled(
+  _i6.Future<bool> isEmulatorInstalled(
     String? emulatorId,
     String? executableName,
   ) =>
@@ -403,17 +466,17 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
               emulatorId,
               executableName,
             ]),
-            returnValue: _i5.Future<bool>.value(false),
+            returnValue: _i6.Future<bool>.value(false),
           )
-          as _i5.Future<bool>);
+          as _i6.Future<bool>);
 
   @override
-  _i5.Future<bool> isRomDownloaded(_i3.Game? game) =>
+  _i6.Future<bool> isRomDownloaded(_i4.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#isRomDownloaded, [game]),
-            returnValue: _i5.Future<bool>.value(false),
+            returnValue: _i6.Future<bool>.value(false),
           )
-          as _i5.Future<bool>);
+          as _i6.Future<bool>);
 
   @override
   bool isEmuLaunchScript(String? path) =>
@@ -424,36 +487,90 @@ class MockDirectoryService extends _i1.Mock implements _i2.DirectoryService {
           as bool);
 
   @override
-  _i5.Future<void> deleteRom(_i3.Game? game) =>
+  _i6.Future<void> launchGame(
+    _i4.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGame,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
+          )
+          as _i6.Future<void>);
+
+  @override
+  _i6.Future<_i7.Process?> launchGameWithHandle(
+    _i4.Game? game,
+    String? romPath,
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchGameWithHandle,
+              [game, romPath, emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i6.Future<_i7.Process?>.value(),
+          )
+          as _i6.Future<_i7.Process?>);
+
+  @override
+  _i6.Future<void> launchStandalone(
+    String? emulatorId,
+    String? exePath, {
+    List<String>? args = const [],
+  }) =>
+      (super.noSuchMethod(
+            Invocation.method(
+              #launchStandalone,
+              [emulatorId, exePath],
+              {#args: args},
+            ),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
+          )
+          as _i6.Future<void>);
+
+  @override
+  _i6.Future<void> deleteRom(_i4.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#deleteRom, [game]),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 }
 
 /// A class which mocks [RommService].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockRommService extends _i1.Mock implements _i6.RommService {
+class MockRommService extends _i1.Mock implements _i8.RommService {
   MockRommService() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  _i3.RomMConfig get config =>
+  _i4.RomMConfig get config =>
       (super.noSuchMethod(
             Invocation.getter(#config),
-            returnValue: _FakeRomMConfig_1(this, Invocation.getter(#config)),
+            returnValue: _FakeRomMConfig_2(this, Invocation.getter(#config)),
           )
-          as _i3.RomMConfig);
+          as _i4.RomMConfig);
 
   @override
   String get authHeader =>
       (super.noSuchMethod(
             Invocation.getter(#authHeader),
-            returnValue: _i4.dummyValue<String>(
+            returnValue: _i5.dummyValue<String>(
               this,
               Invocation.getter(#authHeader),
             ),
@@ -461,63 +578,77 @@ class MockRommService extends _i1.Mock implements _i6.RommService {
           as String);
 
   @override
-  _i5.Future<void> refreshToken() =>
+  void updateConfig(_i4.RomMConfig? newConfig) => super.noSuchMethod(
+    Invocation.method(#updateConfig, [newConfig]),
+    returnValueForMissingStub: null,
+  );
+
+  @override
+  _i6.Future<void> refreshToken() =>
       (super.noSuchMethod(
             Invocation.method(#refreshToken, []),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<List<_i3.Platform>> getPlatforms() =>
+  _i6.Future<_i4.Game?> getGame(String? id) =>
+      (super.noSuchMethod(
+            Invocation.method(#getGame, [id]),
+            returnValue: _i6.Future<_i4.Game?>.value(),
+          )
+          as _i6.Future<_i4.Game?>);
+
+  @override
+  _i6.Future<List<_i4.Platform>> getPlatforms() =>
       (super.noSuchMethod(
             Invocation.method(#getPlatforms, []),
-            returnValue: _i5.Future<List<_i3.Platform>>.value(<_i3.Platform>[]),
+            returnValue: _i6.Future<List<_i4.Platform>>.value(<_i4.Platform>[]),
           )
-          as _i5.Future<List<_i3.Platform>>);
+          as _i6.Future<List<_i4.Platform>>);
 
   @override
-  _i5.Future<List<Map<String, dynamic>>> getCollections() =>
+  _i6.Future<List<Map<String, dynamic>>> getCollections() =>
       (super.noSuchMethod(
             Invocation.method(#getCollections, []),
-            returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
+            returnValue: _i6.Future<List<Map<String, dynamic>>>.value(
               <Map<String, dynamic>>[],
             ),
           )
-          as _i5.Future<List<Map<String, dynamic>>>);
+          as _i6.Future<List<Map<String, dynamic>>>);
 
   @override
-  String? resolveCoverUrl(_i3.Game? game) =>
+  String? resolveCoverUrl(_i4.Game? game) =>
       (super.noSuchMethod(Invocation.method(#resolveCoverUrl, [game]))
           as String?);
 
   @override
-  _i5.Future<List<_i3.Game>> getGames(String? platformId) =>
+  _i6.Future<List<_i4.Game>> getGames(String? platformId) =>
       (super.noSuchMethod(
             Invocation.method(#getGames, [platformId]),
-            returnValue: _i5.Future<List<_i3.Game>>.value(<_i3.Game>[]),
+            returnValue: _i6.Future<List<_i4.Game>>.value(<_i4.Game>[]),
           )
-          as _i5.Future<List<_i3.Game>>);
+          as _i6.Future<List<_i4.Game>>);
 
   @override
-  _i5.Future<List<_i3.Game>> getAllGames({String? platformId}) =>
+  _i6.Future<List<_i4.Game>> getAllGames({String? platformId}) =>
       (super.noSuchMethod(
             Invocation.method(#getAllGames, [], {#platformId: platformId}),
-            returnValue: _i5.Future<List<_i3.Game>>.value(<_i3.Game>[]),
+            returnValue: _i6.Future<List<_i4.Game>>.value(<_i4.Game>[]),
           )
-          as _i5.Future<List<_i3.Game>>);
+          as _i6.Future<List<_i4.Game>>);
 
   @override
-  _i5.Future<List<_i3.Game>> getRecentlyPlayed({int? limit = 15}) =>
+  _i6.Future<List<_i4.Game>> getRecentlyPlayed({int? limit = 15}) =>
       (super.noSuchMethod(
             Invocation.method(#getRecentlyPlayed, [], {#limit: limit}),
-            returnValue: _i5.Future<List<_i3.Game>>.value(<_i3.Game>[]),
+            returnValue: _i6.Future<List<_i4.Game>>.value(<_i4.Game>[]),
           )
-          as _i5.Future<List<_i3.Game>>);
+          as _i6.Future<List<_i4.Game>>);
 
   @override
-  _i5.Future<({List<_i3.Game> games, int total})> getGamesPage({
+  _i6.Future<({List<_i4.Game> games, int total})> getGamesPage({
     int? offset = 0,
     int? limit = 50,
     String? platformId,
@@ -546,34 +677,34 @@ class MockRommService extends _i1.Mock implements _i6.RommService {
               #withCharIndex: withCharIndex,
               #withFilterValues: withFilterValues,
             }),
-            returnValue: _i5.Future<({List<_i3.Game> games, int total})>.value((
-              games: <_i3.Game>[],
+            returnValue: _i6.Future<({List<_i4.Game> games, int total})>.value((
+              games: <_i4.Game>[],
               total: 0,
             )),
           )
-          as _i5.Future<({List<_i3.Game> games, int total})>);
+          as _i6.Future<({List<_i4.Game> games, int total})>);
 
   @override
-  _i5.Future<_i3.Game?> getRandomGame() =>
+  _i6.Future<_i4.Game?> getRandomGame() =>
       (super.noSuchMethod(
             Invocation.method(#getRandomGame, []),
-            returnValue: _i5.Future<_i3.Game?>.value(),
+            returnValue: _i6.Future<_i4.Game?>.value(),
           )
-          as _i5.Future<_i3.Game?>);
+          as _i6.Future<_i4.Game?>);
 
   @override
-  _i5.Future<List<_i3.SaveFile>> getSaves(String? gameId) =>
+  _i6.Future<List<_i4.SaveFile>> getSaves(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getSaves, [gameId]),
-            returnValue: _i5.Future<List<_i3.SaveFile>>.value(<_i3.SaveFile>[]),
+            returnValue: _i6.Future<List<_i4.SaveFile>>.value(<_i4.SaveFile>[]),
           )
-          as _i5.Future<List<_i3.SaveFile>>);
+          as _i6.Future<List<_i4.SaveFile>>);
 
   @override
-  String getDownloadUrl(_i3.Game? game) =>
+  String getDownloadUrl(_i4.Game? game) =>
       (super.noSuchMethod(
             Invocation.method(#getDownloadUrl, [game]),
-            returnValue: _i4.dummyValue<String>(
+            returnValue: _i5.dummyValue<String>(
               this,
               Invocation.method(#getDownloadUrl, [game]),
             ),
@@ -581,74 +712,79 @@ class MockRommService extends _i1.Mock implements _i6.RommService {
           as String);
 
   @override
-  _i5.Future<bool> uploadSave(
+  _i6.Future<bool> uploadSave(
     String? gameId,
     _i7.File? saveFile, {
     String? slot,
     _i7.File? screenshotFile,
+    String? overrideFilename,
   }) =>
       (super.noSuchMethod(
             Invocation.method(
               #uploadSave,
               [gameId, saveFile],
-              {#slot: slot, #screenshotFile: screenshotFile},
+              {
+                #slot: slot,
+                #screenshotFile: screenshotFile,
+                #overrideFilename: overrideFilename,
+              },
             ),
-            returnValue: _i5.Future<bool>.value(false),
+            returnValue: _i6.Future<bool>.value(false),
           )
-          as _i5.Future<bool>);
+          as _i6.Future<bool>);
 
   @override
-  _i5.Future<void> pruneOldSaves(String? gameId, {int? keepCount = 5}) =>
+  _i6.Future<void> pruneOldSaves(String? gameId, {int? keepCount = 5}) =>
       (super.noSuchMethod(
             Invocation.method(
               #pruneOldSaves,
               [gameId],
               {#keepCount: keepCount},
             ),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<List<Map<String, dynamic>>> getSavesList(String? gameId) =>
+  _i6.Future<List<Map<String, dynamic>>> getSavesList(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getSavesList, [gameId]),
-            returnValue: _i5.Future<List<Map<String, dynamic>>>.value(
+            returnValue: _i6.Future<List<Map<String, dynamic>>>.value(
               <Map<String, dynamic>>[],
             ),
           )
-          as _i5.Future<List<Map<String, dynamic>>>);
+          as _i6.Future<List<Map<String, dynamic>>>);
 
   @override
-  _i5.Future<Map<String, dynamic>?> getLatestSave(String? gameId) =>
+  _i6.Future<Map<String, dynamic>?> getLatestSave(String? gameId) =>
       (super.noSuchMethod(
             Invocation.method(#getLatestSave, [gameId]),
-            returnValue: _i5.Future<Map<String, dynamic>?>.value(),
+            returnValue: _i6.Future<Map<String, dynamic>?>.value(),
           )
-          as _i5.Future<Map<String, dynamic>?>);
+          as _i6.Future<Map<String, dynamic>?>);
 
   @override
-  _i5.Future<_i8.Uint8List?> downloadSave(String? saveUrl) =>
+  _i6.Future<_i9.Uint8List?> downloadSave(String? saveUrl) =>
       (super.noSuchMethod(
             Invocation.method(#downloadSave, [saveUrl]),
-            returnValue: _i5.Future<_i8.Uint8List?>.value(),
+            returnValue: _i6.Future<_i9.Uint8List?>.value(),
           )
-          as _i5.Future<_i8.Uint8List?>);
+          as _i6.Future<_i9.Uint8List?>);
 
   @override
-  _i5.Future<List<_i3.Firmware>> getFirmware({String? platformId}) =>
+  _i6.Future<List<_i4.Firmware>> getFirmware({String? platformId}) =>
       (super.noSuchMethod(
             Invocation.method(#getFirmware, [], {#platformId: platformId}),
-            returnValue: _i5.Future<List<_i3.Firmware>>.value(<_i3.Firmware>[]),
+            returnValue: _i6.Future<List<_i4.Firmware>>.value(<_i4.Firmware>[]),
           )
-          as _i5.Future<List<_i3.Firmware>>);
+          as _i6.Future<List<_i4.Firmware>>);
 
   @override
-  String getFirmwareDownloadUrl(_i3.Firmware? firmware) =>
+  String getFirmwareDownloadUrl(_i4.Firmware? firmware) =>
       (super.noSuchMethod(
             Invocation.method(#getFirmwareDownloadUrl, [firmware]),
-            returnValue: _i4.dummyValue<String>(
+            returnValue: _i5.dummyValue<String>(
               this,
               Invocation.method(#getFirmwareDownloadUrl, [firmware]),
             ),
@@ -656,8 +792,8 @@ class MockRommService extends _i1.Mock implements _i6.RommService {
           as String);
 
   @override
-  _i5.Future<_i8.Uint8List?> downloadFirmware(
-    _i3.Firmware? firmware, {
+  _i6.Future<_i9.Uint8List?> downloadFirmware(
+    _i4.Firmware? firmware, {
     void Function(int, int)? onProgress,
   }) =>
       (super.noSuchMethod(
@@ -666,12 +802,12 @@ class MockRommService extends _i1.Mock implements _i6.RommService {
               [firmware],
               {#onProgress: onProgress},
             ),
-            returnValue: _i5.Future<_i8.Uint8List?>.value(),
+            returnValue: _i6.Future<_i9.Uint8List?>.value(),
           )
-          as _i5.Future<_i8.Uint8List?>);
+          as _i6.Future<_i9.Uint8List?>);
 
   @override
-  _i5.Future<bool> updateRomProps(
+  _i6.Future<bool> updateRomProps(
     String? romId, {
     bool? backlogged,
     bool? nowPlaying,
@@ -691,46 +827,54 @@ class MockRommService extends _i1.Mock implements _i6.RommService {
                 #completion: completion,
               },
             ),
-            returnValue: _i5.Future<bool>.value(false),
+            returnValue: _i6.Future<bool>.value(false),
           )
-          as _i5.Future<bool>);
+          as _i6.Future<bool>);
 
   @override
-  _i5.Future<List<_i3.RomNote>> getRomNotes(String? romId) =>
+  _i6.Future<List<_i4.RomNote>> getRomNotes(String? romId) =>
       (super.noSuchMethod(
             Invocation.method(#getRomNotes, [romId]),
-            returnValue: _i5.Future<List<_i3.RomNote>>.value(<_i3.RomNote>[]),
+            returnValue: _i6.Future<List<_i4.RomNote>>.value(<_i4.RomNote>[]),
           )
-          as _i5.Future<List<_i3.RomNote>>);
+          as _i6.Future<List<_i4.RomNote>>);
 
   @override
-  _i5.Future<bool> createRomNote(
+  _i6.Future<bool> createRomNote(
     String? romId,
     String? title,
     String? content,
   ) =>
       (super.noSuchMethod(
             Invocation.method(#createRomNote, [romId, title, content]),
-            returnValue: _i5.Future<bool>.value(false),
+            returnValue: _i6.Future<bool>.value(false),
+          )
+          as _i6.Future<bool>);
+
+  @override
+  _i6.Future<bool> deleteRomNote(String? romId, int? noteId) =>
+      (super.noSuchMethod(
+            Invocation.method(#deleteRomNote, [romId, noteId]),
+            returnValue: _i6.Future<bool>.value(false),
           )
-          as _i5.Future<bool>);
+          as _i6.Future<bool>);
 }
 
 /// A class which mocks [StrategyRegistry].
 ///
 /// See the documentation for Mockito's code generation for more information.
-class MockStrategyRegistry extends _i1.Mock implements _i9.StrategyRegistry {
+class MockStrategyRegistry extends _i1.Mock implements _i10.StrategyRegistry {
   MockStrategyRegistry() {
     _i1.throwOnMissingStub(this);
   }
 
   @override
-  Map<String, List<_i10.EmulatorStrategy>> detectConflicts() =>
+  Map<String, List<_i11.EmulatorStrategy>> detectConflicts() =>
       (super.noSuchMethod(
             Invocation.method(#detectConflicts, []),
-            returnValue: <String, List<_i10.EmulatorStrategy>>{},
+            returnValue: <String, List<_i11.EmulatorStrategy>>{},
           )
-          as Map<String, List<_i10.EmulatorStrategy>>);
+          as Map<String, List<_i11.EmulatorStrategy>>);
 
   @override
   String? getPreferredEmulatorId(String? slug) =>
@@ -738,43 +882,49 @@ class MockStrategyRegistry extends _i1.Mock implements _i9.StrategyRegistry {
           as String?);
 
   @override
-  _i5.Future<void> loadPreferences() =>
+  _i6.Future<void> loadPreferences() =>
       (super.noSuchMethod(
             Invocation.method(#loadPreferences, []),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<void> setPreference(String? canonicalSlug, String? emulatorId) =>
+  _i6.Future<void> setPreference(String? canonicalSlug, String? emulatorId) =>
       (super.noSuchMethod(
             Invocation.method(#setPreference, [canonicalSlug, emulatorId]),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i5.Future<void> clearPreferences() =>
+  _i6.Future<void> clearPreferences() =>
       (super.noSuchMethod(
             Invocation.method(#clearPreferences, []),
-            returnValue: _i5.Future<void>.value(),
-            returnValueForMissingStub: _i5.Future<void>.value(),
+            returnValue: _i6.Future<void>.value(),
+            returnValueForMissingStub: _i6.Future<void>.value(),
           )
-          as _i5.Future<void>);
+          as _i6.Future<void>);
 
   @override
-  _i10.EmulatorStrategy? getStrategyForSlug(String? platformSlug) =>
+  _i11.EmulatorStrategy? getStrategyForSlug(String? platformSlug) =>
       (super.noSuchMethod(
             Invocation.method(#getStrategyForSlug, [platformSlug]),
           )
-          as _i10.EmulatorStrategy?);
+          as _i11.EmulatorStrategy?);
 
   @override
-  _i10.EmulatorStrategy? getStrategyById(String? id) =>
+  _i11.EmulatorStrategy? getStrategyById(String? id) =>
       (super.noSuchMethod(Invocation.method(#getStrategyById, [id]))
-          as _i10.EmulatorStrategy?);
+          as _i11.EmulatorStrategy?);
+
+  @override
+  void setNdsCore(String? core) => super.noSuchMethod(
+    Invocation.method(#setNdsCore, [core]),
+    returnValueForMissingStub: null,
+  );
 
   @override
   Map<String, dynamic>? getDefinition(String? emulatorId) =>

Clone this wiki locally