using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.Devices.Geolocation;
using Windows.Services.Maps;
using Windows.Storage.Streams;
using Windows.UI;
using Windows.UI.Core;
using Windows.UI.Xaml.Automation;
using Windows.UI.Xaml.Controls.Maps;
using Windows.UI.Xaml.Shapes;
using Breda_Tour.CustomControls;
using System.Diagnostics;
using Windows.Devices.Geolocation.Geofencing;
using Windows.UI.Xaml.Automation.Peers;
using Breda_Tour.Data;
using Breda_Tour.RouteSelectScreen;
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
namespace Breda_Tour.MapScreen
{
///
/// An empty page that can be used on its own or navigated to within a Frame.
///
public sealed partial class MapPage : Page
{
private MapIcon marker;
private Geopoint point;
private Gps gps;
private Route route;
public MapPage()
{
GeofenceMonitor.Current.GeofenceStateChanged += OnGeofenceStateChange;
this.NavigationCacheMode = NavigationCacheMode.Enabled;
marker = new MapIcon();
marker.Image = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/Marker.png"));
marker.NormalizedAnchorPoint = new Point(0.5, 0.5);
gps = new Gps(this);
gps.Start();
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Collapsed;
DefaultPivot.SetCheckedButton(DefaultPivotControl.Tab.Map);
if (RouteExample.fromRouteExamp)
{
RouteExample.fromRouteExamp = false;
route = e.Parameter as Route;
Map.MapElements.Clear();
gps.History.Clear();
gps.Refresh();
ShowWaypoints(route);
//ShowRoute();
}
}
public async void ShowLocaton(Geopoint point)
{
this.point = point;
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
Map.Center = point;
if (!Map.MapElements.Contains(marker))
{
Map.MapElements.Add(marker);
}
marker.Location = point;
});
await Map.TrySetViewAsync(point, 17);
}
public async void ShowRoute()
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
Map.Routes.Add(RouteExample.routeView);
});
//await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
//{
// List geopoints = new List();
// foreach (Waypoint wayPoint in route.Waypoints)
// {
// geopoints.Add(wayPoint.Position);
// }
// MapRouteFinderResult finder = await MapRouteFinder.GetWalkingRouteFromWaypointsAsync(geopoints);
// if (finder.Status == MapRouteFinderStatus.Success)
// {
// MapRouteView routeView = new MapRouteView(finder.Route);
// routeView.RouteColor = Colors.Firebrick;
// routeView.OutlineColor = Colors.Black;
// Map.Routes.Add(routeView);
// }
//});
}
public async void ShowWaypoints(Route route)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
GeofenceMonitor.Current.Geofences.Clear();
for (int x = 0; x < route.Waypoints.Count; x++)
{
//Waypoints handeling
Waypoint wayp = route.Waypoints.ElementAt(x);
MapIcon wp = new MapIcon { Location = wayp.Position, Title = (x + 1).ToString() };
Map.MapElements.Add(wp);
//Geofencing handeling
string name = $"Fence {(x + 1).ToString()}";
GeofenceMonitor.Current.Geofences.Add(new Geofence(name,new Geocircle(wayp.Position.Position,10), MonitoredGeofenceStates.Entered, true,TimeSpan.FromSeconds(3)));
Debug.Write("Geofences count: "+ GeofenceMonitor.Current.Geofences.Count);
}
//foreach (var waypoint in route.WayPoints)
//{
// MapIcon wp = new MapIcon() {Location = waypoint.Position, Title = waypoint.number.ToString()};
// Map.MapElements.Add(wp);
//}
});
}
private void Map_OnMapElementClick(MapControl sender, MapElementClickEventArgs args)
{
MapIcon Icon = args.MapElements.FirstOrDefault(x => x is MapIcon) as MapIcon;
for (int x = 0; x < route.Waypoints.Count; x++)
{
if (Icon.Title != "")
{
if (x + 1 == int.Parse(Icon.Title))
{
MainPage.RootFrame.Navigate(typeof(WpDetailPage), route.Waypoints.ElementAt(x));
}
}
}
//foreach (var waypoint in route.WayPoints)
//{
// if (Icon.Title != "")
// {
// if (waypoint.number == int.Parse(Icon.Title))
// {
// MainPage.RootFrame.Navigate(typeof(WpDetailPage), waypoint);
// }
// }
//}
}
public async void DrawWalkingPath(List positions)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
MapPolyline mapPolyline = new MapPolyline();
mapPolyline.StrokeColor = Colors.Blue;
mapPolyline.StrokeThickness = 3;
mapPolyline.Path = new Geopath(positions);
Map.MapElements.Add(mapPolyline);
});
}
private void OnGeofenceStateChange(GeofenceMonitor sender, object args)
{
Debug.Write("Kappa circle entered!!");
}
}
}