A listener class for detecting orientation changes.
/* The following code was written by
*
* Matthew Wiggins (Jun 2009)
*
* and is released under the APACHE 2.0 license
*
* http://www.apache.org/licenses/LICENSE-2.0
*/
package com.hlidskialf.android.hardware;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import java.lang.UnsupportedOperationException;
import java.util.List;
public class OrientationListener implements SensorEventListener
{
public static final int ORIENTATION_UNDETERMINED=-1;
public static final int ORIENTATION_NORTH=0;
public static final int ORIENTATION_EAST=1;
public static final int ORIENTATION_SOUTH=2;
public static final int ORIENTATION_WEST=3;
private SensorManager mSensorMgr;
private Sensor mSensor;
private Context mContext;
private int mCurOrientation = ORIENTATION_UNDETERMINED;
private OnRotateListener mRotateListener;
public interface OnRotateListener
{
public void onRotate(int orientation);
}
public OrientationListener(Context context)
{
mContext = context;
}
public void resume() {
mSensorMgr = (SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);
if (mSensorMgr == null) {
throw new UnsupportedOperationException("Sensors not supported");
}
List sensors = mSensorMgr.getSensorList(Sensor.TYPE_ORIENTATION);
if (sensors.size() < 1)
throw new UnsupportedOperationException("Orientation not supported");
mSensor = sensors.get(0);
if (!mSensorMgr.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_UI))
throw new UnsupportedOperationException("Orientation not supported");
}
public void pause() {
if (mSensorMgr != null) {
mSensorMgr.unregisterListener(this, mSensor);
mSensorMgr = null;
}
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
public void onSensorChanged(SensorEvent event)
{
int new_orient = which_orientation(event.values[0]);
if (new_orient == ORIENTATION_UNDETERMINED)
return;
if (new_orient != mCurOrientation) {
mCurOrientation = new_orient;
if (mRotateListener != null) {
mRotateListener.onRotate(new_orient);
}
}
}
private int which_orientation(float angle)
{
if ((angle < 90) && (angle > 0))
return ORIENTATION_NORTH;
if ((angle < 180) && (angle > 90))
return ORIENTATION_EAST;
if ((angle < 270) && (angle > 180))
return ORIENTATION_SOUTH;
if ((angle < 360) && (angle > 270))
return ORIENTATION_WEST;
return ORIENTATION_UNDETERMINED;
}
public void setOnRotateListener(OnRotateListener lstnr)
{
mRotateListener = lstnr;
}
}