package at.abraxas.amarino.plugin.gesture; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.preference.PreferenceManager; import android.util.Log; import at.abraxas.amarino.Amarino; import at.abraxas.amarino.AmarinoIntent; import at.abraxas.amarino.plugin.BackgroundService; public class GestureService extends BackgroundService implements SensorEventListener{ private static final String TAG = "GestureService"; private static final boolean DEBUG = true; private final int STATE_NORMAL = 10; private final int STATE_TURNED_AROUND = 20; private final int MSG_FLIP_OVER = 1; private final int MSG_REVERT_BACK = 2; private final int SENSOR_INTERVAL_DEFAULT = 2; // should reduce battery drain slightly private final int SENSOR_INTERVAL_SLOW = 30; // should reduce battery drain even more private final int INITAL_SENSOR_COUNT = 1; private int interval = SENSOR_INTERVAL_DEFAULT; private int sensorCount = INITAL_SENSOR_COUNT; private SensorManager sm; private Sensor orientationSensor; private int state = STATE_NORMAL; private int oldState = STATE_NORMAL; public GestureService() { super(TAG, DEBUG); } @Override public boolean init() { pluginId = PreferenceManager.getDefaultSharedPreferences(this) .getInt(AmarinoIntent.EXTRA_PLUGIN_ID, -1); /* add your code here */ initSensorManager(); return true; // note: return true if init was successful } @Override public void cleanup() { /* add your code here */ sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sm.unregisterListener(this); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } @Override public void onSensorChanged(SensorEvent event) { if (sensorCount % interval == 0){ sensorCount = INITAL_SENSOR_COUNT; switch (event.sensor.getType()){ case Sensor.TYPE_ORIENTATION: //Log.d(GestureService.TAG, "sensor active"); state = getState(event.values[SensorManager.DATA_Y], event.values[SensorManager.DATA_Z]); if (oldState == STATE_NORMAL && state == STATE_TURNED_AROUND){ // flip over detected Amarino.sendDataFromPlugin(this, pluginId, MSG_FLIP_OVER); } else if (oldState == STATE_TURNED_AROUND && state == STATE_NORMAL){ // revert back detected Amarino.sendDataFromPlugin(this, pluginId, MSG_REVERT_BACK); } //Log.d(TAG, "state: " + state); oldState = state; break; } } else { sensorCount++; //Log.d(GestureService.TAG, "sensorcount: " + sensorCount); } } private void initSensorManager() { sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); orientationSensor = sm.getSensorList(Sensor.TYPE_ORIENTATION).get(0); sm.registerListener(GestureService.this, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL); } private int getState(float y, float z) { //Log.d(TAG, y + " , " + z); if ((y > 168 || y < -168) && (z > -13 && z < 13)) { return STATE_TURNED_AROUND; } else { return STATE_NORMAL; } } }