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

http://eyes-free.googlecode.com/ · Java · 102 lines · 64 code · 18 blank · 20 comment · 8 complexity · 0af87401fc97c5729cc82496d3d2538c MD5 · raw file

  1. /*
  2. * Copyright (C) 2010 Google Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.google.marvin.shell;
  17. import android.content.Context;
  18. import android.hardware.Sensor;
  19. import android.hardware.SensorEvent;
  20. import android.hardware.SensorEventListener;
  21. import android.hardware.SensorManager;
  22. /**
  23. * Uses the accelerometer to detect when the user is shaking the phone.
  24. *
  25. * @author clchen@google.com (Charles L. Chen), credo@google.com (Tim Credo)
  26. */
  27. public class ShakeDetector {
  28. public interface ShakeListener {
  29. public void onShakeDetected();
  30. }
  31. private SensorEventListener mListener;
  32. private ShakeListener cb;
  33. private SensorManager sensorManager;
  34. public ShakeDetector(Context context, ShakeListener callback) {
  35. cb = callback;
  36. mListener = new SensorEventListener() {
  37. private final double deletionForce = .8;
  38. private final int deletionCount = 2;
  39. int shakeCount = 0;
  40. boolean lastShakePositive = false;
  41. private int shakeCountTimeout = 500;
  42. @Override
  43. public void onSensorChanged(SensorEvent event) {
  44. float[] values = event.values;
  45. if ((values[1] > deletionForce) && !lastShakePositive) {
  46. (new Thread(new resetShakeCount())).start();
  47. shakeCount++;
  48. lastShakePositive = true;
  49. } else if ((values[1] < -deletionForce) && lastShakePositive) {
  50. (new Thread(new resetShakeCount())).start();
  51. shakeCount++;
  52. lastShakePositive = false;
  53. }
  54. if (shakeCount > deletionCount) {
  55. shakeCount = 0;
  56. cb.onShakeDetected();
  57. }
  58. }
  59. @Override
  60. public void onAccuracyChanged(Sensor arg0, int arg1) {
  61. }
  62. class resetShakeCount implements Runnable {
  63. @Override
  64. public void run() {
  65. try {
  66. Thread.sleep(shakeCountTimeout);
  67. shakeCount = 0;
  68. } catch (InterruptedException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. }
  73. };
  74. sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
  75. Sensor accelerometer = sensorManager.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER);
  76. sensorManager.registerListener(
  77. mListener, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
  78. }
  79. public void shutdown() {
  80. if (sensorManager != null) {
  81. sensorManager.unregisterListener(mListener);
  82. }
  83. }
  84. }