OSDN Git Service

theme engine fixes
[android-x86/packages-apps-Eleven.git] / src / com / android / music / Shaker.java
1 package com.android.music;\r
2 \r
3 import android.content.Context;\r
4 import android.hardware.Sensor;\r
5 import android.hardware.SensorEvent;\r
6 import android.hardware.SensorEventListener;\r
7 import android.hardware.SensorManager;\r
8 import android.os.SystemClock;\r
9 \r
10 public class Shaker {\r
11         private SensorManager mgr = null;\r
12         private long lastShakeTimestamp = 0;\r
13         private double threshold = 1.0d;\r
14         private long gap = 0;\r
15         private Shaker.Callback cb = null;\r
16 \r
17         public Shaker(Context ctxt, double threshold, long gap, Shaker.Callback cb) {\r
18                 this.threshold = threshold * threshold;\r
19                 this.threshold = this.threshold * SensorManager.GRAVITY_EARTH\r
20                                 * SensorManager.GRAVITY_EARTH;\r
21                 this.gap = gap;\r
22                 this.cb = cb;\r
23 \r
24                 mgr = (SensorManager) ctxt.getSystemService(Context.SENSOR_SERVICE);\r
25                 mgr.registerListener(listener,\r
26                                 mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),\r
27                                 SensorManager.SENSOR_DELAY_UI);\r
28         }\r
29 \r
30         public void close() {\r
31                 mgr.unregisterListener(listener);\r
32         }\r
33 \r
34         private void isShaking() {\r
35                 long now = SystemClock.uptimeMillis();\r
36                 try {\r
37                         if (lastShakeTimestamp == 0) {\r
38                                 lastShakeTimestamp = now;\r
39 \r
40                                 if (cb != null) {\r
41                                         cb.shakingStarted();\r
42                                 }\r
43                         } else {\r
44                                 lastShakeTimestamp = now;\r
45                         }\r
46                 } catch (NullPointerException e) {\r
47 \r
48                 }\r
49         }\r
50 \r
51         private void isNotShaking() {\r
52                 long now = SystemClock.uptimeMillis();\r
53 \r
54                 if (lastShakeTimestamp > 0) {\r
55                         if (now - lastShakeTimestamp > gap) {\r
56                                 lastShakeTimestamp = 0;\r
57 \r
58                                 if (cb != null) {\r
59                                         cb.shakingStopped();\r
60                                 }\r
61                         }\r
62                 }\r
63         }\r
64 \r
65         public interface Callback {\r
66                 void shakingStarted();\r
67 \r
68                 void shakingStopped();\r
69         }\r
70 \r
71         private SensorEventListener listener = new SensorEventListener() {\r
72                 public void onSensorChanged(SensorEvent e) {\r
73                         if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {\r
74                                 double netForce = e.values[0] * e.values[0];\r
75 \r
76                                 netForce += e.values[1] * e.values[1];\r
77                                 netForce += e.values[2] * e.values[2];\r
78 \r
79                                 if (threshold < netForce) {\r
80                                         isShaking();\r
81                                 } else {\r
82                                         isNotShaking();\r
83                                 }\r
84                         }\r
85                 }\r
86 \r
87                 public void onAccuracyChanged(Sensor sensor, int accuracy) {\r
88                         // unused\r
89                 }\r
90         };\r
91 }