You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tasks/app/src/main/java/org/tasks/widget/ChipProvider.kt

132 lines
4.8 KiB
Kotlin

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
import com.todoroo.astrid.api.TagFilter
import com.todoroo.astrid.data.Task
import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.BuildConfig
import org.tasks.R
import org.tasks.data.TaskContainer
import org.tasks.date.DateTimeUtils.toDateTime
import org.tasks.filters.PlaceFilter
import org.tasks.locale.Locale
import org.tasks.preferences.Preferences
import org.tasks.themes.CustomIcons
import org.tasks.time.DateTimeUtils.startOfDay
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
fun getSubtaskChip(task: TaskContainer): RemoteViews {
val chip = newChip()
chip.setTextViewText(
R.id.chip_text,
context
.resources
.getQuantityString(R.plurals.subtask_count, task.children, task.children)
)
chip.setImageViewResource(
R.id.chip_icon,
if (task.isCollapsed) {
R.drawable.ic_keyboard_arrow_down_black_24dp
} else {
R.drawable.ic_keyboard_arrow_up_black_24dp
}
)
return chip
}
fun getStartDateChip(task: TaskContainer, showFullDate: Boolean, sortByStartDate: Boolean): RemoteViews? {
return if (task.isHidden) {
val chip = newChip()
val time = if (sortByStartDate && task.sortGroup?.startOfDay() == task.startDate.startOfDay()) {
task.startDate
.takeIf { Task.hasDueTime(it) }
?.let { DateUtilities.getTimeString(context, it.toDateTime()) }
?: return null
} else {
DateUtilities.getRelativeDateTime(
context,
task.startDate,
locale.locale,
FormatStyle.MEDIUM,
showFullDate,
false
)
}
chip.setTextViewText(R.id.chip_text, time)
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 }
?.let { newChip(chipListCache.getGoogleTaskList(it), R.drawable.ic_list_24px) }
?.let { return it }
task.caldav
?.takeIf { filter !is CaldavFilter }
?.let { newChip(chipListCache.getCaldavList(it), R.drawable.ic_list_24px) }
?.let { return it }
return null
}
fun getPlaceChip(filter: Filter?, task: TaskContainer): RemoteViews? {
task.location
?.takeIf { filter !is PlaceFilter || it.place != filter.place}
?.let { return newChip(PlaceFilter(it.place), R.drawable.ic_outline_place_24px) }
return null
}
fun getTagChips(filter: Filter?, task: TaskContainer): List<RemoteViews> {
val tags = task.tags?.split(",")?.toHashSet() ?: return emptyList()
if (filter is TagFilter) {
tags.remove(filter.uuid)
}
return tags
.mapNotNull(chipListCache::getTag)
.sortedBy(TagFilter::listingTitle)
.mapNotNull { newChip(it, R.drawable.ic_outline_label_24px) }
}
private fun newChip(filter: Filter?, defaultIcon: Int): RemoteViews? {
if (filter == null) {
return null
}
val chip = newChip()
chip.setTextViewText(R.id.chip_text, filter.listingTitle)
val icon = filter.icon
.takeIf { it >= 0 }
?.let { CustomIcons.getIconResId(it) }
?: defaultIcon
chip.setImageViewResource(R.id.chip_icon, icon)
if (filter.tint != 0) {
chip.setInt(R.id.chip_background, "setColorFilter", filter.tint)
chip.setTextColor(R.id.chip_text, filter.tint)
chip.setInt(R.id.chip_icon, "setColorFilter", filter.tint)
}
return chip
}
private fun newChip() = RemoteViews(
BuildConfig.APPLICATION_ID,
if (isDark) R.layout.widget_chip_dark else R.layout.widget_chip_light
)
}