walking_page.dart 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_activity_recognition/flutter_activity_recognition.dart';
  4. import 'package:geolocator/geolocator.dart' hide ActivityType;
  5. import 'package:rxdart/rxdart.dart';
  6. import 'models/score.dart';
  7. import 'services/walking_services.dart';
  8. class WalkingPage extends StatefulWidget {
  9. WalkingPage({Key? key}) : super(key: key);
  10. @override
  11. State<WalkingPage> createState() => _WalkingPageState();
  12. }
  13. class _WalkingPageState extends State<WalkingPage> {
  14. final FlutterActivityRecognition activityRecognition = FlutterActivityRecognition.instance;
  15. final StreamController<Position> _streamController = StreamController.broadcast();
  16. final StreamController<ActivityType> _simulatedActivityController = StreamController.broadcast();
  17. late Stream<dynamic> _activityPositionStream;
  18. num distance = 0;
  19. Position? lastPosition;
  20. @override
  21. void initState() {
  22. _simulatedActivityController.stream.listen(print);
  23. _activityPositionStream = CombineLatestStream.combine2(
  24. _simulatedActivityController.stream,
  25. Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 5)),
  26. (ActivityType a, Position b) => [a, b],
  27. );
  28. super.initState();
  29. }
  30. @override
  31. void dispose() {
  32. _streamController.close();
  33. super.dispose();
  34. }
  35. void addScore() {
  36. WalkingServices.addScore(Score(points: 45, distance: 500));
  37. }
  38. @override
  39. Widget build(BuildContext context) {
  40. Geolocator.getPositionStream(locationSettings: LocationSettings(distanceFilter: 1)).listen((position) {
  41. _streamController.add(position);
  42. print(position);
  43. });
  44. return Scaffold(
  45. body: Center(
  46. child: Column(
  47. mainAxisAlignment: MainAxisAlignment.center,
  48. children: [
  49. ElevatedButton(
  50. onPressed: () => _simulatedActivityController.add(ActivityType.WALKING),
  51. child: Text("WALKING"),
  52. ),
  53. ElevatedButton(
  54. onPressed: () => _simulatedActivityController.add(ActivityType.RUNNING),
  55. child: Text("RUNNING"),
  56. ),
  57. ElevatedButton(
  58. onPressed: () => _simulatedActivityController.add(ActivityType.STILL),
  59. child: Text("STILL"),
  60. ),
  61. StreamBuilder<dynamic>(
  62. stream: _activityPositionStream,
  63. builder: (context, snapshot) {
  64. if (!snapshot.hasData) {
  65. return CircularProgressIndicator();
  66. }
  67. var activity = snapshot.data![0];
  68. var position = snapshot.data![1];
  69. if (activity == ActivityType.RUNNING || activity == ActivityType.WALKING) {
  70. if (lastPosition != null) {
  71. distance += Geolocator.distanceBetween(
  72. lastPosition!.latitude, lastPosition!.longitude, position.latitude, position.longitude);
  73. }
  74. }
  75. else{
  76. if(distance>0){
  77. var points=distance/10;
  78. WalkingServices.addScore(Score(points: points.floor(), distance: distance.floor()));
  79. distance=0;
  80. }
  81. }
  82. lastPosition = position;
  83. print(distance);
  84. return Text("$distance");
  85. },
  86. ),
  87. ],
  88. ),
  89. ),
  90. );
  91. }
  92. Future<bool> isPermissionGrants() async {
  93. // Check if the user has granted permission. If not, request permission.
  94. PermissionRequestResult reqResult;
  95. reqResult = await activityRecognition.checkPermission();
  96. if (reqResult == PermissionRequestResult.PERMANENTLY_DENIED) {
  97. print('Permission is permanently denied.');
  98. return false;
  99. } else if (reqResult == PermissionRequestResult.DENIED) {
  100. reqResult = await activityRecognition.requestPermission();
  101. if (reqResult != PermissionRequestResult.GRANTED) {
  102. print('Permission is denied.');
  103. return false;
  104. }
  105. }
  106. return true;
  107. }
  108. Future<void> _getPermissions() async {
  109. bool serviceEnabled;
  110. LocationPermission permission;
  111. // Test if location services are enabled.
  112. serviceEnabled = await Geolocator.isLocationServiceEnabled();
  113. if (!serviceEnabled) {
  114. // Location services are not enabled don't continue
  115. // accessing the position and request users of the
  116. // App to enable the location services.
  117. return Future.error('Location services are disabled.');
  118. }
  119. permission = await Geolocator.checkPermission();
  120. if (permission == LocationPermission.denied) {
  121. permission = await Geolocator.requestPermission();
  122. if (permission == LocationPermission.denied) {
  123. // Permissions are denied, next time you could try
  124. // requesting permissions again (this is also where
  125. // Android's shouldShowRequestPermissionRationale
  126. // returned true. According to Android guidelines
  127. // your App should show an explanatory UI now.
  128. return Future.error('Location permissions are denied');
  129. }
  130. }
  131. if (permission == LocationPermission.deniedForever) {
  132. // Permissions are denied forever, handle appropriately.
  133. return Future.error('Location permissions are permanently denied, we cannot request permissions.');
  134. }
  135. }
  136. }
  137. /*
  138. Get distance only when walking or running
  139. if (walking || running) {
  140. calculateScore()
  141. }
  142. */
  143. // --W---R----W----S----W------
  144. // --P--P--P--P--P--P
  145. // --[W,P]--[W,P]--[R,P]--