package com.cellbots.sensors; import java.util.List; import com.allthingsgeek.celljoust.MainActivity; 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 SensorListener 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) MainActivity.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( SensorListener orientationListener) { sensorManager = (SensorManager) MainActivity.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_NORMAL); 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 Side currentSide = null; private Side oldSide = null; private float azimuth; private float pitch; private float roll; public void onAccuracyChanged(Sensor sensor, int accuracy) {} public void onSensorChanged(SensorEvent event) { azimuth = event.values[0]; // azimuth pitch = event.values[1]; // pitch roll = event.values[2]; // roll if (pitch < -45 && pitch > -135) { // top side up currentSide = Side.TOP; } else if (pitch > 45 && pitch < 135) { // bottom side up currentSide = Side.BOTTOM; } else if (roll > 45) { // right side up currentSide = Side.RIGHT; } else if (roll < -45) { // left side up currentSide = Side.LEFT; } /* if (currentSide != null && !currentSide.equals(oldSide)) { switch (currentSide) { case TOP : listener.onTopUp(); break; case BOTTOM : listener.onBottomUp(); break; case LEFT: listener.onLeftUp(); break; case RIGHT: listener.onRightUp(); break; } oldSide = currentSide; }*/ // forwards orientation to the OrientationListener listener.onOrientationChanged(azimuth, pitch, roll); } }; }