package
org.geeksforgeeks.detectphysicalshake
import
android.content.Context
import
android.hardware.Sensor
import
android.hardware.SensorEvent
import
android.hardware.SensorEventListener
import
android.hardware.SensorManager
import
androidx.appcompat.app.AppCompatActivity
import
android.os.Bundle
import
android.widget.Toast
import
java.util.*
import
kotlin.math.sqrt
class
MainActivity : AppCompatActivity() {
private
var sensorManager: SensorManager? =
null
private
var acceleration = 0f
private
var currentAcceleration = 0f
private
var lastAcceleration = 0f
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
Objects.requireNonNull(sensorManager)!!
.registerListener(sensorListener, sensorManager!!
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL)
acceleration = 10f
currentAcceleration = SensorManager.GRAVITY_EARTH
lastAcceleration = SensorManager.GRAVITY_EARTH
}
private
val sensorListener: SensorEventListener = object : SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
val x = event.values[
0
]
val y = event.values[
1
]
val z = event.values[
2
]
lastAcceleration = currentAcceleration
currentAcceleration = sqrt((x * x + y * y + z * z).toDouble()).toFloat()
val delta: Float = currentAcceleration - lastAcceleration
acceleration = acceleration *
0
.9f + delta
if
(acceleration >
12
) {
Toast.makeText(applicationContext,
"Shake event detected"
, Toast.LENGTH_SHORT).show()
}
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}
}
override fun onResume() {
sensorManager?.registerListener(sensorListener, sensorManager!!.getDefaultSensor(
Sensor .TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL
)
super
.onResume()
}
override fun onPause() {
sensorManager!!.unregisterListener(sensorListener)
super
.onPause()
}
}