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