Files
emergency/lib/services/country_code_sources/manual_country_code_source.dart
T
rootandClaude Sonnet 5 e3aa088bc2 Notrufnummern-Datenbasis, Ländererkennung, State-Management und Lokalisierung (AP1-AP7)
Implementiert den kompletten Kern-Flow der Emergency App gemäß docs/plan.md:
- Notrufnummern-Datenbasis für 199 Länder + Modelle/Repository (AP1)
- DialerService für tel:-Notrufe ohne Auto-Dial (AP2)
- Statisches UI mit Panik-Button-Fallback (AP3)
- Priorisierte Ländererkennung: SIM/Netz -> GPS/Geocoding -> Cache (AP4)
- EmergencyProvider verdrahtet Repository/LocationService mit der UI (AP5)
- Manuelle Länderauswahl als Fallback samt eigener Priorität (AP6)
- UI-Lokalisierung (de/en/fr/es), an erkanntes Land gekoppelt (AP7)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-24 11:29:38 +02:00

47 lines
1.6 KiB
Dart

import 'package:shared_preferences/shared_preferences.dart';
import 'country_code_source.dart';
/// Liest/schreibt den vom Nutzer manuell gewählten ISO-Ländercode aus
/// `shared_preferences` (`docs/plan.md`, Abschnitt 8, AP6).
///
/// Bewusst getrennt von [CachedCountryCodeSource] (eigener Key, eigene
/// Klasse): Die manuelle Auswahl ist ein Nutzer-Override und darf vom
/// automatisch zuletzt ermittelten Code (SIM/GPS-Treffer) nicht überschrieben
/// oder mit ihm verwechselt werden. `LocationService` fragt diese Quelle
/// deshalb mit höchster Priorität vor SIM/GPS/Cache ab.
class ManualCountryCodeSource implements ManualCountryCodeStore {
const ManualCountryCodeSource();
static const _key = 'manual_country_code';
@override
Future<String?> resolve() async {
try {
final prefs = await SharedPreferences.getInstance();
final code = prefs.getString(_key)?.trim();
if (code == null || code.isEmpty) return null;
return code.toUpperCase();
} catch (_) {
return null;
}
}
/// Setzt die manuelle Länderauswahl. `isoCode == null` löscht eine zuvor
/// gesetzte Auswahl wieder, damit der Nutzer zur automatischen Ermittlung
/// zurückkehren kann. Best effort: Schreibfehler werden verschluckt.
@override
Future<void> save(String? isoCode) async {
try {
final prefs = await SharedPreferences.getInstance();
if (isoCode == null) {
await prefs.remove(_key);
} else {
await prefs.setString(_key, isoCode.toUpperCase());
}
} catch (_) {
// Best effort, siehe Doc-Kommentar oben.
}
}
}