expo-sensors 10.2.2 → 11.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +21 -2
  2. package/android/build.gradle +3 -12
  3. package/android/src/main/java/expo/modules/sensors/SensorsPackage.kt +50 -0
  4. package/android/src/main/java/expo/modules/sensors/modules/AccelerometerModule.kt +55 -0
  5. package/android/src/main/java/expo/modules/sensors/modules/BarometerModule.kt +54 -0
  6. package/android/src/main/java/expo/modules/sensors/modules/BaseSensorModule.kt +80 -0
  7. package/android/src/main/java/expo/modules/sensors/modules/DeviceMotionModule.kt +242 -0
  8. package/android/src/main/java/expo/modules/sensors/modules/GyroscopeModule.kt +55 -0
  9. package/android/src/main/java/expo/modules/sensors/modules/MagnetometerModule.kt +55 -0
  10. package/android/src/main/java/expo/modules/sensors/modules/MagnetometerUncalibratedModule.kt +55 -0
  11. package/android/src/main/java/expo/modules/sensors/modules/PedometerModule.kt +63 -0
  12. package/android/src/main/java/expo/modules/sensors/services/AccelerometerService.kt +15 -0
  13. package/android/src/main/java/expo/modules/sensors/services/BarometerService.kt +15 -0
  14. package/android/src/main/java/expo/modules/sensors/services/BaseSensorService.kt +26 -0
  15. package/android/src/main/java/expo/modules/sensors/services/BaseService.kt +44 -0
  16. package/android/src/main/java/expo/modules/sensors/services/GravitySensorService.kt +15 -0
  17. package/android/src/main/java/expo/modules/sensors/services/GyroscopeService.kt +15 -0
  18. package/android/src/main/java/expo/modules/sensors/services/LinearAccelerationSensorService.kt +15 -0
  19. package/android/src/main/java/expo/modules/sensors/services/MagnetometerService.kt +15 -0
  20. package/android/src/main/java/expo/modules/sensors/services/MagnetometerUncalibratedService.kt +15 -0
  21. package/android/src/main/java/expo/modules/sensors/services/PedometerService.kt +15 -0
  22. package/android/src/main/java/expo/modules/sensors/services/RotationVectorSensorService.kt +15 -0
  23. package/android/src/main/java/expo/modules/sensors/services/SensorServiceSubscription.kt +49 -0
  24. package/android/src/main/java/expo/modules/sensors/services/SubscribableSensorService.kt +92 -0
  25. package/build/DeviceMotion.js +1 -4
  26. package/build/DeviceMotion.js.map +1 -1
  27. package/build/DeviceSensor.d.ts +1 -2
  28. package/build/DeviceSensor.js +57 -54
  29. package/build/DeviceSensor.js.map +1 -1
  30. package/build/ExpoBarometer.d.ts +1 -1
  31. package/build/ExpoBarometer.js +1 -1
  32. package/build/ExpoBarometer.js.map +1 -1
  33. package/build/ExponentAccelerometer.d.ts +1 -1
  34. package/build/ExponentAccelerometer.js +1 -1
  35. package/build/ExponentAccelerometer.js.map +1 -1
  36. package/build/ExponentAccelerometer.web.js +1 -1
  37. package/build/ExponentAccelerometer.web.js.map +1 -1
  38. package/build/ExponentDeviceMotion.d.ts +1 -1
  39. package/build/ExponentDeviceMotion.js +1 -1
  40. package/build/ExponentDeviceMotion.js.map +1 -1
  41. package/build/ExponentDeviceMotion.web.js +1 -1
  42. package/build/ExponentDeviceMotion.web.js.map +1 -1
  43. package/build/ExponentGyroscope.d.ts +1 -1
  44. package/build/ExponentGyroscope.js +1 -1
  45. package/build/ExponentGyroscope.js.map +1 -1
  46. package/build/ExponentGyroscope.web.js +1 -1
  47. package/build/ExponentGyroscope.web.js.map +1 -1
  48. package/build/ExponentMagnetometer.d.ts +1 -1
  49. package/build/ExponentMagnetometer.js +1 -1
  50. package/build/ExponentMagnetometer.js.map +1 -1
  51. package/build/ExponentMagnetometerUncalibrated.d.ts +1 -1
  52. package/build/ExponentMagnetometerUncalibrated.js +1 -1
  53. package/build/ExponentMagnetometerUncalibrated.js.map +1 -1
  54. package/build/ExponentPedometer.d.ts +1 -1
  55. package/build/ExponentPedometer.js +1 -1
  56. package/build/ExponentPedometer.js.map +1 -1
  57. package/build/Pedometer.d.ts +1 -2
  58. package/build/Pedometer.js +1 -2
  59. package/build/Pedometer.js.map +1 -1
  60. package/build/utils/isSensorEnabledAsync.web.js +2 -3
  61. package/build/utils/isSensorEnabledAsync.web.js.map +1 -1
  62. package/ios/EXSensors/EXMotionPermissionRequester.m +6 -6
  63. package/ios/EXSensors/EXSensorsManager.h +2 -2
  64. package/ios/EXSensors/EXSensorsManager.m +5 -2
  65. package/ios/EXSensors/Modules/EXPedometer.h +5 -5
  66. package/ios/EXSensors/Modules/EXPedometer.m +24 -24
  67. package/ios/EXSensors/Modules/SensorModules/EXAccelerometer.m +2 -2
  68. package/ios/EXSensors/Modules/SensorModules/EXBarometer.m +2 -2
  69. package/ios/EXSensors/Modules/SensorModules/EXBaseSensorModule.h +4 -4
  70. package/ios/EXSensors/Modules/SensorModules/EXBaseSensorModule.m +18 -18
  71. package/ios/EXSensors/Modules/SensorModules/EXDeviceMotion.m +2 -2
  72. package/ios/EXSensors/Modules/SensorModules/EXGyroscope.m +2 -2
  73. package/ios/EXSensors/Modules/SensorModules/EXMagnetometer.m +2 -2
  74. package/ios/EXSensors/Modules/SensorModules/EXMagnetometerUncalibrated.m +2 -2
  75. package/ios/EXSensors.podspec +2 -2
  76. package/ios/EXSensors.xcframework/ios-arm64/EXSensors.framework/EXSensors +0 -0
  77. package/ios/EXSensors.xcframework/ios-arm64/EXSensors.framework/Info.plist +0 -0
  78. package/ios/EXSensors.xcframework/ios-arm64_x86_64-simulator/EXSensors.framework/EXSensors +0 -0
  79. package/ios/EXSensors.xcframework/ios-arm64_x86_64-simulator/EXSensors.framework/Info.plist +0 -0
  80. package/package.json +5 -8
  81. package/src/DeviceSensor.ts +7 -2
  82. package/src/ExpoBarometer.ts +1 -1
  83. package/src/ExponentAccelerometer.ts +1 -1
  84. package/src/ExponentAccelerometer.web.ts +1 -1
  85. package/src/ExponentDeviceMotion.ts +1 -1
  86. package/src/ExponentDeviceMotion.web.ts +1 -1
  87. package/src/ExponentGyroscope.ts +1 -1
  88. package/src/ExponentGyroscope.web.ts +1 -1
  89. package/src/ExponentMagnetometer.ts +1 -1
  90. package/src/ExponentMagnetometerUncalibrated.ts +1 -1
  91. package/src/ExponentPedometer.ts +1 -1
  92. package/src/Pedometer.ts +8 -2
  93. package/src/utils/isSensorEnabledAsync.web.ts +2 -3
  94. package/android/src/main/java/expo/modules/sensors/SensorsPackage.java +0 -57
  95. package/android/src/main/java/expo/modules/sensors/modules/AccelerometerModule.java +0 -69
  96. package/android/src/main/java/expo/modules/sensors/modules/BarometerModule.java +0 -68
  97. package/android/src/main/java/expo/modules/sensors/modules/BaseSensorModule.java +0 -114
  98. package/android/src/main/java/expo/modules/sensors/modules/DeviceMotionModule.java +0 -298
  99. package/android/src/main/java/expo/modules/sensors/modules/GyroscopeModule.java +0 -69
  100. package/android/src/main/java/expo/modules/sensors/modules/MagnetometerModule.java +0 -69
  101. package/android/src/main/java/expo/modules/sensors/modules/MagnetometerUncalibratedModule.java +0 -69
  102. package/android/src/main/java/expo/modules/sensors/modules/PedometerModule.java +0 -76
  103. package/android/src/main/java/expo/modules/sensors/services/AccelerometerService.java +0 -29
  104. package/android/src/main/java/expo/modules/sensors/services/BarometerService.java +0 -29
  105. package/android/src/main/java/expo/modules/sensors/services/BaseSensorService.java +0 -33
  106. package/android/src/main/java/expo/modules/sensors/services/BaseService.java +0 -66
  107. package/android/src/main/java/expo/modules/sensors/services/GravitySensorService.java +0 -29
  108. package/android/src/main/java/expo/modules/sensors/services/GyroscopeService.java +0 -30
  109. package/android/src/main/java/expo/modules/sensors/services/LinearAccelerationSensorService.java +0 -29
  110. package/android/src/main/java/expo/modules/sensors/services/MagnetometerService.java +0 -29
  111. package/android/src/main/java/expo/modules/sensors/services/MagnetometerUncalibratedService.java +0 -29
  112. package/android/src/main/java/expo/modules/sensors/services/PedometerService.java +0 -29
  113. package/android/src/main/java/expo/modules/sensors/services/RotationVectorSensorService.java +0 -29
  114. package/android/src/main/java/expo/modules/sensors/services/SensorServiceSubscription.java +0 -65
  115. package/android/src/main/java/expo/modules/sensors/services/SubscribableSensorService.java +0 -123
