package org.osmdroid.views.overlay.compass; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; public class InternalCompassOrientationProvider implements SensorEventListener, IOrientationProvider { private IOrientationConsumer mOrientationConsumer; private SensorManager mSensorManager; private float mAzimuth; public InternalCompassOrientationProvider(Context context) { mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); } // // IOrientationProvider // /** * Enable orientation updates from the internal compass sensor and show the compass. */ @Override public boolean startOrientationProvider(IOrientationConsumer orientationConsumer) { mOrientationConsumer = orientationConsumer; boolean result = false; final Sensor sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); if (sensor != null) { result = mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI); } return result; } @Override public void stopOrientationProvider() { mOrientationConsumer = null; mSensorManager.unregisterListener(this); } @Override public float getLastKnownOrientation() { return mAzimuth; } @Override public void destroy() { stopOrientationProvider(); mOrientationConsumer=null; mSensorManager=null; } // // SensorEventListener // @Override public void onAccuracyChanged(final Sensor sensor, final int accuracy) { // This is not interesting for us at the moment } @Override public void onSensorChanged(final SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) { if (event.values != null) { mAzimuth = event.values[0]; if (mOrientationConsumer != null) mOrientationConsumer.onOrientationChanged(mAzimuth, this); } } } }