diff options
author | Mathias Agopian <mathias@google.com> | 2011-01-21 15:02:26 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2011-01-21 15:02:26 -0800 |
commit | 80f3376b3a0f9c677c37c98382d1021bed6c5633 (patch) | |
tree | 4f306a4f5d1b6a982a72c4943c6f9a874e37030d /core | |
parent | d75ee6f13aca098f5200e81cc339e7ca70dff01d (diff) | |
parent | b92a40ebfaf49783f942b75b413e1499e149c3bb (diff) | |
download | frameworks_base-80f3376b3a0f9c677c37c98382d1021bed6c5633.zip frameworks_base-80f3376b3a0f9c677c37c98382d1021bed6c5633.tar.gz frameworks_base-80f3376b3a0f9c677c37c98382d1021bed6c5633.tar.bz2 |
am b92a40eb: am 12d014fd: Merge "fix [3355413] Gyro calls onAccuracyChanged and reports accuracy as UNRELIABLE" into gingerbread
* commit 'b92a40ebfaf49783f942b75b413e1499e149c3bb':
fix [3355413] Gyro calls onAccuracyChanged and reports accuracy as UNRELIABLE
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/hardware/SensorManager.java | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index 4a75514..f079e42 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -25,6 +25,7 @@ import android.os.ServiceManager; import android.util.Log; import android.util.SparseArray; import android.util.SparseBooleanArray; +import android.util.SparseIntArray; import android.view.IRotationWatcher; import android.view.IWindowManager; import android.view.Surface; @@ -489,6 +490,8 @@ public class SensorManager private final Handler mHandler; private SensorEvent mValuesPool; public SparseBooleanArray mSensors = new SparseBooleanArray(); + public SparseBooleanArray mFirstEvent = new SparseBooleanArray(); + public SparseIntArray mSensorAccuracies = new SparseIntArray(); ListenerDelegate(SensorEventListener listener, Sensor sensor, Handler handler) { mSensorEventListener = listener; @@ -499,10 +502,30 @@ public class SensorManager mHandler = new Handler(looper) { @Override public void handleMessage(Message msg) { - SensorEvent t = (SensorEvent)msg.obj; - if (t.accuracy >= 0) { - mSensorEventListener.onAccuracyChanged(t.sensor, t.accuracy); + final SensorEvent t = (SensorEvent)msg.obj; + final int handle = t.sensor.getHandle(); + + switch (t.sensor.getType()) { + // Only report accuracy for sensors that support it. + case Sensor.TYPE_MAGNETIC_FIELD: + case Sensor.TYPE_ORIENTATION: + // call onAccuracyChanged() only if the value changes + final int accuracy = mSensorAccuracies.get(handle); + if ((t.accuracy >= 0) && (accuracy != t.accuracy)) { + mSensorAccuracies.put(handle, t.accuracy); + mSensorEventListener.onAccuracyChanged(t.sensor, t.accuracy); + } + break; + default: + // For other sensors, just report the accuracy once + if (mFirstEvent.get(handle) == false) { + mFirstEvent.put(handle, true); + mSensorEventListener.onAccuracyChanged( + t.sensor, SENSOR_STATUS_ACCURACY_HIGH); + } + break; } + mSensorEventListener.onSensorChanged(t); returnToPool(t); } |