merge: integrate boxing module from remote with sound/vibration feedback

Merge remote boxing module (one2one, one2many, many2one modes) with
local sound and vibration feedback feature. Migrate SharedPreferences
to AppConfigService across all services including SoundService.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Misaka
2026-05-11 20:18:47 +08:00
14 changed files with 2246 additions and 160 deletions

View File

@@ -1,37 +1,36 @@
import 'package:audioplayers/audioplayers.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:pad_scanner/services/app_config_service.dart';
class SoundService {
static const _keySuccess = 'sound_success';
static const _keyFailure = 'sound_failure';
final _player = AudioPlayer();
final _configService = AppConfigService();
Future<String?> getSuccessPath() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString(_keySuccess);
return _configService.getString(_keySuccess);
}
Future<String?> getFailurePath() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString(_keyFailure);
return _configService.getString(_keyFailure);
}
Future<void> setSuccessPath(String? path) async {
final prefs = await SharedPreferences.getInstance();
if (path != null) {
await prefs.setString(_keySuccess, path);
await _configService.setString(_keySuccess, path);
} else {
await prefs.remove(_keySuccess);
final config = await _configService.loadConfig();
config.remove(_keySuccess);
}
}
Future<void> setFailurePath(String? path) async {
final prefs = await SharedPreferences.getInstance();
if (path != null) {
await prefs.setString(_keyFailure, path);
await _configService.setString(_keyFailure, path);
} else {
await prefs.remove(_keyFailure);
final config = await _configService.loadConfig();
config.remove(_keyFailure);
}
}