feat(flutter): persist voice settings and per-user volume (TODO-039,040)
Add SharedPreferences persistence for transmit mode, release tail, input/output device. Per-user volume/mute persisted across sessions.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../l10n/generated/app_localizations.dart';
|
||||
import '../services/channel_spacer.dart';
|
||||
@@ -571,11 +572,40 @@ class _ClientVolumePreference {
|
||||
}
|
||||
|
||||
class _ClientVolumePreferences extends ChangeNotifier {
|
||||
_ClientVolumePreferences._();
|
||||
_ClientVolumePreferences._() {
|
||||
_load();
|
||||
}
|
||||
|
||||
static final instance = _ClientVolumePreferences._();
|
||||
|
||||
static const _prefsKey = 'client_volume_prefs';
|
||||
|
||||
final Map<BigInt, _ClientVolumePreference> _byClientId = {};
|
||||
bool _loaded = false;
|
||||
|
||||
Future<void> _load() async {
|
||||
if (_loaded) return;
|
||||
_loaded = true;
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
final raw = prefs.getStringList(_prefsKey) ?? const [];
|
||||
for (final entry in raw) {
|
||||
final parts = entry.split(':');
|
||||
if (parts.length == 3) {
|
||||
final id = BigInt.tryParse(parts[0]);
|
||||
final volume = double.tryParse(parts[1]);
|
||||
final muted = parts[2] == '1';
|
||||
if (id != null && volume != null) {
|
||||
_byClientId[id] = _ClientVolumePreference(
|
||||
volume: volume,
|
||||
muted: muted,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
notifyListeners();
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
_ClientVolumePreference preferenceFor(BigInt clientId) {
|
||||
return _byClientId[clientId] ?? const _ClientVolumePreference();
|
||||
@@ -588,6 +618,17 @@ class _ClientVolumePreferences extends ChangeNotifier {
|
||||
_byClientId.remove(clientId);
|
||||
}
|
||||
notifyListeners();
|
||||
_save();
|
||||
}
|
||||
|
||||
Future<void> _save() async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
final raw = _byClientId.entries
|
||||
.map((e) => '${e.key}:${e.value.volume}:${e.value.muted ? 1 : 0}')
|
||||
.toList();
|
||||
await prefs.setStringList(_prefsKey, raw);
|
||||
} catch (_) {}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user