Add string and color helpers to AdapterSection

pull/1296/head
Alex Baker 5 years ago
parent 9358dfaca5
commit af2894f8f4

@ -6,7 +6,6 @@
package com.todoroo.andlib.utility; package com.todoroo.andlib.utility;
import static org.tasks.Strings.isNullOrEmpty;
import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.date.DateTimeUtils.newDateTime;
import static org.tasks.time.DateTimeUtils.currentTimeMillis; import static org.tasks.time.DateTimeUtils.currentTimeMillis;
@ -14,13 +13,13 @@ import android.content.Context;
import android.text.format.DateFormat; import android.text.format.DateFormat;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.format.TextStyle;
import org.tasks.BuildConfig; import org.tasks.BuildConfig;
import org.tasks.R; import org.tasks.R;
import org.tasks.locale.Locale; import org.tasks.locale.Locale;
import org.tasks.time.DateTime; import org.tasks.time.DateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.format.TextStyle;
public class DateUtilities { public class DateUtilities {
@ -174,14 +173,14 @@ public class DateUtilities {
if (startOfToday.plusDays(1).equals(startOfDate)) { if (startOfToday.plusDays(1).equals(startOfDate)) {
return context.getString( return context.getString(
abbreviated abbreviated
? R.string.tmrw ? lowercase ? R.string.tomorrow_abbrev_lowercase : R.string.tmrw
: lowercase ? R.string.tomorrow_lowercase : R.string.tomorrow); : lowercase ? R.string.tomorrow_lowercase : R.string.tomorrow);
} }
if (startOfDate.plusDays(1).equals(startOfToday)) { if (startOfDate.plusDays(1).equals(startOfToday)) {
return context.getString( return context.getString(
abbreviated abbreviated
? R.string.yest ? lowercase ? R.string.yesterday_abbrev_lowercase : R.string.yest
: lowercase ? R.string.yesterday_lowercase : R.string.yesterday); : lowercase ? R.string.yesterday_lowercase : R.string.yesterday);
} }

@ -1,3 +1,63 @@
package org.tasks.tasklist package org.tasks.tasklist
data class AdapterSection(var firstPosition: Int, val value: Long, var sectionedPosition: Int = 0, var collapsed: Boolean = false) import android.content.Context
import androidx.annotation.StringRes
import androidx.core.content.ContextCompat
import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.core.SortHelper.*
import org.tasks.R
import org.tasks.date.DateTimeUtils.toDateTime
import java.time.format.FormatStyle
import java.util.*
data class AdapterSection(
var firstPosition: Int,
val value: Long,
var sectionedPosition: Int = 0,
var collapsed: Boolean = false
) {
fun headerColor(context: Context, sortMode: Int) =
ContextCompat.getColor(context, if ((sortMode == SORT_DUE || sortMode == SORT_START)
&& value > 0
&& value.toDateTime().plusDays(1).startOfDay().isBeforeNow) {
R.color.overdue
} else {
R.color.text_secondary
})
fun headerString(
context: Context,
locale: Locale,
sortMode: Int,
alwaysDisplayFullDate: Boolean,
style: FormatStyle = FormatStyle.FULL
): String =
when {
sortMode == SORT_IMPORTANCE -> context.getString(priorityToString())
value == 0L -> context.getString(when (sortMode) {
SORT_DUE -> R.string.no_due_date
SORT_START -> R.string.no_start_date
else -> R.string.no_date
})
else -> {
val dateString = DateUtilities.getRelativeDay(
context, value, locale, style, alwaysDisplayFullDate, true
)
when (sortMode) {
SORT_DUE -> context.getString(R.string.sort_due_group, dateString)
SORT_START -> context.getString(R.string.sort_start_group, dateString)
SORT_CREATED -> context.getString(R.string.sort_created_group, dateString)
SORT_MODIFIED -> context.getString(R.string.sort_modified_group, dateString)
else -> throw IllegalArgumentException()
}
}
}
@StringRes
private fun priorityToString() = when (value) {
0L -> R.string.filter_high_priority
1L -> R.string.filter_medium_priority
2L -> R.string.filter_low_priority
else -> R.string.filter_no_priority
}
}

@ -3,14 +3,9 @@ package org.tasks.tasklist
import android.content.Context import android.content.Context
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import androidx.annotation.StringRes
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.core.SortHelper
import org.tasks.R import org.tasks.R
import org.tasks.date.DateTimeUtils.newDateTime
import java.time.format.FormatStyle
import java.util.* import java.util.*
class HeaderViewHolder( class HeaderViewHolder(
@ -24,7 +19,11 @@ class HeaderViewHolder(
fun bind(filter: Filter, sortMode: Int, alwaysDisplayFullDate: Boolean, section: AdapterSection) { fun bind(filter: Filter, sortMode: Int, alwaysDisplayFullDate: Boolean, section: AdapterSection) {
sortGroup = section.value sortGroup = section.value
val header: String? = if (filter.supportsSorting()) getHeader(sortMode, alwaysDisplayFullDate, sortGroup) else null val header = if (filter.supportsSorting()) {
section.headerString(context, locale, sortMode, alwaysDisplayFullDate)
} else {
null
}
if (header == null) { if (header == null) {
this.header.visibility = View.GONE this.header.visibility = View.GONE
@ -32,43 +31,8 @@ class HeaderViewHolder(
this.header.visibility = View.VISIBLE this.header.visibility = View.VISIBLE
this.header.text = header this.header.text = header
this.header.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, if (section.collapsed) R.drawable.ic_keyboard_arrow_down_black_18dp else R.drawable.ic_keyboard_arrow_up_black_18dp, 0) this.header.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, if (section.collapsed) R.drawable.ic_keyboard_arrow_down_black_18dp else R.drawable.ic_keyboard_arrow_up_black_18dp, 0)
this.header.setTextColor( this.header.setTextColor(section.headerColor(context, sortMode))
context.getColor(
if ((sortMode == SortHelper.SORT_DUE || sortMode == SortHelper.SORT_START)
&& sortGroup > 0
&& newDateTime(sortGroup).plusDays(1).startOfDay().isBeforeNow) {
R.color.overdue
} else {
R.color.text_secondary
}))
}
} }
private fun getHeader(sortMode: Int, alwaysDisplayFullDate: Boolean, group: Long): String =
when {
sortMode == SortHelper.SORT_IMPORTANCE ->
context.getString(priorityToString(group.toInt()))
group == 0L -> context.getString(when (sortMode) {
SortHelper.SORT_DUE -> R.string.no_due_date
SortHelper.SORT_START -> R.string.no_start_date
else -> R.string.no_date
})
sortMode == SortHelper.SORT_CREATED ->
context.getString(R.string.sort_created_group, getDateString(group, alwaysDisplayFullDate))
sortMode == SortHelper.SORT_MODIFIED ->
context.getString(R.string.sort_modified_group, getDateString(group, alwaysDisplayFullDate))
else -> getDateString(group, alwaysDisplayFullDate, false)
}
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) {
0 -> R.string.filter_high_priority
1 -> R.string.filter_medium_priority
2 -> R.string.filter_low_priority
else -> R.string.filter_no_priority
} }
init { init {

@ -8,7 +8,6 @@ import android.graphics.Paint
import android.view.View import android.view.View
import android.widget.RemoteViews import android.widget.RemoteViews
import android.widget.RemoteViewsService.RemoteViewsFactory import android.widget.RemoteViewsService.RemoteViewsFactory
import androidx.annotation.StringRes
import com.todoroo.andlib.utility.DateUtilities import com.todoroo.andlib.utility.DateUtilities
import com.todoroo.astrid.api.Filter import com.todoroo.astrid.api.Filter
import com.todoroo.astrid.core.SortHelper import com.todoroo.astrid.core.SortHelper
@ -136,7 +135,7 @@ internal class ScrollableViewsFactory(
val section = tasks.getSection(position) val section = tasks.getSection(position)
val sortGroup = section.value val sortGroup = section.value
val header: String? = if (filter?.supportsSorting() == true) { val header: String? = if (filter?.supportsSorting() == true) {
getHeader(sortMode, section.value) section.headerString(context, locale.locale, sortMode, showFullDate, FormatStyle.MEDIUM)
} else { } else {
null null
} }
@ -146,18 +145,7 @@ internal class ScrollableViewsFactory(
} else { } else {
R.drawable.ic_keyboard_arrow_up_black_18dp R.drawable.ic_keyboard_arrow_up_black_18dp
}) })
val color = if (sortMode == SortHelper.SORT_DUE row.setTextColor(R.id.header, section.headerColor(context, sortMode))
&& sortGroup > 0
&& DateTimeUtils.newDateTime(sortGroup).plusDays(1).startOfDay().isBeforeNow) {
context.getColor(R.color.overdue)
} else if (sortMode == SortHelper.SORT_START
&& sortGroup > 0
&& DateTimeUtils.newDateTime(sortGroup).plusDays(1).startOfDay().isBeforeNow) {
context.getColor(R.color.overdue)
} else {
textColorSecondary
}
row.setTextColor(R.id.header, color)
if (!showDividers) { if (!showDividers) {
row.setViewVisibility(R.id.divider, View.GONE) row.setViewVisibility(R.id.divider, View.GONE)
} }
@ -171,31 +159,6 @@ internal class ScrollableViewsFactory(
return row return row
} }
private fun getHeader(sortMode: Int, group: Long): String = when {
sortMode == SortHelper.SORT_IMPORTANCE -> context.getString(priorityToString(group.toInt()))
group == 0L -> context.getString(when (sortMode) {
SortHelper.SORT_DUE -> R.string.no_due_date
SortHelper.SORT_START -> R.string.no_start_date
else -> R.string.no_date
})
sortMode == SortHelper.SORT_CREATED ->
context.getString(R.string.sort_created_group, getDateString(group))
sortMode == SortHelper.SORT_MODIFIED ->
context.getString(R.string.sort_modified_group, getDateString(group))
else -> getDateString(group, false)
}
private fun getDateString(value: Long, lowercase: Boolean = true) =
DateUtilities.getRelativeDay(context, value, locale.locale, FormatStyle.MEDIUM, showFullDate, lowercase)
@StringRes
private fun priorityToString(priority: Int) = when (priority) {
0 -> R.string.filter_high_priority
1 -> R.string.filter_medium_priority
2 -> R.string.filter_low_priority
else -> R.string.filter_no_priority
}
private fun buildUpdate(position: Int): RemoteViews? { private fun buildUpdate(position: Int): RemoteViews? {
try { try {
val taskContainer = getTask(position) ?: return null val taskContainer = getTask(position) ?: return null

@ -305,7 +305,9 @@ File %1$s contained %2$s.\n\n
<string name="yesterday">Yesterday</string> <string name="yesterday">Yesterday</string>
<string name="yesterday_lowercase">yesterday</string> <string name="yesterday_lowercase">yesterday</string>
<string name="tmrw">Tmrw</string> <string name="tmrw">Tmrw</string>
<string name="tomorrow_abbrev_lowercase">tmrw</string>
<string name="yest">Yest</string> <string name="yest">Yest</string>
<string name="yesterday_abbrev_lowercase">yest</string>
<string name="sync_SPr_interval_title">Background sync</string> <string name="sync_SPr_interval_title">Background sync</string>
<string name="widget_show_checkboxes">Show checkboxes</string> <string name="widget_show_checkboxes">Show checkboxes</string>
<string name="widget_hide_background">Hide background</string> <string name="widget_hide_background">Hide background</string>
@ -630,6 +632,8 @@ File %1$s contained %2$s.\n\n
<string name="support_development_subscribe">Unlock additional features and support open source software</string> <string name="support_development_subscribe">Unlock additional features and support open source software</string>
<string name="no_thanks">No thanks</string> <string name="no_thanks">No thanks</string>
<string name="got_it">Got it!</string> <string name="got_it">Got it!</string>
<string name="sort_start_group">Start %s</string>
<string name="sort_due_group">Due %s</string>
<string name="sort_created_group">Created %s</string> <string name="sort_created_group">Created %s</string>
<string name="sort_modified_group">Modified %s</string> <string name="sort_modified_group">Modified %s</string>
<string name="on_launch">On launch</string> <string name="on_launch">On launch</string>

Loading…
Cancel
Save