package/CHANGELOG.md CHANGED
@@ -10,14 +10,33 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
- ## 10.2.2 — 2021-06-24
13
+ ## 11.0.3 — 2021-10-21
14
14
 
15
15
  _This version does not introduce any user-facing changes._
16
16
 
17
- ## 10.2.1 — 2021-06-22
17
+ ## 11.0.2 — 2021-10-15
18
18
 
19
19
  _This version does not introduce any user-facing changes._
20
20
 
21
+ ## 11.0.1 — 2021-10-01
22
+
23
+ _This version does not introduce any user-facing changes._
24
+
25
+ ## 11.0.0 — 2021-09-28
26
+
27
+ ### 🛠 Breaking changes
28
+
29
+ - Dropped support for iOS 11.0 ([#14383](https://github.com/expo/expo/pull/14383) by [@cruzach](https://github.com/cruzach))
30
+
31
+ ### 🐛 Bug fixes
32
+
33
+ - Fix building errors from use_frameworks! in Podfile. ([#14523](https://github.com/expo/expo/pull/14523) by [@kudo](https://github.com/kudo))
34
+
35
+ ### 💡 Others
36
+
37
+ - Converted Android code to Kotlin ([#13738](https://github.com/expo/expo/pull/13738) by [@ixf](https://github.com/ixf))
38
+ - Updated `@expo/config-plugins` ([#14443](https://github.com/expo/expo/pull/14443) by [@EvanBacon](https://github.com/EvanBacon))
39
+
21
40
  ## 10.2.0 — 2021-06-16
22
41
 
23
42
  ### 🐛 Bug fixes
@@ -3,7 +3,7 @@ apply plugin: 'kotlin-android'
3
3
  apply plugin: 'maven'
4
4
 
5
5
  group = 'host.exp.exponent'
6
- version = '10.2.2'
6
+ version = '11.0.3'
7
7
 
8
8
  buildscript {
9
9
  // Simple helper that allows the root project to override versions declared by this library.
@@ -57,24 +57,15 @@ android {
57
57
  minSdkVersion safeExtGet("minSdkVersion", 21)
58
58
  targetSdkVersion safeExtGet("targetSdkVersion", 30)
59
59
  versionCode 27
60
- versionName "10.2.2"
60
+ versionName "11.0.3"
61
61
  }
62
62
  lintOptions {
63
63
  abortOnError false
64
64
  }
65
65
  }
66
66
 
67
- if (new File(rootProject.projectDir.parentFile, 'package.json').exists()) {
68
- apply from: project(":unimodules-core").file("../unimodules-core.gradle")
69
- } else {
70
- throw new GradleException(
71
- "'unimodules-core.gradle' was not found in the usual React Native dependency location. " +
72
- "This package can only be used in such projects. Are you sure you've installed the dependencies properly?")
73
- }
74
-
75
67
  dependencies {
76
- unimodule "unimodules-core"
77
- unimodule 'expo-modules-core'
68
+ implementation project(':expo-modules-core')
78
69
 
79
70
  implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${safeExtGet('kotlinVersion', '1.4.21')}"
80
71
  }
@@ -0,0 +1,50 @@
1
+ package expo.modules.sensors
2
+
3
+ import android.content.Context
4
+ import expo.modules.sensors.modules.AccelerometerModule
5
+ import expo.modules.sensors.modules.BarometerModule
6
+ import expo.modules.sensors.modules.DeviceMotionModule
7
+ import expo.modules.sensors.modules.GyroscopeModule
8
+ import expo.modules.sensors.modules.MagnetometerModule
9
+ import expo.modules.sensors.modules.MagnetometerUncalibratedModule
10
+ import expo.modules.sensors.modules.PedometerModule
11
+ import expo.modules.sensors.services.AccelerometerService
12
+ import expo.modules.sensors.services.BarometerService
13
+ import expo.modules.sensors.services.GravitySensorService
14
+ import expo.modules.sensors.services.GyroscopeService
15
+ import expo.modules.sensors.services.LinearAccelerationSensorService
16
+ import expo.modules.sensors.services.MagnetometerService
17
+ import expo.modules.sensors.services.MagnetometerUncalibratedService
18
+ import expo.modules.sensors.services.PedometerService
19
+ import expo.modules.sensors.services.RotationVectorSensorService
20
+ import expo.modules.core.BasePackage
21
+ import expo.modules.core.ExportedModule
22
+ import expo.modules.core.interfaces.InternalModule
23
+
24
+ class SensorsPackage : BasePackage() {
25
+ override fun createInternalModules(context: Context): List<InternalModule> {
26
+ return listOf<InternalModule>(
27
+ AccelerometerService(context),
28
+ BarometerService(context),
29
+ GravitySensorService(context),
30
+ GyroscopeService(context),
31
+ LinearAccelerationSensorService(context),
32
+ MagnetometerService(context),
33
+ MagnetometerUncalibratedService(context),
34
+ RotationVectorSensorService(context),
35
+ PedometerService(context)
36
+ )
37
+ }
38
+
39
+ override fun createExportedModules(context: Context): List<ExportedModule> {
40
+ return listOf<ExportedModule>(
41
+ AccelerometerModule(context),
42
+ BarometerModule(context),
43
+ GyroscopeModule(context),
44
+ DeviceMotionModule(context),
45
+ MagnetometerModule(context),
46
+ MagnetometerUncalibratedModule(context),
47
+ PedometerModule(context)
48
+ )
49
+ }
50
+ }
@@ -0,0 +1,55 @@
1
+ // Copyright 2015-present 650 Industries. All rights reserved.
2
+ package expo.modules.sensors.modules
3
+
4
+ import android.content.Context
5
+ import android.hardware.Sensor
6
+ import android.hardware.SensorEvent
7
+ import android.hardware.SensorManager
8
+ import android.os.Bundle
9
+ import expo.modules.interfaces.sensors.SensorServiceInterface
10
+ import expo.modules.interfaces.sensors.services.AccelerometerServiceInterface
11
+ import expo.modules.core.Promise
12
+ import expo.modules.core.interfaces.ExpoMethod
13
+
14
+ class AccelerometerModule(reactContext: Context?) : BaseSensorModule(reactContext) {
15
+ override val eventName: String = "accelerometerDidUpdate"
16
+
17
+ override fun getName(): String = "ExponentAccelerometer"
18
+
19
+ override fun getSensorService(): SensorServiceInterface {
20
+ return moduleRegistry.getModule(AccelerometerServiceInterface::class.java)
21
+ }
22
+
23
+ override fun eventToMap(sensorEvent: SensorEvent): Bundle {
24
+ return Bundle().apply {
25
+ putDouble("x", (sensorEvent.values[0] / SensorManager.GRAVITY_EARTH).toDouble())
26
+ putDouble("y", (sensorEvent.values[1] / SensorManager.GRAVITY_EARTH).toDouble())
27
+ putDouble("z", (sensorEvent.values[2] / SensorManager.GRAVITY_EARTH).toDouble())
28
+ }
29
+ }
30
+
31
+ @ExpoMethod
32
+ fun startObserving(promise: Promise) {
33
+ super.startObserving()
34
+ promise.resolve(null)
35
+ }
36
+
37
+ @ExpoMethod
38
+ fun stopObserving(promise: Promise) {
39
+ super.stopObserving()
40
+ promise.resolve(null)
41
+ }
42
+
43
+ @ExpoMethod
44
+ fun setUpdateInterval(updateInterval: Int, promise: Promise) {
45
+ super.setUpdateInterval(updateInterval)
46
+ promise.resolve(null)
47
+ }
48
+
49
+ @ExpoMethod
50
+ fun isAvailableAsync(promise: Promise) {
51
+ val mSensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
52
+ val isAvailable = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null
53
+ promise.resolve(isAvailable)
54
+ }
55
+ }
@@ -0,0 +1,54 @@
1
+ // Copyright 2015-present 650 Industries. All rights reserved.
2
+ package expo.modules.sensors.modules
3
+
4
+ import android.content.Context
5
+ import android.hardware.Sensor
6
+ import android.hardware.SensorEvent
7
+ import android.hardware.SensorManager
8
+ import android.os.Bundle
9
+ import expo.modules.interfaces.sensors.SensorServiceInterface
10
+ import expo.modules.interfaces.sensors.services.BarometerServiceInterface
11
+ import expo.modules.core.Promise
12
+ import expo.modules.core.interfaces.ExpoMethod
13
+
14
+ class BarometerModule(reactContext: Context?) : BaseSensorModule(reactContext) {
15
+ override val eventName: String = "barometerDidUpdate"
16
+
17
+ override fun getName(): String = "ExpoBarometer"
18
+
19
+ override fun getSensorService(): SensorServiceInterface {
20
+ return moduleRegistry.getModule(BarometerServiceInterface::class.java)
21
+ }
22
+
23
+ override fun eventToMap(sensorEvent: SensorEvent): Bundle {
24
+ return Bundle().apply {
25
+ // TODO: Bacon: Can we get relative altitude?
26
+ putDouble("pressure", sensorEvent.values[0].toDouble())
27
+ }
28
+ }
29
+
30
+ @ExpoMethod
31
+ fun startObserving(promise: Promise) {
32
+ super.startObserving()
33
+ promise.resolve(null)
34
+ }
35
+
36
+ @ExpoMethod
37
+ fun stopObserving(promise: Promise) {
38
+ super.stopObserving()
39
+ promise.resolve(null)
40
+ }
41
+
42
+ @ExpoMethod
43
+ fun setUpdateInterval(updateInterval: Int, promise: Promise) {
44
+ super.setUpdateInterval(updateInterval)
45
+ promise.resolve(null)
46
+ }
47
+
48
+ @ExpoMethod
49
+ fun isAvailableAsync(promise: Promise) {
50
+ val mSensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
51
+ val isAvailable = mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null
52
+ promise.resolve(isAvailable)
53
+ }
54
+ }
@@ -0,0 +1,80 @@
1
+ package expo.modules.sensors.modules
2
+
3
+ import android.content.Context
4
+ import android.hardware.Sensor
5
+ import android.hardware.SensorEvent
6
+ import android.hardware.SensorEventListener2
7
+ import android.os.Bundle
8
+ import android.util.Log
9
+ import expo.modules.interfaces.sensors.SensorServiceInterface
10
+ import expo.modules.interfaces.sensors.SensorServiceSubscriptionInterface
11
+ import expo.modules.core.ExportedModule
12
+ import expo.modules.core.ModuleRegistry
13
+ import expo.modules.core.interfaces.LifecycleEventListener
14
+ import expo.modules.core.interfaces.services.EventEmitter
15
+ import expo.modules.core.interfaces.services.UIManager
16
+
17
+ abstract class BaseSensorModule internal constructor(context: Context?) : ExportedModule(context), SensorEventListener2, LifecycleEventListener {
18
+ lateinit var moduleRegistry: ModuleRegistry
19
+ private set
20
+ private val sensorKernelServiceSubscription: SensorServiceSubscriptionInterface by lazy {
21
+ getSensorService().createSubscriptionForListener(this)
22
+ }
23
+ private var mIsObserving = false
24
+
25
+ protected abstract val eventName: String
26
+ protected abstract fun getSensorService(): SensorServiceInterface
27
+ protected abstract fun eventToMap(sensorEvent: SensorEvent): Bundle
28
+
29
+ override fun onCreate(moduleRegistry: ModuleRegistry) {
30
+ this.moduleRegistry = moduleRegistry
31
+
32
+ // Unregister from old UIManager
33
+ moduleRegistry.getModule(UIManager::class.java)?.unregisterLifecycleEventListener(this)
34
+
35
+ // Register to new UIManager
36
+ moduleRegistry.getModule(UIManager::class.java)?.registerLifecycleEventListener(this)
37
+ }
38
+
39
+ override fun onSensorChanged(sensorEvent: SensorEvent) {
40
+ val eventEmitter = moduleRegistry.getModule(EventEmitter::class.java)
41
+ eventEmitter?.emit(eventName, eventToMap(sensorEvent))
42
+ ?: Log.e("E_SENSOR_MODULE", "Could not emit $eventName event, no event emitter present.")
43
+ }
44
+
45
+ override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) = Unit
46
+
47
+ override fun onFlushCompleted(sensor: Sensor) = Unit
48
+
49
+ fun setUpdateInterval(updateInterval: Int) {
50
+ sensorKernelServiceSubscription.updateInterval = updateInterval.toLong()
51
+ }
52
+
53
+ fun startObserving() {
54
+ mIsObserving = true
55
+ sensorKernelServiceSubscription.start()
56
+ }
57
+
58
+ fun stopObserving() {
59
+ if (mIsObserving) {
60
+ mIsObserving = false
61
+ sensorKernelServiceSubscription.stop()
62
+ }
63
+ }
64
+
65
+ override fun onHostResume() {
66
+ if (mIsObserving) {
67
+ sensorKernelServiceSubscription.start()
68
+ }
69
+ }
70
+
71
+ override fun onHostPause() {
72
+ if (mIsObserving) {
73
+ sensorKernelServiceSubscription.stop()
74
+ }
75
+ }
76
+
77
+ override fun onHostDestroy() {
78
+ sensorKernelServiceSubscription.release()
79
+ }
80
+ }
@@ -0,0 +1,242 @@
1
+ package expo.modules.sensors.modules
2
+
3
+ import android.content.Context
4
+ import android.hardware.Sensor
5
+ import android.hardware.SensorEvent
6
+ import android.hardware.SensorEventListener2
7
+ import android.hardware.SensorManager
8
+ import android.os.Bundle
9
+ import android.view.Choreographer
10
+ import android.view.Surface
11
+ import android.view.WindowManager
12
+ import expo.modules.interfaces.sensors.SensorServiceInterface
13
+ import expo.modules.interfaces.sensors.SensorServiceSubscriptionInterface
14
+ import expo.modules.interfaces.sensors.services.AccelerometerServiceInterface
15
+ import expo.modules.interfaces.sensors.services.GravitySensorServiceInterface
16
+ import expo.modules.interfaces.sensors.services.GyroscopeServiceInterface
17
+ import expo.modules.interfaces.sensors.services.LinearAccelerationSensorServiceInterface
18
+ import expo.modules.interfaces.sensors.services.RotationVectorSensorServiceInterface
19
+ import expo.modules.core.ExportedModule
20
+ import expo.modules.core.ModuleRegistry
21
+ import expo.modules.core.Promise
22
+ import expo.modules.core.interfaces.ExpoMethod
23
+ import expo.modules.core.interfaces.services.EventEmitter
24
+ import expo.modules.core.interfaces.services.UIManager
25
+
26
+ class DeviceMotionModule(context: Context?) : ExportedModule(context), SensorEventListener2 {
27
+ private var mLastUpdate: Long = 0
28
+ private var mUpdateInterval = 1.0f / 60.0f
29
+ private val mRotationMatrix = FloatArray(9)
30
+ private val mRotationResult = FloatArray(3)
31
+ private var mAccelerationEvent: SensorEvent? = null
32
+ private var mAccelerationIncludingGravityEvent: SensorEvent? = null
33
+ private var mRotationEvent: SensorEvent? = null
34
+ private var mRotationRateEvent: SensorEvent? = null
35
+ private var mGravityEvent: SensorEvent? = null
36
+ private lateinit var mServiceSubscriptions: MutableList<SensorServiceSubscriptionInterface>
37
+ private lateinit var mUIManager: UIManager
38
+ private lateinit var mModuleRegistry: ModuleRegistry
39
+
40
+ private val mCurrentFrameCallback: ScheduleDispatchFrameCallback = ScheduleDispatchFrameCallback()
41
+ private val mDispatchEventRunnable = DispatchEventRunnable()
42
+ private lateinit var mEventEmitter: EventEmitter
43
+
44
+ override fun getName(): String = "ExponentDeviceMotion"
45
+
46
+ override fun getConstants(): Map<String, Any> {
47
+ // Gravity on the planet this module supports (currently just Earth) represented as m/s^2.
48
+ return mapOf(Pair("Gravity", 9.80665))
49
+ }
50
+
51
+ @ExpoMethod
52
+ fun setUpdateInterval(updateInterval: Int, promise: Promise) {
53
+ mUpdateInterval = updateInterval.toFloat()
54
+ promise.resolve(null)
55
+ }
56
+
57
+ @ExpoMethod
58
+ fun startObserving(promise: Promise) {
59
+ if (!this::mServiceSubscriptions.isInitialized) {
60
+ mServiceSubscriptions = ArrayList()
61
+ for (kernelService in getSensorKernelServices()) {
62
+ val subscription = kernelService.createSubscriptionForListener(this)
63
+ // We want handle update interval on our own,
64
+ // because we need to coordinate updates from multiple sensor services.
65
+ subscription.updateInterval = 0
66
+ mServiceSubscriptions.add(subscription)
67
+ }
68
+ }
69
+ mServiceSubscriptions.forEach { it.start() }
70
+ promise.resolve(null)
71
+ }
72
+
73
+ @ExpoMethod
74
+ fun stopObserving(promise: Promise) {
75
+ mUIManager.runOnUiQueueThread {
76
+ mServiceSubscriptions.forEach { it.stop() }
77
+ mCurrentFrameCallback.stop()
78
+ promise.resolve(null)
79
+ }
80
+ }
81
+
82
+ @ExpoMethod
83
+ fun isAvailableAsync(promise: Promise) {
84
+ val mSensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
85
+ val sensorTypes = arrayListOf(Sensor.TYPE_GYROSCOPE, Sensor.TYPE_ACCELEROMETER, Sensor.TYPE_LINEAR_ACCELERATION, Sensor.TYPE_ROTATION_VECTOR, Sensor.TYPE_GRAVITY)
86
+ for (type in sensorTypes) {
87
+ if (mSensorManager.getDefaultSensor(type!!) == null) {
88
+ promise.resolve(false)
89
+ return
90
+ }
91
+ }
92
+ promise.resolve(true)
93
+ }
94
+
95
+ override fun onCreate(moduleRegistry: ModuleRegistry) {
96
+ mEventEmitter = moduleRegistry.getModule(EventEmitter::class.java)
97
+ mUIManager = moduleRegistry.getModule(UIManager::class.java)
98
+ mModuleRegistry = moduleRegistry
99
+ }
100
+
101
+ private fun getSensorKernelServices(): List<SensorServiceInterface> {
102
+ return arrayListOf(
103
+ mModuleRegistry.getModule(GyroscopeServiceInterface::class.java),
104
+ mModuleRegistry.getModule(LinearAccelerationSensorServiceInterface::class.java),
105
+ mModuleRegistry.getModule(AccelerometerServiceInterface::class.java),
106
+ mModuleRegistry.getModule(RotationVectorSensorServiceInterface::class.java),
107
+ mModuleRegistry.getModule(GravitySensorServiceInterface::class.java)
108
+ )
109
+ }
110
+
111
+ override fun onSensorChanged(sensorEvent: SensorEvent) {
112
+ val sensor = sensorEvent.sensor
113
+ when (sensor.type) {
114
+ Sensor.TYPE_GYROSCOPE -> mRotationRateEvent = sensorEvent
115
+ Sensor.TYPE_ACCELEROMETER -> mAccelerationIncludingGravityEvent = sensorEvent
116
+ Sensor.TYPE_LINEAR_ACCELERATION -> mAccelerationEvent = sensorEvent
117
+ Sensor.TYPE_ROTATION_VECTOR -> mRotationEvent = sensorEvent
118
+ Sensor.TYPE_GRAVITY -> mGravityEvent = sensorEvent
119
+ }
120
+ mCurrentFrameCallback.maybePostFromNonUI()
121
+ }
122
+
123
+ override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) = Unit
124
+
125
+ override fun onFlushCompleted(sensor: Sensor) = Unit
126
+
127
+ private inner class ScheduleDispatchFrameCallback : Choreographer.FrameCallback {
128
+ @Volatile
129
+ private var mIsPosted = false
130
+ private var mShouldStop = false
131
+
132
+ override fun doFrame(frameTimeNanos: Long) {
133
+ if (mShouldStop) {
134
+ mIsPosted = false
135
+ } else {
136
+ post()
137
+ }
138
+ val curTime = System.currentTimeMillis()
139
+ if (curTime - mLastUpdate > mUpdateInterval) {
140
+ mUIManager.runOnClientCodeQueueThread(mDispatchEventRunnable)
141
+ mLastUpdate = curTime
142
+ }
143
+ }
144
+
145
+ fun stop() {
146
+ mShouldStop = true
147
+ }
148
+
149
+ fun maybePost() {
150
+ if (!mIsPosted) {
151
+ mIsPosted = true
152
+ post()
153
+ }
154
+ }
155
+
156
+ private fun post() {
157
+ Choreographer.getInstance().postFrameCallback(mCurrentFrameCallback)
158
+ }
159
+
160
+ fun maybePostFromNonUI() {
161
+ if (mIsPosted) {
162
+ return
163
+ }
164
+ mUIManager.runOnUiQueueThread { maybePost() }
165
+ }
166
+ }
167
+
168
+ private inner class DispatchEventRunnable : Runnable {
169
+ override fun run() {
170
+ mEventEmitter.emit("deviceMotionDidUpdate", eventsToMap())
171
+ }
172
+ }
173
+
174
+ private fun eventsToMap(): Bundle {
175
+ val map = Bundle()
176
+ var interval = 0.0
177
+ if (mAccelerationEvent != null) {
178
+ map.putBundle(
179
+ "acceleration",
180
+ Bundle().apply {
181
+ putDouble("x", mAccelerationEvent!!.values[0].toDouble())
182
+ putDouble("y", mAccelerationEvent!!.values[1].toDouble())
183
+ putDouble("z", mAccelerationEvent!!.values[2].toDouble())
184
+ }
185
+ )
186
+ interval = mAccelerationEvent!!.timestamp.toDouble()
187
+ }
188
+ if (mAccelerationIncludingGravityEvent != null && mGravityEvent != null) {
189
+ map.putBundle(
190
+ "accelerationIncludingGravity",
191
+ Bundle().apply {
192
+ putDouble("x", (mAccelerationIncludingGravityEvent!!.values[0] - 2 * mGravityEvent!!.values[0]).toDouble())
193
+ putDouble("y", (mAccelerationIncludingGravityEvent!!.values[1] - 2 * mGravityEvent!!.values[1]).toDouble())
194
+ putDouble("z", (mAccelerationIncludingGravityEvent!!.values[2] - 2 * mGravityEvent!!.values[2]).toDouble())
195
+ }
196
+ )
197
+ interval = mAccelerationIncludingGravityEvent!!.timestamp.toDouble()
198
+ }
199
+ if (mRotationRateEvent != null) {
200
+ map.putBundle(
201
+ "rotationRate",
202
+ Bundle().apply {
203
+ putDouble("alpha", Math.toDegrees(mRotationRateEvent!!.values[0].toDouble()))
204
+ putDouble("beta", Math.toDegrees(mRotationRateEvent!!.values[1].toDouble()))
205
+ putDouble("gamma", Math.toDegrees(mRotationRateEvent!!.values[2].toDouble()))
206
+ }
207
+ )
208
+ interval = mRotationRateEvent!!.timestamp.toDouble()
209
+ }
210
+ if (mRotationEvent != null) {
211
+ SensorManager.getRotationMatrixFromVector(mRotationMatrix, mRotationEvent!!.values)
212
+ SensorManager.getOrientation(mRotationMatrix, mRotationResult)
213
+ map.putBundle(
214
+ "rotation",
215
+ Bundle().apply {
216
+ putDouble("alpha", (-mRotationResult[0]).toDouble())
217
+ putDouble("beta", (-mRotationResult[1]).toDouble())
218
+ putDouble("gamma", mRotationResult[2].toDouble())
219
+ }
220
+ )
221
+ interval = mRotationEvent!!.timestamp.toDouble()
222
+ }
223
+ map.putDouble("interval", interval)
224
+ map.putInt("orientation", getOrientation())
225
+ return map
226
+ }
227
+
228
+ private fun getOrientation(): Int {
229
+ val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager?
230
+ if (windowManager != null) {
231
+ when (windowManager.defaultDisplay.rotation) {
232
+ Surface.ROTATION_0 -> return 0
233
+ Surface.ROTATION_90 -> return 90
234
+ Surface.ROTATION_180 -> return 180
235
+ Surface.ROTATION_270 -> return -90
236
+ else -> {
237
+ }
238
+ }
239
+ }
240
+ return 0
241
+ }
242
+ }
@@ -0,0 +1,55 @@
1
+ // Copyright 2015-present 650 Industries. All rights reserved.
2
+ package expo.modules.sensors.modules
3
+
4
+ import android.content.Context
5
+ import android.hardware.Sensor
6
+ import android.hardware.SensorEvent
7
+ import android.hardware.SensorManager
8
+ import android.os.Bundle
9
+ import expo.modules.interfaces.sensors.SensorServiceInterface
10
+ import expo.modules.interfaces.sensors.services.GyroscopeServiceInterface
11
+ import expo.modules.core.Promise
12
+ import expo.modules.core.interfaces.ExpoMethod
13
+
14
+ class GyroscopeModule(reactContext: Context?) : BaseSensorModule(reactContext) {
15
+ override val eventName: String = "gyroscopeDidUpdate"
16
+
17
+ override fun getName(): String = "ExponentGyroscope"
18
+
19
+ override fun getSensorService(): SensorServiceInterface {
20
+ return moduleRegistry.getModule(GyroscopeServiceInterface::class.java)
21
+ }
22
+
23
+ override fun eventToMap(sensorEvent: SensorEvent): Bundle {
24
+ return Bundle().apply {
25
+ putDouble("x", sensorEvent.values[0].toDouble())
26
+ putDouble("y", sensorEvent.values[1].toDouble())
27
+ putDouble("z", sensorEvent.values[2].toDouble())
28
+ }
29
+ }
30
+
31
+ @ExpoMethod
32
+ fun startObserving(promise: Promise) {
33
+ super.startObserving()
34
+ promise.resolve(null)
35
+ }
36
+
37
+ @ExpoMethod
38
+ fun stopObserving(promise: Promise) {
39
+ super.stopObserving()
40
+ promise.resolve(null)
41
+ }
42
+
43
+ @ExpoMethod
44
+ fun setUpdateInterval(updateInterval: Int, promise: Promise) {
45
+ super.setUpdateInterval(updateInterval)
46
+ promise.resolve(null)
47
+ }
48
+
49
+ @ExpoMethod
50
+ fun isAvailableAsync(promise: Promise) {
51
+ val mSensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
52
+ val isAvailable = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE) != null
53
+ promise.resolve(isAvailable)
54
+ }
55
+ }
@@ -0,0 +1,55 @@
1
+ // Copyright 2015-present 650 Industries. All rights reserved.
2
+ package expo.modules.sensors.modules
3
+
4
+ import android.content.Context
5
+ import android.hardware.Sensor
6
+ import android.hardware.SensorEvent
7
+ import android.hardware.SensorManager
8
+ import android.os.Bundle
9
+ import expo.modules.interfaces.sensors.SensorServiceInterface
10
+ import expo.modules.interfaces.sensors.services.MagnetometerServiceInterface
11
+ import expo.modules.core.Promise
12
+ import expo.modules.core.interfaces.ExpoMethod
13
+
14
+ class MagnetometerModule(reactContext: Context?) : BaseSensorModule(reactContext) {
15
+ override val eventName: String = "magnetometerDidUpdate"
16
+
17
+ override fun getName(): String = "ExponentMagnetometer"
18
+
19
+ override fun getSensorService(): SensorServiceInterface {
20
+ return moduleRegistry.getModule(MagnetometerServiceInterface::class.java)
21
+ }
22
+
23
+ override fun eventToMap(sensorEvent: SensorEvent): Bundle {
24
+ return Bundle().apply {
25
+ putDouble("x", sensorEvent.values[0].toDouble())
26
+ putDouble("y", sensorEvent.values[1].toDouble())
27
+ putDouble("z", sensorEvent.values[2].toDouble())
28
+ }
29
+ }
30
+
31
+ @ExpoMethod
32
+ fun startObserving(promise: Promise) {
33
+ super.startObserving()
34
+ promise.resolve(null)
35
+ }
36
+
37
+ @ExpoMethod
38
+ fun stopObserving(promise: Promise) {
39
+ super.stopObserving()
40
+ promise.resolve(null)
41
+ }
42
+
43
+ @ExpoMethod
44
+ fun setUpdateInterval(updateInterval: Int, promise: Promise) {
45
+ super.setUpdateInterval(updateInterval)
46
+ promise.resolve(null)
47
+ }
48
+
49
+ @ExpoMethod
50
+ fun isAvailableAsync(promise: Promise) {
51
+ val mSensorManager = context.getSystemService(Context.SENSOR_SERVICE) as SensorManager
52
+ val isAvailable = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null
53
+ promise.resolve(isAvailable)
54
+ }
55
+ }