From acb41db1fb383b4642ae53078a28477b45320a89 Mon Sep 17 00:00:00 2001 From: Joe Manke Date: Tue, 5 Nov 2019 08:52:34 -0600 Subject: [PATCH] [Android Maps] Check for location permissions when IsShowingUser=true (#7282) fixes #4691 * Check for location permissions when IsShowingUser=true instead of crashing * Fix courseLocationPermission -> coarseLocationPermission Co-Authored-By: Samantha Houts --- Xamarin.Forms.Maps.Android/MapRenderer.cs | 37 +++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/Xamarin.Forms.Maps.Android/MapRenderer.cs b/Xamarin.Forms.Maps.Android/MapRenderer.cs index a2192f5..1db7dc8 100644 --- a/Xamarin.Forms.Maps.Android/MapRenderer.cs +++ b/Xamarin.Forms.Maps.Android/MapRenderer.cs @@ -5,10 +5,13 @@ using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Linq; +using Android; using Android.Content; +using Android.Content.PM; using Android.Gms.Maps; using Android.Gms.Maps.Model; using Android.OS; +using Android.Support.V4.Content; using Java.Lang; using Xamarin.Forms.Internals; using Xamarin.Forms.Platform.Android; @@ -175,7 +178,7 @@ namespace Xamarin.Forms.Maps.Android if (e.PropertyName == Map.IsShowingUserProperty.PropertyName) { - gmap.MyLocationEnabled = gmap.UiSettings.MyLocationButtonEnabled = Map.IsShowingUser; + SetUserVisible(); } else if (e.PropertyName == Map.HasScrollEnabledProperty.PropertyName) { @@ -229,7 +232,7 @@ namespace Xamarin.Forms.Maps.Android map.UiSettings.ZoomControlsEnabled = Map.HasZoomEnabled; map.UiSettings.ZoomGesturesEnabled = Map.HasZoomEnabled; map.UiSettings.ScrollGesturesEnabled = Map.HasScrollEnabled; - map.MyLocationEnabled = map.UiSettings.MyLocationButtonEnabled = Map.IsShowingUser; + SetUserVisible(); SetMapType(); } @@ -779,6 +782,36 @@ namespace Xamarin.Forms.Maps.Android } #endregion + + void SetUserVisible() + { + GoogleMap map = NativeMap; + if (map == null) + { + return; + } + + if (Map.IsShowingUser) + { + var coarseLocationPermission = ContextCompat.CheckSelfPermission(Context, Manifest.Permission.AccessCoarseLocation); + var fineLocationPermission = ContextCompat.CheckSelfPermission(Context, Manifest.Permission.AccessFineLocation); + + if (coarseLocationPermission == Permission.Granted || fineLocationPermission == Permission.Granted) + { + map.MyLocationEnabled = map.UiSettings.MyLocationButtonEnabled = true; + } + else + { + Log.Warning("Xamarin.Forms.MapRenderer", "Missing location permissions for IsShowingUser"); + map.MyLocationEnabled = map.UiSettings.MyLocationButtonEnabled = false; + } + } + else + { + map.MyLocationEnabled = map.UiSettings.MyLocationButtonEnabled = false; + } + } + void IOnMapReadyCallback.OnMapReady(GoogleMap map) { NativeMap = map; -- 2.7.4