diff --git a/app/src/main/java/net/gsantner/markor/format/todotxt/TodoTxtAutoTextFormatter.java b/app/src/main/java/net/gsantner/markor/format/todotxt/TodoTxtAutoTextFormatter.java index 5d781f84a3..10d65478e5 100644 --- a/app/src/main/java/net/gsantner/markor/format/todotxt/TodoTxtAutoTextFormatter.java +++ b/app/src/main/java/net/gsantner/markor/format/todotxt/TodoTxtAutoTextFormatter.java @@ -29,6 +29,6 @@ public CharSequence filter(CharSequence source, int start, int end, Spanned dest } private CharSequence autoIndent(CharSequence source) { - return source + TodoTxtTask.DATEF_YYYY_MM_DD.format(new Date()) + " "; + return source + TodoTxtTask.getDateFormat().format(new Date()) + " "; } } diff --git a/app/src/main/java/net/gsantner/markor/format/todotxt/TodoTxtTask.java b/app/src/main/java/net/gsantner/markor/format/todotxt/TodoTxtTask.java index 2f62431053..7403c5bf9b 100644 --- a/app/src/main/java/net/gsantner/markor/format/todotxt/TodoTxtTask.java +++ b/app/src/main/java/net/gsantner/markor/format/todotxt/TodoTxtTask.java @@ -14,6 +14,7 @@ import net.gsantner.markor.frontend.textview.TextViewUtils; import net.gsantner.opoc.format.GsTextUtils; +import net.gsantner.markor.ApplicationObject; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -30,12 +31,29 @@ public class TodoTxtTask { // - // Static memebers + // Static members - date format helpers, regex generators & constants // public static final SimpleDateFormat DATEF_YYYY_MM_DD = new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT); public static final int DATEF_YYYY_MM_DD_LEN = "yyyy-MM-dd".length(); - public static final String PT_DATE = "\\d{4}-\\d{2}-\\d{2}"; + + /** + * Returns a SimpleDateFormat for the configured todo date format. + * Falls back to {@link #DATE_FORMAT} if settings are not available or the configured pattern is invalid. + * Note: This does not cache the SimpleDateFormat instance because the pattern may change at runtime. + */ + public static SimpleDateFormat getDateFormat() { + final String fmt = ApplicationObject.settings() != null ? ApplicationObject.settings().getTodoDateFormat() : "yyyy-MM-dd"; + + try { + return new SimpleDateFormat(fmt, Locale.ROOT); + } catch (IllegalArgumentException e) { + // Fallback: return a default format instead of throwing + return DATEF_YYYY_MM_DD; + } + } + + public static final String PT_DATE = "\\d{4}-\\d{2}-\\d{2}(?:[ T]\\d{2}:\\d{2}(?::\\d{2})?)?"; public static final Pattern PATTERN_PROJECTS = Pattern.compile("(?:^|\\s)(?:\\++)(\\S+)"); public static final Pattern PATTERN_CONTEXTS = Pattern.compile("(?:^|\\s)(?:\\@+)(\\S+)"); public static final Pattern PATTERN_DONE = Pattern.compile("(?m)(^[Xx]) (.*)$"); @@ -61,7 +79,7 @@ public enum TodoDueState { } public static String getToday() { - return DATEF_YYYY_MM_DD.format(new Date()); + return getDateFormat().format(new Date()); } public static List getTasks(final CharSequence text, final int[] sel) { diff --git a/app/src/main/java/net/gsantner/markor/model/AppSettings.java b/app/src/main/java/net/gsantner/markor/model/AppSettings.java index 3b657c12ed..a8e67c4624 100644 --- a/app/src/main/java/net/gsantner/markor/model/AppSettings.java +++ b/app/src/main/java/net/gsantner/markor/model/AppSettings.java @@ -347,6 +347,10 @@ public boolean isTodoAddCompletionDateEnabled() { return getBool(R.string.pref_key__todotxt__add_completion_date_for_todos, true); } + public String getTodoDateFormat() { + return getString(R.string.pref_key__todotxt__set_date_format, "yyyy-MM-dd"); + } + public boolean isAppCurrentVersionFirstStart(boolean doSet) { int value = getInt(R.string.pref_key__app_first_start_current_version, -1); if (doSet) { diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 77b1e4733d..7c7b3a0d5b 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -132,6 +132,18 @@ + + + @string/todo_date_format_year_month_day + @string/todo_date_format_year_month_day_hour_minute + @string/todo_date_format_year_month_day_hour_minute_second + + + + yyyy-MM-dd + yyyy-MM-dd HH:mm + yyyy-MM-dd HH:mm:ss + + @string/heading_1 @string/heading_2 diff --git a/app/src/main/res/values/string-not_translatable.xml b/app/src/main/res/values/string-not_translatable.xml index 932f1fe99b..204418d53d 100644 --- a/app/src/main/res/values/string-not_translatable.xml +++ b/app/src/main/res/values/string-not_translatable.xml @@ -422,6 +422,7 @@ work. If not, see . pref_key__editor_tab_to_indent **** "pref_key__todotxt__additional_projects_contexts" + "pref_key__todotxt__set_date_format" pref_key__todotxt_due_date_offset action_format_keyvalue action_format_plaintext diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d7403767c..3b6bb81de7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -413,6 +413,11 @@ work. If not, see . Code block Add completion date Add completion date for todos when marking them as done + Set date format + Set date format used in todo tasks + yyyy-MM-dd (2026-12-31) + yyyy-MM-dd HH:mm (2026-12-31 14:30) + yyyy-MM-dd HH:mm:ss (2026-12-31 14:30:45) File description format Format for the description under each file in the file browser. Follows Android\'s SimpleDateFormat rules, with the addition of FS for showing file size. Leave blank to use the default format for your locale.\n\nExample input:\nFS yyyy MMM dd hh:mm:ss aa\nOutput format:\n30KB 2020 Mar 20 11:24:52 PM Loading default value diff --git a/app/src/main/res/xml/preferences_master.xml b/app/src/main/res/xml/preferences_master.xml index 9c81a41d34..2c0579adfd 100644 --- a/app/src/main/res/xml/preferences_master.xml +++ b/app/src/main/res/xml/preferences_master.xml @@ -515,6 +515,15 @@ android:key="@string/pref_key__todotxt__add_completion_date_for_todos" android:summary="@string/add_completion_date_for_todos_when_marking_them_as_done" android:title="@string/add_completion_date" /> +