settings_service.dart 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import 'dart:io';
  2. import 'package:shared_preferences/shared_preferences.dart';
  3. import 'package:asr_client/common/constants.dart';
  4. abstract interface class SettingsService {
  5. Future<String> getHost();
  6. Future<int> getPort();
  7. Future<void> setHost(String host);
  8. Future<void> setPort(int port);
  9. String getWebSocketUrl(String host, int port);
  10. Future<String> getLiveKitUrl();
  11. Future<void> setLiveKitUrl(String url);
  12. }
  13. final class SharedPreferencesSettingsService implements SettingsService {
  14. SharedPreferencesSettingsService({SharedPreferences? prefs}) : _prefs = prefs;
  15. SharedPreferences? _prefs;
  16. Future<SharedPreferences> get _preferences async {
  17. if (_prefs != null) return _prefs!;
  18. _prefs = await SharedPreferences.getInstance();
  19. return _prefs!;
  20. }
  21. @override
  22. Future<String> getHost() async {
  23. final prefs = await _preferences;
  24. final raw = prefs.getString(_hostKey);
  25. if (raw == null || raw.trim().isEmpty) return AppConstants.defaultHost;
  26. // `localhost` does not resolve reliably on Android and triggers
  27. // "no address associated with hostname". Map it to the emulator's
  28. // host-loopback alias so a previously saved `localhost` still works.
  29. if (raw.trim().toLowerCase() == 'localhost' && Platform.isAndroid) {
  30. return '10.0.2.2';
  31. }
  32. return raw.trim();
  33. }
  34. @override
  35. Future<int> getPort() async {
  36. final prefs = await _preferences;
  37. return prefs.getInt(_portKey) ?? AppConstants.defaultPort;
  38. }
  39. @override
  40. Future<void> setHost(String host) async {
  41. final prefs = await _preferences;
  42. await prefs.setString(_hostKey, host.trim());
  43. }
  44. @override
  45. Future<void> setPort(int port) async {
  46. final prefs = await _preferences;
  47. await prefs.setInt(_portKey, port);
  48. }
  49. @override
  50. String getWebSocketUrl(String host, int port) => 'ws://$host:$port';
  51. @override
  52. Future<String> getLiveKitUrl() async {
  53. final prefs = await _preferences;
  54. return prefs.getString(_lkUrlKey) ?? AppConstants.defaultLiveKitUrl;
  55. }
  56. @override
  57. Future<void> setLiveKitUrl(String url) async {
  58. final prefs = await _preferences;
  59. await prefs.setString(_lkUrlKey, url.trim());
  60. }
  61. static const _hostKey = 'asr_host';
  62. static const _portKey = 'asr_port';
  63. static const _lkUrlKey = 'asr_livekit_url';
  64. }