settings_service.dart 2.5 KB

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