package com.cellbots; import java.util.Date; import java.util.List; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; /** * Android Orientation Sensor Manager Archetype * @author antoine vianey * under GPL v3 : http://www.gnu.org/licenses/gpl-3.0.html */ public class OrientationManager { private static Sensor sensor; private static SensorManager sensorManager; // you could use an OrientationListener array instead // if you plans to use more than one listener private static OrientationListener listener; /** indicates whether or not Orientation Sensor is supported */ private static Boolean supported; /** indicates whether or not Orientation Sensor is running */ private static boolean running = false; /** Sides of the phone */ enum Side { TOP, BOTTOM, LEFT, RIGHT; } /** * Returns true if the manager is listening to orientation changes */ public static boolean isListening() { return running; } /** * Unregisters listeners */ public static void stopListening() { running = false; try { if (sensorManager != null && sensorEventListener != null) { sensorManager.unregisterListener(sensorEventListener); } } catch (Exception e) {} } /** * Returns true if at least one Orientation sensor is available */ public static boolean isSupported() { if (supported == null) { sensorManager = (SensorManager) ServoTester.sensorManager; if (sensorManager != null) { List<Sensor> sensors = sensorManager.getSensorList( Sensor.TYPE_ORIENTATION); supported = new Boolean(sensors.size() > 0); } else { supported = Boolean.FALSE; } } return supported; } /** * Registers a listener and start listening */ public static void startListening( OrientationListener orientationListener) { sensorManager = (SensorManager) ServoTester.sensorManager; if (sensorManager != null) { List<Sensor> sensors = sensorManager.getSensorList( Sensor.TYPE_ORIENTATION); if (sensors.size() > 0) { sensor = sensors.get(0); running = sensorManager.registerListener( sensorEventListener, sensor, SensorManager.SENSOR_DELAY_FASTEST); listener = orientationListener; } } } /** * The listener that listen to events from the orientation listener */ private static SensorEventListener sensorEventListener = new SensorEventListener() { /** The side that is currently up */ private float azimuth = 0; private float pitch = 90; private float roll = 0; private long lastTimeStamp = System.nanoTime(); private float pitchRate; public void onAccuracyChanged(Sensor sensor, int accuracy) {} public void onSensorChanged(SensorEvent event) { pitchRate = (pitch - event.values[1]) / (event.timestamp - lastTimeStamp); azimuth = event.values[0]; // azimuth pitch = event.values[1]; // pitch roll = event.values[2]; // roll // forwards orientation to the OrientationListener listener.onOrientationChanged(azimuth, pitch, roll,pitchRate); } }; }