diff --git a/GeoClient/GeoClient/Services/Utils/PrerequisitesChecking.cs b/GeoClient/GeoClient/Services/Utils/PrerequisitesChecking.cs index 1bde4ff..5d457cf 100644 --- a/GeoClient/GeoClient/Services/Utils/PrerequisitesChecking.cs +++ b/GeoClient/GeoClient/Services/Utils/PrerequisitesChecking.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace GeoClient.Services.Utils +namespace GeoClient.Services.Utils { public delegate bool BooleanDelegate(); diff --git a/GeoClient/GeoClient/Views/ItemDetailPage.xaml.cs b/GeoClient/GeoClient/Views/ItemDetailPage.xaml.cs index 4710e49..6d8ea21 100644 --- a/GeoClient/GeoClient/Views/ItemDetailPage.xaml.cs +++ b/GeoClient/GeoClient/Views/ItemDetailPage.xaml.cs @@ -2,6 +2,7 @@ using GeoClient.ViewModels; using GeoClient.Views.Utils; using System; +using System.Collections.Generic; using System.Threading.Tasks; using Xamarin.Essentials; using Xamarin.Forms; @@ -84,11 +85,11 @@ private async void OpenLocation_Clicked(object sender, EventArgs e) { var item = _viewModel.IncidentItem; - var geoUri = GeoPointUtil.CreateGeoUri(item.Location, "GeoClient: Berufungsort"); + var uriList = GeoPointUtil.CreateUrisForGeoPoint(item.Location, "GeoClient: Berufungsort"); - if (geoUri != null) + if (uriList != null) { - await Launcher.OpenAsync(geoUri); + await OpenFirstSupportedUri(uriList); } else { @@ -100,11 +101,11 @@ private async void OpenDestination_Clicked(object sender, EventArgs e) { var item = _viewModel.IncidentItem; - var geoUri = GeoPointUtil.CreateGeoUri(item.Destination, "GeoClient: Zielort"); + var uriList = GeoPointUtil.CreateUrisForGeoPoint(item.Destination, "GeoClient: Zielort"); - if (geoUri != null) + if (uriList != null) { - await Launcher.OpenAsync(geoUri); + await OpenFirstSupportedUri(uriList); } else { @@ -112,6 +113,26 @@ private async void OpenDestination_Clicked(object sender, EventArgs e) } } + private async Task OpenFirstSupportedUri(List uriList) + { + bool uriOpened = false; + foreach (Uri uri in uriList) + { + var uriSupported = await Launcher.CanOpenAsync(uri); + if (uriSupported) + { + await Launcher.OpenAsync(uri); + uriOpened = true; + break; + } + } + + if (!uriOpened) + { + await ShowNoAppForGeoUriError(); + } + } + private async Task ShowGeoUriNotAvailableError() { await DisplayAlert( @@ -119,5 +140,13 @@ await DisplayAlert( "Die Adresse konnte leider nicht automatisch verortet werden.", "OK"); } + + private async Task ShowNoAppForGeoUriError() + { + await DisplayAlert( + "Keine passende App gefunden", + "Es konnte keine passende App für den Link gefunden werden. Bitte installiere ein Kartenprogramm wie z.B. Google Maps.", + "OK"); + } } } \ No newline at end of file diff --git a/GeoClient/GeoClient/Views/Utils/GeoPointUtil.cs b/GeoClient/GeoClient/Views/Utils/GeoPointUtil.cs index 18f0967..cf53978 100644 --- a/GeoClient/GeoClient/Views/Utils/GeoPointUtil.cs +++ b/GeoClient/GeoClient/Views/Utils/GeoPointUtil.cs @@ -1,41 +1,85 @@ -using System; +using GeoClient.Models; +using System; +using System.Collections.Generic; using System.Globalization; using System.Web; -using GeoClient.Models; +using Xamarin.Forms; namespace GeoClient.Views.Utils { public class GeoPointUtil { - public static Uri CreateGeoUri(GeoPoint geoPoint, string geoPointerTag) + public static bool NotBlank(string inputString) + { + return inputString != null && inputString.Trim() != ""; + } + + public static List CreateUrisForGeoPoint(GeoPoint geoPoint, string geoPointerTag) { - Uri geoUri = null; + List uriList = null; if (GeoPointUtil.IsGeoPointValid(geoPoint)) { - var request = string.Format( - "geo:{0},{1}?q={0},{1}({2})", - geoPoint.Latitude.ToString(CultureInfo.InvariantCulture), - geoPoint.Longitude.ToString(CultureInfo.InvariantCulture), - HttpUtility.UrlEncode(geoPointerTag)); - geoUri = new Uri(request); + uriList = new List(); + string latitudeString = geoPoint.Latitude.ToString(CultureInfo.InvariantCulture); + string longitudeString = geoPoint.Longitude.ToString(CultureInfo.InvariantCulture); + + uriList.Add(CreateGeoUri(latitudeString, longitudeString, geoPointerTag)); + if (IsRunningOnIOS()) + { + uriList.Add(CreateAppleMapsUri(latitudeString, longitudeString, geoPointerTag)); + uriList.Add(CreateGoogleMapsUri(latitudeString, longitudeString)); + } else + { + uriList.Add(CreateGoogleMapsUri(latitudeString, longitudeString)); + uriList.Add(CreateAppleMapsUri(latitudeString, longitudeString, geoPointerTag)); + } } else { Console.WriteLine("Cannot create geo URI for geo point: " + geoPoint); } - return geoUri; + return uriList; } - private static bool IsGeoPointValid(GeoPoint geoPoint) + private static Uri CreateGeoUri(string latitudeString, string longitudeString, string geoPointerTag) { - return geoPoint != null; + var uriString = string.Format( + "geo:{0},{1}?q={0},{1}({2})", + latitudeString, + longitudeString, + HttpUtility.UrlEncode(geoPointerTag)); + return new Uri(uriString); } - public static bool NotBlank(string inputString) + private static Uri CreateGoogleMapsUri(string latitudeString, string longitudeString) { - return inputString != null && inputString.Trim() != ""; + var uriString = string.Format( + "https://www.google.com/maps/search/?api=1&query={0},{1}", + latitudeString, + longitudeString); + return new Uri(uriString); + } + + private static Uri CreateAppleMapsUri(string latitudeString, string longitudeString, string geoPointerTag) + { + var uriString = string.Format( + "http://maps.apple.com/?ll={0},{1}&q={2}", + latitudeString, + longitudeString, + HttpUtility.UrlEncode(geoPointerTag)); + return new Uri(uriString); + } + + private static bool IsRunningOnIOS() + { + return Device.RuntimePlatform == Device.iOS; + } + + private static bool IsGeoPointValid(GeoPoint geoPoint) + { + return geoPoint != null; } } }