mirror of
https://github.com/ArcaneChat/android.git
synced 2026-07-03 14:05:24 +02:00
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:
committed by
B. Petersen
parent
9622270923
commit
682b1101a5
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user