package edu.fsu.cs.contextprovider.sensor;
import java.util.List;
import edu.fsu.cs.contextprovider.data.ContextConstants;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
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.os.IBinder;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
public class LightService extends Service implements SensorEventListener, OnSharedPreferenceChangeListener {
private static final String TAG = "LightSensor Service";
private static final boolean DEBUG = false;
protected int contextId;
protected boolean running = false;
private SensorManager sm;
private Sensor lightSensor;
private static float lux = 0;
SharedPreferences prefs;
public void init() {
if (!running) {
startService();
}
}
private void startService() {
getPrefs();
// make sure not to call it twice
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_LIGHT);
if (sensors != null && sensors.size() > 0) {
lightSensor = sensors.get(0);
sm.registerListener(this, lightSensor, SensorManager.SENSOR_DELAY_UI);
running = true;
} else {
Toast.makeText(this, "Light sensor is not available on this device!", Toast.LENGTH_SHORT).show();
}
IntentFilter restartFilter = new IntentFilter();
restartFilter.addAction(ContextConstants.CONTEXT_RESTART_INTENT);
registerReceiver(restartIntentReceiver, restartFilter);
}
private void getPrefs() {
prefs = getSharedPreferences(ContextConstants.CONTEXT_PREFS, MODE_WORLD_READABLE);
// accelPoll = prefs.getInt(ContextConstants.PREFS_ACCEL_POLL_FREQ, 1);
// ignoreThreshold = prefs.getInt(ContextConstants.PREFS_ACCEL_IGNORE_THRESHOLD, 0);
prefs.registerOnSharedPreferenceChangeListener(this);
}
private void stopService() {
sm.unregisterListener(this);
PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);
unregisterReceiver(restartIntentReceiver);
running = false;
}
BroadcastReceiver restartIntentReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
Log.d(TAG, TAG + "Restart Intent: " + intent.getAction());
if (running) {
stopService();
}
startService();
}
};
@Override
public void onDestroy() {
if (running) {
stopService();
}
super.onDestroy();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// we don't need this
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_LIGHT) {
lux = event.values[0];
if (DEBUG)
Log.d(TAG, "send: " + lux);
}
}
public static boolean isInPocket() {
if (lux < .5) {
return true;
}
return false;
}
public String getTAG() {
return TAG;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// TODO Auto-generated method stub
}
}