This commit changes central hybrid animation on dashboard screen.
For now we can set from env randomHybridAnimation variable.
If true animation should be switching randomly. If false just
setting proper hybrid mode based on speed and RPM value.
Also increase childLocks touch target
Original from: Dominik Wawrzonek <dwawrzonek@ics.com>
Bug-AGL: SPEC-4971
Change-Id: I71f09c63bd1bfeda174f92feafc58019c23d07cb
Signed-off-by: Lisandro Pérez Meyer <lpmeyer@ics.com>
final GlobalKey<ScaffoldState> homeScaffoldKey = GlobalKey();
const debugDisplay = bool.fromEnvironment('DEBUG_DISPLAY');
const disableBkgAnimation = bool.fromEnvironment('DISABLE_BKG_ANIMATION');
+const randomHybridAnimation = bool.fromEnvironment('RANDOM_HYBRID_ANIMATION');
return UsersNotifier(Users.initial());
});
-final hybridtateProvider = StateNotifierProvider<HybridNotifier, Hybrid>((ref) {
+final hybridStateProvider =
+ StateNotifierProvider<HybridNotifier, Hybrid>((ref) {
return HybridNotifier(const Hybrid.initial());
});
StateNotifierProvider<CurrentTimeNotifier, DateTime>((ref) {
return CurrentTimeNotifier();
});
+
state = state.copyWith(hybridState: hybridState);
}
- void updateHybridState() {
+ void updateHybridState(double speed, double engineSpeed, bool brake) {
// Variable to store the current state
HybridState currentState = state.hybridState;
// Variable for storing the average value of RPM
double avgRpm = 0.0;
- // Variable to store the brake value state
- bool brake = false;
-
- // Collect 10 samples
- for (int i = 0; i < 10; i++) {
- // Get the current values for speed, engine rpm and brake status
-
- // speed = vehicleProvider();
- // rpm = _rpmFromServer();
- // brake = _brakeFromServer();
-
- // Calculate the average speed value
- // avgSpeed = (avgSpeed * (i + 1) + speed) / (i + 2);
-
- // Calculate the average engine rpm
- // avgRpm = (avgRpm * (i + 1) + rpm) / (i + 2);
+
+ if (speed == 0 && engineSpeed == 0) {
+ // Set idle state.
+ currentState = HybridState.idle;
+ } else if (engineSpeed > 0 && speed > 0) {
+ // Set stan na engine output state..
+ currentState = HybridState.engineOutput;
+ } else if (speed < 0 && brake) {
+ // Set regenerative breaking state
+ currentState = HybridState.regenerativeBreaking;
+ } else if (speed > 0 && engineSpeed <= 0) {
+ // Set battery output state
+ currentState = HybridState.baterryOutput;
}
- // define new state
- // if (avgSpeed == 0 && avgRpm == 0) {
- // currentState = HybridState.idle;
- // } else if (avgRpm > 0 && avgSpeed > 0) {
- // currentState = HybridState.engineOutput;
- // } else if (avgRpm == 0 && brake) {
- // currentState = HybridState.regenerativeBreaking;
- // } else if (avgSpeed > 0 && avgRpm <= avgSpeed) {
- // currentState = HybridState.baterryOutput;
- // }
-
// Update hybrid state
if (currentState != previousState) {
- state = state.copyWith(hybridState: currentState);
+ //state = state.copyWith(hybridState: currentState);
+ setHybridState(currentState);
}
}
}
debugPrint('Tapped child lock left');
ref.read(vehicleProvider.notifier).setChildLock(side: 'left');
},
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.end,
- children: [
- const Text(
- 'Child Lock',
- style: TextStyle(
- fontSize: 26, // Set the font size to 26
- ),
- ),
- Wrap(
- crossAxisAlignment: WrapCrossAlignment.center,
- children: [
- Icon(
- isChildLockActiveLeft ? Icons.lock : Icons.lock_open,
- color: isChildLockActiveLeft ? Colors.white : Colors.redAccent,
- size: 16,
+ child: Container(
+ height: 120,
+ width: 150,
+ color: Colors.transparent,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.end,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ const Text(
+ 'Child Lock',
+ style: TextStyle(
+ fontSize: 26, // Set the font size to 26
),
- Text(
- isChildLockActiveLeft ? 'Activated' : 'Unlocked',
- style: TextStyle(
- color: isChildLockActiveLeft ? Colors.white : Colors.redAccent,
- fontSize: 26, // Set the font size to 26
+ ),
+ Wrap(
+ crossAxisAlignment: WrapCrossAlignment.center,
+ children: [
+ Icon(
+ isChildLockActiveLeft ? Icons.lock : Icons.lock_open,
+ color:
+ isChildLockActiveLeft ? Colors.white : Colors.redAccent,
+ size: 16,
),
- ),
- ],
- ),
- ],
+ Text(
+ isChildLockActiveLeft ? 'Activated' : 'Unlocked',
+ style: TextStyle(
+ color:
+ isChildLockActiveLeft ? Colors.white : Colors.redAccent,
+ fontSize: 26, // Set the font size to 26
+ ),
+ ),
+ ],
+ ),
+ ],
+ ),
),
);
}
debugPrint('Tapped child lock right');
ref.read(vehicleProvider.notifier).setChildLock(side: 'right');
},
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- const Text(
- 'Child Lock',
- style: TextStyle(
- fontSize: 26, // Set the font size to 26
+ child: Container(
+ height: 120,
+ width: 150,
+ color: Colors.transparent,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ const Text(
+ 'Child Lock',
+ style: TextStyle(
+ fontSize: 26, // Set the font size to 26
+ ),
),
- ),
- Wrap(
- crossAxisAlignment: WrapCrossAlignment.center,
- children: [
- Text(
- isChildLockActiveRight ? 'Activated' : 'Unlocked',
- style: TextStyle(
- color: isChildLockActiveRight ? Colors.white : Colors.redAccent,
- fontSize: 26, // Set the font size to 26
+ Wrap(
+ crossAxisAlignment: WrapCrossAlignment.center,
+ children: [
+ Text(
+ isChildLockActiveRight ? 'Activated' : 'Unlocked',
+ style: TextStyle(
+ color: isChildLockActiveRight
+ ? Colors.white
+ : Colors.redAccent,
+ fontSize: 26, // Set the font size to 26
+ ),
),
- ),
- Icon(
- isChildLockActiveRight ? Icons.lock : Icons.lock_open,
- color: isChildLockActiveRight ? Colors.white : Colors.redAccent,
- size: 16,
- ),
- ],
- ),
- ],
+ Icon(
+ isChildLockActiveRight ? Icons.lock : Icons.lock_open,
+ color:
+ isChildLockActiveRight ? Colors.white : Colors.redAccent,
+ size: 16,
+ ),
+ ],
+ ),
+ ],
+ ),
),
);
}
+import 'dart:async';
import 'dart:math';
import 'package:flutter_ics_homescreen/export.dart';
late AnimationController _animationController;
late Animation<double> _animation;
static bool _isAnimationPlayed = false;
+ late Timer timer;
@override
void initState() {
_isAnimationPlayed = true;
});
}
+
+ if (randomHybridAnimation) {
+ timer = Timer.periodic(const Duration(seconds: 5), (timer) {
+ Random random = Random();
+ int randomState = random.nextInt(4);
+ var hybridState = HybridState.values[randomState];
+ ref.read(hybridStateProvider.notifier).setHybridState(hybridState);
+ });
+ }
}
@override
void dispose() {
_animationController.dispose();
+ timer.cancel();
super.dispose();
}
Widget fadeContent = FadeTransition(
opacity: _animation,
- child: Column(
+ child: const Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
- const Row(
+ Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
//mainAxisSize: MainAxisSize.max,
children: [
FuelProgressIndicator(),
],
),
- GestureDetector(
- onTap: () {
- Random random = Random();
- int randomState = random.nextInt(4);
- var hybridState = HybridState.values[randomState];
- ref
- .read(hybridtateProvider.notifier)
- .setHybridState(hybridState);
- },
- child: const HybridModel()),
- const Row(
+ HybridModel(),
+ Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TemperatureWidget(),
RangeWidget(),
],
),
- const CarStatus(),
+ CarStatus(),
],
));
return Align(
alignment: const Alignment(0, -0.75),
child: Consumer(builder: (context, ref, child) {
- final state = ref.watch(hybridtateProvider.select((hybrid) => hybrid));
+ final state = ref.watch(hybridStateProvider.select((hybrid) => hybrid));
Widget? widget;
switch (state.topArrowState) {
case ArrowState.blue:
return Align(
alignment: const Alignment(-0.7, 0.5),
child: Consumer(builder: (context, ref, child) {
- final state = ref.watch(hybridtateProvider.select((hybrid) => hybrid));
+ final state = ref.watch(hybridStateProvider.select((hybrid) => hybrid));
Widget? widget;
switch (state.leftArrowState) {
case ArrowState.blue:
return Align(
alignment: const Alignment(0.70, 0.5),
child: Consumer(builder: (context, ref, child) {
- final state = ref.watch(hybridtateProvider.select((hybrid) => hybrid));
+ final state = ref.watch(hybridStateProvider.select((hybrid) => hybrid));
Widget? widget;
switch (state.rightArrowState) {
@override
Widget build(BuildContext context, WidgetRef ref) {
final batteryState =
- ref.watch(hybridtateProvider.select((hybrid) => hybrid.batteryState));
+ ref.watch(hybridStateProvider.select((hybrid) => hybrid.batteryState));
return Align(
alignment: const Alignment(0, 0.8),
child: SvgPicture.asset(
import 'package:flutter_ics_homescreen/export.dart';
-class HybridModel extends StatefulWidget {
+class HybridModel extends ConsumerStatefulWidget {
const HybridModel({super.key});
@override
- State<HybridModel> createState() => _HybridModelState();
+ HybridModelState createState() => HybridModelState();
}
-class _HybridModelState extends State<HybridModel> {
+class HybridModelState extends ConsumerState<HybridModel> {
+
@override
Widget build(BuildContext context) {
-
- return GestureDetector(
- child: const SizedBox(
- width: 500,
- height: 500,
- child: Stack(
- children: [
- HybridBackround(),
- TopArrow(),
- LeftArrow(),
- RightArrow(),
- BatteryHybrid(),
- ],
- ),
+ if (!randomHybridAnimation) {
+ ref.listen<Vehicle>(vehicleProvider, (Vehicle? previous, Vehicle next) {
+ ref.watch(hybridStateProvider.notifier).updateHybridState(
+ next.speed,
+ next.engineSpeed,
+ false); //TODO get brake value and improve state logic
+ });
+ }
+
+ return const SizedBox(
+ width: 500,
+ height: 500,
+ child: Stack(
+ children: [
+ HybridBackround(),
+ TopArrow(),
+ LeftArrow(),
+ RightArrow(),
+ BatteryHybrid(),
+ ],
),
);
}