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" /> + +