/talkingdialer/src/com/google/marvin/talkingdialer/ShakeDetector.java

http://eyes-free.googlecode.com/ · Java · 79 lines · 61 code · 18 blank · 0 comment · 6 complexity · f9ab7999aee52862f979e678a589af1e MD5 · raw file

  1. package com.google.marvin.talkingdialer;
  2. import android.content.Context;
  3. import android.hardware.Sensor;
  4. import android.hardware.SensorEvent;
  5. import android.hardware.SensorEventListener;
  6. import android.hardware.SensorManager;
  7. public class ShakeDetector {
  8. public interface ShakeListener {
  9. public void onShakeDetected();
  10. }
  11. private SensorEventListener mListener;
  12. private ShakeListener cb;
  13. private SensorManager sensorManager;
  14. public ShakeDetector(Context context, ShakeListener callback) {
  15. cb = callback;
  16. mListener = new SensorEventListener() {
  17. private final double deletionForce = .8;
  18. private final int deletionCount = 2;
  19. int shakeCount = 0;
  20. boolean lastShakePositive = false;
  21. private int shakeCountTimeout = 500;
  22. @Override
  23. public void onSensorChanged(SensorEvent sensorEvent) {
  24. if ((sensorEvent.values[1] > deletionForce) && !lastShakePositive) {
  25. (new Thread(new resetShakeCount())).start();
  26. shakeCount++;
  27. lastShakePositive = true;
  28. } else if ((sensorEvent.values[1] < -deletionForce) && lastShakePositive) {
  29. (new Thread(new resetShakeCount())).start();
  30. shakeCount++;
  31. lastShakePositive = false;
  32. }
  33. if (shakeCount > deletionCount) {
  34. shakeCount = 0;
  35. cb.onShakeDetected();
  36. }
  37. }
  38. @Override
  39. public void onAccuracyChanged(Sensor sensor, int arg1) {
  40. }
  41. class resetShakeCount implements Runnable {
  42. @Override
  43. public void run() {
  44. try {
  45. Thread.sleep(shakeCountTimeout);
  46. shakeCount = 0;
  47. } catch (InterruptedException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. };
  53. sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
  54. sensorManager.registerListener(mListener,
  55. sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
  56. SensorManager.SENSOR_DELAY_FASTEST);
  57. }
  58. public void shutdown() {
  59. sensorManager.unregisterListener(mListener);
  60. }
  61. }