-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #36 from wrk-fmd/develop
RELEASE: Version 1.1.2
- Loading branch information
Showing
34 changed files
with
1,015 additions
and
299 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
77 changes: 77 additions & 0 deletions
77
GeoClient/GeoClient.Android/Location/GooglePlayLocationProvider.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
using Android.App; | ||
using Android.Gms.Common; | ||
using Android.Gms.Common.Apis; | ||
using Android.Gms.Location; | ||
using Android.OS; | ||
using Android.Util; | ||
|
||
namespace GeoClient.Droid.Location | ||
{ | ||
public class GooglePlayLocationProvider : Java.Lang.Object, ILocationListener, ILocationProvider, GoogleApiClient.IConnectionCallbacks, GoogleApiClient.IOnConnectionFailedListener | ||
{ | ||
private const string LoggerTag = "GooglePlayLocationProvider"; | ||
|
||
private LocationProviderListener _updateDelegate = (location) => | ||
{ | ||
Log.Warn(LoggerTag, "No location update delegate registered!"); | ||
}; | ||
|
||
private readonly GoogleApiClient _googleApiClient; | ||
|
||
public GooglePlayLocationProvider() | ||
{ | ||
_googleApiClient = new GoogleApiClient.Builder(Application.Context) | ||
.AddApi(LocationServices.API) | ||
.AddConnectionCallbacks(this) | ||
.AddOnConnectionFailedListener(this) | ||
.Build(); | ||
} | ||
|
||
public void RegisterLocationUpdateDelegate(LocationProviderListener updateDelegate) | ||
{ | ||
_updateDelegate = updateDelegate; | ||
} | ||
|
||
public void StartLocationProvider() | ||
{ | ||
_googleApiClient.Connect(); | ||
} | ||
|
||
public void StopLocationProvider() | ||
{ | ||
_googleApiClient.Disconnect(); | ||
} | ||
|
||
public void OnConnected(Bundle connectionHint) | ||
{ | ||
var locationRequest = new LocationRequest() | ||
.SetPriority(LocationRequest.PriorityHighAccuracy) | ||
.SetInterval(10000) | ||
.SetFastestInterval(5000); | ||
LocationServices.FusedLocationApi.RequestLocationUpdates(_googleApiClient, locationRequest, this); | ||
} | ||
|
||
public void OnConnectionSuspended(int cause) | ||
{ | ||
Log.Warn(LoggerTag, "Connection of google API client has been suspended!"); | ||
} | ||
|
||
public void OnConnectionFailed(ConnectionResult result) | ||
{ | ||
Log.Warn(LoggerTag, "Connection to google API client failed!"); | ||
} | ||
|
||
public void OnLocationChanged(Android.Locations.Location location) | ||
{ | ||
if (location != null) | ||
{ | ||
var updatedLocation = XamarinLocationFactory.CreateXamarinLocation(location); | ||
_updateDelegate.Invoke(updatedLocation); | ||
} | ||
else | ||
{ | ||
Log.Debug(LoggerTag, "Received empty location update from google play provider!"); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
namespace GeoClient.Droid.Location | ||
{ | ||
public delegate void LocationProviderListener(Xamarin.Essentials.Location updatedLocation); | ||
|
||
public interface ILocationProvider | ||
{ | ||
void RegisterLocationUpdateDelegate(LocationProviderListener updateDelegate); | ||
|
||
void StartLocationProvider(); | ||
|
||
void StopLocationProvider(); | ||
} | ||
} |
50 changes: 50 additions & 0 deletions
50
GeoClient/GeoClient.Android/Location/LocationProviderFactory.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
using Android.App; | ||
using Android.Gms.Common; | ||
using Android.Util; | ||
|
||
namespace GeoClient.Droid.Location | ||
{ | ||
public class LocationProviderFactory | ||
{ | ||
private const string LoggerTag = nameof(LocationProviderFactory); | ||
|
||
public ILocationProvider CreateLocationProvider() | ||
{ | ||
ILocationProvider locationProvider; | ||
|
||
if (IsGooglePlayServicesInstalled()) | ||
{ | ||
locationProvider = new GooglePlayLocationProvider(); | ||
} | ||
else | ||
{ | ||
locationProvider = new NativeAndroidLocationProvider(); | ||
} | ||
|
||
return locationProvider; | ||
} | ||
|
||
private bool IsGooglePlayServicesInstalled() | ||
{ | ||
var queryResult = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(Application.Context); | ||
if (queryResult == ConnectionResult.Success) | ||
{ | ||
Log.Info(LoggerTag, "Google Play Services is installed on this device. Will be used as location provider."); | ||
return true; | ||
} | ||
|
||
if (GoogleApiAvailability.Instance.IsUserResolvableError(queryResult)) | ||
{ | ||
var errorString = GoogleApiAvailability.Instance.GetErrorString(queryResult); | ||
Log.Error(LoggerTag, "There is a problem with Google Play Services on this device: {0} - {1}", | ||
queryResult, errorString); | ||
} | ||
else | ||
{ | ||
Log.Error(LoggerTag, "Unkown error while checking if Google Play Services are installed."); | ||
} | ||
|
||
return false; | ||
} | ||
} | ||
} |
85 changes: 85 additions & 0 deletions
85
GeoClient/GeoClient.Android/Location/NativeAndroidLocationProvider.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
using System; | ||
using Android.App; | ||
using Android.Content; | ||
using Android.Locations; | ||
using Android.OS; | ||
using Android.Util; | ||
using Object = Java.Lang.Object; | ||
|
||
namespace GeoClient.Droid.Location | ||
{ | ||
public class NativeAndroidLocationProvider : Object, ILocationProvider, ILocationListener | ||
{ | ||
private const string LoggerTag = "NativeAndroidLocationProvider"; | ||
|
||
private const long MinimumElapsedTimeInMilliseconds = 10000; | ||
|
||
// Only use coarse or fine here! Other values are only for bearing, horizontal accuracy, etc. | ||
private const Accuracy RequiredAccuracy = Accuracy.Fine; | ||
|
||
private readonly LocationManager _locationManager; | ||
|
||
private LocationProviderListener _locationUpdateDelegate = (location) => | ||
{ | ||
Log.Warn(LoggerTag, "No location update delegate registered!"); | ||
}; | ||
|
||
public NativeAndroidLocationProvider() | ||
{ | ||
_locationManager = Application.Context.GetSystemService(Context.LocationService) as LocationManager; | ||
} | ||
|
||
public void RegisterLocationUpdateDelegate(LocationProviderListener updateDelegate) | ||
{ | ||
_locationUpdateDelegate = updateDelegate; | ||
} | ||
|
||
public void StartLocationProvider() | ||
{ | ||
var locationProvider = GetLocationProvider(); | ||
_locationManager.RequestLocationUpdates(locationProvider, MinimumElapsedTimeInMilliseconds, 0, this); | ||
Log.Debug(LoggerTag, "Native android location provider is registered for location updates."); | ||
} | ||
|
||
public void StopLocationProvider() | ||
{ | ||
_locationManager.RemoveUpdates(this); | ||
} | ||
|
||
public void OnLocationChanged(Android.Locations.Location location) | ||
{ | ||
var updatedLocation = XamarinLocationFactory.CreateXamarinLocation(location); | ||
_locationUpdateDelegate.Invoke(updatedLocation); | ||
} | ||
|
||
public void OnProviderDisabled(string provider) | ||
{ | ||
Log.Warn(LoggerTag, "Location provider was disabled! provider: " + provider); | ||
} | ||
|
||
public void OnProviderEnabled(string provider) | ||
{ | ||
Log.Info(LoggerTag, "Location provider was enabled. provider: " + provider); | ||
} | ||
|
||
public void OnStatusChanged(string provider, Availability status, Bundle extras) | ||
{ | ||
Log.Info( | ||
LoggerTag, | ||
"Status of location provider changed. provider: " + provider + ", availability: " + status); | ||
} | ||
|
||
private string GetLocationProvider() | ||
{ | ||
var locationCriteria = new Criteria | ||
{ | ||
Accuracy = RequiredAccuracy, | ||
PowerRequirement = Power.NoRequirement | ||
}; | ||
|
||
var locationProvider = _locationManager.GetBestProvider(locationCriteria, true); | ||
Log.Debug(LoggerTag, $"You are about to get location updates via {locationProvider}"); | ||
return locationProvider; | ||
} | ||
} | ||
} |
Oops, something went wrong.