diff --git a/app/src/main/java/org/tasks/data/TaskContainer.java b/app/src/main/java/org/tasks/data/TaskContainer.java
index 37f3f1ed5..b32f8794a 100644
--- a/app/src/main/java/org/tasks/data/TaskContainer.java
+++ b/app/src/main/java/org/tasks/data/TaskContainer.java
@@ -54,6 +54,10 @@ public class TaskContainer {
return task.isHidden();
}
+ public long getStartDate() {
+ return task.getHideUntil();
+ }
+
public boolean isCompleted() {
return task.isCompleted();
}
diff --git a/app/src/main/java/org/tasks/preferences/Preferences.kt b/app/src/main/java/org/tasks/preferences/Preferences.kt
index 9ef2f53d4..a05ce0a5d 100644
--- a/app/src/main/java/org/tasks/preferences/Preferences.kt
+++ b/app/src/main/java/org/tasks/preferences/Preferences.kt
@@ -456,6 +456,9 @@ class Preferences @JvmOverloads constructor(
val showSubtaskChip: Boolean
get() = getBoolean(R.string.p_subtask_chips, true)
+ val showStartDateChip: Boolean
+ get() = getBoolean(R.string.p_start_date_chip, true)
+
val showPlaceChip: Boolean
get() = getBoolean(R.string.p_place_chips, true)
diff --git a/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt
index 3de2847fb..6e3c6a26f 100644
--- a/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt
+++ b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt
@@ -83,6 +83,7 @@ class ScrollableWidget : InjectingPreferenceFragment() {
setupCheckbox(R.string.p_widget_show_checkboxes)
setupCheckbox(R.string.p_widget_show_dividers)
setupCheckbox(R.string.p_widget_show_subtasks)
+ setupCheckbox(R.string.p_widget_show_start_dates)
setupCheckbox(R.string.p_widget_show_places)
setupCheckbox(R.string.p_widget_show_lists)
setupCheckbox(R.string.p_widget_show_tags)
diff --git a/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt b/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt
index 461629cb2..f24eb0882 100644
--- a/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt
+++ b/app/src/main/java/org/tasks/tasklist/TaskViewHolder.kt
@@ -67,9 +67,6 @@ class TaskViewHolder internal constructor(
@BindView(R.id.chip_group)
lateinit var chipGroup: ChipGroup
- @BindView(R.id.hidden_icon)
- lateinit var hiddenIcon: View
-
lateinit var task: TaskContainer
var indent = 0
@@ -139,7 +136,6 @@ class TaskViewHolder internal constructor(
this.task = task
indent = task.indent
nameView.text = task.title
- hiddenIcon.visibility = if (task.isHidden) View.VISIBLE else View.GONE
setupTitleAndCheckbox()
setupDueDate(sortByDueDate)
setupChips(filter)
@@ -271,7 +267,7 @@ class TaskViewHolder internal constructor(
description.isSingleLine = false
description.ellipsize = null
}
- setTopPadding(rowPadding, nameView, completeBox, dueDate, hiddenIcon)
+ setTopPadding(rowPadding, nameView, completeBox, dueDate)
setBottomPadding(rowPadding, completeBox, dueDate)
nameView.textSize = fontSize.toFloat()
description.textSize = fontSize.toFloat()
diff --git a/app/src/main/java/org/tasks/ui/ChipProvider.kt b/app/src/main/java/org/tasks/ui/ChipProvider.kt
index 261d8261d..cd7cd222d 100644
--- a/app/src/main/java/org/tasks/ui/ChipProvider.kt
+++ b/app/src/main/java/org/tasks/ui/ChipProvider.kt
@@ -6,6 +6,7 @@ import androidx.annotation.DrawableRes
import androidx.core.content.res.ResourcesCompat
import com.google.android.material.chip.Chip
import com.todoroo.andlib.utility.AndroidUtilities
+import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter
@@ -21,6 +22,7 @@ import org.tasks.preferences.Preferences
import org.tasks.themes.ColorProvider
import org.tasks.themes.CustomIcons.getIconResId
import org.tasks.themes.ThemeColor
+import java.time.format.FormatStyle
import java.util.*
import javax.inject.Inject
@@ -46,6 +48,26 @@ class ChipProvider @Inject constructor(
showIcon = appearance != 1
}
+ private fun newStartDateChip(task: TaskContainer, compact: Boolean): Chip {
+ val chip = newChip(task)
+ apply(
+ chip,
+ R.drawable.ic_pending_actions_24px,
+ DateUtilities.getRelativeDateTime(
+ activity,
+ task.startDate,
+ locale.locale,
+ if (compact) FormatStyle.SHORT else FormatStyle.MEDIUM,
+ false,
+ false
+ ),
+ 0,
+ showText = true,
+ showIcon = true
+ )
+ return chip
+ }
+
fun newSubtaskChip(task: TaskContainer, compact: Boolean): Chip {
val chip = newChip(task)
apply(
@@ -66,6 +88,9 @@ class ChipProvider @Inject constructor(
if (task.hasChildren() && preferences.showSubtaskChip) {
chips.add(newSubtaskChip(task, !showText))
}
+ if (task.isHidden && preferences.showStartDateChip) {
+ chips.add(newStartDateChip(task, !showText))
+ }
if (task.hasLocation() && filter !is PlaceFilter && preferences.showPlaceChip) {
val location = task.getLocation()
newChip(PlaceFilter(location.place), R.drawable.ic_outline_place_24px)?.let(chips::add)
diff --git a/app/src/main/java/org/tasks/widget/ChipProvider.kt b/app/src/main/java/org/tasks/widget/ChipProvider.kt
index 246d268ce..8875b0053 100644
--- a/app/src/main/java/org/tasks/widget/ChipProvider.kt
+++ b/app/src/main/java/org/tasks/widget/ChipProvider.kt
@@ -2,6 +2,7 @@ package org.tasks.widget
import android.content.Context
import android.widget.RemoteViews
+import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.CaldavFilter
import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.api.GtasksFilter
@@ -11,13 +12,18 @@ import org.tasks.BuildConfig
import org.tasks.R
import org.tasks.data.TaskContainer
import org.tasks.filters.PlaceFilter
+import org.tasks.locale.Locale
+import org.tasks.preferences.Preferences
import org.tasks.themes.CustomIcons
import org.tasks.ui.ChipListCache
+import java.time.format.FormatStyle
import javax.inject.Inject
class ChipProvider @Inject constructor(
@ApplicationContext private val context: Context,
private val chipListCache: ChipListCache,
+ private val locale: Locale,
+ private val preferences: Preferences,
) {
var isDark = false
@@ -41,6 +47,27 @@ class ChipProvider @Inject constructor(
return chip
}
+ fun getStartDateChip(task: TaskContainer, showFullDate: Boolean): RemoteViews? {
+ return if (task.isHidden) {
+ val chip = newChip()
+ chip.setTextViewText(
+ R.id.chip_text,
+ DateUtilities.getRelativeDateTime(
+ context,
+ task.startDate,
+ locale.locale,
+ FormatStyle.MEDIUM,
+ showFullDate,
+ false
+ )
+ )
+ chip.setImageViewResource(R.id.chip_icon, R.drawable.ic_pending_actions_24px)
+ chip
+ } else {
+ null
+ }
+ }
+
fun getListChip(filter: Filter?, task: TaskContainer): RemoteViews? {
task.googleTaskList
?.takeIf { filter !is GtasksFilter }
diff --git a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt
index f288cff2d..894d34221 100644
--- a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt
+++ b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt
@@ -64,6 +64,7 @@ internal class ScrollableViewsFactory(
private var showDividers = false
private var disableGroups = false
private var showSubtasks = false
+ private var showStartDates = false
private var showPlaces = false
private var showLists = false
private var showTags = false
@@ -199,9 +200,6 @@ internal class ScrollableViewsFactory(
val row = newRemoteView()
if (task.isHidden) {
textColorTitle = textColorSecondary
- row.setViewVisibility(R.id.hidden_icon, View.VISIBLE)
- } else {
- row.setViewVisibility(R.id.hidden_icon, View.GONE)
}
if (task.isCompleted) {
textColorTitle = textColorSecondary
@@ -267,6 +265,11 @@ internal class ScrollableViewsFactory(
.putExtra(WidgetClickActivity.EXTRA_COLLAPSED, !taskContainer.isCollapsed)
)
}
+ if (taskContainer.isHidden && showStartDates) {
+ chipProvider
+ .getStartDateChip(taskContainer, showFullDate)
+ ?.let { row.addView(R.id.chips, it) }
+ }
if (taskContainer.hasLocation() && showPlaces) {
chipProvider
.getPlaceChip(filter, taskContainer)
@@ -367,6 +370,7 @@ internal class ScrollableViewsFactory(
} == true
showPlaces = widgetPreferences.showPlaces()
showSubtasks = widgetPreferences.showSubtasks()
+ showStartDates = widgetPreferences.showStartDates()
showLists = widgetPreferences.showLists()
showTags = widgetPreferences.showTags()
showFullDate = widgetPreferences.alwaysDisplayFullDate
diff --git a/app/src/main/java/org/tasks/widget/WidgetPreferences.java b/app/src/main/java/org/tasks/widget/WidgetPreferences.java
index 6662ae960..792aa5878 100644
--- a/app/src/main/java/org/tasks/widget/WidgetPreferences.java
+++ b/app/src/main/java/org/tasks/widget/WidgetPreferences.java
@@ -60,6 +60,10 @@ public class WidgetPreferences implements QueryPreferences {
return getBoolean(R.string.p_widget_show_subtasks, true);
}
+ boolean showStartDates() {
+ return getBoolean(R.string.p_widget_show_start_dates, true);
+ }
+
boolean disableGroups() {
return getBoolean(R.string.p_widget_disable_groups, false);
}
diff --git a/app/src/main/res/layout/task_adapter_row.xml b/app/src/main/res/layout/task_adapter_row.xml
index 860548d66..063cb5fe8 100644
--- a/app/src/main/res/layout/task_adapter_row.xml
+++ b/app/src/main/res/layout/task_adapter_row.xml
@@ -44,22 +44,11 @@
android:textSize="14sp"
tools:text="Tmrrw" />
-
-
-
-
-
-
widget-show-full-task-title-
widget-show-dividers-
widget-show-subtasks-
+ widget-show-start-dates-
widget-disable_groups-
widget-show-places-
widget-show-lists-
@@ -414,6 +415,7 @@
chip_style
chip_appearance
chips_subtask
+ chips_start_date
chips_place
chips_list
chips_tag
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 982c7c1c8..a3b88d9c5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -59,6 +59,7 @@ File %1$s contained %2$s.\n\n
No time
Due date
Due time
+ Start date
Day before due
Week before due
due date
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..ef7ec2361 100644
--- a/app/src/main/res/xml/preferences_look_and_feel.xml
+++ b/app/src/main/res/xml/preferences_look_and_feel.xml
@@ -130,6 +130,11 @@
android:key="@string/p_subtask_chips"
android:title="@string/subtasks" />
+
+
+
+