From 7fcad7b5c58d59a19c75b502d26b2fc2779d3e00 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Wed, 23 Dec 2020 19:47:41 -0600 Subject: [PATCH] Remove MemoryEntryList --- .../isoron/uhabits/core/models/EntryList.java | 122 ++++++++++++------ .../core/models/memory/MemoryEntryList.java | 101 --------------- .../models/memory/MemoryModelFactory.java | 2 +- .../core/models/sqlite/SQLModelFactory.java | 2 +- 4 files changed, 82 insertions(+), 145 deletions(-) delete mode 100644 android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryEntryList.java diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.java index f34b87d66..5a7f8d346 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/EntryList.java @@ -31,19 +31,22 @@ import java.util.*; import javax.annotation.concurrent.*; import static org.isoron.uhabits.core.models.Entry.*; -import static org.isoron.uhabits.core.utils.StringUtils.defaultToStringStyle; +import static org.isoron.uhabits.core.utils.StringUtils.*; /** * The collection of {@link Entry}s belonging to a habit. */ @ThreadSafe -public abstract class EntryList +public class EntryList { protected final Habit habit; + protected ArrayList list; + public EntryList(Habit habit) { this.habit = habit; + this.list = new ArrayList<>(); } @NonNull @@ -145,13 +148,19 @@ public abstract class EntryList { int shift = Math.min(gapCenterToEnd, gapNextToCurrent + 1); intervals.set(i, new Interval(curr.begin.minus(shift), - curr.center, - curr.end.minus(shift))); + curr.center, + curr.end.minus(shift))); } } } - public abstract void add(List entries); + public void add(List entries) + { + list.addAll(entries); + Collections.sort(list, + (c1, c2) -> c2.getTimestamp().compare(c1.getTimestamp())); + + } /** * Returns the values for all the checkmarks, since the oldest repetition of @@ -185,13 +194,39 @@ public abstract class EntryList * That is, the first checkmark corresponds to the newest timestamp, and the * last checkmark corresponds to the oldest timestamp. * - * @param fromTimestamp timestamp of the beginning of the interval. - * @param toTimestamp timestamp of the end of the interval. + * @param from timestamp of the beginning of the interval. + * @param to timestamp of the end of the interval. * @return the list of checkmarks within the interval. */ @NonNull - public abstract List getByInterval(Timestamp fromTimestamp, - Timestamp toTimestamp); + public List getByInterval(Timestamp from, + Timestamp to) + { + compute(); + + Timestamp newestComputed = new Timestamp(0); + Timestamp oldestComputed = new Timestamp(0).plus(1000000); + + Entry newest = getNewestComputed(); + Entry oldest = getOldestComputed(); + if (newest != null) newestComputed = newest.getTimestamp(); + if (oldest != null) oldestComputed = oldest.getTimestamp(); + + List filtered = new ArrayList<>( + Math.max(0, oldestComputed.daysUntil(newestComputed) + 1)); + + for (int i = 0; i <= from.daysUntil(to); i++) + { + Timestamp t = to.minus(i); + if (t.isNewerThan(newestComputed) || t.isOlderThan(oldestComputed)) + filtered.add(new Entry(t, Entry.UNKNOWN)); + else + filtered.add(list.get(t.daysUntil(newestComputed))); + } + + return filtered; + + } /** * Returns the checkmark for today. @@ -281,7 +316,10 @@ public abstract class EntryList * * @param timestamp the timestamp */ - public abstract void invalidateNewerThan(Timestamp timestamp); + public void invalidateNewerThan(Timestamp timestamp) + { + list.clear(); + } /** * Writes the entire list of checkmarks to the given writer, in CSV format. @@ -329,29 +367,27 @@ public abstract class EntryList if (from.isNewerThan(today)) return; Entry reps[] = habit - .getOriginalEntries() - .getByInterval(from, today) - .toArray(new Entry[0]); + .getOriginalEntries() + .getByInterval(from, today) + .toArray(new Entry[0]); if (habit.isNumerical()) computeNumerical(reps); else computeYesNo(reps); } - /** - * Returns newest checkmark that has already been computed. - * - * @return newest checkmark already computed - */ @Nullable - protected abstract Entry getNewestComputed(); + protected Entry getNewestComputed() + { + if (list.isEmpty()) return null; + return list.get(0); + } - /** - * Returns oldest checkmark that has already been computed. - * - * @return oldest checkmark already computed - */ @Nullable - protected abstract Entry getOldestComputed(); + protected Entry getOldestComputed() + { + if (list.isEmpty()) return null; + return list.get(list.size() - 1); + } private void computeNumerical(Entry[] original) { @@ -382,9 +418,10 @@ public abstract class EntryList add(buildEntriesFromInterval(original, intervals)); } - public List getAll() { + public List getAll() + { Entry oldest = habit.getOriginalEntries().getOldest(); - if(oldest == null) return new ArrayList<>(); + if (oldest == null) return new ArrayList<>(); return getByInterval(oldest.getTimestamp(), DateUtils.getTodayWithOffset()); } @@ -403,7 +440,8 @@ public abstract class EntryList this.end = end; } - public int length() { + public int length() + { return begin.daysUntil(end) + 1; } @@ -417,30 +455,30 @@ public abstract class EntryList Interval interval = (Interval) o; return new EqualsBuilder() - .append(begin, interval.begin) - .append(center, interval.center) - .append(end, interval.end) - .isEquals(); + .append(begin, interval.begin) + .append(center, interval.center) + .append(end, interval.end) + .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder(17, 37) - .append(begin) - .append(center) - .append(end) - .toHashCode(); + .append(begin) + .append(center) + .append(end) + .toHashCode(); } @Override public String toString() { return new ToStringBuilder(this, defaultToStringStyle()) - .append("begin", begin) - .append("center", center) - .append("end", end) - .toString(); + .append("begin", begin) + .append("center", center) + .append("end", end) + .toString(); } } @@ -471,9 +509,9 @@ public abstract class EntryList truncatedTimestamps[count++] = tt; } - if(habit.isNumerical()) + if (habit.isNumerical()) values[count - 1] += rep.getValue(); - else if(rep.getValue() == Entry.YES_MANUAL) + else if (rep.getValue() == Entry.YES_MANUAL) values[count - 1] += 1000; } diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryEntryList.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryEntryList.java deleted file mode 100644 index f77dd7374..000000000 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryEntryList.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2016 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -package org.isoron.uhabits.core.models.memory; - -import androidx.annotation.*; - -import org.isoron.uhabits.core.models.*; - -import java.util.*; - -/** - * In-memory implementation of {@link EntryList}. - */ -public class MemoryEntryList extends EntryList -{ - ArrayList list; - - public MemoryEntryList(Habit habit) - { - super(habit); - list = new ArrayList<>(); - } - - @Override - public void add(List entries) - { - list.addAll(entries); - Collections.sort(list, - (c1, c2) -> c2.getTimestamp().compare(c1.getTimestamp())); - } - - @NonNull - @Override - public synchronized List getByInterval(Timestamp from, - Timestamp to) - { - compute(); - - Timestamp newestComputed = new Timestamp(0); - Timestamp oldestComputed = new Timestamp(0).plus(1000000); - - Entry newest = getNewestComputed(); - Entry oldest = getOldestComputed(); - if(newest != null) newestComputed = newest.getTimestamp(); - if(oldest != null) oldestComputed = oldest.getTimestamp(); - - List filtered = new ArrayList<>( - Math.max(0, oldestComputed.daysUntil(newestComputed) + 1)); - - for(int i = 0; i <= from.daysUntil(to); i++) - { - Timestamp t = to.minus(i); - if(t.isNewerThan(newestComputed) || t.isOlderThan(oldestComputed)) - filtered.add(new Entry(t, Entry.UNKNOWN)); - else - filtered.add(list.get(t.daysUntil(newestComputed))); - } - - return filtered; - } - - @Override - public void invalidateNewerThan(Timestamp timestamp) - { - list.clear(); - } - - @Override - @Nullable - protected Entry getOldestComputed() - { - if(list.isEmpty()) return null; - return list.get(list.size()-1); - } - - @Override - @Nullable - protected Entry getNewestComputed() - { - if(list.isEmpty()) return null; - return list.get(0); - } - -} diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.java index 33d6858fd..f5b56a4ea 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.java @@ -28,7 +28,7 @@ public class MemoryModelFactory implements ModelFactory @Override public EntryList buildEntryList(Habit habit) { - return new MemoryEntryList(habit); + return new EntryList(habit); } @Override diff --git a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.java b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.java index bb6319d91..082169443 100644 --- a/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.java +++ b/android/uhabits-core/src/main/java/org/isoron/uhabits/core/models/sqlite/SQLModelFactory.java @@ -44,7 +44,7 @@ public class SQLModelFactory implements ModelFactory @Override public EntryList buildEntryList(Habit habit) { - return new MemoryEntryList(habit); + return new EntryList(habit); } @Override