diff --git a/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java b/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java
index 799bc351c..d868730f2 100644
--- a/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java
+++ b/app/src/main/java/com/todoroo/andlib/utility/DateUtilities.java
@@ -90,23 +90,30 @@ public class DateUtilities {
public static String getRelativeDateTime(
Context context, long date, java.util.Locale locale, FormatStyle style) {
- return getRelativeDateTime(context, date, locale, style, false);
+ return getRelativeDateTime(context, date, locale, style, false, false);
}
public static String getRelativeDateTime(
- Context context, long date, java.util.Locale locale, FormatStyle style, boolean lowercase) {
- if (isWithinSixDays(date)) {
- String day = getRelativeDay(context, date, locale, isAbbreviated(style), lowercase);
- if (Task.hasDueTime(date)) {
- String time = getTimeString(context, newDateTime(date));
- return newDateTime().startOfDay().equals(newDateTime(date).startOfDay()) ? time : String.format("%s %s", day, time);
- } else {
- return day;
- }
+ Context context, long date, java.util.Locale locale, FormatStyle style, boolean lowercase) {
+ return getRelativeDateTime(context, date, locale, style, false, lowercase);
+ }
+
+ public static String getRelativeDateTime(
+ Context context, long date, java.util.Locale locale, FormatStyle style, boolean alwaysDisplayFullDate, boolean lowercase) {
+
+ if(alwaysDisplayFullDate || !isWithinSixDays(date)) {
+ return Task.hasDueTime(date)
+ ? getFullDateTime(newDateTime(date), locale, style)
+ : getFullDate(newDateTime(date), locale, style);
+ }
+
+ String day = getRelativeDay(context, date, locale, isAbbreviated(style), lowercase);
+ if (Task.hasDueTime(date)) {
+ String time = getTimeString(context, newDateTime(date));
+ return newDateTime().startOfDay().equals(newDateTime(date).startOfDay()) ? time : String.format("%s %s", day, time);
+ } else {
+ return day;
}
- return Task.hasDueTime(date)
- ? getFullDateTime(newDateTime(date), locale, style)
- : getFullDate(newDateTime(date), locale, style);
}
private static boolean isAbbreviated(FormatStyle style) {
@@ -118,7 +125,7 @@ public class DateUtilities {
long date,
java.util.Locale locale,
FormatStyle style) {
- return getRelativeDay(context, date, locale, style, false);
+ return getRelativeDay(context, date, locale, style, false,false);
}
public static String getRelativeDay(
@@ -126,7 +133,11 @@ public class DateUtilities {
long date,
java.util.Locale locale,
FormatStyle style,
+ boolean alwaysDisplayFullDate,
boolean lowercase) {
+ if(alwaysDisplayFullDate) {
+ return getFullDate(newDateTime(date), locale, style);
+ }
return isWithinSixDays(date)
? getRelativeDay(context, date, locale, isAbbreviated(style), lowercase)
: getFullDate(newDateTime(date), locale, style);
diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt
index b4a7ab1e5..463c784a7 100644
--- a/app/src/main/java/org/tasks/preferences/Preferences.kt
+++ b/app/src/main/java/org/tasks/preferences/Preferences.kt
@@ -338,6 +338,10 @@ class Preferences @JvmOverloads constructor(
override val showCompletedTemporarily: Boolean
get() = getBoolean(R.string.p_temporarily_show_completed_tasks, false)
+ override var alwaysDisplayFullDate: Boolean
+ get() = getBoolean(R.string.p_always_display_full_date, false)
+ set(value) { setBoolean(R.string.p_always_display_full_date, value)}
+
private fun setPublicPref(key: String, value: Int) {
val edit = publicPrefs.edit()
edit?.putInt(key, value)?.apply()
diff --git a/app/src/main/java/org/tasks/preferences/QueryPreferences.kt b/app/src/main/java/org/tasks/preferences/QueryPreferences.kt
index 03e0b2755..1c1b2b661 100644
--- a/app/src/main/java/org/tasks/preferences/QueryPreferences.kt
+++ b/app/src/main/java/org/tasks/preferences/QueryPreferences.kt
@@ -15,5 +15,7 @@ interface QueryPreferences {
val showCompletedTemporarily: Boolean
+ var alwaysDisplayFullDate: Boolean
+
fun usePagedQueries(): Boolean
}
\ No newline at end of file
diff --git a/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt b/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt
index 30c074d5a..e2001c03d 100644
--- a/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt
+++ b/app/src/main/java/org/tasks/tasklist/DragAndDropRecyclerAdapter.kt
@@ -52,7 +52,7 @@ class DragAndDropRecyclerAdapter(
val viewType = getItemViewType(position)
if (viewType == 1) {
val headerSection = items.getSection(position)
- (holder as HeaderViewHolder).bind(taskList.getFilter(), preferences.sortMode, headerSection)
+ (holder as HeaderViewHolder).bind(taskList.getFilter(), preferences.sortMode, preferences.alwaysDisplayFullDate, headerSection)
} else {
super.onBindViewHolder(holder, position)
}
diff --git a/app/src/main/java/org/tasks/tasklist/HeaderViewHolder.kt b/app/src/main/java/org/tasks/tasklist/HeaderViewHolder.kt
index 11e242d7a..167922dc1 100644
--- a/app/src/main/java/org/tasks/tasklist/HeaderViewHolder.kt
+++ b/app/src/main/java/org/tasks/tasklist/HeaderViewHolder.kt
@@ -22,9 +22,9 @@ class HeaderViewHolder(
private val header: TextView = view.findViewById(R.id.header)
private var sortGroup = -1L
- fun bind(filter: Filter, sortMode: Int, section: AdapterSection) {
+ fun bind(filter: Filter, sortMode: Int, alwaysDisplayFullDate: Boolean, section: AdapterSection) {
sortGroup = section.value
- val header: String? = if (filter.supportsSorting()) getHeader(sortMode, sortGroup) else null
+ val header: String? = if (filter.supportsSorting()) getHeader(sortMode, alwaysDisplayFullDate, sortGroup) else null
if (header == null) {
this.header.visibility = View.GONE
@@ -38,7 +38,7 @@ class HeaderViewHolder(
}
}
- private fun getHeader(sortMode: Int, group: Long): String {
+ private fun getHeader(sortMode: Int, alwaysDisplayFullDate: Boolean, group: Long): String {
return when {
sortMode == SortHelper.SORT_IMPORTANCE -> context.getString(priorityToString(group.toInt()))
group == 0L -> context.getString(if (sortMode == SortHelper.SORT_DUE) {
@@ -47,15 +47,15 @@ class HeaderViewHolder(
R.string.no_date
})
sortMode == SortHelper.SORT_CREATED ->
- context.getString(R.string.sort_created_group, getDateString(group))
+ context.getString(R.string.sort_created_group, getDateString(group, alwaysDisplayFullDate))
sortMode == SortHelper.SORT_MODIFIED ->
- context.getString(R.string.sort_modified_group, getDateString(group))
- else -> getDateString(group, false)
+ context.getString(R.string.sort_modified_group, getDateString(group, alwaysDisplayFullDate))
+ else -> getDateString(group, alwaysDisplayFullDate)
}
}
- private fun getDateString(value: Long, lowercase: Boolean = true) =
- DateUtilities.getRelativeDay(context, value, locale, FormatStyle.FULL, lowercase)
+ private fun getDateString(value: Long, alwaysDisplayFullDate: Boolean, lowercase: Boolean = true) =
+ DateUtilities.getRelativeDay(context, value, locale, FormatStyle.FULL, alwaysDisplayFullDate, lowercase)
@StringRes
private fun priorityToString(priority: Int) = when (priority) {
diff --git a/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt b/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt
index 51852b8aa..22baa775c 100644
--- a/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt
+++ b/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt
@@ -196,7 +196,7 @@ class TaskViewHolder internal constructor(
DateUtilities.getTimeString(context, newDateTime(task.dueDate))
}
} else {
- DateUtilities.getRelativeDateTime(context, task.dueDate, locale, FormatStyle.MEDIUM)
+ DateUtilities.getRelativeDateTime(context, task.dueDate, locale, FormatStyle.MEDIUM, preferences.alwaysDisplayFullDate, false)
}
dueDate.text = dateValue
dueDate.visibility = View.VISIBLE
diff --git a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt
index 6fce79598..55905c4a1 100644
--- a/app/src/main/java/org/tasks/ui/TaskListViewModel.kt
+++ b/app/src/main/java/org/tasks/ui/TaskListViewModel.kt
@@ -45,7 +45,7 @@ class TaskListViewModel @ViewModelInject constructor(
invalidate()
}
- private fun removeObserver() = internal?.removeObserver(this)
+ private fun removeObserver() = internal?.removeObserver(this)
fun invalidate() {
AndroidUtilities.assertMainThread()
diff --git a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt
index f452b90b2..2ab173d51 100644
--- a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt
+++ b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt
@@ -192,8 +192,8 @@ internal class ScrollableViewsFactory(
}
}
- private fun getDateString(value: Long, lowercase: Boolean = true) =
- DateUtilities.getRelativeDay(context, value, locale.locale, FormatStyle.MEDIUM, lowercase)
+ private fun getDateString(value: Long, lowercase: Boolean = true, alwaysDisplayFullDate: Boolean = false) =
+ DateUtilities.getRelativeDay(context, value, locale.locale, FormatStyle.MEDIUM, alwaysDisplayFullDate, lowercase)
@StringRes
private fun priorityToString(priority: Int) = when (priority) {
diff --git a/app/src/main/java/org/tasks/widget/WidgetPreferences.java b/app/src/main/java/org/tasks/widget/WidgetPreferences.java
index 54621880e..8c13c35f3 100644
--- a/app/src/main/java/org/tasks/widget/WidgetPreferences.java
+++ b/app/src/main/java/org/tasks/widget/WidgetPreferences.java
@@ -266,6 +266,9 @@ public class WidgetPreferences implements QueryPreferences {
return preferences.getShowCompletedTemporarily();
}
+ @Override
+ public boolean getAlwaysDisplayFullDate() { return getBoolean(R.string.p_always_display_full_date, false); }
+
@Override
public boolean usePagedQueries() {
return preferences.usePagedQueries();
@@ -290,4 +293,9 @@ public class WidgetPreferences implements QueryPreferences {
public void setReverseSort(boolean isReverseSort) {
setBoolean(R.string.p_widget_sort_reverse, isReverseSort);
}
+
+ @Override
+ public void setAlwaysDisplayFullDate(boolean noWeekday) {
+ setBoolean(R.string.p_always_display_full_date, noWeekday);
+ }
}
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index b5c0d3f0e..c292913de 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -485,6 +485,7 @@
Aufgaben nach Erledigung noch vorübergehend anzeigen
Aufgaben bleiben nach Erledigung noch für eine kurze Zeit sichtbar
Aufgaben verschwinden sofort nach Erledigung
+ Datum ganz anzeigen
- %d Teilaufgabe
- %d Teilaufgaben
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index 9e1e2f040..a9b217e15 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -359,6 +359,7 @@
last_backup
show_description
show_full_description
+ always_display_full_date
linkify_task_list
linkify_task_edit
Mapbox
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c85a89450..97cdfbc3d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -100,6 +100,7 @@ File %1$s contained %2$s.\n\n
Temporarily show tasks upon completion
Tasks will remain temporarily visible in the list after completion
Tasks will immediately disappear from the list after completion
+ Show full date
Reset preferences
Preferences will be reset to default values
Delete task data
diff --git a/app/src/main/res/xml/preferences_look_and_feel.xml b/app/src/main/res/xml/preferences_look_and_feel.xml
index 1a889cace..0685f67b1 100644
--- a/app/src/main/res/xml/preferences_look_and_feel.xml
+++ b/app/src/main/res/xml/preferences_look_and_feel.xml
@@ -78,6 +78,11 @@
android:key="@string/p_show_full_description"
android:title="@string/show_full_description" />
+
+