package pl.llp.aircasting.tracking; import pl.llp.aircasting.helper.MetadataHelper; import pl.llp.aircasting.helper.SettingsHelper; import pl.llp.aircasting.model.*; import pl.llp.aircasting.model.events.MeasurementEvent; import pl.llp.aircasting.storage.DatabaseTaskQueue; import pl.llp.aircasting.storage.SessionPropertySetter; import pl.llp.aircasting.storage.db.DBConstants; import pl.llp.aircasting.storage.db.WritableDatabaseTask; import pl.llp.aircasting.storage.repository.SessionRepository; import android.content.ContentValues; import android.database.sqlite.SQLiteDatabase; import com.google.common.eventbus.EventBus; import java.util.Date; import java.util.Map; import static com.google.common.collect.Maps.newHashMap; import static pl.llp.aircasting.storage.db.DBConstants.*; public class ActualSessionTracker implements SessionTracker { protected final Session session; protected final SettingsHelper settingsHelper; protected final MetadataHelper metadataHelper; protected final EventBus eventBus; final DatabaseTaskQueue dbQueue; final NoteTracker noteTracker; final SessionRepository sessions; MeasurementTracker measurementTracker; final SessionPropertySetter setter; protected Map<String, Double> recentMeasurements = newHashMap(); ActualSessionTracker(EventBus eventBus, final Session session, DatabaseTaskQueue dbQueue, SettingsHelper settingsHelper, MetadataHelper metadataHelper, SessionRepository sessions, boolean locationLess) { this.session = session; this.settingsHelper = settingsHelper; this.metadataHelper = metadataHelper; this.dbQueue = dbQueue; this.sessions = sessions; this.setter = new SessionPropertySetter(dbQueue); this.eventBus = eventBus; this.noteTracker = new ActualNoteTracker(eventBus, dbQueue); this.measurementTracker = new ActualMeasurementTracker(dbQueue); session.setStart(new Date()); session.setLocationless(this.settingsHelper.areMapsDisabled() || locationLess); session.setCalibration(this.settingsHelper.getCalibration()); session.setOffset60DB(this.settingsHelper.getOffset60DB()); session.setOsVersion(this.metadataHelper.getOSVersion()); session.setPhoneModel(this.metadataHelper.getPhoneModel()); } @Override public void addNote(Note note) { noteTracker.addNote(session, note); } @Override public void finishTracking() { session.setEnd(new Date()); } @Override public void setTitle(long sessionId, String title) { session.setTitle(title); setter.forSession(sessionId).key(DBConstants.SESSION_TITLE).value(title).doSet(); } @Override public void setTags(long sessionId, String tags) { session.setTags(tags); setter.forSession(sessionId).key(SESSION_TAGS).value(tags).doSet(); } @Override public void setDescription(long sessionId, String description) { session.setDescription(description); setter.forSession(sessionId).key(DBConstants.SESSION_DESCRIPTION).value(description).doSet(); } @Override public void setContribute(long sessionId, boolean shouldContribute) { session.setContribute(shouldContribute); setter.forSession(sessionId).key(DBConstants.SESSION_CONTRIBUTE).value(shouldContribute).doSet(); } @Override public void addStream(final MeasurementStream stream) { session.add(stream); dbQueue.add(sessions.addStreamTask(stream, session)); } @Override public void addMeasurement(Sensor sensor, MeasurementStream stream, Measurement measurement) { measurementTracker.add(stream, measurement); recentMeasurements.put(stream.getSensorName(), measurement.getValue()); eventBus.post(new MeasurementEvent(measurement, sensor)); } @Override public void delete(long session) { sessions.deleteCompletely(session); } @Override public boolean save(final Session session) { if(!beforeSave(session)) return false; saveToDb(session); return true; } @Override public synchronized double getNow(Sensor sensor) { if (!recentMeasurements.containsKey(sensor.getSensorName())) { return 0; } return recentMeasurements.get(sensor.getSensorName()); } protected boolean beforeSave(final Session session) { return true; } protected void saveToDb(final Session session) { dbQueue.add(new WritableDatabaseTask<Void>() { @Override public Void execute(SQLiteDatabase writableDatabase) { ContentValues values = new ContentValues(); values.put(SESSION_START, session.getStart().getTime()); values.put(SESSION_UUID, session.getUUID().toString()); values.put(SESSION_CALIBRATION, session.getCalibration()); values.put(SESSION_PHONE_MODEL, session.getPhoneModel()); values.put(SESSION_OS_VERSION, session.getOSVersion()); values.put(SESSION_OFFSET_60_DB, session.getOffset60DB()); values.put(SESSION_MARKED_FOR_REMOVAL, 0); values.put(SESSION_SUBMITTED_FOR_REMOVAL, 0); values.put(SESSION_CALIBRATED, 1); values.put(SESSION_LOCAL_ONLY, session.isLocationless() ? 1 : 0); values.put(SESSION_INCOMPLETE, 1); values.put(SESSION_TYPE, session.getType()); values.put(SESSION_TITLE, session.getTitle()); values.put(SESSION_DESCRIPTION, session.getDescription()); values.put(SESSION_TAGS, session.getTags()); values.put(SESSION_INDOOR, session.isIndoor() ? 1 : 0); values.put(SESSION_LATITUDE, session.getLatitude()); values.put(SESSION_LONGITUDE, session.getLongitude()); long sessionKey = writableDatabase.insertOrThrow(SESSION_TABLE_NAME, null, values); session.setId(sessionKey); return null; } }); } }