private async Task <bool> UpdateLocation() { bool locationChanged = false; if (Settings.DataSync == WearableDataSync.Off && Settings.FollowGPS && (location == null || location.locationType == LocationType.GPS)) { if (Activity != null && ContextCompat.CheckSelfPermission(Activity, Manifest.Permission.AccessFineLocation) != Permission.Granted) { RequestPermissions(new String[] { Manifest.Permission.AccessFineLocation }, PERMISSION_LOCATION_REQUEST_CODE); return(false); } Android.Locations.Location location = null; if (WearableHelper.IsGooglePlayServicesInstalled && !WearableHelper.HasGPS) { location = await mFusedLocationClient.GetLastLocationAsync(); if (location == null) { var mLocationRequest = new LocationRequest(); mLocationRequest.SetInterval(10000); mLocationRequest.SetFastestInterval(1000); mLocationRequest.SetPriority(LocationRequest.PriorityHighAccuracy); await mFusedLocationClient.RequestLocationUpdatesAsync(mLocationRequest, mLocCallback, null); await mFusedLocationClient.FlushLocationsAsync(); } } else { LocationManager locMan = Activity?.GetSystemService(Context.LocationService) as LocationManager; bool isGPSEnabled = (bool)locMan?.IsProviderEnabled(LocationManager.GpsProvider); bool isNetEnabled = (bool)locMan?.IsProviderEnabled(LocationManager.NetworkProvider); if (isGPSEnabled || isNetEnabled) { Criteria locCriteria = new Criteria() { Accuracy = Accuracy.Coarse, CostAllowed = false, PowerRequirement = Power.Low }; string provider = locMan.GetBestProvider(locCriteria, true); location = locMan.GetLastKnownLocation(provider); if (location == null) { locMan.RequestSingleUpdate(provider, mLocListnr, null); } } else { Toast.MakeText(Activity, Resource.String.error_retrieve_location, ToastLength.Short).Show(); } } if (location != null) { LocationData lastGPSLocData = await Settings.GetLastGPSLocData(); // Check previous location difference if (lastGPSLocData.query != null && mLocation != null && ConversionMethods.CalculateGeopositionDistance(mLocation, location) < 1600) { return(false); } if (lastGPSLocData.query != null && Math.Abs(ConversionMethods.CalculateHaversine(lastGPSLocData.latitude, lastGPSLocData.longitude, location.Latitude, location.Longitude)) < 1600) { return(false); } LocationQueryViewModel view = null; await Task.Run(async() => { view = await wm.GetLocation(location); if (String.IsNullOrEmpty(view.LocationQuery)) { view = new LocationQueryViewModel(); } }); if (String.IsNullOrWhiteSpace(view.LocationQuery)) { // Stop since there is no valid query return(false); } // Save location as last known lastGPSLocData.SetData(view, location); Settings.SaveHomeData(lastGPSLocData); this.location = lastGPSLocData; mLocation = location; locationChanged = true; } } return(locationChanged); }
private async Task <bool> UpdateLocation() { bool locationChanged = false; if (Settings.FollowGPS && (location == null || location.locationType == LocationType.GPS)) { Geoposition newGeoPos = null; try { newGeoPos = await geolocal.GetGeopositionAsync(TimeSpan.FromMinutes(15), TimeSpan.FromSeconds(10)); } catch (Exception) { var geoStatus = GeolocationAccessStatus.Unspecified; try { geoStatus = await Geolocator.RequestAccessAsync(); } catch (Exception ex) { Logger.WriteLine(LoggerLevel.Error, ex, "WeatherNow: GetWeather error"); } finally { if (geoStatus == GeolocationAccessStatus.Allowed) { try { newGeoPos = await geolocal.GetGeopositionAsync(TimeSpan.FromMinutes(15), TimeSpan.FromSeconds(10)); } catch (Exception ex) { Logger.WriteLine(LoggerLevel.Error, ex, "WeatherNow: GetWeather error"); } } else if (geoStatus == GeolocationAccessStatus.Denied) { // Disable gps feature Settings.FollowGPS = false; } } if (!Settings.FollowGPS) { return(false); } } // Access to location granted if (newGeoPos != null) { LocationData lastGPSLocData = await Settings.GetLastGPSLocData(); // Check previous location difference if (lastGPSLocData.query != null && geoPos != null && ConversionMethods.CalculateGeopositionDistance(geoPos, newGeoPos) < geolocal.MovementThreshold) { return(false); } if (lastGPSLocData.query != null && Math.Abs(ConversionMethods.CalculateHaversine(lastGPSLocData.latitude, lastGPSLocData.longitude, newGeoPos.Coordinate.Point.Position.Latitude, newGeoPos.Coordinate.Point.Position.Longitude)) < geolocal.MovementThreshold) { return(false); } LocationQueryViewModel view = null; await Task.Run(async() => { view = await wm.GetLocation(newGeoPos); if (String.IsNullOrEmpty(view.LocationQuery)) { view = new LocationQueryViewModel(); } }); if (String.IsNullOrWhiteSpace(view.LocationQuery)) { // Stop since there is no valid query return(false); } // Save oldkey string oldkey = lastGPSLocData.query; // Save location as last known lastGPSLocData.SetData(view, newGeoPos); Settings.SaveLastGPSLocData(lastGPSLocData); // Update tile id for location if (oldkey != null && SecondaryTileUtils.Exists(oldkey)) { await SecondaryTileUtils.UpdateTileId(oldkey, lastGPSLocData.query); } location = lastGPSLocData; geoPos = newGeoPos; locationChanged = true; } } return(locationChanged); }
private async Task <bool> UpdateLocation() { bool locationChanged = false; if (Settings.FollowGPS && (location == null || location.locationType == LocationType.GPS)) { if (AppCompatActivity != null && ContextCompat.CheckSelfPermission(AppCompatActivity, Manifest.Permission.AccessFineLocation) != Permission.Granted && ContextCompat.CheckSelfPermission(AppCompatActivity, Manifest.Permission.AccessCoarseLocation) != Permission.Granted) { ActivityCompat.RequestPermissions(AppCompatActivity, new String[] { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation }, PERMISSION_LOCATION_REQUEST_CODE); return(false); } LocationManager locMan = AppCompatActivity?.GetSystemService(Context.LocationService) as LocationManager; bool isGPSEnabled = (bool)locMan?.IsProviderEnabled(LocationManager.GpsProvider); bool isNetEnabled = (bool)locMan?.IsProviderEnabled(LocationManager.NetworkProvider); Android.Locations.Location location = null; if (isGPSEnabled || isNetEnabled) { Criteria locCriteria = new Criteria() { Accuracy = Accuracy.Coarse, CostAllowed = false, PowerRequirement = Power.Low }; string provider = locMan.GetBestProvider(locCriteria, true); location = locMan.GetLastKnownLocation(provider); if (location == null) { locMan.RequestSingleUpdate(provider, mLocListnr, null); } else { LocationData lastGPSLocData = await Settings.GetLastGPSLocData(); // Check previous location difference if (lastGPSLocData.query != null && mLocation != null && ConversionMethods.CalculateGeopositionDistance(mLocation, location) < 1600) { return(false); } if (lastGPSLocData.query != null && Math.Abs(ConversionMethods.CalculateHaversine(lastGPSLocData.latitude, lastGPSLocData.longitude, location.Latitude, location.Longitude)) < 1600) { return(false); } LocationQueryViewModel view = null; await Task.Run(async() => { view = await wm.GetLocation(location); if (String.IsNullOrEmpty(view.LocationQuery)) { view = new LocationQueryViewModel(); } }); if (String.IsNullOrWhiteSpace(view.LocationQuery)) { // Stop since there is no valid query return(false); } // Save oldkey string oldkey = lastGPSLocData.query; // Save location as last known lastGPSLocData.SetData(view, location); Settings.SaveLastGPSLocData(lastGPSLocData); App.Context.StartService( new Intent(App.Context, typeof(WearableDataListenerService)) .SetAction(WearableDataListenerService.ACTION_SENDLOCATIONUPDATE)); this.location = lastGPSLocData; mLocation = location; // Update widget ids for location if (oldkey != null && WidgetUtils.Exists(oldkey)) { WidgetUtils.UpdateWidgetIds(oldkey, lastGPSLocData); } locationChanged = true; } } else { AppCompatActivity?.RunOnUiThread(() => { Toast.MakeText(AppCompatActivity, Resource.String.error_retrieve_location, ToastLength.Short).Show(); }); } } return(locationChanged); }
private async Task <bool> UpdateLocation() { bool locationChanged = false; if (Settings.FollowGPS) { if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) != Permission.Granted) { return(false); } Android.Locations.Location location = null; if (WearableHelper.IsGooglePlayServicesInstalled && !WearableHelper.HasGPS) { var mFusedLocationClient = new FusedLocationProviderClient(this); location = await mFusedLocationClient.GetLastLocationAsync(); } else { LocationManager locMan = GetSystemService(Context.LocationService) as LocationManager; bool isGPSEnabled = (bool)locMan?.IsProviderEnabled(LocationManager.GpsProvider); bool isNetEnabled = (bool)locMan?.IsProviderEnabled(LocationManager.NetworkProvider); if (isGPSEnabled || isNetEnabled) { Criteria locCriteria = new Criteria() { Accuracy = Accuracy.Coarse, CostAllowed = false, PowerRequirement = Power.Low }; string provider = locMan.GetBestProvider(locCriteria, true); location = locMan.GetLastKnownLocation(provider); } else { Toast.MakeText(this, Resource.String.error_retrieve_location, ToastLength.Short).Show(); } } if (location != null) { LocationData lastGPSLocData = await Settings.GetLastGPSLocData(); // Check previous location difference if (lastGPSLocData.query != null && Math.Abs(ConversionMethods.CalculateHaversine(lastGPSLocData.latitude, lastGPSLocData.longitude, location.Latitude, location.Longitude)) < 1600) { return(false); } LocationQueryViewModel view = null; await Task.Run(async() => { view = await wm.GetLocation(location); if (String.IsNullOrEmpty(view.LocationQuery)) { view = new LocationQueryViewModel(); } }); if (String.IsNullOrWhiteSpace(view.LocationQuery)) { // Stop since there is no valid query return(false); } // Save location as last known lastGPSLocData.SetData(view, location); Settings.SaveHomeData(lastGPSLocData); locationChanged = true; } } return(locationChanged); }
private async Task <bool> UpdateLocation() { bool locationChanged = false; if (Settings.FollowGPS) { Geoposition newGeoPos = null; Geolocator geolocal = new Geolocator() { DesiredAccuracyInMeters = 5000, ReportInterval = 900000, MovementThreshold = 1600 }; try { cts.Token.ThrowIfCancellationRequested(); newGeoPos = await geolocal.GetGeopositionAsync(TimeSpan.FromMinutes(15), TimeSpan.FromSeconds(10)).AsTask(cts.Token); } catch (OperationCanceledException) { return(locationChanged); } catch (Exception) { var geoStatus = GeolocationAccessStatus.Unspecified; try { cts.Token.ThrowIfCancellationRequested(); geoStatus = await Geolocator.RequestAccessAsync().AsTask(cts.Token); } catch (OperationCanceledException) { return(locationChanged); } catch (Exception ex) { Logger.WriteLine(LoggerLevel.Error, ex, "{0}: error requesting location permission", taskName); } finally { if (!cts.IsCancellationRequested && geoStatus == GeolocationAccessStatus.Allowed) { try { newGeoPos = await geolocal.GetGeopositionAsync(TimeSpan.FromMinutes(15), TimeSpan.FromSeconds(10)).AsTask(cts.Token); } catch (Exception ex) { Logger.WriteLine(LoggerLevel.Error, ex, "{0}: GetWeather error", taskName); } } } } // Access to location granted if (newGeoPos != null) { var lastGPSLocData = await Settings.GetLastGPSLocData(); if (cts.IsCancellationRequested) { return(locationChanged); } // Check previous location difference if (lastGPSLocData.query != null && Math.Abs(ConversionMethods.CalculateHaversine(lastGPSLocData.latitude, lastGPSLocData.longitude, newGeoPos.Coordinate.Point.Position.Latitude, newGeoPos.Coordinate.Point.Position.Longitude)) < geolocal.MovementThreshold) { return(false); } LocationQueryViewModel view = null; await Task.Run(async() => { view = await wm.GetLocation(newGeoPos); if (String.IsNullOrEmpty(view.LocationQuery)) { view = new LocationQueryViewModel(); } }, cts.Token); if (String.IsNullOrWhiteSpace(view.LocationQuery)) { // Stop since there is no valid query return(false); } if (cts.IsCancellationRequested) { return(locationChanged); } // Save oldkey string oldkey = lastGPSLocData.query; // Save location as last known lastGPSLocData.SetData(view, newGeoPos); Settings.SaveLastGPSLocData(lastGPSLocData); // Update tile id for location if (oldkey != null && SecondaryTileUtils.Exists(oldkey)) { await SecondaryTileUtils.UpdateTileId(oldkey, lastGPSLocData.query); } locationChanged = true; } } return(locationChanged); }