|
|
|
|
@ -34,16 +34,18 @@ open class TimeFrame : RealmObject() { |
|
|
|
|
// indicates a state of pause |
|
|
|
|
var paused: Boolean = false |
|
|
|
|
|
|
|
|
|
// Session |
|
|
|
|
@LinkingObjects("timeFrame") |
|
|
|
|
private val sessions: RealmResults<Session>? = null |
|
|
|
|
|
|
|
|
|
@LinkingObjects("timeFrame") |
|
|
|
|
private val groups: RealmResults<SessionGroup>? = null |
|
|
|
|
private val sessions: RealmResults<Session>? = null // we should have only one session |
|
|
|
|
|
|
|
|
|
@Ignore |
|
|
|
|
var session: Session? = null |
|
|
|
|
get() = this.sessions?.first() |
|
|
|
|
|
|
|
|
|
// Group |
|
|
|
|
@LinkingObjects("timeFrame") |
|
|
|
|
private val groups: RealmResults<SessionGroup>? = null // we should have only one group |
|
|
|
|
|
|
|
|
|
@Ignore |
|
|
|
|
var group: SessionGroup? = null |
|
|
|
|
get() = this.groups?.first() |
|
|
|
|
@ -60,13 +62,7 @@ open class TimeFrame : RealmObject() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private fun computeDuration() { |
|
|
|
|
|
|
|
|
|
var endDate: Date |
|
|
|
|
if (this.endDate != null) { |
|
|
|
|
endDate = this.endDate!! |
|
|
|
|
} else { |
|
|
|
|
endDate = Date() |
|
|
|
|
} |
|
|
|
|
var endDate: Date = this.endDate ?: Date() |
|
|
|
|
this.duration = endDate.time - startDate.time - this.breakDuration |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -102,83 +98,107 @@ open class TimeFrame : RealmObject() { |
|
|
|
|
*/ |
|
|
|
|
private fun updateTimeFrames(sessionGroups: RealmResults<SessionGroup>) { |
|
|
|
|
|
|
|
|
|
// update |
|
|
|
|
if (sessionGroups.size == 1) { |
|
|
|
|
when (sessionGroups.size) { |
|
|
|
|
0 -> this.createSessionGroup() |
|
|
|
|
1 -> this.updateSingleSessionGroup(sessionGroups.first()?.timeFrame!!) |
|
|
|
|
else -> this.mergeSessionGroups(sessionGroups) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// we are sure that the timeframe is not null from the realm query |
|
|
|
|
val groupTimeFrame: TimeFrame = sessionGroups.first()?.timeFrame!! |
|
|
|
|
if (this.startDate.before(groupTimeFrame.startDate)) { |
|
|
|
|
groupTimeFrame.startDate = this.startDate |
|
|
|
|
} |
|
|
|
|
val endDate = this.endDate |
|
|
|
|
if (endDate != null && groupTimeFrame.endDate != null && endDate.after(groupTimeFrame.endDate)) { |
|
|
|
|
groupTimeFrame.endDate = endDate |
|
|
|
|
} else if (endDate == null) { |
|
|
|
|
groupTimeFrame.endDate = null |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Realm Update |
|
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
|
realm.beginTransaction() |
|
|
|
|
realm.copyToRealmOrUpdate(groupTimeFrame) |
|
|
|
|
realm.commitTransaction() |
|
|
|
|
private fun createSessionGroup() { |
|
|
|
|
|
|
|
|
|
} else if (sessionGroups.size > 1) { |
|
|
|
|
val group: SessionGroup = SessionGroup.newInstance() |
|
|
|
|
group.timeFrame?.let { |
|
|
|
|
it.startDate = this.startDate |
|
|
|
|
it.endDate = this.endDate |
|
|
|
|
} ?: run { |
|
|
|
|
throw ModelException("TimeFrame should never be null here") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var startDate: Date = this.startDate |
|
|
|
|
var endDate: Date? = this.endDate |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val timeFrames = sessionGroups.mapNotNull { it.timeFrame } |
|
|
|
|
timeFrames.forEach { tf -> |
|
|
|
|
if (tf.startDate.before(startDate)) { |
|
|
|
|
startDate = tf.startDate |
|
|
|
|
} |
|
|
|
|
/** |
|
|
|
|
* Single session group update |
|
|
|
|
* Changes the group timeframe using the current timeframe dates |
|
|
|
|
*/ |
|
|
|
|
private fun updateSingleSessionGroup(groupTimeFrame: TimeFrame) { |
|
|
|
|
|
|
|
|
|
endDate?.let { ed -> |
|
|
|
|
tf.endDate?.let { tfed -> |
|
|
|
|
if (tfed.after(ed)) { |
|
|
|
|
endDate = tfed |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} ?: run { |
|
|
|
|
endDate = tf.endDate |
|
|
|
|
} |
|
|
|
|
if (this.startDate.before(groupTimeFrame.startDate)) { |
|
|
|
|
groupTimeFrame.startDate = this.startDate |
|
|
|
|
} |
|
|
|
|
val endDate = this.endDate |
|
|
|
|
if (endDate != null && groupTimeFrame.endDate != null && endDate.after(groupTimeFrame.endDate)) { |
|
|
|
|
groupTimeFrame.endDate = endDate |
|
|
|
|
} else if (endDate == null) { |
|
|
|
|
groupTimeFrame.endDate = null |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
// Realm Update |
|
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
|
realm.beginTransaction() |
|
|
|
|
realm.copyToRealmOrUpdate(groupTimeFrame) |
|
|
|
|
realm.commitTransaction() |
|
|
|
|
|
|
|
|
|
// get all sessions from groups |
|
|
|
|
var sessions = sessionGroups.flatMap { it.sessions } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Start Realm updates |
|
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
|
realm.beginTransaction() |
|
|
|
|
/** |
|
|
|
|
* Multiple session groups update: |
|
|
|
|
* Merges all groups into one (delete all then create a new one) |
|
|
|
|
*/ |
|
|
|
|
private fun mergeSessionGroups(sessionGroups: RealmResults<SessionGroup>) { |
|
|
|
|
|
|
|
|
|
// delete all groups |
|
|
|
|
sessionGroups.deleteAllFromRealm() |
|
|
|
|
var startDate: Date = this.startDate |
|
|
|
|
var endDate: Date? = this.endDate |
|
|
|
|
|
|
|
|
|
// Create a new groups |
|
|
|
|
val group: SessionGroup = SessionGroup.newInstance() |
|
|
|
|
group.timeFrame?.let { |
|
|
|
|
it.startDate = startDate |
|
|
|
|
it.endDate = endDate |
|
|
|
|
} ?: run { |
|
|
|
|
throw ModelException("TimeFrame should never be null here") |
|
|
|
|
val timeFrames = sessionGroups.mapNotNull { it.timeFrame } |
|
|
|
|
timeFrames.forEach { tf -> |
|
|
|
|
if (tf.startDate.before(startDate)) { |
|
|
|
|
startDate = tf.startDate |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Add the session linked to this timeframe to the new group |
|
|
|
|
this.sessions?.first()?.let { |
|
|
|
|
group.sessions.add(it) |
|
|
|
|
endDate?.let { ed -> |
|
|
|
|
tf.endDate?.let { tfed -> |
|
|
|
|
if (tfed.after(ed)) { |
|
|
|
|
endDate = tfed |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} ?: run { |
|
|
|
|
throw ModelException("TimeFrame should never be null here") |
|
|
|
|
endDate = tf.endDate |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Add all orphan sessions |
|
|
|
|
group.sessions.addAll(sessions) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// get all sessions from groups |
|
|
|
|
var sessions = sessionGroups.flatMap { it.sessions } |
|
|
|
|
|
|
|
|
|
realm.commitTransaction() |
|
|
|
|
// Start Realm updates |
|
|
|
|
val realm = Realm.getDefaultInstance() |
|
|
|
|
realm.beginTransaction() |
|
|
|
|
|
|
|
|
|
// delete all groups |
|
|
|
|
sessionGroups.deleteAllFromRealm() |
|
|
|
|
|
|
|
|
|
// Create a new groups |
|
|
|
|
val group: SessionGroup = SessionGroup.newInstance() |
|
|
|
|
group.timeFrame?.let { |
|
|
|
|
it.startDate = startDate |
|
|
|
|
it.endDate = endDate |
|
|
|
|
} ?: run { |
|
|
|
|
throw ModelException("TimeFrame should never be null here") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Add the session linked to this timeframe to the new group |
|
|
|
|
this.sessions?.first()?.let { |
|
|
|
|
group.sessions.add(it) |
|
|
|
|
} ?: run { |
|
|
|
|
throw ModelException("TimeFrame should never be null here") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Add all orphan sessions |
|
|
|
|
group.sessions.addAll(sessions) |
|
|
|
|
|
|
|
|
|
realm.commitTransaction() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|