1 // Copyright 2015-present 650 Industries. All rights reserved. 2 package host.exp.exponent.kernel.services.sensors 3 4 import android.Manifest 5 import android.content.Context 6 import android.content.pm.PackageManager 7 import android.hardware.Sensor 8 import android.hardware.SensorEvent 9 import android.hardware.SensorEventListener 10 import android.hardware.SensorManager 11 import android.os.Build 12 import host.exp.exponent.kernel.services.BaseKernelService 13 14 abstract class BaseSensorKernelService internal constructor(reactContext: Context) : BaseKernelService(reactContext), SensorEventListener { 15 private var sensor: Sensor? = null 16 private val sensorManager: SensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager 17 private val samplingPeriodUs: Int 18 get() = if (hasHighSamplingRateSensorsPermission()) SensorManager.SENSOR_DELAY_FASTEST else SensorManager.SENSOR_DELAY_NORMAL 19 20 abstract val sensorType: Int onSensorDataChangednull21 abstract fun onSensorDataChanged(sensorEvent: SensorEvent) 22 23 protected fun startObserving() { 24 sensor = sensorManager.getDefaultSensor(sensorType) 25 if (sensor != null) { 26 sensorManager.registerListener(this, sensor, samplingPeriodUs) 27 } 28 } 29 stopObservingnull30 protected fun stopObserving() { 31 sensorManager.unregisterListener(this) 32 } 33 hasHighSamplingRateSensorsPermissionnull34 private fun hasHighSamplingRateSensorsPermission(): Boolean { 35 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { 36 return true 37 } 38 39 return try { 40 context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_PERMISSIONS)?.run { 41 requestedPermissions.contains(Manifest.permission.HIGH_SAMPLING_RATE_SENSORS) 42 } ?: false 43 } catch (e: PackageManager.NameNotFoundException) { 44 false 45 } 46 } 47 48 // android.hardware.SensorEventListener onAccuracyChangednull49 override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {} 50 } 51