Skip to content
Snippets Groups Projects
Commit b7462e47 authored by Marvin Weiler's avatar Marvin Weiler
Browse files

Added option to specify in which interval a measurement must be. Refactored...

Added option to specify in which interval a measurement must be. Refactored the settings to a own class.
parent d9bd3196
No related branches found
No related tags found
1 merge request!7Draft: Resolve "User should be able to specify a min and max value which raw sensor distances should be recorded"
Pipeline #277044 passed
...@@ -2,6 +2,7 @@ import 'dart:async'; ...@@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:app/foreground_task/bluetooth.dart'; import 'package:app/foreground_task/bluetooth.dart';
import 'package:app/foreground_task/circular_buffer.dart'; import 'package:app/foreground_task/circular_buffer.dart';
import 'package:app/manager/settings_manager.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:flutter_foreground_task/flutter_foreground_task.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
...@@ -29,7 +30,7 @@ void startBackgroundTask() { ...@@ -29,7 +30,7 @@ void startBackgroundTask() {
class ForegroundTaskHandler extends TaskHandler { class ForegroundTaskHandler extends TaskHandler {
late Isar _isar; late Isar _isar;
late Bluetooth _bluetooth; late Bluetooth _bluetooth;
late SharedPreferencesAsync _prefs; final SettingsManager _settingsManager = SettingsManager();
late Uuid _uuid; late Uuid _uuid;
final LocationSettings locationSettings = LocationSettings( final LocationSettings locationSettings = LocationSettings(
accuracy: LocationAccuracy.best, accuracy: LocationAccuracy.best,
...@@ -108,9 +109,6 @@ class ForegroundTaskHandler extends TaskHandler { ...@@ -108,9 +109,6 @@ class ForegroundTaskHandler extends TaskHandler {
// add callback for the disconnect event // add callback for the disconnect event
_bluetooth.subscribeToDisconnectEvent(_onBleDeviceDisconnected); _bluetooth.subscribeToDisconnectEvent(_onBleDeviceDisconnected);
//Initialize access to the sharedPreferenzes
_prefs = SharedPreferencesAsync();
// Initialize the location // Initialize the location
_positionStream = _positionStream =
Geolocator.getPositionStream(locationSettings: locationSettings) Geolocator.getPositionStream(locationSettings: locationSettings)
...@@ -128,11 +126,8 @@ class ForegroundTaskHandler extends TaskHandler { ...@@ -128,11 +126,8 @@ class ForegroundTaskHandler extends TaskHandler {
); );
// Initialize Sentry to report errors from isolate // Initialize Sentry to report errors from isolate
final sentryEnabled = await _prefs.getBool('sentryEnabled') ?? false; final sentryEnabled = await _settingsManager.readSentryEnabled();
//final sentryEnabled = true; final sentryDSN = await _settingsManager.readSentryDSN();
final sentryDSN = await _prefs.getString('sentryDSN') ??
'https://d36af7603bf2434889b0bc7ffcaeeda7@glitchtip.weiler.rocks/1';
if (sentryEnabled && sentryDSN.isNotEmpty) { if (sentryEnabled && sentryDSN.isNotEmpty) {
await SentryFlutter.init((options) { await SentryFlutter.init((options) {
...@@ -375,22 +370,29 @@ class ForegroundTaskHandler extends TaskHandler { ...@@ -375,22 +370,29 @@ class ForegroundTaskHandler extends TaskHandler {
} }
// Substract the handlebar length from the sensor readings // Substract the handlebar length from the sensor readings
final handlebarDistance = await _prefs.getInt("handlebarDistance") ?? 0; final handlebarDistance = await _settingsManager.readHandlebarOffset();
final invertSensors = await _prefs.getBool("invertSensors") ?? false; final invertSensors = await _settingsManager.readInvertSensors();
final minMeassurement = await _settingsManager.readMinMeasurement();
final maxMeassurement = await _settingsManager.readMaxMeasurement();
// find the index in the list of the confirmed event // find the index in the list of the confirmed event
final confirmedIdx = sampleData.indexWhere((element) => element.confirmed); final confirmedIdx = sampleData.indexWhere((element) => element.confirmed);
// Extract the sensor data, invert the sensors if set in settings // Extract the sensor data, invert the sensors if set in settings
// if the value is smaller then the handlebar distance set it to 65000 // if the value is smaller then the handlebar distance set it to 65000
// also check if the value is inside of the min and max meassurement range
// 65535 is the max value a obs reports and will be ignored by the portal // 65535 is the max value a obs reports and will be ignored by the portal
final s1Data = sampleData final s1Data = sampleData
.map((e) => invertSensors ? e.sensor2 : e.sensor1) .map((e) => invertSensors ? e.sensor2 : e.sensor1)
.map((val) => (val - handlebarDistance) > 0.0 ? val : 65535.0) .map((val) => (val - handlebarDistance) > 0.0 ? val : 65535.0)
.map((val) =>
val < minMeassurement || val > maxMeassurement ? 65535.0 : val)
.toList(); .toList();
final s2Data = sampleData final s2Data = sampleData
.map((e) => invertSensors ? e.sensor1 : e.sensor2) .map((e) => invertSensors ? e.sensor1 : e.sensor2)
.map((val) => (val - handlebarDistance) > 0.0 ? val : 65535.0) .map((val) => (val - handlebarDistance) > 0.0 ? val : 65535.0)
.map((val) =>
val < minMeassurement || val > maxMeassurement ? 65535.0 : val)
.toList(); .toList();
final TripSegment event = TripSegment() final TripSegment event = TripSegment()
......
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
"settingsPageTitle": "OBS APP Einstellungen", "settingsPageTitle": "OBS APP Einstellungen",
"settingsPageHandlebarDistanceDescription": "Miss den horizontalen Abstand deines linken und rechten Lenker-Endes bis zur Radmitte. Hat dein Lenker zum Beispiel eine gesamtbreite von 60 cm, dann gibts du hier 30cm ein.", "settingsPageHandlebarDistanceDescription": "Miss den horizontalen Abstand deines linken und rechten Lenker-Endes bis zur Radmitte. Hat dein Lenker zum Beispiel eine gesamtbreite von 60 cm, dann gibts du hier 30cm ein.",
"settingsPageHandlebarDistanceLabel": "Lenkerabstand in cm", "settingsPageHandlebarDistanceLabel": "Lenkerabstand in cm",
"settingsPageDistanceFilterDescription": "Einige OpenBikeSensors melden ungültige Entfernungsdaten. Oft liegen diese Werte in der Nähe der Min/Max-Werte. Hier kannst du den Bereich angeben, in dem du die Werte aufzeichnen möchten. Entfernungen, die nicht zwischen diesen beiden Werten liegen, werden nicht aufgezeichnet",
"settingsPageMinMeasurementLabel": "Min Messung in cm",
"settingsPageMaxMeasurementLabel": "Max Messung in cm",
"settingsPageInvertSensorsDescription": ",Wenn die Abstandswerte links und rechts vertauscht angezeigt werden, kannst du hier die Sensoren vertauschen. Dies ist z.B. notwendig, wenn der OBS kopfüber montiert wird.", "settingsPageInvertSensorsDescription": ",Wenn die Abstandswerte links und rechts vertauscht angezeigt werden, kannst du hier die Sensoren vertauschen. Dies ist z.B. notwendig, wenn der OBS kopfüber montiert wird.",
"settingsPageInvertSensorsLabel": "Vertausche den linken und rechten sensor", "settingsPageInvertSensorsLabel": "Vertausche den linken und rechten sensor",
"settingsPageHandlebarDistanceError": "Bitte gib eine Zahl zwischen 0 und 200 ein", "settingsPageHandlebarDistanceError": "Bitte gib eine Zahl zwischen 0 und 200 ein",
......
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
"settingsPageTitle": "OBS APP Settings", "settingsPageTitle": "OBS APP Settings",
"settingsPageHandlebarDistanceDescription": "Measure the horizontal distance from your left and right handlebar ends to the centre of the wheel. For example, if your handlebars are at all 60 cm wide, enter 30 cm here.", "settingsPageHandlebarDistanceDescription": "Measure the horizontal distance from your left and right handlebar ends to the centre of the wheel. For example, if your handlebars are at all 60 cm wide, enter 30 cm here.",
"settingsPageHandlebarDistanceLabel": "Handlebar distance in cm", "settingsPageHandlebarDistanceLabel": "Handlebar distance in cm",
"settingsPageDistanceFilterDescription": "Some OpenBikeSensors report invalid distance data. Often these values are close to the min/max values. You can specify the range in which you want to record the values. Distances not between these two values will not be recorded.",
"settingsPageMinMeasurementLabel": "Min Measurement in cm",
"settingsPageMaxMeasurementLabel": "Max Measurement in cm",
"settingsPageInvertSensorsDescription": "If the distance values are displayed reversed on the left and right, you can swap the sensors here. This is necessary, for example, if the OBS is mounted upside down.", "settingsPageInvertSensorsDescription": "If the distance values are displayed reversed on the left and right, you can swap the sensors here. This is necessary, for example, if the OBS is mounted upside down.",
"settingsPageInvertSensorsLabel": "Swap left and right sensor", "settingsPageInvertSensorsLabel": "Swap left and right sensor",
"settingsPageHandlebarDistanceError": "Please enter a number between 0 and 200", "settingsPageHandlebarDistanceError": "Please enter a number between 0 and 200",
......
...@@ -3,6 +3,7 @@ import 'dart:io'; ...@@ -3,6 +3,7 @@ import 'dart:io';
import 'package:app/generated/i18n/app_localizations.dart'; import 'package:app/generated/i18n/app_localizations.dart';
import 'package:app/manager/background_manger.dart'; import 'package:app/manager/background_manger.dart';
import 'package:app/manager/settings_manager.dart';
import 'package:app/providers/battery_provider.dart'; import 'package:app/providers/battery_provider.dart';
import 'package:app/providers/bluetooth_provider.dart'; import 'package:app/providers/bluetooth_provider.dart';
import 'package:app/providers/button_provider.dart'; import 'package:app/providers/button_provider.dart';
...@@ -36,16 +37,11 @@ Future<void> main() async { ...@@ -36,16 +37,11 @@ Future<void> main() async {
], ],
child: const MyApp(), child: const MyApp(),
); );
final settingsManager = SettingsManager();
// Initialize the shared preferences
SharedPreferencesAsync prefs = SharedPreferencesAsync();
// Initialize Sentry to report errors from isolate // Initialize Sentry to report errors from isolate
final sentryEnabled = await prefs.getBool('sentryEnabled') ?? false; final sentryEnabled = await settingsManager.readSentryEnabled();
//final sentryEnabled = true; final sentryDSN = await settingsManager.readSentryDSN();
final sentryDSN = await prefs.getString('sentryDSN') ??
'https://d36af7603bf2434889b0bc7ffcaeeda7@glitchtip.weiler.rocks/1';
if (sentryEnabled && sentryDSN.isNotEmpty) { if (sentryEnabled && sentryDSN.isNotEmpty) {
await SentryFlutter.init((options) { await SentryFlutter.init((options) {
options.dsn = sentryDSN; options.dsn = sentryDSN;
......
import 'dart:core';
import 'package:shared_preferences/shared_preferences.dart';
class SettingsManager {
SharedPreferencesAsync prefs = SharedPreferencesAsync();
Future<void> _saveStringValue(String key, String value) async {
await prefs.setString(key, value);
}
Future<void> _saveIntValue(String key, int value) async {
await prefs.setInt(key, value);
}
Future<void> _saveBoolValue(String key, bool value) async {
await prefs.setBool(key, value);
}
Future<int> readHandlebarOffset() async =>
await prefs.getInt('handlebarOffset') ?? 0;
Future<void> writeHandlebarOffset(int value) async {
await _saveIntValue('handlebarOffset', value);
}
Future<String> readPortalServer() async =>
await prefs.getString('portalServer') ?? "";
Future<void> writePortalServer(String value) async {
await _saveStringValue('portalServer', value);
}
Future<String> readPortalKey() async =>
await prefs.getString('portalKey') ?? "";
Future<void> writePortalKey(String value) async {
await _saveStringValue('portalKey', value);
}
Future<String> readSentryDSN() async =>
await prefs.getString('sentryDSN') ?? "";
Future<void> writeSentryDSN(String value) async {
await _saveStringValue('sentryDSN', value);
}
Future<bool> readSentryEnabled() async =>
await prefs.getBool('sentryEnabled') ?? false;
Future<void> writeSentryEnabled(bool value) async {
await _saveBoolValue('sentryEnabled', value);
}
Future<bool> readInvertSensors() async =>
await prefs.getBool('invertSensors') ?? false;
Future<void> writeInvertSensors(bool value) async {
await _saveBoolValue('invertSensors', value);
}
Future<int> readMinMeasurement() async =>
await prefs.getInt('minMeasurement') ?? 0;
Future<void> writeMinMeasurement(int value) async {
await _saveIntValue('minMeasurement', value);
}
Future<int> readMaxMeasurement() async =>
await prefs.getInt('maxMeasurement') ?? 1000;
Future<void> writeMaxMeasurement(int value) async {
await _saveIntValue('maxMeasurement', value);
}
}
import 'package:app/database/trip.dart'; import 'package:app/database/trip.dart';
import 'package:app/manager/database_manger.dart'; import 'package:app/manager/database_manger.dart';
import 'package:app/manager/settings_manager.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:http_parser/http_parser.dart'; import 'package:http_parser/http_parser.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
...@@ -7,6 +8,8 @@ import 'package:sentry_flutter/sentry_flutter.dart'; ...@@ -7,6 +8,8 @@ import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
class UploadManager { class UploadManager {
final MICRO_SEC_TO_CM_DIVIDER = 58.0;
Future<(int, int)> upload() async { Future<(int, int)> upload() async {
final database = await IsarService().isar; final database = await IsarService().isar;
...@@ -78,8 +81,8 @@ class UploadManager { ...@@ -78,8 +81,8 @@ class UploadManager {
return (minLeft, minRight); return (minLeft, minRight);
} }
String _genMetadataHeader( String _genMetadataHeader(Trip trip, int maxMeasurements,
Trip trip, int maxMeasurements, int handlebarDistance) { int handlebarDistance, int maxFlightTimeinMicroSec) {
// https://github.com/openbikesensor/OpenBikeSensorFirmware/blob/main/docs/software/firmware/csv_format.md#metadata // https://github.com/openbikesensor/OpenBikeSensorFirmware/blob/main/docs/software/firmware/csv_format.md#metadata
final fields = [ final fields = [
"OBSFirmwareVersion=${trip.obsFirmwareRevision}", "OBSFirmwareVersion=${trip.obsFirmwareRevision}",
...@@ -90,7 +93,7 @@ class UploadManager { ...@@ -90,7 +93,7 @@ class UploadManager {
"OffsetRight=${handlebarDistance / 2}", "OffsetRight=${handlebarDistance / 2}",
"NumberOfDefinedPrivacyAreas=0", // can be 0 as we do not record in privacy areas "NumberOfDefinedPrivacyAreas=0", // can be 0 as we do not record in privacy areas
"PrivacyLevelApplied=AbsolutePrivacy", "PrivacyLevelApplied=AbsolutePrivacy",
"MaximumValidFlightTimeMicroseconds=18560", "MaximumValidFlightTimeMicroseconds=$maxFlightTimeinMicroSec",
"DistanceSensorsUsed=HC-SR04/JSN-SR04T", // TODO read from db "DistanceSensorsUsed=HC-SR04/JSN-SR04T", // TODO read from db
"DeviceId=obs-app" "DeviceId=obs-app"
]; ];
...@@ -141,8 +144,6 @@ class UploadManager { ...@@ -141,8 +144,6 @@ class UploadManager {
final double minLeftDistance = minDistances.$1 - event.offsetLeft; final double minLeftDistance = minDistances.$1 - event.offsetLeft;
final double minRightDistance = minDistances.$2 - event.offsetRight; final double minRightDistance = minDistances.$2 - event.offsetRight;
final MICRO_SEC_TO_CM_DIVIDER = 58.0;
final List<String> fields = [ final List<String> fields = [
"${event.timestamp.day}.${event.timestamp.month}.${event.timestamp.year}", "${event.timestamp.day}.${event.timestamp.month}.${event.timestamp.year}",
"${event.timestamp.hour}:${event.timestamp.minute}:${event.timestamp.second}", "${event.timestamp.hour}:${event.timestamp.minute}:${event.timestamp.second}",
...@@ -192,10 +193,11 @@ class UploadManager { ...@@ -192,10 +193,11 @@ class UploadManager {
return fields.join(";"); return fields.join(";");
} }
String _genCSVFile(Trip trip, int handlebarDistance) { String _genCSVFile(
Trip trip, int handlebarDistance, int maxFlightTimeinMicroSec) {
final maxMeasurements = _maxDistanceForTrip(trip); final maxMeasurements = _maxDistanceForTrip(trip);
final metadata = final metadata = _genMetadataHeader(
_genMetadataHeader(trip, maxMeasurements, handlebarDistance); trip, maxMeasurements, handlebarDistance, maxFlightTimeinMicroSec);
final header = _genCSVHeader(trip, maxMeasurements); final header = _genCSVHeader(trip, maxMeasurements);
final List<String> rows = []; final List<String> rows = [];
...@@ -207,23 +209,25 @@ class UploadManager { ...@@ -207,23 +209,25 @@ class UploadManager {
} }
Future<bool> uploadTrip(Trip trip) async { Future<bool> uploadTrip(Trip trip) async {
final SharedPreferencesAsync prefs = SharedPreferencesAsync(); final SettingsManager settingsManager = SettingsManager();
int handlebarDistance = await prefs.getInt('handlebarDistance') ?? 0; int handlebarDistance = await settingsManager.readHandlebarOffset();
int maxMeasurements = await settingsManager.readMaxMeasurement();
String portalServer = await prefs.getString('portalServer') ?? ""; String portalServer = await settingsManager.readPortalServer();
if (portalServer.isEmpty) { if (portalServer.isEmpty) {
throw Exception("No portal server set"); throw Exception("No portal server set");
} }
if (!portalServer.startsWith("https://")) { if (!portalServer.startsWith("https://")) {
portalServer = "https://$portalServer"; portalServer = "https://$portalServer";
} }
final portalKey = await prefs.getString('portalKey') ?? ""; final portalKey = await settingsManager.readPortalKey();
if (portalKey.isEmpty) { if (portalKey.isEmpty) {
throw Exception("No portal key set"); throw Exception("No portal key set");
} }
String csvContent = _genCSVFile(trip, handlebarDistance); String csvContent = _genCSVFile(trip, handlebarDistance,
maxMeasurements * MICRO_SEC_TO_CM_DIVIDER.toInt());
String filename = "${trip.trackID}_${trip.createdAt.toString()}.csv"; String filename = "${trip.trackID}_${trip.createdAt.toString()}.csv";
......
import 'dart:io'; import 'dart:io';
import 'package:app/manager/settings_manager.dart';
import 'package:app/manager/upload_manger.dart'; import 'package:app/manager/upload_manger.dart';
import 'package:app/providers/trip_provider.dart'; import 'package:app/providers/trip_provider.dart';
import 'package:app/providers/upload_provider.dart'; import 'package:app/providers/upload_provider.dart';
...@@ -44,13 +45,11 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> { ...@@ -44,13 +45,11 @@ class _ObsListUploadPageState extends State<ObsListUploadPage> {
onPressed: uploadStateProvider.uploading onPressed: uploadStateProvider.uploading
? null ? null
: () async { : () async {
final SharedPreferencesAsync prefs = final settingsManager = SettingsManager();
SharedPreferencesAsync();
if (((await prefs.getString('portalServer'))?.isEmpty ?? if (((await settingsManager.readPortalServer())
true) || .isEmpty) ||
((await prefs.getString('portalKey'))?.isEmpty ?? (await settingsManager.readPortalKey()).isEmpty) {
true)) {
toastification.show( toastification.show(
context: context, context: context,
type: ToastificationType.error, type: ToastificationType.error,
......
import 'package:app/database/privacy_zone.dart'; import 'package:app/database/privacy_zone.dart';
import 'package:app/manager/settings_manager.dart';
import 'package:app/widgets/map_page.dart'; import 'package:app/widgets/map_page.dart';
import 'package:app/providers/privacy_zone_provider.dart'; import 'package:app/providers/privacy_zone_provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
...@@ -25,9 +27,14 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> { ...@@ -25,9 +27,14 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
final TextEditingController _portalServerController = TextEditingController(); final TextEditingController _portalServerController = TextEditingController();
final TextEditingController _portalKeyController = TextEditingController(); final TextEditingController _portalKeyController = TextEditingController();
final TextEditingController _sentryDSNController = TextEditingController(); final TextEditingController _sentryDSNController = TextEditingController();
final TextEditingController _minMeasurementController =
TextEditingController();
final TextEditingController _maxMeasurementController =
TextEditingController();
bool _sentryEnabled = false; bool _sentryEnabled = false;
bool _invertSensors = false; bool _invertSensors = false;
String? _lenkerabstandError; // Variable to hold error message String? _lenkerabstandError; // Variable to hold error message
final SettingsManager _settingsManager = SettingsManager();
@override @override
void initState() { void initState() {
...@@ -45,8 +52,7 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> { ...@@ -45,8 +52,7 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
} else { } else {
setState(() { setState(() {
_lenkerabstandError = null; // Clear the error if valid _lenkerabstandError = null; // Clear the error if valid
_saveIntValue( _settingsManager.writeHandlebarOffset(numberValue);
'handlebarDistance', numberValue); // Save only if valid
}); });
} }
} else { } else {
...@@ -58,17 +64,18 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> { ...@@ -58,17 +64,18 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
} }
Future<void> _loadSavedValues() async { Future<void> _loadSavedValues() async {
SharedPreferencesAsync prefs = SharedPreferencesAsync(); final handlebarDistance = await _settingsManager.readHandlebarOffset();
final portalServer = await _settingsManager.readPortalServer();
final handlebarDistance = await prefs.getInt('handlebarDistance') ?? 0; final portalKey = await _settingsManager.readPortalKey();
final portalServer = await prefs.getString('portalServer') ?? ""; final sentryDSN = await _settingsManager.readSentryDSN();
final portalKey = await prefs.getString('portalKey') ?? ""; final sentryEnabled = await _settingsManager.readSentryEnabled();
final sentryDSN = await prefs.getString('sentryDSN') ?? ""; final invertSensors = await _settingsManager.readInvertSensors();
final sentryEnabled = await prefs.getBool('sentryEnabled') ?? false; final minMeasurement = await _settingsManager.readMinMeasurement();
final invertSensors = await prefs.getBool('invertSensors') ?? false; final maxMeasurement = await _settingsManager.readMaxMeasurement();
setState(() { setState(() {
_lenkerabstandController.text = handlebarDistance.toString(); _lenkerabstandController.text = handlebarDistance.toString();
_minMeasurementController.text = minMeasurement.toString();
_maxMeasurementController.text = maxMeasurement.toString();
_portalServerController.text = portalServer; _portalServerController.text = portalServer;
_portalKeyController.text = portalKey; _portalKeyController.text = portalKey;
_sentryDSNController.text = sentryDSN; _sentryDSNController.text = sentryDSN;
...@@ -82,21 +89,6 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> { ...@@ -82,21 +89,6 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
return packageInfo.version; return packageInfo.version;
} }
Future<void> _saveStringValue(String key, String value) async {
SharedPreferencesAsync prefs = SharedPreferencesAsync();
await prefs.setString(key, value);
}
Future<void> _saveIntValue(String key, int value) async {
SharedPreferencesAsync prefs = SharedPreferencesAsync();
await prefs.setInt(key, value);
}
Future<void> _saveBoolValue(String key, bool value) async {
SharedPreferencesAsync prefs = SharedPreferencesAsync();
await prefs.setBool(key, value);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final privacyZonesProvider = context.watch<PrivacyZoneProvider>(); final privacyZonesProvider = context.watch<PrivacyZoneProvider>();
...@@ -123,17 +115,50 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> { ...@@ -123,17 +115,50 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
SelectableText(localizations.settingsPageDistanceFilterDescription),
Row(children: [
Expanded(
child: TextField(
controller: _minMeasurementController,
decoration: InputDecoration(
labelText: localizations.settingsPageMinMeasurementLabel,
),
keyboardType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
],
onChanged: (value) {
_settingsManager.writeMinMeasurement(int.parse(value));
},
),
),
const SizedBox(width: 5),
Expanded(
child: TextField(
controller: _maxMeasurementController,
decoration: InputDecoration(
labelText: localizations.settingsPageMaxMeasurementLabel,
),
keyboardType: TextInputType.number,
inputFormatters: [
FilteringTextInputFormatter.digitsOnly,
],
onChanged: (value) {
_settingsManager.writeMaxMeasurement(int.parse(value));
},
),
),
]),
const SizedBox(height: 20),
SelectableText(localizations.settingsPageInvertSensorsDescription), SelectableText(localizations.settingsPageInvertSensorsDescription),
SwitchListTile( SwitchListTile(
title: Text(localizations.settingsPageInvertSensorsLabel), title: Text(localizations.settingsPageInvertSensorsLabel),
value: _invertSensors, value: _invertSensors,
onChanged: (value) { onChanged: (value) {
setState(() { _settingsManager.writeInvertSensors(value);
_saveBoolValue('invertSensors', value);
setState(() { setState(() {
_invertSensors = value; _invertSensors = value;
}); });
});
}, },
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
...@@ -142,7 +167,7 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> { ...@@ -142,7 +167,7 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
controller: _portalServerController, controller: _portalServerController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: localizations.settingsPagePortalServerLabel), labelText: localizations.settingsPagePortalServerLabel),
onChanged: (value) => _saveStringValue('portalServer', value), onChanged: (value) => _settingsManager.writePortalServer(value),
), ),
const SizedBox(height: 20), const SizedBox(height: 20),
SelectableText(localizations.settingsPagePortalKeyDescription), SelectableText(localizations.settingsPagePortalKeyDescription),
...@@ -150,7 +175,7 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> { ...@@ -150,7 +175,7 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
controller: _portalKeyController, controller: _portalKeyController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: localizations.settingsPagePortalKeyLabel), labelText: localizations.settingsPagePortalKeyLabel),
onChanged: (value) => _saveStringValue('portalKey', value), onChanged: (value) => _settingsManager.writePortalKey(value),
), ),
const SizedBox(height: 40), const SizedBox(height: 40),
Text(localizations.settingsPageErrorReportingTitle, Text(localizations.settingsPageErrorReportingTitle,
...@@ -160,12 +185,10 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> { ...@@ -160,12 +185,10 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
title: Text(localizations.settingsPageErrorReportingSwitchLabel), title: Text(localizations.settingsPageErrorReportingSwitchLabel),
value: _sentryEnabled, value: _sentryEnabled,
onChanged: (value) { onChanged: (value) {
setState(() { _settingsManager.writeSentryEnabled(value);
_saveBoolValue('sentryEnabled', value);
setState(() { setState(() {
_sentryEnabled = value; _sentryEnabled = value;
}); });
});
}, },
), ),
SelectableText(localizations.settingsPageSentryDSNDescription), SelectableText(localizations.settingsPageSentryDSNDescription),
...@@ -173,7 +196,7 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> { ...@@ -173,7 +196,7 @@ class _OBSSettingsPageState extends State<OBSSettingsPage> {
controller: _sentryDSNController, controller: _sentryDSNController,
decoration: InputDecoration( decoration: InputDecoration(
labelText: localizations.settingsPageSentryDSNLabel), labelText: localizations.settingsPageSentryDSNLabel),
onChanged: (value) => _saveStringValue('sentryDSN', value), onChanged: (value) => _settingsManager.writeSentryDSN(value),
), ),
Divider(), Divider(),
const SizedBox(height: 20), const SizedBox(height: 20),
......
import 'package:app/events.dart'; import 'package:app/events.dart';
import 'package:app/generated/i18n/app_localizations.dart'; import 'package:app/generated/i18n/app_localizations.dart';
import 'package:app/manager/background_manger.dart'; import 'package:app/manager/background_manger.dart';
import 'package:app/manager/settings_manager.dart';
import 'package:app/providers/distance_provider.dart'; import 'package:app/providers/distance_provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:app/providers/bluetooth_provider.dart'; import 'package:app/providers/bluetooth_provider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
class Measurements extends StatefulWidget { class Measurements extends StatefulWidget {
const Measurements({super.key}); const Measurements({super.key});
...@@ -16,19 +16,18 @@ class Measurements extends StatefulWidget { ...@@ -16,19 +16,18 @@ class Measurements extends StatefulWidget {
class _MeasurementsState extends State<Measurements> { class _MeasurementsState extends State<Measurements> {
late BackgroundManager backgroundManger; late BackgroundManager backgroundManger;
late SharedPreferencesAsync _prefs; final _settingsManager = SettingsManager();
bool invertSensors = false; bool invertSensors = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
backgroundManger = BackgroundManager.instance; backgroundManger = BackgroundManager.instance;
_prefs = SharedPreferencesAsync();
getInvertSesnors(); getInvertSesnors();
} }
Future<void> getInvertSesnors() async { Future<void> getInvertSesnors() async {
final val = await _prefs.getBool('invertSensors') ?? false; final val = await _settingsManager.readInvertSensors();
setState(() { setState(() {
invertSensors = val; invertSensors = val;
}); });
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment