aboutsummaryrefslogtreecommitdiff
path: root/mobileapp/src/smoots/udesign/accelerometer/AccelerometerManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'mobileapp/src/smoots/udesign/accelerometer/AccelerometerManager.java')
-rwxr-xr-xmobileapp/src/smoots/udesign/accelerometer/AccelerometerManager.java178
1 files changed, 178 insertions, 0 deletions
diff --git a/mobileapp/src/smoots/udesign/accelerometer/AccelerometerManager.java b/mobileapp/src/smoots/udesign/accelerometer/AccelerometerManager.java
new file mode 100755
index 0000000..2d5877c
--- /dev/null
+++ b/mobileapp/src/smoots/udesign/accelerometer/AccelerometerManager.java
@@ -0,0 +1,178 @@
+package smoots.udesign.accelerometer;
+
+import java.util.List;
+
+import smoots.udesign.canvas.VirtualCanvasActivity;
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+
+
+public class AccelerometerManager {
+
+ /** Accuracy configuration */
+ private static float threshold = 5;
+ private static int interval = 1000;
+
+ private static Sensor sensor;
+ private static SensorManager sensorManager;
+ // you could use an OrientationListener array instead
+ // if you plans to use more than one listener
+ private static AccelerometerListener listener;
+
+ /** indicates whether or not Accelerometer Sensor is supported */
+ private static Boolean supported;
+ /** indicates whether or not Accelerometer Sensor is running */
+ private static boolean running = false;
+
+ /**
+ * Returns true if the manager is listening to orientation changes
+ */
+ public static boolean isListening() {
+ return running;
+ }
+
+ /**
+ * Unregisters listeners
+ */
+ public static void stopListening() {
+ running = false;
+ try {
+ if (sensorManager != null && sensorEventListener != null) {
+ sensorManager.unregisterListener(sensorEventListener);
+ }
+ } catch (Exception e) {}
+ }
+
+ /**
+ * Returns true if at least one Accelerometer sensor is available
+ */
+ public static boolean isSupported() {
+ if (supported == null) {
+ if (VirtualCanvasActivity.getContext() != null) {
+ sensorManager = (SensorManager) VirtualCanvasActivity.getContext().
+ getSystemService(Context.SENSOR_SERVICE);
+ List<Sensor> sensors = sensorManager.getSensorList(
+ Sensor.TYPE_ACCELEROMETER);
+ supported = new Boolean(sensors.size() > 0);
+ } else {
+ supported = Boolean.FALSE;
+ }
+ }
+ return supported;
+ }
+
+ /**
+ * Configure the listener for shaking
+ * @param threshold
+ * minimum acceleration variation for considering shaking
+ * @param interval
+ * minimum interval between to shake events
+ */
+ public static void configure(int threshold, int interval) {
+ AccelerometerManager.threshold = threshold;
+ AccelerometerManager.interval = interval;
+ }
+
+ /**
+ * Registers a listener and start listening
+ * @param accelerometerListener
+ * callback for accelerometer events
+ */
+ public static void startListening(
+ AccelerometerListener accelerometerListener) {
+ sensorManager = (SensorManager) VirtualCanvasActivity.getContext().
+ getSystemService(Context.SENSOR_SERVICE);
+ List<Sensor> sensors = sensorManager.getSensorList(
+ Sensor.TYPE_ACCELEROMETER);
+ if (sensors.size() > 0) {
+ sensor = sensors.get(0);
+ running = sensorManager.registerListener(
+ sensorEventListener, sensor,
+ SensorManager.SENSOR_DELAY_GAME);
+ listener = accelerometerListener;
+ }
+ }
+
+ /**
+ * Configures threshold and interval
+ * And registers a listener and start listening
+ * @param accelerometerListener
+ * callback for accelerometer events
+ * @param threshold
+ * minimum acceleration variation for considering shaking
+ * @param interval
+ * minimum interval between to shake events
+ */
+ public static void startListening(
+ AccelerometerListener accelerometerListener,
+ int threshold, int interval) {
+ configure(threshold, interval);
+ startListening(accelerometerListener);
+ }
+
+ /**
+ * The listener that listen to events from the accelerometer listener
+ */
+ private static SensorEventListener sensorEventListener =
+ new SensorEventListener() {
+
+ private long now = 0;
+ private long timeDiff = 0;
+ private long lastUpdate = 0;
+ private long lastShake = 0;
+
+ private float x = 0;
+ private float y = 0;
+ private float z = 0;
+ private float lastX = 0;
+ private float lastY = 0;
+ private float lastZ = 0;
+ private float force = 0;
+
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {}
+
+ public void onSensorChanged(SensorEvent event) {
+ // use the event timestamp as reference
+ // so the manager precision won't depends
+ // on the AccelerometerListener implementation
+ // processing time
+ now = event.timestamp;
+
+ x = event.values[0];
+ y = event.values[1];
+ z = event.values[2];
+
+ // SHAKE THE PHONE
+ if (lastUpdate == 0) {
+ lastUpdate = now;
+ lastShake = now;
+ lastX = x;
+ lastY = y;
+ lastZ = z;
+ } else {
+ timeDiff = now - lastUpdate;
+ if (timeDiff > interval) {
+ force = Math.abs(x + y + z - lastX - lastY - lastZ) / timeDiff * 10000000;
+ if (force > threshold) {
+ if (now - lastShake >= interval) {
+ // trigger shake event
+ listener.onShake(force);
+ }
+ lastShake = now;
+ }
+ lastX = x;
+ lastY = y;
+ lastZ = z;
+ lastUpdate = now;
+ }
+ }
+ // trigger change event
+ listener.onAccelerationChanged(x, y, z);
+ }
+
+ };
+
+}