This repository has been archived on 2022-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
DevOpsOpenHack/MobileApps/MyDriving/MyDriving.Android/Helpers/AccelerometerManager.cs
2022-11-03 16:41:13 -04:00

136 lines
4.1 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.
using Android.Content;
using Android.Hardware;
using Java.Lang;
using Exception = System.Exception;
using Math = System.Math;
namespace MyDriving.Droid.Helpers
{
public interface IAccelerometerListener
{
void OnAccelerationChanged(float x, float y, float z);
void OnShake(float force);
}
public class AccelerometerManager
{
readonly ShakeSensorEventListener eventListener;
readonly SensorManager sensorManager;
Sensor sensor;
public AccelerometerManager(Context context, IAccelerometerListener listener)
{
eventListener = new ShakeSensorEventListener(listener);
sensorManager = (SensorManager) context.GetSystemService(Context.SensorService);
IsSupported = sensorManager.GetSensorList(SensorType.Accelerometer).Count > 0;
}
public bool IsSupported { get; set; }
/// <summary>
/// Gets if the manager is listening to orientation changes
/// </summary>
public bool IsListening { get; private set; }
public void Configure(int threshold, int interval)
{
eventListener.Threshold = threshold;
eventListener.Interval = interval;
}
public void StopListening()
{
IsListening = false;
try
{
if (sensorManager != null && eventListener != null)
{
sensorManager.UnregisterListener(eventListener);
}
}
catch (Exception)
{
}
}
public void StartListening()
{
var sensors = sensorManager.GetSensorList(SensorType.Accelerometer);
if (sensors.Count > 0)
{
sensor = sensors[0];
IsListening = sensorManager.RegisterListener(eventListener, sensor, SensorDelay.Game);
}
}
class ShakeSensorEventListener : Object, ISensorEventListener
{
readonly IAccelerometerListener listener;
long now, timeDiff, lastUpdate, lastShake;
float x, y, z, lastX, lastY, lastZ, force;
public ShakeSensorEventListener(IAccelerometerListener listener)
{
this.listener = listener;
Threshold = 25.0f;
Interval = 200;
}
//Accuracy Configuration
public float Threshold { get; set; }
public int Interval { get; set; }
public void OnAccuracyChanged(Sensor sensor, SensorStatus accuracy)
{
}
public void OnSensorChanged(SensorEvent e)
{
try
{
now = e.Timestamp;
x = e.Values[0];
y = e.Values[1];
z = e.Values[2];
if (lastUpdate == 0)
{
lastUpdate = now;
lastShake = now;
lastX = x;
lastY = y;
lastZ = z;
}
else
{
timeDiff = now - lastUpdate;
if (timeDiff <= 0)
return;
force = Math.Abs(x + y + z - lastX - lastY - lastZ);
if (Float.Compare(force, Threshold) > 0)
{
if (now - lastShake >= Interval)
listener.OnShake(force);
lastShake = now;
}
lastX = x;
lastY = y;
lastZ = z;
lastUpdate = now;
}
}
finally
{
listener.OnAccelerationChanged(x, y, z);
}
}
}
}
}