text: '''
  Android Gyroscope
  -----------------
  '''
  
  from plyer.facades import Gyroscope
  from jnius import PythonJavaClass, java_method, autoclass, cast
  from plyer.platforms.android import activity
  
  Context = autoclass('android.content.Context')
  Sensor = autoclass('android.hardware.Sensor')
  SensorManager = autoclass('android.hardware.SensorManager')
  
  
  class GyroscopeSensorListener(PythonJavaClass):
      __javainterfaces__ = ['android/hardware/SensorEventListener']
  
      def __init__(self):
          super(GyroscopeSensorListener, self).__init__()
          self.SensorManager = cast(
              'android.hardware.SensorManager',
              activity.getSystemService(Context.SENSOR_SERVICE)
          )
          self.sensor = self.SensorManager.getDefaultSensor(
              Sensor.TYPE_GYROSCOPE
          )
  
          self.values = [None, None, None]
  
      def enable(self):
          self.SensorManager.registerListener(
              self, self.sensor,
              SensorManager.SENSOR_DELAY_NORMAL
          )
  
      def disable(self):
          self.SensorManager.unregisterListener(self, self.sensor)
  
      @java_method('(Landroid/hardware/SensorEvent;)V')
      def onSensorChanged(self, event):
          self.values = event.values[:3]
  
      @java_method('(Landroid/hardware/Sensor;I)V')
      def onAccuracyChanged(self, sensor, accuracy):
          # Maybe, do something in future?
          pass
  
  
  class GyroUncalibratedSensorListener(PythonJavaClass):
      __javainterfaces__ = ['android/hardware/SensorEventListener']
  
      def __init__(self):
          super(GyroUncalibratedSensorListener, self).__init__()
          service = activity.getSystemService(Context.SENSOR_SERVICE)
          self.SensorManager = cast('android.hardware.SensorManager', service)
  
          self.sensor = self.SensorManager.getDefaultSensor(
              Sensor.TYPE_GYROSCOPE_UNCALIBRATED)
          self.values = [None, None, None, None, None, None]
  
      def enable(self):
          self.SensorManager.registerListener(
              self, self.sensor,
              SensorManager.SENSOR_DELAY_NORMAL
          )
  
      def disable(self):
          self.SensorManager.unregisterListener(self, self.sensor)
  
      @java_method('(Landroid/hardware/SensorEvent;)V')
      def onSensorChanged(self, event):
          self.values = event.values[:6]
  
      @java_method('(Landroid/hardware/Sensor;I)V')
      def onAccuracyChanged(self, sensor, accuracy):
          pass
  
  
  class AndroidGyroscope(Gyroscope):
      def __init__(self):
          super(AndroidGyroscope, self).__init__()
          self.bState = False
  
      def _enable(self):
          if (not self.bState):
              self.listenerg = GyroscopeSensorListener()
              self.listenergu = GyroUncalibratedSensorListener()
              self.listenerg.enable()
              self.listenergu.enable()
              self.bState = True
  
      def _disable(self):
          if (self.bState):
              self.bState = False
              self.listenerg.disable()
              self.listenergu.disable()
              del self.listenerg
              del self.listenergu
  
      def _get_orientation(self):
          if (self.bState):
              return tuple(self.listenerg.values)
          else:
              return (None, None, None)
  
      def _get_rotation_uncalib(self):
          if (self.bState):
              return tuple(self.listenergu.values)
          else:
              return (None, None, None, None, None, None)
  
      def __del__(self):
          if(self.bState):
              self._disable()
          super(self.__class__, self).__del__()
  
  
  def instance():
      return AndroidGyroscope()
  