|
@@ -0,0 +1,171 @@
|
|
|
|
|
+import 'dart:async';
|
|
|
|
|
+import 'package:flutter/material.dart';
|
|
|
|
|
+import 'package:flutter_activity_recognition/flutter_activity_recognition.dart';
|
|
|
|
|
+import 'package:geolocator/geolocator.dart' hide ActivityType;
|
|
|
|
|
+import 'package:rxdart/rxdart.dart';
|
|
|
|
|
+import '../models/score.dart';
|
|
|
|
|
+import '../services/walking_services.dart';
|
|
|
|
|
+
|
|
|
|
|
+class Walking extends StatefulWidget {
|
|
|
|
|
+ Walking({Key? key}) : super(key: key);
|
|
|
|
|
+
|
|
|
|
|
+ @override
|
|
|
|
|
+ State<Walking> createState() => _WalkingState();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+class _WalkingState extends State<Walking> {
|
|
|
|
|
+ final FlutterActivityRecognition activityRecognition = FlutterActivityRecognition.instance;
|
|
|
|
|
+ final StreamController<Position> _streamController = StreamController.broadcast();
|
|
|
|
|
+ final StreamController<ActivityType> _simulatedActivityController = StreamController.broadcast();
|
|
|
|
|
+ late Stream<dynamic> _activityPositionStream;
|
|
|
|
|
+
|
|
|
|
|
+ num distance = 0;
|
|
|
|
|
+ Position? lastPosition;
|
|
|
|
|
+ num points = 0;
|
|
|
|
|
+ num totalPoints = 0;
|
|
|
|
|
+ num totalDistance = 0;
|
|
|
|
|
+
|
|
|
|
|
+ @override
|
|
|
|
|
+ void initState() {
|
|
|
|
|
+ // _simulatedActivityController.stream.listen(print);
|
|
|
|
|
+ // activityRecognition.activityStream.listen((event) {
|
|
|
|
|
+ // print(event.type);
|
|
|
|
|
+ // });
|
|
|
|
|
+ _activityPositionStream = CombineLatestStream.combine2(
|
|
|
|
|
+ activityRecognition.activityStream,
|
|
|
|
|
+ // _simulatedActivityController.stream,
|
|
|
|
|
+ Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 10)),
|
|
|
|
|
+ (dynamic a, Position b) => [a, b],
|
|
|
|
|
+ );
|
|
|
|
|
+ _activityPositionStream.listen(_calculatePoints);
|
|
|
|
|
+ super.initState();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @override
|
|
|
|
|
+ void dispose() {
|
|
|
|
|
+ _streamController.close();
|
|
|
|
|
+ super.dispose();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void addScore() {
|
|
|
|
|
+ WalkingServices.addScore(Score(points: 45, distance: 500));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void _updatePoints(num newPoints) {
|
|
|
|
|
+ setState(() {
|
|
|
|
|
+ totalPoints += newPoints;
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void _updateDistance(num newDistance) {
|
|
|
|
|
+ setState(() {
|
|
|
|
|
+ totalDistance += newDistance;
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ void _calculatePoints(dynamic activityPosition) {
|
|
|
|
|
+ var activity = activityPosition[0];
|
|
|
|
|
+ var position = activityPosition[1];
|
|
|
|
|
+ if (activity == ActivityType.WALKING || activity == ActivityType.RUNNING) {
|
|
|
|
|
+ if (lastPosition != null) {
|
|
|
|
|
+ distance = Geolocator.distanceBetween(
|
|
|
|
|
+ lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude);
|
|
|
|
|
+ _updateDistance(distance);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (distance > 0 && activity == ActivityType.WALKING) {
|
|
|
|
|
+ points += distance / 10;
|
|
|
|
|
+ _updatePoints(points);
|
|
|
|
|
+ } else if (distance > 0 && activity == ActivityType.RUNNING) {
|
|
|
|
|
+ points += distance / 8;
|
|
|
|
|
+ _updatePoints(points);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (activity != ActivityType.WALKING && activity != ActivityType.RUNNING && points > 0) {
|
|
|
|
|
+ WalkingServices.addScore(Score(points: points.floor(), distance: 0));
|
|
|
|
|
+ points = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ lastPosition = position;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @override
|
|
|
|
|
+ Widget build(BuildContext context) {
|
|
|
|
|
+ Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 0)).listen((position) {
|
|
|
|
|
+ _streamController.add(position);
|
|
|
|
|
+ print(position);
|
|
|
|
|
+ });
|
|
|
|
|
+ return Scaffold(
|
|
|
|
|
+ body: Center(
|
|
|
|
|
+ child: Column(
|
|
|
|
|
+ mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
|
+ children: [
|
|
|
|
|
+ Text(
|
|
|
|
|
+ "Walked distance since start:\n$totalDistance m",
|
|
|
|
|
+ textAlign: TextAlign.center,
|
|
|
|
|
+ style: const TextStyle(fontSize: 24),
|
|
|
|
|
+ ),
|
|
|
|
|
+ const SizedBox(height: 32),
|
|
|
|
|
+ Text(
|
|
|
|
|
+ "Earned points since start:\n$totalPoints pts",
|
|
|
|
|
+ textAlign: TextAlign.center,
|
|
|
|
|
+ style: const TextStyle(fontSize: 24),
|
|
|
|
|
+ ),
|
|
|
|
|
+ // ElevatedButton(
|
|
|
|
|
+ // onPressed: () => _simulatedActivityController.add(ActivityType.WALKING),
|
|
|
|
|
+ // child: Text("WALKING"),
|
|
|
|
|
+ // ),
|
|
|
|
|
+ // ElevatedButton(
|
|
|
|
|
+ // onPressed: () => _simulatedActivityController.add(ActivityType.RUNNING),
|
|
|
|
|
+ // child: Text("RUNNING"),
|
|
|
|
|
+ // ),
|
|
|
|
|
+ // ElevatedButton(
|
|
|
|
|
+ // onPressed: () => _simulatedActivityController.add(ActivityType.STILL),
|
|
|
|
|
+ // child: Text("STILL"),
|
|
|
|
|
+ // ),
|
|
|
|
|
+ // StreamBuilder<dynamic>(
|
|
|
|
|
+ // stream: _activityPositionStream,
|
|
|
|
|
+ // builder: (context, snapshot) {
|
|
|
|
|
+ // if (!snapshot.hasData) {
|
|
|
|
|
+ // return CircularProgressIndicator();
|
|
|
|
|
+ // }
|
|
|
|
|
+ // var activity = snapshot.data![0];
|
|
|
|
|
+ // var position = snapshot.data![1];
|
|
|
|
|
+ // if (activity == ActivityType.WALKING || activity == ActivityType.RUNNING) {
|
|
|
|
|
+ // if (lastPosition != null) {
|
|
|
|
|
+ // distance = Geolocator.distanceBetween(
|
|
|
|
|
+ // lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude);
|
|
|
|
|
+ // }
|
|
|
|
|
+ // }
|
|
|
|
|
+ // if (distance > 0 && activity == ActivityType.WALKING) {
|
|
|
|
|
+ // points += distance / 10;
|
|
|
|
|
+ // } else if (distance > 0 && activity == ActivityType.RUNNING) {
|
|
|
|
|
+ // points += distance / 8;
|
|
|
|
|
+ // }
|
|
|
|
|
+ // if (activity != ActivityType.WALKING && activity != ActivityType.RUNNING && points > 0) {
|
|
|
|
|
+ // WalkingServices.addScore(Score(points: points.floor(), distance: 0));
|
|
|
|
|
+ // points = 0;
|
|
|
|
|
+ // }
|
|
|
|
|
+ // lastPosition = position;
|
|
|
|
|
+ // print(distance);
|
|
|
|
|
+ // return Text("$distance");
|
|
|
|
|
+ // },
|
|
|
|
|
+ // ),
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/*
|
|
|
|
|
+Get distance only when walking or running
|
|
|
|
|
+
|
|
|
|
|
+if (walking || running) {
|
|
|
|
|
+ calculateScore()
|
|
|
|
|
+}
|
|
|
|
|
+*/
|
|
|
|
|
+
|
|
|
|
|
+// --W---R----W----S----W------
|
|
|
|
|
+
|
|
|
|
|
+// --P--P--P--P--P--P
|
|
|
|
|
+
|
|
|
|
|
+// --[W,P]--[W,P]--[R,P]--
|