package pl.llp.aircasting.tracking;
import pl.llp.aircasting.activity.events.SessionStoppedEvent;
import pl.llp.aircasting.helper.LocationHelper;
import pl.llp.aircasting.helper.MetadataHelper;
import pl.llp.aircasting.helper.SettingsHelper;
import pl.llp.aircasting.model.*;
import pl.llp.aircasting.storage.DatabaseTaskQueue;
import pl.llp.aircasting.storage.repository.SessionRepository;
import pl.llp.aircasting.sync.FixedSessionUploader;
import com.google.common.eventbus.EventBus;
import com.google.inject.Inject;
/**
* Created by ags on 03/16/13 at 23:36
*/
public class ContinuousTracker
{
@Inject EventBus eventBus;
@Inject MetadataHelper metadataHelper;
@Inject LocationHelper locationHelper;
@Inject SettingsHelper settingsHelper;
@Inject DatabaseTaskQueue taskQueue;
@Inject SessionRepository sessions;
@Inject
FixedSessionUploader fixedSessionUploader;
private Session session;
private SessionTracker sessionTracker;
private ActualNoteTracker noteTracker;
@Inject
public void init()
{
eventBus.register(this);
sessionTracker = new InactiveSessionTracker(taskQueue);
noteTracker = new ActualNoteTracker(eventBus, taskQueue);
}
public void addNote(Note note)
{
sessionTracker.addNote(note);
}
public boolean startTracking(Session incomingSession, boolean locationLess)
{
this.session = incomingSession;
sessionTracker = buildSessionTracker(locationLess);
if(sessionTracker.save(session))
return true;
else {
stopTracking(session);
return false;
}
}
public boolean continueTracking(Session incomingSession, boolean locationLess)
{
this.session = incomingSession;
sessionTracker = buildSessionTracker(locationLess);
return true;
}
public void stopTracking() {
stopTracking(session);
}
public void stopTracking(Session session)
{
sessionTracker.finishTracking();
sessionTracker = new InactiveSessionTracker(taskQueue);
eventBus.post(new SessionStoppedEvent(session));
}
public void setTitle(long sessionId, String title)
{
sessionTracker.setTitle(sessionId, title);
}
public void setTags(long sessionId, String tags)
{
sessionTracker.setTags(sessionId, tags);
}
public void setDescription(long sessionId, String description)
{
sessionTracker.setDescription(sessionId, description);
}
public void setContribute(long sessionId, boolean shouldContribute)
{
sessionTracker.setContribute(sessionId, shouldContribute);
}
public void addStream(final MeasurementStream stream)
{
sessionTracker.addStream(stream);
}
public void addMeasurement(Sensor sensor, MeasurementStream stream, Measurement measurement)
{
sessionTracker.addMeasurement(sensor, stream, measurement);
}
public void complete(long sessionId)
{
sessions.complete(sessionId);
}
public void discard(long sessionId)
{
stopTracking(session);
sessions.deleteCompletely(sessionId);
}
public void deleteNote(Session session, Note note)
{
noteTracker.deleteNote(session, note);
}
private SessionTracker buildSessionTracker(boolean locationLess) {
if(session.isFixed())
return new FixedSessionTracker(eventBus, session, taskQueue, settingsHelper, metadataHelper, sessions, fixedSessionUploader, locationLess);
else
return new ActualSessionTracker(eventBus, session, taskQueue, settingsHelper, metadataHelper, sessions, locationLess);
}
public synchronized double getNow(Sensor sensor) {
return sessionTracker.getNow(sensor);
}
}