package com.nbs.client.assassins.sensors; import java.util.IdentityHashMap; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.util.Log; public class BearingProviderImpl implements BearingProvider, SensorEventListener { private static final String TAG = "BearingProviderImpl"; private SensorManager mSensorManager; private Sensor accelerometer; private Sensor magnetometer; private boolean registeredForSensorUpdates = false; private BearingSmoother bearingSmoother; private IdentityHashMap<BearingReceiver, BearingReceiver> bearingReceivers; public BearingProviderImpl(Context c) { bearingReceivers = new IdentityHashMap<BearingReceiver, BearingReceiver>(); bearingSmoother = new BearingSmoother(new SensorManagerStub()); mSensorManager = (SensorManager)c.getSystemService(Context.SENSOR_SERVICE); accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } private void registerForSensorUpdates() { if(!registeredForSensorUpdates) { mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI); mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_GAME); registeredForSensorUpdates = true; } } private void stopSensorUpdates() { if(registeredForSensorUpdates) { mSensorManager.unregisterListener(this); registeredForSensorUpdates = false; } } public void onBearingChanged(float bearing) { for(BearingReceiver receiver : bearingReceivers.values()) { Log.d(TAG, receiver.toString()); receiver.onBearingChanged(bearing); } } @Override public void registerForBearingUpdates(BearingReceiver receiver) { bearingReceivers.put(receiver, receiver); registerForSensorUpdates(); } @Override public void unregisterForBearingUpdates(BearingReceiver receiver) { bearingReceivers.remove(receiver); if(bearingReceivers.isEmpty()) stopSensorUpdates(); } @Override public void onSensorChanged(SensorEvent event) { Log.d(TAG, "SensorEvent at time: " + event.timestamp); int type = event.sensor.getType(); if (type == Sensor.TYPE_ACCELEROMETER) { bearingSmoother.onAccelerometerChanged(event.values); } else if (type == Sensor.TYPE_MAGNETIC_FIELD) { bearingSmoother.onMagnetometerChanged(event.values); } onBearingChanged(bearingSmoother.getBearing()); } }