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>
47 lines
1.6 KiB
Dart
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.
|
|
}
|
|
}
|
|
}
|