From 0783b3d4daca0a4a5592238695a82f996453c79c Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Thu, 24 Sep 2020 17:05:33 -0500 Subject: [PATCH] Display list chips on widget --- .../java/org/tasks/widget/ChipProvider.kt | 77 +++++++++++++++++++ .../tasks/widget/ScrollableViewsFactory.kt | 32 ++++---- .../widget/ScrollableWidgetUpdateService.java | 4 +- .../org/tasks/widget/WidgetPreferences.java | 4 + ..._chip_dark.xml => widget_chip_dark_bg.xml} | 1 + ...hip_light.xml => widget_chip_light_bg.xml} | 1 + app/src/main/res/layout/widget_chip_dark.xml | 48 ++++++++++++ app/src/main/res/layout/widget_chip_light.xml | 48 ++++++++++++ app/src/main/res/layout/widget_row_dark.xml | 42 ++-------- app/src/main/res/layout/widget_row_light.xml | 41 ++-------- app/src/main/res/values/keys.xml | 1 + 11 files changed, 210 insertions(+), 89 deletions(-) create mode 100644 app/src/main/java/org/tasks/widget/ChipProvider.kt rename app/src/main/res/drawable/{widget_chip_dark.xml => widget_chip_dark_bg.xml} (80%) rename app/src/main/res/drawable/{widget_chip_light.xml => widget_chip_light_bg.xml} (80%) create mode 100644 app/src/main/res/layout/widget_chip_dark.xml create mode 100644 app/src/main/res/layout/widget_chip_light.xml diff --git a/app/src/main/java/org/tasks/widget/ChipProvider.kt b/app/src/main/java/org/tasks/widget/ChipProvider.kt new file mode 100644 index 000000000..db1c0c6e8 --- /dev/null +++ b/app/src/main/java/org/tasks/widget/ChipProvider.kt @@ -0,0 +1,77 @@ +package org.tasks.widget + +import android.content.Context +import android.widget.RemoteViews +import com.todoroo.astrid.api.CaldavFilter +import com.todoroo.astrid.api.Filter +import com.todoroo.astrid.api.GtasksFilter +import dagger.hilt.android.qualifiers.ApplicationContext +import org.tasks.BuildConfig +import org.tasks.R +import org.tasks.data.TaskContainer +import org.tasks.themes.CustomIcons +import org.tasks.ui.ChipListCache +import javax.inject.Inject + +class ChipProvider @Inject constructor( + @ApplicationContext private val context: Context, + private val chipListCache: ChipListCache, +) { + + 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 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 + } + + 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 + ) +} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt index 25ce0242f..8b5616d55 100644 --- a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt +++ b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt @@ -35,7 +35,9 @@ internal class ScrollableViewsFactory( private val taskDao: TaskDao, private val defaultFilterProvider: DefaultFilterProvider, private val checkBoxProvider: CheckBoxProvider, - private val locale: Locale) : RemoteViewsFactory { + private val locale: Locale, + private val chipProvider: ChipProvider +) : RemoteViewsFactory { private val indentPadding: Int private var isDark = false private var showDueDates = false @@ -54,6 +56,7 @@ internal class ScrollableViewsFactory( private var handleDueDateClick = false private var showDividers = false private var showSubtasks = false + private var showLists = false private var isRtl = false private var tasks: List = ArrayList() override fun onCreate() {} @@ -167,24 +170,21 @@ internal class ScrollableViewsFactory( if (!showDividers) { row.setViewVisibility(R.id.divider, View.GONE) } + row.removeAllViews(R.id.chips) if (showSubtasks && taskContainer.hasChildren()) { + val chip = chipProvider.getSubtaskChip(taskContainer) + row.addView(R.id.chips, chip) row.setOnClickFillInIntent( - R.id.subtask_button, + R.id.chip, Intent(WidgetClickActivity.TOGGLE_SUBTASKS) .putExtra(WidgetClickActivity.EXTRA_TASK, task) - .putExtra(WidgetClickActivity.EXTRA_COLLAPSED, !taskContainer.isCollapsed)) - row.setTextViewText( - R.id.subtask_text, - context - .resources - .getQuantityString( - R.plurals.subtask_count, taskContainer.children, taskContainer.children)) - row.setImageViewResource( - R.id.subtask_icon, - if (taskContainer.isCollapsed) R.drawable.ic_keyboard_arrow_down_black_18dp else R.drawable.ic_keyboard_arrow_up_black_18dp) - row.setViewVisibility(R.id.subtask_button, View.VISIBLE) - } else { - row.setViewVisibility(R.id.subtask_button, View.GONE) + .putExtra(WidgetClickActivity.EXTRA_COLLAPSED, !taskContainer.isCollapsed) + ) + } + if (!taskContainer.hasParent() && showLists) { + chipProvider + .getListChip(filter, taskContainer) + ?.let { row.addView(R.id.chips, it) } } row.setInt(R.id.widget_row, "setLayoutDirection", locale.directionality) val startPad = taskContainer.getIndent() * indentPadding @@ -248,6 +248,7 @@ internal class ScrollableViewsFactory( showDescription = widgetPreferences.showDescription() showFullDescription = widgetPreferences.showFullDescription() isDark = widgetPreferences.themeIndex > 0 + chipProvider.isDark = isDark textColorPrimary = context.getColor(if (isDark) R.color.white_87 else R.color.black_87) textColorSecondary = context.getColor(if (isDark) R.color.white_60 else R.color.black_60) val dueDatePosition = widgetPreferences.dueDatePosition @@ -259,6 +260,7 @@ internal class ScrollableViewsFactory( filter = defaultFilterProvider.getFilterFromPreference(widgetPreferences.filterId) showDividers = widgetPreferences.showDividers() showSubtasks = widgetPreferences.showSubtasks() + showLists = widgetPreferences.showLists() isRtl = locale.directionality == View.LAYOUT_DIRECTION_RTL } diff --git a/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java b/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java index c8862e7f5..bf006b22a 100644 --- a/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java +++ b/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java @@ -23,6 +23,7 @@ public class ScrollableWidgetUpdateService extends RemoteViewsService { @Inject SubtasksHelper subtasksHelper; @Inject DefaultFilterProvider defaultFilterProvider; @Inject Locale locale; + @Inject ChipProvider chipProvider; @Override public void onStart(Intent intent, int startId) { @@ -52,6 +53,7 @@ public class ScrollableWidgetUpdateService extends RemoteViewsService { taskDao, defaultFilterProvider, new CheckBoxProvider(context, new ColorProvider(context, preferences)), - locale); + locale, + chipProvider); } } diff --git a/app/src/main/java/org/tasks/widget/WidgetPreferences.java b/app/src/main/java/org/tasks/widget/WidgetPreferences.java index ceb071a70..e57237f07 100644 --- a/app/src/main/java/org/tasks/widget/WidgetPreferences.java +++ b/app/src/main/java/org/tasks/widget/WidgetPreferences.java @@ -53,6 +53,10 @@ public class WidgetPreferences { return getBoolean(R.string.p_widget_show_subtasks, true); } + boolean showLists() { + return getBoolean(R.string.p_widget_show_lists, true); + } + public int getDueDatePosition() { return getIntegerFromString(R.string.p_widget_due_date_position, 0); } diff --git a/app/src/main/res/drawable/widget_chip_dark.xml b/app/src/main/res/drawable/widget_chip_dark_bg.xml similarity index 80% rename from app/src/main/res/drawable/widget_chip_dark.xml rename to app/src/main/res/drawable/widget_chip_dark_bg.xml index 51411cae1..62390bd18 100644 --- a/app/src/main/res/drawable/widget_chip_dark.xml +++ b/app/src/main/res/drawable/widget_chip_dark_bg.xml @@ -3,4 +3,5 @@ android:shape="rectangle"> + \ No newline at end of file diff --git a/app/src/main/res/drawable/widget_chip_light.xml b/app/src/main/res/drawable/widget_chip_light_bg.xml similarity index 80% rename from app/src/main/res/drawable/widget_chip_light.xml rename to app/src/main/res/drawable/widget_chip_light_bg.xml index d8882a2a3..984174650 100644 --- a/app/src/main/res/drawable/widget_chip_light.xml +++ b/app/src/main/res/drawable/widget_chip_light_bg.xml @@ -3,4 +3,5 @@ android:shape="rectangle"> + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_chip_dark.xml b/app/src/main/res/layout/widget_chip_dark.xml new file mode 100644 index 000000000..18e99bb9a --- /dev/null +++ b/app/src/main/res/layout/widget_chip_dark.xml @@ -0,0 +1,48 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_chip_light.xml b/app/src/main/res/layout/widget_chip_light.xml new file mode 100644 index 000000000..c1004d51f --- /dev/null +++ b/app/src/main/res/layout/widget_chip_light.xml @@ -0,0 +1,48 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/widget_row_dark.xml b/app/src/main/res/layout/widget_row_dark.xml index ab9a585f4..cbadee05f 100644 --- a/app/src/main/res/layout/widget_row_dark.xml +++ b/app/src/main/res/layout/widget_row_dark.xml @@ -105,49 +105,17 @@ tools:text="Tomorrow" tools:textColor="@color/white_60"/> - - - - - - - + android:orientation="horizontal" /> - - - - - - - + android:orientation="horizontal" /> widget-show-full-task-title- widget-show-dividers- widget-show-subtasks- + widget-show-lists- widget-show-description- widget-show-full-description- widget-show-checkboxes-