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 createState() => _WalkingState(); } class _WalkingState extends State { final FlutterActivityRecognition activityRecognition = FlutterActivityRecognition.instance; final StreamController _streamController = StreamController.broadcast(); final StreamController _simulatedActivityController = StreamController.broadcast(); late Stream _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( // 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]--