From a41bb061ecd7404d2d9818fcb3bc2687f93ccdd1 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Thu, 8 May 2025 21:51:43 -0700 Subject: [PATCH] Accuracy selector --- lib/l10n/app_en.arb | 3 +++ lib/preferences.dart | 2 +- lib/settings_screen.dart | 37 +++++++++++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index dbeff41..8f2c7a7 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -9,6 +9,9 @@ "idLabel": "Device identifier", "urlLabel": "Server URL", "accuracyLabel": "Location accuracy", + "highAccuracyLabel": "High", + "mediumAccuracyLabel": "Medium", + "lowAccuracyLabel": "Low", "intervalLabel": "Frequency", "distanceLabel": "Distance", "bufferLabel": "Offline buffering", diff --git a/lib/preferences.dart b/lib/preferences.dart index 0e58f93..d1ad931 100644 --- a/lib/preferences.dart +++ b/lib/preferences.dart @@ -24,7 +24,7 @@ class Preferences { await preferences.setInt(interval, preferences.getInt(interval) ?? 300); final distanceValue = preferences.getInt(distance); if (distanceValue == null || distanceValue <= 0) { - await preferences.setInt(distance, 50); + await preferences.setInt(distance, 75); } await preferences.setBool(buffer, preferences.getBool(buffer) ?? true); } diff --git a/lib/settings_screen.dart b/lib/settings_screen.dart index 23cd6b0..5e36a2e 100644 --- a/lib/settings_screen.dart +++ b/lib/settings_screen.dart @@ -32,6 +32,14 @@ class _SettingsScreenState extends State { }); } + String _getAccuracyLabel(String? key) { + return switch (key) { + 'high' => AppLocalizations.of(context)!.highAccuracyLabel, + 'low' => AppLocalizations.of(context)!.lowAccuracyLabel, + _ => AppLocalizations.of(context)!.mediumAccuracyLabel, + }; + } + Future _editSetting(String title, String key, bool isInt) async { final initialValue = isInt ? preferences.getInt(key)?.toString() ?? '0' @@ -84,6 +92,31 @@ class _SettingsScreenState extends State { ); } + Widget _buildAccuracyListTile() { + final accuracyOptions = ['high', 'medium', 'low']; + return ListTile( + title: Text(AppLocalizations.of(context)!.accuracyLabel), + subtitle: Text(_getAccuracyLabel(preferences.getString(Preferences.accuracy))), + onTap: () async { + final selectedAccuracy = await showDialog( + context: context, + builder: (context) => SimpleDialog( + title: Text(AppLocalizations.of(context)!.accuracyLabel), + children: accuracyOptions.map((option) => SimpleDialogOption( + child: Text(_getAccuracyLabel(option)), + onPressed: () => Navigator.pop(context, option), + )).toList(), + ), + ); + if (selectedAccuracy != null) { + await preferences.setString(Preferences.accuracy, selectedAccuracy); + await bg.BackgroundGeolocation.setConfig(Preferences.geolocationConfig(preferences)); + setState(() {}); + } + }, + ); + } + @override Widget build(BuildContext context) { if (loading) { @@ -96,9 +129,9 @@ class _SettingsScreenState extends State { children: [ _buildListTile(AppLocalizations.of(context)!.idLabel, Preferences.id, false), _buildListTile(AppLocalizations.of(context)!.urlLabel, Preferences.url, false), - _buildListTile(AppLocalizations.of(context)!.accuracyLabel, Preferences.accuracy, false), - _buildListTile(AppLocalizations.of(context)!.intervalLabel, Preferences.interval, true), + _buildAccuracyListTile(), _buildListTile(AppLocalizations.of(context)!.distanceLabel, Preferences.distance, true), + _buildListTile(AppLocalizations.of(context)!.intervalLabel, Preferences.interval, true), SwitchListTile( title: Text(AppLocalizations.of(context)!.bufferLabel), value: buffering,