package org.openiot.cupus.mobile.sensors.service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v4.content.LocalBroadcastManager; import org.openiot.cupus.artefact.TripletAnnouncement; import org.openiot.cupus.mobile.data.IntentObjectHolder; import org.openiot.cupus.mobile.data.Parameters; import org.openiot.cupus.mobile.sensors.common.PullSensor; import org.openiot.cupus.mobile.sensors.common.SensorReading; import java.util.List; /** * Created by Kristijan on 22.01.14.. */ public class SensorManager extends AbstractSensorManager implements Runnable{ private PullSensor pullSensor; private SensorServiceBroadcastReceiver sensorServiceBroadcastReceiver; public SensorManager(LocalBroadcastManager localBroadcastManager) { super(localBroadcastManager); this.sensorEventListener = new SensorEventListenerImplement(); IntentFilter sensorControl = new IntentFilter(Parameters.START_STOP_SENSOR); sensorServiceBroadcastReceiver = new SensorServiceBroadcastReceiver(); localBroadcastManager.registerReceiver(sensorServiceBroadcastReceiver, sensorControl); } @Override public void run() { while (running) { try { Thread.sleep(period); } catch (InterruptedException e) { e.printStackTrace(); } sensorEventListener.sendReading(); } } @Override public void startIt() { if (!running) { Thread thread = new Thread(this); thread.start(); running = true; } } @Override public void terminate() { stopIt(); pullSensor.terminate(); Intent intent = new Intent(Parameters.TERMINATE); intent.putExtra("readingDefinition", pullSensor.getReadingDefinition().getName()); intent.putExtra("tripletAnnouncement", pullSensor.getTripletAnnouncement().hashCode()); localBroadcastManager.sendBroadcast(intent); } private class SensorEventListenerImplement implements SensorEventListener { @Override public void sendReading() { Intent intent = new Intent(Parameters.PUBLICATION); // sending values ​​through the map SensorReading reading = pullSensor.pullReading(); IntentObjectHolder.intentObjectMap.put(reading.hashCode(), reading); intent.putExtra("mapKey", reading.hashCode()); intent.putExtra("readingDefinition", pullSensor.getReadingDefinition().getName()); localBroadcastManager.sendBroadcast(intent); } @Override public void newSensor() { Intent intent = new Intent(Parameters.ANNOUNCEMENT); TripletAnnouncement tripletAnnouncement = pullSensor.getTripletAnnouncement(); IntentObjectHolder.readingDefinitionMap.put(tripletAnnouncement.hashCode(), tripletAnnouncement); intent.putExtra("readingDefinition", pullSensor.getReadingDefinition().getName()); intent.putExtra("tripletAnnouncement", tripletAnnouncement.hashCode()); localBroadcastManager.sendBroadcast(intent); } } public void setPullSensor(PullSensor pullSensor) { this.pullSensor = pullSensor; } public PullSensor getPullSensor() { return pullSensor; } private class SensorServiceBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Parameters.START_STOP_SENSOR)) { List<String> subscriptions = intent.getStringArrayListExtra("subscriptions"); if (subscriptions.contains(getPullSensor().getReadingDefinition().getName())) { if (!isRunning()) { startIt(); } } else { if (isRunning()) { stopIt(); } } } } } }