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.
- package/CHANGELOG.md +21 -2
- package/android/build.gradle +3 -12
- package/android/src/main/java/expo/modules/sensors/SensorsPackage.kt +50 -0
- package/android/src/main/java/expo/modules/sensors/modules/AccelerometerModule.kt +55 -0
- package/android/src/main/java/expo/modules/sensors/modules/BarometerModule.kt +54 -0
- package/android/src/main/java/expo/modules/sensors/modules/BaseSensorModule.kt +80 -0
- package/android/src/main/java/expo/modules/sensors/modules/DeviceMotionModule.kt +242 -0
- package/android/src/main/java/expo/modules/sensors/modules/GyroscopeModule.kt +55 -0
- package/android/src/main/java/expo/modules/sensors/modules/MagnetometerModule.kt +55 -0
- package/android/src/main/java/expo/modules/sensors/modules/MagnetometerUncalibratedModule.kt +55 -0
- package/android/src/main/java/expo/modules/sensors/modules/PedometerModule.kt +63 -0
- package/android/src/main/java/expo/modules/sensors/services/AccelerometerService.kt +15 -0
- package/android/src/main/java/expo/modules/sensors/services/BarometerService.kt +15 -0
- package/android/src/main/java/expo/modules/sensors/services/BaseSensorService.kt +26 -0
- package/android/src/main/java/expo/modules/sensors/services/BaseService.kt +44 -0
- package/android/src/main/java/expo/modules/sensors/services/GravitySensorService.kt +15 -0
- package/android/src/main/java/expo/modules/sensors/services/GyroscopeService.kt +15 -0
- package/android/src/main/java/expo/modules/sensors/services/LinearAccelerationSensorService.kt +15 -0
- package/android/src/main/java/expo/modules/sensors/services/MagnetometerService.kt +15 -0
- package/android/src/main/java/expo/modules/sensors/services/MagnetometerUncalibratedService.kt +15 -0
- package/android/src/main/java/expo/modules/sensors/services/PedometerService.kt +15 -0
- package/android/src/main/java/expo/modules/sensors/services/RotationVectorSensorService.kt +15 -0
- package/android/src/main/java/expo/modules/sensors/services/SensorServiceSubscription.kt +49 -0
- package/android/src/main/java/expo/modules/sensors/services/SubscribableSensorService.kt +92 -0
- package/build/DeviceMotion.js +1 -4
- package/build/DeviceMotion.js.map +1 -1
- package/build/DeviceSensor.d.ts +1 -2
- package/build/DeviceSensor.js +57 -54
- package/build/DeviceSensor.js.map +1 -1
- package/build/ExpoBarometer.d.ts +1 -1
- package/build/ExpoBarometer.js +1 -1
- package/build/ExpoBarometer.js.map +1 -1
- package/build/ExponentAccelerometer.d.ts +1 -1
- package/build/ExponentAccelerometer.js +1 -1
- package/build/ExponentAccelerometer.js.map +1 -1
- package/build/ExponentAccelerometer.web.js +1 -1
- package/build/ExponentAccelerometer.web.js.map +1 -1
- package/build/ExponentDeviceMotion.d.ts +1 -1
- package/build/ExponentDeviceMotion.js +1 -1
- package/build/ExponentDeviceMotion.js.map +1 -1
- package/build/ExponentDeviceMotion.web.js +1 -1
- package/build/ExponentDeviceMotion.web.js.map +1 -1
- package/build/ExponentGyroscope.d.ts +1 -1
- package/build/ExponentGyroscope.js +1 -1
- package/build/ExponentGyroscope.js.map +1 -1
- package/build/ExponentGyroscope.web.js +1 -1
- package/build/ExponentGyroscope.web.js.map +1 -1
- package/build/ExponentMagnetometer.d.ts +1 -1
- package/build/ExponentMagnetometer.js +1 -1
- package/build/ExponentMagnetometer.js.map +1 -1
- package/build/ExponentMagnetometerUncalibrated.d.ts +1 -1
- package/build/ExponentMagnetometerUncalibrated.js +1 -1
- package/build/ExponentMagnetometerUncalibrated.js.map +1 -1
- package/build/ExponentPedometer.d.ts +1 -1
- package/build/ExponentPedometer.js +1 -1
- package/build/ExponentPedometer.js.map +1 -1
- package/build/Pedometer.d.ts +1 -2
- package/build/Pedometer.js +1 -2
- package/build/Pedometer.js.map +1 -1
- package/build/utils/isSensorEnabledAsync.web.js +2 -3
- package/build/utils/isSensorEnabledAsync.web.js.map +1 -1
- package/ios/EXSensors/EXMotionPermissionRequester.m +6 -6
- package/ios/EXSensors/EXSensorsManager.h +2 -2
- package/ios/EXSensors/EXSensorsManager.m +5 -2
- package/ios/EXSensors/Modules/EXPedometer.h +5 -5
- package/ios/EXSensors/Modules/EXPedometer.m +24 -24
- package/ios/EXSensors/Modules/SensorModules/EXAccelerometer.m +2 -2
- package/ios/EXSensors/Modules/SensorModules/EXBarometer.m +2 -2
- package/ios/EXSensors/Modules/SensorModules/EXBaseSensorModule.h +4 -4
- package/ios/EXSensors/Modules/SensorModules/EXBaseSensorModule.m +18 -18
- package/ios/EXSensors/Modules/SensorModules/EXDeviceMotion.m +2 -2
- package/ios/EXSensors/Modules/SensorModules/EXGyroscope.m +2 -2
- package/ios/EXSensors/Modules/SensorModules/EXMagnetometer.m +2 -2
- package/ios/EXSensors/Modules/SensorModules/EXMagnetometerUncalibrated.m +2 -2
- package/ios/EXSensors.podspec +2 -2
- package/ios/EXSensors.xcframework/ios-arm64/EXSensors.framework/EXSensors +0 -0
- package/ios/EXSensors.xcframework/ios-arm64/EXSensors.framework/Info.plist +0 -0
- package/ios/EXSensors.xcframework/ios-arm64_x86_64-simulator/EXSensors.framework/EXSensors +0 -0
- package/ios/EXSensors.xcframework/ios-arm64_x86_64-simulator/EXSensors.framework/Info.plist +0 -0
- package/package.json +5 -8
- package/src/DeviceSensor.ts +7 -2
- package/src/ExpoBarometer.ts +1 -1
- package/src/ExponentAccelerometer.ts +1 -1
- package/src/ExponentAccelerometer.web.ts +1 -1
- package/src/ExponentDeviceMotion.ts +1 -1
- package/src/ExponentDeviceMotion.web.ts +1 -1
- package/src/ExponentGyroscope.ts +1 -1
- package/src/ExponentGyroscope.web.ts +1 -1
- package/src/ExponentMagnetometer.ts +1 -1
- package/src/ExponentMagnetometerUncalibrated.ts +1 -1
- package/src/ExponentPedometer.ts +1 -1
- package/src/Pedometer.ts +8 -2
- package/src/utils/isSensorEnabledAsync.web.ts +2 -3
- package/android/src/main/java/expo/modules/sensors/SensorsPackage.java +0 -57
- package/android/src/main/java/expo/modules/sensors/modules/AccelerometerModule.java +0 -69
- package/android/src/main/java/expo/modules/sensors/modules/BarometerModule.java +0 -68
- package/android/src/main/java/expo/modules/sensors/modules/BaseSensorModule.java +0 -114
- package/android/src/main/java/expo/modules/sensors/modules/DeviceMotionModule.java +0 -298
- package/android/src/main/java/expo/modules/sensors/modules/GyroscopeModule.java +0 -69
- package/android/src/main/java/expo/modules/sensors/modules/MagnetometerModule.java +0 -69
- package/android/src/main/java/expo/modules/sensors/modules/MagnetometerUncalibratedModule.java +0 -69
- package/android/src/main/java/expo/modules/sensors/modules/PedometerModule.java +0 -76
- package/android/src/main/java/expo/modules/sensors/services/AccelerometerService.java +0 -29
- package/android/src/main/java/expo/modules/sensors/services/BarometerService.java +0 -29
- package/android/src/main/java/expo/modules/sensors/services/BaseSensorService.java +0 -33
- package/android/src/main/java/expo/modules/sensors/services/BaseService.java +0 -66
- package/android/src/main/java/expo/modules/sensors/services/GravitySensorService.java +0 -29
- package/android/src/main/java/expo/modules/sensors/services/GyroscopeService.java +0 -30
- package/android/src/main/java/expo/modules/sensors/services/LinearAccelerationSensorService.java +0 -29
- package/android/src/main/java/expo/modules/sensors/services/MagnetometerService.java +0 -29
- package/android/src/main/java/expo/modules/sensors/services/MagnetometerUncalibratedService.java +0 -29
- package/android/src/main/java/expo/modules/sensors/services/PedometerService.java +0 -29
- package/android/src/main/java/expo/modules/sensors/services/RotationVectorSensorService.java +0 -29
- package/android/src/main/java/expo/modules/sensors/services/SensorServiceSubscription.java +0 -65
- 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
|
-
##
|
|
13
|
+
## 11.0.3 — 2021-10-21
|
|
14
14
|
|
|
15
15
|
_This version does not introduce any user-facing changes._
|
|
16
16
|
|
|
17
|
-
##
|
|
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
|
package/android/build.gradle
CHANGED
|
@@ -3,7 +3,7 @@ apply plugin: 'kotlin-android'
|
|
|
3
3
|
apply plugin: 'maven'
|
|
4
4
|
|
|
5
5
|
group = 'host.exp.exponent'
|
|
6
|
-
version = '
|
|
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 "
|
|
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
|
-
|
|
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
|
+
}
|