summaryrefslogtreecommitdiff
path: root/external/plyer/platforms/android/gps.py
diff options
context:
space:
mode:
Diffstat (limited to 'external/plyer/platforms/android/gps.py')
-rw-r--r--external/plyer/platforms/android/gps.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/external/plyer/platforms/android/gps.py b/external/plyer/platforms/android/gps.py
new file mode 100644
index 0000000..fbe580f
--- /dev/null
+++ b/external/plyer/platforms/android/gps.py
@@ -0,0 +1,79 @@
+'''
+Android GPS
+-----------
+'''
+
+from plyer.facades import GPS
+from plyer.platforms.android import activity
+from jnius import autoclass, java_method, PythonJavaClass
+
+Looper = autoclass('android.os.Looper')
+LocationManager = autoclass('android.location.LocationManager')
+Context = autoclass('android.content.Context')
+
+
+class _LocationListener(PythonJavaClass):
+ __javainterfaces__ = ['android/location/LocationListener']
+
+ def __init__(self, root):
+ self.root = root
+ super(_LocationListener, self).__init__()
+
+ @java_method('(Landroid/location/Location;)V')
+ def onLocationChanged(self, location):
+ self.root.on_location(
+ lat=location.getLatitude(),
+ lon=location.getLongitude(),
+ speed=location.getSpeed(),
+ bearing=location.getBearing(),
+ altitude=location.getAltitude())
+
+ @java_method('(Ljava/lang/String;)V')
+ def onProviderEnabled(self, status):
+ if self.root.on_status:
+ self.root.on_status('provider-enabled', status)
+
+ @java_method('(Ljava/lang/String;)V')
+ def onProviderDisabled(self, status):
+ if self.root.on_status:
+ self.root.on_status('provider-disabled', status)
+
+ @java_method('(Ljava/lang/String;ILandroid/os/Bundle;)V')
+ def onStatusChanged(self, provider, status, extras):
+ if self.root.on_status:
+ s_status = 'unknown'
+ if status == 0x00:
+ s_status = 'out-of-service'
+ elif status == 0x01:
+ s_status = 'temporarily-unavailable'
+ elif status == 0x02:
+ s_status = 'available'
+ self.root.on_status('provider-status', '{}: {}'.format(
+ provider, s_status))
+
+
+class AndroidGPS(GPS):
+
+ def _configure(self):
+ if not hasattr(self, '_location_manager'):
+ self._location_manager = activity.getSystemService(
+ Context.LOCATION_SERVICE)
+ self._location_listener = _LocationListener(self)
+
+ def _start(self):
+ # XXX defaults should be configurable by the user, later
+ providers = self._location_manager.getProviders(False).toArray()
+ for provider in providers:
+ self._location_manager.requestLocationUpdates(
+ provider,
+ 1000, # minTime, in milliseconds
+ 1, # minDistance, in meters
+ self._location_listener,
+ Looper.getMainLooper())
+
+ def _stop(self):
+ self._location_manager.removeUpdates(self._location_listener)
+
+
+def instance():
+ return AndroidGPS()