aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2024-01-04 20:13:01 -0500
committerScott Murray <scott.murray@konsulko.com>2024-01-04 20:20:16 -0500
commit31438c5081e8ee5b520787a6e64b9372ec678886 (patch)
tree3c2fd4d08d0ad5070ade0f6111fe5961ed39a8da
parent5588d1d26f1be968af6809e43507d7be0fadf434 (diff)
Configurable units fixes
Notable changes: - Add pressure unit to the units model. - Add tire pressure unit configuration page under settings. - Rework the VSS client, provider, and the associated handling in the vehicle and audio state providers to make the signal updating code reusable for processing the result of VAL API get commands. - Add logic to get the initial values of the used VSS signals so the initial application state looks sane in demo scenarios. - Add VSS signal support to the units provider so that changes will be pushed out for e.g. IC use. - Fix pressure unit use in various widgets. - Fix up range calculation for dashboard to correctly account for units and the incoming VSS value being in meters. - Fix some unit naming inconsistencies around capitalization. Bug-AGL: SPEC-5031, SPEC-5032 Change-Id: I33ac735dfbe35283bd30c92aa157cbdb7af1837c Signed-off-by: Scott Murray <scott.murray@konsulko.com>
-rw-r--r--lib/core/constants/vss_path.dart9
-rw-r--r--lib/data/data_providers/app_provider.dart6
-rw-r--r--lib/data/data_providers/audio_notifier.dart24
-rw-r--r--lib/data/data_providers/units_notifier.dart65
-rw-r--r--lib/data/data_providers/val_client.dart47
-rw-r--r--lib/data/data_providers/vehicle_notifier.dart87
-rw-r--r--lib/data/models/units.dart17
-rw-r--r--lib/data/models/vehicle.dart16
-rw-r--r--lib/export.dart1
-rw-r--r--lib/presentation/router/routes/routes.dart2
-rw-r--r--lib/presentation/screens/dashboard/widgets/car_status.dart95
-rw-r--r--lib/presentation/screens/dashboard/widgets/circle_indicator.dart2
-rw-r--r--lib/presentation/screens/dashboard/widgets/range.dart19
-rw-r--r--lib/presentation/screens/settings/settings_screens/units/distance/distance_unit_screen.dart11
-rw-r--r--lib/presentation/screens/settings/settings_screens/units/pressure/pressure_unit_screen.dart121
-rw-r--r--lib/presentation/screens/settings/settings_screens/units/units_screen.dart16
16 files changed, 392 insertions, 146 deletions
diff --git a/lib/core/constants/vss_path.dart b/lib/core/constants/vss_path.dart
index afba8de..cdb39f2 100644
--- a/lib/core/constants/vss_path.dart
+++ b/lib/core/constants/vss_path.dart
@@ -45,6 +45,12 @@ class VSSPath {
'Vehicle.Cabin.HVAC.Station.Row1.Driver.Temperature';
static const String vehiclePassengerTemperature =
'Vehicle.Cabin.HVAC.Station.Row1.Passenger.Temperature';
+ static const String vehicleHmiDistanceUnit =
+ 'Vehicle.Cabin.Infotainment.HMI.DistanceUnit';
+ static const String vehicleHmiTemperatureUnit =
+ 'Vehicle.Cabin.Infotainment.HMI.TemperatureUnit';
+ static const String vehicleHmiPressureUnit =
+ 'Vehicle.Cabin.Infotainment.HMI.TirePressureUnit';
List<String> getSignalsList() {
return const [
@@ -72,6 +78,9 @@ class VSSPath {
vehicleFanSpeed,
vehicleDriverTemperature,
vehiclePassengerTemperature,
+ vehicleHmiDistanceUnit,
+ vehicleHmiTemperatureUnit,
+ vehicleHmiPressureUnit,
];
}
}
diff --git a/lib/data/data_providers/app_provider.dart b/lib/data/data_providers/app_provider.dart
index 3d00d4c..ee6d29e 100644
--- a/lib/data/data_providers/app_provider.dart
+++ b/lib/data/data_providers/app_provider.dart
@@ -40,6 +40,7 @@ enum AppState {
weather,
distanceUnit,
tempUnit,
+ pressureUnit,
clock,
date,
time,
@@ -78,9 +79,8 @@ final signalsProvider = StateNotifierProvider<SignalNotifier, Signals>((ref) {
return SignalNotifier(const Signals.initial());
});
-final unitStateProvider = StateNotifierProvider<UnitsNotifier, Units>((ref) {
- return UnitsNotifier(const Units.initial());
-});
+final unitStateProvider =
+ NotifierProvider<UnitsNotifier, Units>(UnitsNotifier.new);
final audioStateProvider =
NotifierProvider<AudioStateNotifier, AudioState>(AudioStateNotifier.new);
diff --git a/lib/data/data_providers/audio_notifier.dart b/lib/data/data_providers/audio_notifier.dart
index a601095..76b34a7 100644
--- a/lib/data/data_providers/audio_notifier.dart
+++ b/lib/data/data_providers/audio_notifier.dart
@@ -36,36 +36,36 @@ class AudioStateNotifier extends Notifier<AudioState> {
);
}
- bool handleSignalsUpdate(EntryUpdate update) {
+ bool handleSignalUpdate(DataEntry entry) {
bool handled = true;
- switch (update.entry.path) {
+ switch (entry.path) {
case VSSPath.vehicleMediaVolume:
- if (update.entry.value.hasUint32()) {
- double value = update.entry.value.uint32.toDouble();
+ if (entry.value.hasUint32()) {
+ double value = entry.value.uint32.toDouble();
state = state.copyWith(volume: value);
}
break;
case VSSPath.vehicleMediaBalance:
- if (update.entry.value.hasInt32()) {
- double value = (update.entry.value.int32 + 100) / 20.0;
+ if (entry.value.hasInt32()) {
+ double value = (entry.value.int32 + 100) / 20.0;
state = state.copyWith(balance: value);
}
break;
case VSSPath.vehicleMediaFade:
- if (update.entry.value.hasInt32()) {
- double value = (update.entry.value.int32 + 100) / 20.0;
+ if (entry.value.hasInt32()) {
+ double value = (entry.value.int32 + 100) / 20.0;
state = state.copyWith(fade: value);
}
break;
case VSSPath.vehicleMediaTreble:
- if (update.entry.value.hasInt32()) {
- double value = (update.entry.value.int32 + 100) / 20.0;
+ if (entry.value.hasInt32()) {
+ double value = (entry.value.int32 + 100) / 20.0;
state = state.copyWith(treble: value);
}
break;
case VSSPath.vehicleMediaBass:
- if (update.entry.value.hasInt32()) {
- double value = (update.entry.value.int32 + 100) / 20.0;
+ if (entry.value.hasInt32()) {
+ double value = (entry.value.int32 + 100) / 20.0;
state = state.copyWith(bass: value);
}
break;
diff --git a/lib/data/data_providers/units_notifier.dart b/lib/data/data_providers/units_notifier.dart
index f7c25aa..26b79da 100644
--- a/lib/data/data_providers/units_notifier.dart
+++ b/lib/data/data_providers/units_notifier.dart
@@ -1,13 +1,72 @@
-import '../../export.dart';
+import 'package:flutter_ics_homescreen/export.dart';
+import 'package:protos/val-api.dart';
-class UnitsNotifier extends StateNotifier<Units> {
- UnitsNotifier(super.state);
+class UnitsNotifier extends Notifier<Units> {
+ @override
+ Units build() {
+ return const Units.initial();
+ }
+
+ bool handleSignalUpdate(DataEntry entry) {
+ bool handled = true;
+ switch (entry.path) {
+ case VSSPath.vehicleHmiDistanceUnit:
+ if (entry.value.hasString()) {
+ String value = entry.value.string;
+ DistanceUnit unit = DistanceUnit.kilometers;
+ if (value != "KILOMETERS") unit = DistanceUnit.miles;
+ state = state.copyWith(distanceUnit: unit);
+ }
+ break;
+ case VSSPath.vehicleHmiTemperatureUnit:
+ if (entry.value.hasString()) {
+ String value = entry.value.string;
+ TemperatureUnit unit = TemperatureUnit.celsius;
+ if (value != "C") unit = TemperatureUnit.fahrenheit;
+ state = state.copyWith(temperatureUnit: unit);
+ }
+ break;
+ case VSSPath.vehicleHmiPressureUnit:
+ if (entry.value.hasString()) {
+ String value = entry.value.string;
+ PressureUnit unit = PressureUnit.kilopascals;
+ if (value != "KPA") unit = PressureUnit.psi;
+ state = state.copyWith(pressureUnit: unit);
+ }
+ break;
+ default:
+ handled = false;
+ }
+ return handled;
+ }
void setDistanceUnit(DistanceUnit unit) {
state = state.copyWith(distanceUnit: unit);
+ var valClient = ref.read(valClientProvider);
+ valClient.setString(
+ VSSPath.vehicleHmiDistanceUnit,
+ unit == DistanceUnit.kilometers ? "KILOMETERS" : "MILES",
+ true,
+ );
}
void setTemperatureUnit(TemperatureUnit unit) {
state = state.copyWith(temperatureUnit: unit);
+ var valClient = ref.read(valClientProvider);
+ valClient.setString(
+ VSSPath.vehicleHmiTemperatureUnit,
+ unit == TemperatureUnit.celsius ? "C" : "F",
+ true,
+ );
+ }
+
+ void setPressureUnit(PressureUnit unit) {
+ state = state.copyWith(pressureUnit: unit);
+ var valClient = ref.read(valClientProvider);
+ valClient.setString(
+ VSSPath.vehicleHmiPressureUnit,
+ unit == PressureUnit.kilopascals ? "KPA" : "PSI",
+ true,
+ );
}
}
diff --git a/lib/data/data_providers/val_client.dart b/lib/data/data_providers/val_client.dart
index db962ee..5e7339c 100644
--- a/lib/data/data_providers/val_client.dart
+++ b/lib/data/data_providers/val_client.dart
@@ -29,15 +29,21 @@ class ValClient {
}
void run() async {
- List<String> fewSignals = VSSPath().getSignalsList();
- var request = SubscribeRequest();
+ List<String> signals = VSSPath().getSignalsList();
Map<String, String> metadata = {};
if (config.authorization.isNotEmpty) {
metadata = {'authorization': "Bearer ${config.authorization}"};
}
- for (int i = 0; i < fewSignals.length; i++) {
+
+ // Initialize signal states
+ for (int i = 0; i < signals.length; i++) {
+ get(signals[i]);
+ }
+
+ var request = SubscribeRequest();
+ for (int i = 0; i < signals.length; i++) {
var entry = SubscribeEntry();
- entry.path = fewSignals[i];
+ entry.path = signals[i];
entry.fields.add(Field.FIELD_PATH);
entry.fields.add(Field.FIELD_VALUE);
request.entries.add(entry);
@@ -48,7 +54,7 @@ class ValClient {
responseStream.listen((value) async {
for (var update in value.updates) {
if (!(update.hasEntry() && update.entry.hasPath())) continue;
- handleSignalsUpdate(update);
+ handleSignalUpdate(update.entry);
}
}, onError: (stacktrace, errorDescriptor) {
debugPrint(stacktrace.toString());
@@ -58,11 +64,14 @@ class ValClient {
}
}
- bool handleSignalsUpdate(EntryUpdate update) {
- if (ref.read(vehicleProvider.notifier).handleSignalsUpdate(update)) {
+ bool handleSignalUpdate(DataEntry entry) {
+ if (ref.read(vehicleProvider.notifier).handleSignalUpdate(entry)) {
+ return true;
+ }
+ if (ref.read(audioStateProvider.notifier).handleSignalUpdate(entry)) {
return true;
}
- return ref.read(audioStateProvider.notifier).handleSignalsUpdate(update);
+ return ref.read(unitStateProvider.notifier).handleSignalUpdate(entry);
}
void setUint32(String path, int value, [bool actuator = true]) async {
@@ -114,4 +123,26 @@ class ValClient {
}
await stub.set(request, options: CallOptions(metadata: metadata));
}
+
+ void get(String path) async {
+ var entry = EntryRequest()..path = path;
+ entry.fields.add(Field.FIELD_VALUE);
+ var request = GetRequest();
+ request.entries.add(entry);
+ Map<String, String> metadata = {};
+ if (config.authorization.isNotEmpty) {
+ metadata = {'authorization': "Bearer ${config.authorization}"};
+ }
+ debugPrint("Getting {path} value");
+ var response =
+ await stub.get(request, options: CallOptions(metadata: metadata));
+ if (response.hasError()) {
+ debugPrint("Get request had error {response.error().reason}");
+ return;
+ }
+ for (var entry in response.entries) {
+ if (!entry.hasPath()) continue;
+ handleSignalUpdate(entry);
+ }
+ }
}
diff --git a/lib/data/data_providers/vehicle_notifier.dart b/lib/data/data_providers/vehicle_notifier.dart
index 6fafb8c..fb2de19 100644
--- a/lib/data/data_providers/vehicle_notifier.dart
+++ b/lib/data/data_providers/vehicle_notifier.dart
@@ -15,99 +15,93 @@ class VehicleNotifier extends Notifier<Vehicle> {
state = state.copyWith(speed: newValue);
}
- bool handleSignalsUpdate(EntryUpdate update) {
+ bool handleSignalUpdate(DataEntry entry) {
bool handled = true;
- switch (update.entry.path) {
+ switch (entry.path) {
case VSSPath.vehicleSpeed:
- if (update.entry.value.hasFloat()) {
- state = state.copyWith(speed: update.entry.value.float);
+ if (entry.value.hasFloat()) {
+ state = state.copyWith(speed: entry.value.float);
}
break;
case VSSPath.vehicleInsideTemperature:
- if (update.entry.value.hasFloat()) {
- state = state.copyWith(insideTemperature: update.entry.value.float);
+ if (entry.value.hasFloat()) {
+ state = state.copyWith(insideTemperature: entry.value.float);
}
break;
case VSSPath.vehicleOutsideTemperature:
- if (update.entry.value.hasFloat()) {
- state = state.copyWith(outsideTemperature: update.entry.value.float);
+ if (entry.value.hasFloat()) {
+ state = state.copyWith(outsideTemperature: entry.value.float);
}
break;
case VSSPath.vehicleRange:
- if (update.entry.value.hasUint32()) {
- state = state.copyWith(range: update.entry.value.uint32);
+ if (entry.value.hasUint32()) {
+ state = state.copyWith(range: entry.value.uint32);
}
break;
case VSSPath.vehicleFuelLevel:
- if (update.entry.value.hasUint32()) {
- state = state.copyWith(fuelLevel: update.entry.value.uint32);
+ if (entry.value.hasUint32()) {
+ state = state.copyWith(fuelLevel: entry.value.uint32);
}
break;
case VSSPath.vehicleIsChildLockActiveLeft:
- if (update.entry.value.hasBool_12()) {
- state =
- state.copyWith(isChildLockActiveLeft: update.entry.value.bool_12);
+ if (entry.value.hasBool_12()) {
+ state = state.copyWith(isChildLockActiveLeft: entry.value.bool_12);
}
break;
case VSSPath.vehicleIsChildLockActiveRight:
- if (update.entry.value.hasBool_12()) {
- state = state.copyWith(
- isChildLockActiveRight: update.entry.value.bool_12);
+ if (entry.value.hasBool_12()) {
+ state = state.copyWith(isChildLockActiveRight: entry.value.bool_12);
}
break;
case VSSPath.vehicleEngineSpeed:
- if (update.entry.value.hasFloat()) {
- state = state.copyWith(engineSpeed: update.entry.value.float);
+ if (entry.value.hasFloat()) {
+ state = state.copyWith(engineSpeed: entry.value.float);
}
break;
case VSSPath.vehicleFrontLeftTire:
- if (update.entry.value.hasUint32()) {
- state = state.copyWith(frontLeftTire: update.entry.value.uint32);
+ if (entry.value.hasUint32()) {
+ state = state.copyWith(frontLeftTire: entry.value.uint32);
}
break;
case VSSPath.vehicleFrontRightTire:
- if (update.entry.value.hasUint32()) {
- state = state.copyWith(frontRightTire: update.entry.value.uint32);
+ if (entry.value.hasUint32()) {
+ state = state.copyWith(frontRightTire: entry.value.uint32);
}
break;
case VSSPath.vehicleRearLeftTire:
- if (update.entry.value.hasUint32()) {
- state = state.copyWith(rearLeftTire: update.entry.value.uint32);
+ if (entry.value.hasUint32()) {
+ state = state.copyWith(rearLeftTire: entry.value.uint32);
}
break;
case VSSPath.vehicleRearRightTire:
- if (update.entry.value.hasUint32()) {
- state = state.copyWith(rearRightTire: update.entry.value.uint32);
+ if (entry.value.hasUint32()) {
+ state = state.copyWith(rearRightTire: entry.value.uint32);
}
break;
case VSSPath.vehicleIsAirConditioningActive:
- if (update.entry.value.hasBool_12()) {
- state = state.copyWith(
- isAirConditioningActive: update.entry.value.bool_12);
+ if (entry.value.hasBool_12()) {
+ state = state.copyWith(isAirConditioningActive: entry.value.bool_12);
}
break;
case VSSPath.vehicleIsFrontDefrosterActive:
- if (update.entry.value.hasBool_12()) {
- state = state.copyWith(
- isFrontDefrosterActive: update.entry.value.bool_12);
+ if (entry.value.hasBool_12()) {
+ state = state.copyWith(isFrontDefrosterActive: entry.value.bool_12);
}
break;
case VSSPath.vehicleIsRearDefrosterActive:
- if (update.entry.value.hasBool_12()) {
- state =
- state.copyWith(isRearDefrosterActive: update.entry.value.bool_12);
+ if (entry.value.hasBool_12()) {
+ state = state.copyWith(isRearDefrosterActive: entry.value.bool_12);
}
break;
case VSSPath.vehicleIsRecirculationActive:
- if (update.entry.value.hasBool_12()) {
- state =
- state.copyWith(isRecirculationActive: update.entry.value.bool_12);
+ if (entry.value.hasBool_12()) {
+ state = state.copyWith(isRecirculationActive: entry.value.bool_12);
}
break;
case VSSPath.vehicleFanSpeed:
- if (update.entry.value.hasUint32()) {
+ if (entry.value.hasUint32()) {
// Convert 0-100 to local 0-3 setting
- var value = update.entry.value.uint32;
+ var value = entry.value.uint32;
var fanSpeed = 0;
if (value > 66)
fanSpeed = 3;
@@ -118,14 +112,13 @@ class VehicleNotifier extends Notifier<Vehicle> {
}
break;
case VSSPath.vehicleDriverTemperature:
- if (update.entry.value.hasInt32()) {
- state = state.copyWith(driverTemperature: update.entry.value.int32);
+ if (entry.value.hasInt32()) {
+ state = state.copyWith(driverTemperature: entry.value.int32);
}
break;
case VSSPath.vehiclePassengerTemperature:
- if (update.entry.value.hasInt32()) {
- state =
- state.copyWith(passengerTemperature: update.entry.value.int32);
+ if (entry.value.hasInt32()) {
+ state = state.copyWith(passengerTemperature: entry.value.int32);
}
break;
default:
diff --git a/lib/data/models/units.dart b/lib/data/models/units.dart
index 9e71213..c299a12 100644
--- a/lib/data/models/units.dart
+++ b/lib/data/models/units.dart
@@ -4,32 +4,39 @@ enum DistanceUnit { kilometers, miles }
enum TemperatureUnit { celsius, fahrenheit }
+enum PressureUnit { kilopascals, psi }
+
@immutable
class Units {
final DistanceUnit distanceUnit;
final TemperatureUnit temperatureUnit;
+ final PressureUnit pressureUnit;
const Units(
this.distanceUnit,
this.temperatureUnit,
+ this.pressureUnit,
);
const Units.initial()
: distanceUnit = DistanceUnit.kilometers,
- temperatureUnit = TemperatureUnit.celsius;
+ temperatureUnit = TemperatureUnit.celsius,
+ pressureUnit = PressureUnit.kilopascals;
Units copyWith({
DistanceUnit? distanceUnit,
TemperatureUnit? temperatureUnit,
+ PressureUnit? pressureUnit,
}) {
return Units(
distanceUnit ?? this.distanceUnit,
temperatureUnit ?? this.temperatureUnit,
+ pressureUnit ?? this.pressureUnit,
);
}
@override
String toString() =>
- 'Units(distanceUnit: $distanceUnit, temperatureUnit: $temperatureUnit)';
+ 'Units(distanceUnit: $distanceUnit, temperatureUnit: $temperatureUnit, pressureUnit: $pressureUnit)';
@override
bool operator ==(Object other) {
@@ -37,9 +44,11 @@ class Units {
return other is Units &&
other.distanceUnit == distanceUnit &&
- other.temperatureUnit == temperatureUnit;
+ other.temperatureUnit == temperatureUnit &&
+ other.pressureUnit == pressureUnit;
}
@override
- int get hashCode => distanceUnit.hashCode ^ temperatureUnit.hashCode;
+ int get hashCode =>
+ distanceUnit.hashCode ^ temperatureUnit.hashCode ^ pressureUnit.hashCode;
}
diff --git a/lib/data/models/vehicle.dart b/lib/data/models/vehicle.dart
index ad76620..dfeae05 100644
--- a/lib/data/models/vehicle.dart
+++ b/lib/data/models/vehicle.dart
@@ -57,10 +57,10 @@ class Vehicle {
fuelLevel = 0,
isChildLockActiveLeft = false,
isChildLockActiveRight = true,
- frontLeftTire = 33,
- frontRightTire = 31,
- rearLeftTire = 31,
- rearRightTire = 32,
+ frontLeftTire = 228,
+ frontRightTire = 214,
+ rearLeftTire = 214,
+ rearRightTire = 221,
isAirConditioningActive = false,
isFrontDefrosterActive = false,
isRearDefrosterActive = false,
@@ -79,10 +79,10 @@ class Vehicle {
fuelLevel = 49,
isChildLockActiveLeft = false,
isChildLockActiveRight = true,
- frontLeftTire = 33,
- frontRightTire = 31,
- rearLeftTire = 31,
- rearRightTire = 32,
+ frontLeftTire = 228,
+ frontRightTire = 214,
+ rearLeftTire = 214,
+ rearRightTire = 221,
isAirConditioningActive = false,
isFrontDefrosterActive = false,
isRearDefrosterActive = false,
diff --git a/lib/export.dart b/lib/export.dart
index e97fd90..ef029c7 100644
--- a/lib/export.dart
+++ b/lib/export.dart
@@ -41,6 +41,7 @@ export 'presentation/screens/settings/settings_screens/units/units_screen.dart';
export 'presentation/screens/settings/settings_screens/version_info/version_info_screend.dart';
export 'presentation/screens/settings/settings_screens/units/distance/distance_unit_screen.dart';
export 'presentation/screens/settings/settings_screens/units/temperature/temperature_unit_screen.dart';
+export 'presentation/screens/settings/settings_screens/units/pressure/pressure_unit_screen.dart';
export 'package:flutter_ics_homescreen/presentation/screens/settings/settings_screens/profiles/widgets/new_profile_screen.dart';
export 'presentation/screens/apps/apps.dart';
diff --git a/lib/presentation/router/routes/routes.dart b/lib/presentation/router/routes/routes.dart
index 45a1a14..328d495 100644
--- a/lib/presentation/router/routes/routes.dart
+++ b/lib/presentation/router/routes/routes.dart
@@ -45,6 +45,8 @@ List<Page<dynamic>> onGenerateAppViewPages(
return [DistanceUnitPage.page()];
case AppState.tempUnit:
return [TemperatureUnitPage.page()];
+ case AppState.pressureUnit:
+ return [PressureUnitPage.page()];
case AppState.clock:
return [ClockPage.page()];
case AppState.newProfile:
diff --git a/lib/presentation/screens/dashboard/widgets/car_status.dart b/lib/presentation/screens/dashboard/widgets/car_status.dart
index b824871..604d404 100644
--- a/lib/presentation/screens/dashboard/widgets/car_status.dart
+++ b/lib/presentation/screens/dashboard/widgets/car_status.dart
@@ -4,25 +4,13 @@ import 'package:gradient_borders/gradient_borders.dart';
import '../../../../export.dart';
-class CarStatus extends ConsumerStatefulWidget {
+class CarStatus extends ConsumerWidget {
const CarStatus({super.key});
@override
- CarStatusState createState() => CarStatusState();
-}
-
-class CarStatusState extends ConsumerState<CarStatus> {
- @override
- void initState() {
- super.initState();
- // "ref" can be used in all life-cycles of a StatefulWidget.
- //ref.read(counterProvider);
- }
-
- @override
- Widget build(BuildContext context) {
+ Widget build(BuildContext context, WidgetRef Ref) {
return Padding(
- padding: const EdgeInsets.fromLTRB(0,0,0,84),
+ padding: const EdgeInsets.fromLTRB(0, 0, 0, 84),
child: SizedBox(
height: 440,
width: 652,
@@ -59,6 +47,18 @@ class LeftCarStatus extends ConsumerWidget {
ref.watch(vehicleProvider.select((vehicle) => vehicle.frontLeftTire));
final rearLeftTire =
ref.watch(vehicleProvider.select((vehicle) => vehicle.rearLeftTire));
+ final unit =
+ ref.watch(unitStateProvider.select((unit) => unit.pressureUnit));
+
+ String frontLeftTireString = "";
+ String rearLeftTireString = "";
+ if (unit == PressureUnit.psi) {
+ frontLeftTireString = (frontLeftTire * 0.145038).toStringAsFixed(1);
+ rearLeftTireString = (rearLeftTire * 0.145038).toStringAsFixed(1);
+ } else {
+ frontLeftTireString = frontLeftTire.toString();
+ rearLeftTireString = rearLeftTire.toString();
+ }
return Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
@@ -67,22 +67,21 @@ class LeftCarStatus extends ConsumerWidget {
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
- PSIProgressIndicator(value: frontLeftTire.toDouble()),
+ TirePressureProgressIndicator(value: frontLeftTire.toDouble()),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
- frontLeftTire.toStringAsFixed(1),
+ frontLeftTireString,
style: GoogleFonts.brunoAce(
- textStyle: TextStyle(
- color: Colors.white, fontSize: 44),
+ textStyle: TextStyle(color: Colors.white, fontSize: 44),
),
),
SizedBox(
width: 5,
),
- PSIWidget(),
+ TirePressureUnitWidget(),
],
),
],
@@ -91,22 +90,21 @@ class LeftCarStatus extends ConsumerWidget {
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
- PSIProgressIndicator(value: rearLeftTire.toDouble()),
+ TirePressureProgressIndicator(value: rearLeftTire.toDouble()),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
- rearLeftTire.toStringAsFixed(1),
+ rearLeftTireString,
style: GoogleFonts.brunoAce(
- textStyle: TextStyle(
- color: Colors.white, fontSize: 44),
+ textStyle: TextStyle(color: Colors.white, fontSize: 44),
),
),
SizedBox(
width: 5,
),
- PSIWidget(),
+ TirePressureUnitWidget(),
],
),
],
@@ -127,6 +125,18 @@ class RightCarStatus extends ConsumerWidget {
ref.watch(vehicleProvider.select((vehicle) => vehicle.frontRightTire));
final rearRightTire =
ref.watch(vehicleProvider.select((vehicle) => vehicle.rearRightTire));
+ final unit =
+ ref.watch(unitStateProvider.select((unit) => unit.pressureUnit));
+
+ String frontRightTireString = "";
+ String rearRightTireString = "";
+ if (unit == PressureUnit.psi) {
+ frontRightTireString = (frontRightTire * 0.145038).toStringAsFixed(1);
+ rearRightTireString = (rearRightTire * 0.145038).toStringAsFixed(1);
+ } else {
+ frontRightTireString = frontRightTire.toString();
+ rearRightTireString = rearRightTire.toString();
+ }
return Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
@@ -134,23 +144,21 @@ class RightCarStatus extends ConsumerWidget {
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
-
children: [
- PSIProgressIndicator(value: frontRightTire.toDouble()),
+ TirePressureProgressIndicator(value: frontRightTire.toDouble()),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
- frontRightTire.toStringAsFixed(1),
+ frontRightTireString,
style: GoogleFonts.brunoAce(
- textStyle: TextStyle(
- color: Colors.white, fontSize: 44),
+ textStyle: TextStyle(color: Colors.white, fontSize: 44),
),
),
SizedBox(
width: 5,
),
- PSIWidget(),
+ TirePressureUnitWidget(),
],
),
],
@@ -159,22 +167,21 @@ class RightCarStatus extends ConsumerWidget {
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- PSIProgressIndicator(value: rearRightTire.toDouble()),
+ TirePressureProgressIndicator(value: rearRightTire.toDouble()),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
- rearRightTire.toStringAsFixed(1),
+ rearRightTireString,
style: GoogleFonts.brunoAce(
- textStyle: TextStyle(
- color: Colors.white, fontSize: 44),
+ textStyle: TextStyle(color: Colors.white, fontSize: 44),
),
),
SizedBox(
width: 5,
),
- PSIWidget(),
+ TirePressureUnitWidget(),
],
),
],
@@ -184,9 +191,9 @@ class RightCarStatus extends ConsumerWidget {
}
}
-class PSIProgressIndicator extends StatelessWidget {
+class TirePressureProgressIndicator extends StatelessWidget {
final double value;
- const PSIProgressIndicator({
+ const TirePressureProgressIndicator({
Key? key,
required this.value, // Require the value to be passed
}) : super(key: key);
@@ -208,7 +215,6 @@ class PSIProgressIndicator extends StatelessWidget {
LinearGradient(colors: const [Colors.white30, Colors.white]),
),
),
-
),
Positioned(
left: 3,
@@ -231,17 +237,20 @@ class PSIProgressIndicator extends StatelessWidget {
}
}
-class PSIWidget extends StatelessWidget {
- const PSIWidget({
+class TirePressureUnitWidget extends ConsumerWidget {
+ const TirePressureUnitWidget({
super.key,
});
@override
- Widget build(BuildContext context) {
+ Widget build(BuildContext context, WidgetRef ref) {
+ final unit =
+ ref.watch(unitStateProvider.select((unit) => unit.pressureUnit));
+
return Padding(
padding: const EdgeInsets.only(left: 4.0, right: 1.0, bottom: 2.0),
child: Text(
- 'PSI',
+ unit == PressureUnit.kilopascals ? 'kPa' : 'PSI',
style: TextStyle(
fontSize: 26,
),
diff --git a/lib/presentation/screens/dashboard/widgets/circle_indicator.dart b/lib/presentation/screens/dashboard/widgets/circle_indicator.dart
index 6ff3613..e3a3ba5 100644
--- a/lib/presentation/screens/dashboard/widgets/circle_indicator.dart
+++ b/lib/presentation/screens/dashboard/widgets/circle_indicator.dart
@@ -189,7 +189,7 @@ class SpeedProgressIndicatorState extends ConsumerState<SpeedProgressIndicator>
),
Text(
- unit == DistanceUnit.kilometers ? 'Km/h' : 'Mph',
+ unit == DistanceUnit.kilometers ? 'km/h' : 'mph',
style: const TextStyle(color: Colors.white, fontSize: 40),
),
],
diff --git a/lib/presentation/screens/dashboard/widgets/range.dart b/lib/presentation/screens/dashboard/widgets/range.dart
index aea92af..34435ae 100644
--- a/lib/presentation/screens/dashboard/widgets/range.dart
+++ b/lib/presentation/screens/dashboard/widgets/range.dart
@@ -10,8 +10,12 @@ class RangeWidget extends ConsumerWidget {
final range = ref.watch(vehicleProvider.select((vehicle) => vehicle.range));
final unit =
ref.watch(unitStateProvider.select((unit) => unit.distanceUnit));
+ final rangeString = (unit == DistanceUnit.kilometers)
+ ? (range / 1000.0).toStringAsFixed(0)
+ : (range / 1609.0).toStringAsFixed(0);
+
return Container(
- height:130,
+ height: 130,
width: 306,
// padding: const EdgeInsets.all(10),
decoration: const ShapeDecoration(
@@ -54,24 +58,19 @@ class RangeWidget extends ConsumerWidget {
),
RichText(
text: TextSpan(
-
- text: '$range',
+ text: rangeString,
style: GoogleFonts.brunoAce(
-
- textStyle:
- const TextStyle(
+ textStyle: const TextStyle(
color: Colors.white,
fontSize: 44,
),
),
children: <TextSpan>[
TextSpan(
- text:
- unit == DistanceUnit.kilometers ? ' Km' : ' Mi',
+ text: unit == DistanceUnit.kilometers ? ' km' : ' mi',
style: GoogleFonts.brunoAce(
textStyle: const TextStyle(
- color: Color(0xFFC1D8FF),
- fontSize: 38),
+ color: Color(0xFFC1D8FF), fontSize: 38),
),
),
]),
diff --git a/lib/presentation/screens/settings/settings_screens/units/distance/distance_unit_screen.dart b/lib/presentation/screens/settings/settings_screens/units/distance/distance_unit_screen.dart
index 3e9c135..3d84604 100644
--- a/lib/presentation/screens/settings/settings_screens/units/distance/distance_unit_screen.dart
+++ b/lib/presentation/screens/settings/settings_screens/units/distance/distance_unit_screen.dart
@@ -11,7 +11,6 @@ class DistanceUnitPage extends ConsumerWidget {
ref.watch(unitStateProvider.select((unit) => unit.distanceUnit));
return Scaffold(
-
body: Column(
children: [
CommonTitle(
@@ -48,13 +47,14 @@ class DistanceUnitPage extends ConsumerWidget {
contentPadding: const EdgeInsets.symmetric(
horizontal: 16.0, vertical: 40.0),
leading: Text(
- 'Kilometers',
+ 'kilometers',
style: Theme.of(context).textTheme.titleMedium,
),
//title: Text(widget.title),
//enabled: isSwitchOn,
trailing: unit == DistanceUnit.kilometers
- ? const Icon(Icons.done,
+ ? const Icon(
+ Icons.done,
color: AGLDemoColors.periwinkleColor,
size: 48,
)
@@ -90,13 +90,14 @@ class DistanceUnitPage extends ConsumerWidget {
contentPadding: const EdgeInsets.symmetric(
horizontal: 16.0, vertical: 40.0),
leading: Text(
- 'Miles',
+ 'miles',
style: Theme.of(context).textTheme.titleMedium,
),
//title: Text(widget.title),
//enabled: isSwitchOn,
trailing: unit == DistanceUnit.miles
- ? const Icon(Icons.done,
+ ? const Icon(
+ Icons.done,
color: AGLDemoColors.periwinkleColor,
size: 48,
)
diff --git a/lib/presentation/screens/settings/settings_screens/units/pressure/pressure_unit_screen.dart b/lib/presentation/screens/settings/settings_screens/units/pressure/pressure_unit_screen.dart
new file mode 100644
index 0000000..5be8a05
--- /dev/null
+++ b/lib/presentation/screens/settings/settings_screens/units/pressure/pressure_unit_screen.dart
@@ -0,0 +1,121 @@
+import 'package:flutter_ics_homescreen/export.dart';
+
+class PressureUnitPage extends ConsumerWidget {
+ const PressureUnitPage({super.key});
+
+ static Page<void> page() =>
+ const MaterialPage<void>(child: PressureUnitPage());
+ @override
+ Widget build(BuildContext context, WidgetRef ref) {
+ final unit =
+ ref.watch(unitStateProvider.select((unit) => unit.pressureUnit));
+
+ return Scaffold(
+ body: Column(
+ children: [
+ CommonTitle(
+ title: 'Pressure',
+ hasBackButton: true,
+ onPressed: () {
+ context.flow<AppState>().update((state) => AppState.units);
+ },
+ ),
+ Expanded(
+ child: Padding(
+ padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 144),
+ child: ListView(
+ children: [
+ Container(
+ height: 130,
+ decoration: BoxDecoration(
+ gradient: LinearGradient(
+ begin: Alignment.centerLeft,
+ end: Alignment.centerRight,
+ stops: unit == PressureUnit.kilopascals
+ ? [0, 0.01, 0.8]
+ : [0.1, 1],
+ colors: unit == PressureUnit.kilopascals
+ ? <Color>[
+ Colors.white,
+ Colors.blue,
+ const Color.fromARGB(16, 41, 98, 255)
+ ]
+ : <Color>[Colors.black, Colors.black12]),
+ ),
+ child: ListTile(
+ minVerticalPadding: 0.0,
+ contentPadding: const EdgeInsets.symmetric(
+ horizontal: 16.0, vertical: 40.0),
+ leading: Text(
+ 'kilopascals',
+ style: Theme.of(context).textTheme.titleMedium,
+ ),
+ //title: Text(widget.title),
+ //enabled: isSwitchOn,
+ trailing: unit == PressureUnit.kilopascals
+ ? const Icon(
+ Icons.done,
+ color: AGLDemoColors.periwinkleColor,
+ size: 48,
+ )
+ : null,
+ onTap: () {
+ ref
+ .read(unitStateProvider.notifier)
+ .setPressureUnit(PressureUnit.kilopascals);
+ }),
+ ),
+ const SizedBox(
+ height: 5,
+ ),
+ Container(
+ height: 130,
+ decoration: BoxDecoration(
+ gradient: LinearGradient(
+ begin: Alignment.centerLeft,
+ end: Alignment.centerRight,
+ stops: unit == PressureUnit.psi
+ ? [0, 0.01, 0.8]
+ : [0.1, 1],
+ colors: unit == PressureUnit.psi
+ ? <Color>[
+ Colors.white,
+ Colors.blue,
+ const Color.fromARGB(16, 41, 98, 255)
+ ]
+ : <Color>[Colors.black, Colors.black12]),
+ ),
+ child: ListTile(
+ minVerticalPadding: 0.0,
+ contentPadding: const EdgeInsets.symmetric(
+ horizontal: 16.0, vertical: 40.0),
+ leading: Text(
+ 'PSI',
+ style: Theme.of(context).textTheme.titleMedium,
+ ),
+ //title: Text(widget.title),
+ //enabled: isSwitchOn,
+ trailing: unit == PressureUnit.psi
+ ? const Icon(
+ Icons.done,
+ color: AGLDemoColors.periwinkleColor,
+ size: 38,
+ )
+ : null,
+
+ onTap: () {
+ ref
+ .read(unitStateProvider.notifier)
+ .setPressureUnit(PressureUnit.psi);
+ },
+ ),
+ ),
+ ],
+ ),
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/presentation/screens/settings/settings_screens/units/units_screen.dart b/lib/presentation/screens/settings/settings_screens/units/units_screen.dart
index 1c6e37c..fde7505 100644
--- a/lib/presentation/screens/settings/settings_screens/units/units_screen.dart
+++ b/lib/presentation/screens/settings/settings_screens/units/units_screen.dart
@@ -30,8 +30,8 @@ class UnitsPage extends ConsumerWidget {
icon: Icons.calendar_month_outlined,
title: 'Distance',
unitName: unit.distanceUnit == DistanceUnit.kilometers
- ? 'Kilometers'
- : 'Miles',
+ ? 'kilometers'
+ : 'miles',
hasSwich: false,
voidCallback: () async {
context
@@ -50,6 +50,18 @@ class UnitsPage extends ConsumerWidget {
.flow<AppState>()
.update((next) => AppState.tempUnit);
}),
+ UnitsTile(
+ icon: Icons.straighten,
+ title: 'Pressure',
+ unitName: unit.pressureUnit == PressureUnit.kilopascals
+ ? 'kilopascals'
+ : 'PSI',
+ hasSwich: true,
+ voidCallback: () {
+ context
+ .flow<AppState>()
+ .update((next) => AppState.pressureUnit);
+ }),
],
),
),