from plyer import gps from kivy.app import App from kivy.clock import Clock from kivy.properties import DictProperty from kivy.clock import mainthread from kivy.utils import platform from kivy.uix.screenmanager import ScreenManager, Screen, RiseInTransition from kivy_garden.mapview import MapView from kivy.vector import Vector from kivy.animation import Animation from math import floor import random from time import sleep from pprint import pprint class MapScreen(Screen): pass class CompassScreen(Screen): pass class FlockompassApp(App): gps_data = DictProperty() session_data = DictProperty() def dump(self, dt): print(dt, self.gps_data, self.session_data) def set_destination(self): self.session_data['dest_lat'] = self.ms.ids.centermark.lat self.session_data['dest_lon'] = self.ms.ids.centermark.lon self.ms.ids.mapview.center_on(self.session_data['dest_lat'], self.session_data['dest_lon']) def request_android_permissions(self): from android.permissions import request_permissions, Permission def callback(permissions, results): if all([res for res in results]): print("aguas: callback. All permissions granted.") else: print("aguas: callback. Some permissions refused.", results) request_permissions([Permission.ACCESS_COARSE_LOCATION, Permission.ACCESS_FINE_LOCATION], callback) def gps_start(self, minTime, minDistance): gps.start(minTime, minDistance) def gps_stop(self): gps.stop() def on_pause(self): self.gps_stop() return True def on_resume(self): self.gps_start(1000, 0) @mainthread def on_location(self, **kwargs): self.gps_data = kwargs if ('dest_lat' not in self.session_data and 'dest_lon' not in self.session_data): self.session_data['dest_lat'] = self.gps_data['lat'] self.session_data['dest_lon'] = self.gps_data['lon'] self.ms.ids.mapview.center_on(self.session_data['dest_lat'], self.session_data['dest_lon']) def build(self): # start GPS try: gps.configure(on_location=self.on_location) except NotImplementedError: import traceback traceback.print_exc() print('GPS is not implemented for your platform') if platform == "android": print("gps.py: Android detected. Requesting permissions") self.request_android_permissions() self.gps_start(1000, 0) # setup app screens screen_manager = ScreenManager(transition=RiseInTransition()) self.ms = MapScreen(name='map') screen_manager.add_widget(self.ms) self.cs = CompassScreen(name='compass') screen_manager.add_widget(self.cs) Clock.schedule_interval(self.dump, 2.0) return screen_manager if __name__ == '__main__': app = FlockompassApp() app.run()