GeoHandler.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Windows.Devices.Geolocation;
  6. using Windows.Devices.Geolocation.Geofencing;
  7. using Windows.System;
  8. using YJMPD_UWP.Helpers.EventArgs;
  9. namespace YJMPD_UWP.Model
  10. {
  11. public class GeoHandler
  12. {
  13. private Geolocator geo;
  14. private PositionStatus _status;
  15. public PositionStatus Status { get { return _status; } }
  16. private Geoposition _position;
  17. public Geoposition Position { get { return _position; } }
  18. public bool? Connected { get; private set; }
  19. private List<Geoposition> _history;
  20. public List<Geoposition> History
  21. {
  22. get
  23. {
  24. return _history;
  25. }
  26. }
  27. //Events
  28. public delegate void OnPositionUpdateHandler(object sender, PositionUpdatedEventArgs e);
  29. public event OnPositionUpdateHandler OnPositionUpdate;
  30. public delegate void OnStatusUpdateHandler(object sender, PositionStatusUpdatedEventArgs e);
  31. public event OnStatusUpdateHandler OnStatusUpdate;
  32. public GeoHandler()
  33. {
  34. _status = PositionStatus.NotInitialized;
  35. Connected = false;
  36. _history = new List<Geoposition>();
  37. StartTracking();
  38. }
  39. public async void ForceRefresh()
  40. {
  41. if (geo == null)
  42. await StartTracking();
  43. else
  44. _position = await geo.GetGeopositionAsync();
  45. }
  46. public async void TryConnectIfNull()
  47. {
  48. if (geo == null)
  49. await StartTracking();
  50. }
  51. public void ClearHistory()
  52. {
  53. _history.Clear();
  54. }
  55. public async Task<String> StartTracking()
  56. {
  57. // Request permission to access location
  58. if (Status != PositionStatus.NotAvailable && Status != PositionStatus.NotInitialized)
  59. return "Already Connected";
  60. var accessStatus = await Geolocator.RequestAccessAsync();
  61. switch (accessStatus)
  62. {
  63. case GeolocationAccessStatus.Allowed:
  64. geo = new Geolocator
  65. {
  66. DesiredAccuracy = PositionAccuracy.High,
  67. MovementThreshold = 3
  68. //ReportInterval = 1500
  69. };
  70. ClearHistory();
  71. Connected = true;
  72. geo.PositionChanged += Geo_PositionChanged;
  73. geo.StatusChanged += Geo_StatusChanged;
  74. GeofenceMonitor.Current.Geofences.Clear();
  75. _position = await geo.GetGeopositionAsync();
  76. return "Connected";
  77. case GeolocationAccessStatus.Denied:
  78. Connected = false;
  79. _status = PositionStatus.NotAvailable;
  80. bool result = await Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
  81. return "Denied";
  82. default:
  83. case GeolocationAccessStatus.Unspecified:
  84. Connected = false;
  85. _status = PositionStatus.NotAvailable;
  86. return "Error";
  87. }
  88. }
  89. private void Geo_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
  90. {
  91. if (args.Status == PositionStatus.Disabled)
  92. {
  93. Connected = false;
  94. _position = null;
  95. }
  96. else if (!(bool)Connected)
  97. Connected = true;
  98. UpdateStatus(args.Status);
  99. }
  100. private void Geo_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
  101. {
  102. if (_history.Count > 0)
  103. UpdatePosition(_history.Last(), args.Position);
  104. else
  105. {
  106. _position = args.Position;
  107. UpdatePosition(args.Position, args.Position);
  108. }
  109. _history.Add(args.Position);
  110. }
  111. private void UpdateStatus(PositionStatus s)
  112. {
  113. _status = s;
  114. if (OnStatusUpdate == null) return;
  115. OnStatusUpdate(this, new PositionStatusUpdatedEventArgs(s));
  116. }
  117. private void UpdatePosition(Geoposition old, Geoposition newp)
  118. {
  119. _position = newp;
  120. if (OnPositionUpdate == null) return;
  121. OnPositionUpdate(this, new PositionUpdatedEventArgs(old, newp));
  122. }
  123. }
  124. }