closes #685 by strictly defining points in time

- today is from 00:00.00 this morning until the end of time
- yesterday is from yesterday 00:00.00 until today
- the other ones also mean pretty much exactly what you would expect
them to mean.
- this week and this month both can be empty because they are already
covered by today, yesterday etc. This is by design.
This commit is contained in:
Angelo Fuchs
2019-02-14 17:18:21 +01:00
committed by B. Petersen
parent 9622270923
commit 682b1101a5
2 changed files with 56 additions and 16 deletions
+2
View File
@@ -36,6 +36,8 @@
<string name="yesterday">Yesterday</string>
<string name="this_week">This week</string>
<string name="this_month">This month</string>
<string name="last_week">Last week</string>
<string name="last_month">Last month</string>
<!-- Translators: show beside messages that are "N minutes old". prefer a short string, prefer abbreviations if they're well-known -->
<plurals name="n_minutes">
<item quantity="one">%d min</item>
@@ -14,7 +14,6 @@ import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.database.Address;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
@@ -72,17 +71,33 @@ public class BucketedThreadMediaLoader extends AsyncTaskLoader<BucketedThreadMed
private final TimeBucket TODAY;
private final TimeBucket YESTERDAY;
private final TimeBucket THIS_WEEK;
private final TimeBucket LAST_WEEK;
private final TimeBucket THIS_MONTH;
private final TimeBucket LAST_MONTH;
private final MonthBuckets OLDER;
private final TimeBucket[] TIME_SECTIONS;
public BucketedThreadMedia(@NonNull Context context) {
this.TODAY = new TimeBucket(context.getString(R.string.today), TimeBucket.addToCalendar(Calendar.DAY_OF_YEAR, 0), Long.MAX_VALUE);
this.YESTERDAY = new TimeBucket(context.getString(R.string.yesterday), TimeBucket.addToCalendar(Calendar.DAY_OF_YEAR, -1), TODAY.startTime);
this.THIS_WEEK = new TimeBucket(context.getString(R.string.this_week), TimeBucket.addToCalendar(Calendar.DAY_OF_YEAR, -6), YESTERDAY.startTime);
this.THIS_MONTH = new TimeBucket(context.getString(R.string.this_month), TimeBucket.addToCalendar(Calendar.MONTH, -1), THIS_WEEK.startTime);
this.TIME_SECTIONS = new TimeBucket[]{TODAY, YESTERDAY, THIS_WEEK, THIS_MONTH};
// from today midnight until the end of human time
this.TODAY = new TimeBucket(context.getString(R.string.today),
addToCalendarFromTodayMidnight(Calendar.DAY_OF_YEAR, 0), Long.MAX_VALUE);
// from yesterday midnight until today midnight
this.YESTERDAY = new TimeBucket(context.getString(R.string.yesterday),
addToCalendarFromTodayMidnight(Calendar.DAY_OF_YEAR, -1), TODAY.startTime);
// from the closest start of week until yesterday midnight (that can be a negative timespace and thus be empty)
this.THIS_WEEK = new TimeBucket(context.getString(R.string.this_week),
setInCalendarFromTodayMidnight(Calendar.DAY_OF_WEEK, getCalendar().getFirstDayOfWeek()), YESTERDAY.startTime);
// from the closest start of week one week back until the closest start of week.
this.LAST_WEEK = new TimeBucket(context.getString(R.string.last_week),
addToCalendarFrom(THIS_WEEK.startTime, Calendar.WEEK_OF_YEAR, -1), THIS_WEEK.startTime);
// from the closest 1st of a month until one week prior to the closest start of week (can be negative and thus empty)
this.THIS_MONTH = new TimeBucket(context.getString(R.string.this_month),
setInCalendarFromTodayMidnight(Calendar.DAY_OF_MONTH, 1), LAST_WEEK.startTime);
// from the closest 1st of a month, one month back to the closest 1st of a month
this.LAST_MONTH = new TimeBucket(context.getString(R.string.last_month),
addToCalendarFrom(THIS_MONTH.startTime, Calendar.MONTH, -1), LAST_WEEK.startTime);
this.TIME_SECTIONS = new TimeBucket[]{TODAY, YESTERDAY, THIS_WEEK, LAST_WEEK, THIS_MONTH, LAST_MONTH};
this.OLDER = new MonthBuckets();
}
@@ -124,6 +139,39 @@ public class BucketedThreadMediaLoader extends AsyncTaskLoader<BucketedThreadMed
else return OLDER.getName(section - activeTimeBuckets.size(), locale);
}
// tests should override this function to deliver a preset calendar.
Calendar getCalendar() {
return Calendar.getInstance();
}
long setInCalendarFromTodayMidnight(int field, int amount) {
Calendar calendar = getCalendar();
setCalendarToTodayMidnight(calendar);
calendar.set(field, amount);
return calendar.getTimeInMillis();
}
long addToCalendarFrom(long relativeTo, int field, int amount) {
Calendar calendar = getCalendar();
calendar.setTime(new Date(relativeTo));
calendar.add(field, amount);
return calendar.getTimeInMillis();
}
long addToCalendarFromTodayMidnight(int field, int amount) {
Calendar calendar = getCalendar();
setCalendarToTodayMidnight(calendar);
calendar.add(field, amount);
return calendar.getTimeInMillis();
}
void setCalendarToTodayMidnight(Calendar calendar) {
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
}
private static class TimeBucket {
private final List<DcMsg> records = new LinkedList<>();
@@ -161,16 +209,6 @@ public class BucketedThreadMediaLoader extends AsyncTaskLoader<BucketedThreadMed
String getName() {
return name;
}
static long addToCalendar(int field, int amount) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.add(field, amount);
return calendar.getTimeInMillis();
}
}
private static class MonthBuckets {