package at.abraxas.amarino.plugins.accelerometer; import java.util.List; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; 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 android.widget.Toast; import at.abraxas.amarino.Amarino; import at.abraxas.amarino.plugins.AbstractPluginService; public class BackgroundService extends AbstractPluginService implements SensorEventListener, OnSharedPreferenceChangeListener { private static final String TAG = "Accelerometer Plugin"; private SensorManager sm; private Sensor accelerometerSensor; private int frequency; private int ignoreThreshold = 0; private int ignoreCounter = 0; @Override public void init() { if (!pluginEnabled){ /* here should be your specific initialization code */ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); frequency = prefs.getInt(EditActivity.PREF_FREQUENCY, 50); pluginId = prefs.getInt(EditActivity.KEY_PLUGIN_ID, -1); ignoreThreshold = EditActivity.getRate(frequency); prefs.registerOnSharedPreferenceChangeListener(this); // make sure not to call it twice sm = (SensorManager) getSystemService(SENSOR_SERVICE); List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ACCELEROMETER); if (sensors != null && sensors.size() > 0) { accelerometerSensor = sensors.get(0); sm.registerListener(this, accelerometerSensor, SensorManager.SENSOR_DELAY_UI); pluginEnabled = true; } else { Toast.makeText(this, "Accelerometer sensor is not available on this device!", Toast.LENGTH_SHORT).show(); } } } @Override public void onDestroy() { if (pluginEnabled){ sm.unregisterListener(this); PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this); } super.onDestroy(); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // we don't need this } public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ if (ignoreCounter >= ignoreThreshold) { ignoreCounter = 0; if (DEBUG) Log.d(TAG, "send: x:" + event.values[0] + " y:" + event.values[1] + " z: " + event.values[2]); Amarino.sendDataFromPlugin(this, pluginId, event.values.clone()); } else { ignoreCounter++; } } } public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if (EditActivity.PREF_FREQUENCY.equals(key)){ ignoreThreshold = EditActivity.getRate(prefs.getInt(key, 50)); } } @Override public String getTAG() { return TAG; } }