From f33cc896dd0273da5131f8ddcb894703326d8dc8 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Sat, 16 Mar 2024 10:37:21 -0500 Subject: [PATCH] Refactor widget --- app/src/main/AndroidManifest.xml | 2 +- .../java/org/tasks/LocalBroadcastManager.kt | 4 + app/src/main/java/org/tasks/Tasks.kt | 6 + .../tasks/dialogs/SortSettingsViewModel.kt | 7 + .../main/java/org/tasks/extensions/Context.kt | 4 - .../tasks/extensions/RemoteViewsExtensions.kt | 37 ++ .../org/tasks/preferences/QueryPreferences.kt | 2 +- ...{ScrollableWidget.kt => WidgetSettings.kt} | 13 +- .../org/tasks/tasklist/SectionedDataSource.kt | 12 +- .../java/org/tasks/themes/ColorProvider.kt | 2 +- .../java/org/tasks/themes/ThemeColor.java | 1 + .../java/org/tasks/ui/CheckBoxProvider.kt | 22 +- .../tasks/widget/ScrollableViewsFactory.kt | 395 ------------------ .../widget/ScrollableWidgetUpdateService.java | 74 ---- .../main/java/org/tasks/widget/TasksWidget.kt | 211 ++++++---- .../org/tasks/widget/TasksWidgetAdapter.kt | 47 +++ .../tasks/widget/TasksWidgetViewFactory.kt | 321 ++++++++++++++ ...{ChipProvider.kt => WidgetChipProvider.kt} | 89 ++-- .../org/tasks/widget/WidgetClickActivity.kt | 2 +- .../org/tasks/widget/WidgetConfigActivity.kt | 4 +- .../org/tasks/widget/WidgetPreferences.kt | 171 ++++---- ...et_chip_dark_bg.xml => widget_chip_bg.xml} | 0 .../res/drawable/widget_chip_light_bg.xml | 7 - .../{widget_chip_dark.xml => widget_chip.xml} | 2 +- app/src/main/res/layout/widget_chip_light.xml | 49 --- ...get_header_light.xml => widget_header.xml} | 0 .../main/res/layout/widget_header_dark.xml | 51 --- .../{widget_row_light.xml => widget_row.xml} | 0 app/src/main/res/layout/widget_row_dark.xml | 123 ------ app/src/main/res/values-ar/strings.xml | 4 - app/src/main/res/values-bg-rBG/strings.xml | 4 - app/src/main/res/values-cs/strings.xml | 4 - app/src/main/res/values-da/strings.xml | 4 - app/src/main/res/values-de/strings.xml | 4 - app/src/main/res/values-eo/strings.xml | 4 - app/src/main/res/values-es/strings.xml | 4 - app/src/main/res/values-eu/strings.xml | 4 - app/src/main/res/values-fi/strings.xml | 4 - app/src/main/res/values-fr/strings.xml | 4 - app/src/main/res/values-gl/strings.xml | 4 - app/src/main/res/values-hr/strings.xml | 4 - app/src/main/res/values-hu/strings.xml | 4 - app/src/main/res/values-id/strings.xml | 4 - app/src/main/res/values-it/strings.xml | 4 - app/src/main/res/values-iw/strings.xml | 4 - app/src/main/res/values-ja/strings.xml | 4 - app/src/main/res/values-ko/strings.xml | 4 - app/src/main/res/values-lt/strings.xml | 4 - app/src/main/res/values-nb/strings.xml | 4 - app/src/main/res/values-night/colors.xml | 3 + app/src/main/res/values-nl/strings.xml | 4 - app/src/main/res/values-or/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 4 - app/src/main/res/values-pt-rBR/strings.xml | 4 - app/src/main/res/values-pt/strings.xml | 4 - app/src/main/res/values-ro/strings.xml | 4 - app/src/main/res/values-ru/strings.xml | 4 - app/src/main/res/values-si/strings.xml | 4 - app/src/main/res/values-sv/strings.xml | 4 - app/src/main/res/values-ta/strings.xml | 4 - app/src/main/res/values-th/strings.xml | 4 - app/src/main/res/values-tr/strings.xml | 4 - app/src/main/res/values-uk/strings.xml | 4 - app/src/main/res/values-ur/strings.xml | 4 - app/src/main/res/values-vi/strings.xml | 4 - app/src/main/res/values-zh-rCN/strings.xml | 4 - app/src/main/res/values-zh-rTW/strings.xml | 4 - app/src/main/res/values/colors.xml | 3 + app/src/main/res/values/keys.xml | 22 - app/src/main/res/values/strings.xml | 4 - app/src/main/res/xml/preferences_widget.xml | 20 - 71 files changed, 691 insertions(+), 1164 deletions(-) create mode 100644 app/src/main/java/org/tasks/extensions/RemoteViewsExtensions.kt rename app/src/main/java/org/tasks/preferences/fragments/{ScrollableWidget.kt => WidgetSettings.kt} (96%) delete mode 100644 app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt delete mode 100644 app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java create mode 100644 app/src/main/java/org/tasks/widget/TasksWidgetAdapter.kt create mode 100644 app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt rename app/src/main/java/org/tasks/widget/{ChipProvider.kt => WidgetChipProvider.kt} (59%) rename app/src/main/res/drawable/{widget_chip_dark_bg.xml => widget_chip_bg.xml} (100%) delete mode 100644 app/src/main/res/drawable/widget_chip_light_bg.xml rename app/src/main/res/layout/{widget_chip_dark.xml => widget_chip.xml} (96%) delete mode 100644 app/src/main/res/layout/widget_chip_light.xml rename app/src/main/res/layout/{widget_header_light.xml => widget_header.xml} (100%) delete mode 100644 app/src/main/res/layout/widget_header_dark.xml rename app/src/main/res/layout/{widget_row_light.xml => widget_row.xml} (100%) delete mode 100644 app/src/main/res/layout/widget_row_dark.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8f58ebe53..56184212e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -315,7 +315,7 @@ if (resultCode == Activity.RESULT_OK) { - widgetPreferences.color = data!!.getIntExtra( - ColorWheelPicker.EXTRA_SELECTED, - 0 + widgetPreferences.setColor( + data!!.getIntExtra(ColorWheelPicker.EXTRA_SELECTED, 0) ) updateColor() } diff --git a/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt b/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt index 0a6c1e86b..8a4edc517 100644 --- a/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt +++ b/app/src/main/java/org/tasks/tasklist/SectionedDataSource.kt @@ -8,12 +8,12 @@ import org.tasks.data.TaskContainer import org.tasks.time.DateTimeUtils.startOfDay class SectionedDataSource( - tasks: List, - disableHeaders: Boolean, - val groupMode: Int, - val subtaskMode: Int, - private val collapsed: Set, - private val completedAtBottom: Boolean, + tasks: List = emptyList(), + disableHeaders: Boolean = false, + val groupMode: Int = SortHelper.GROUP_NONE, + val subtaskMode: Int = SortHelper.SORT_MANUAL, + private val collapsed: Set = emptySet(), + private val completedAtBottom: Boolean = true, ) { private val tasks = tasks.toMutableList() diff --git a/app/src/main/java/org/tasks/themes/ColorProvider.kt b/app/src/main/java/org/tasks/themes/ColorProvider.kt index 531b69212..21ac4ce91 100644 --- a/app/src/main/java/org/tasks/themes/ColorProvider.kt +++ b/app/src/main/java/org/tasks/themes/ColorProvider.kt @@ -71,7 +71,7 @@ class ColorProvider @Inject constructor( -5792882 to -5135210 // birch ) - fun priorityColor(priority: Int, isDarkMode: Boolean, desaturate: Boolean): Int { + fun priorityColor(priority: Int, isDarkMode: Boolean = false, desaturate: Boolean = false): Int { val color = when (priority) { in Int.MIN_VALUE..Task.Priority.HIGH -> RED_500 Task.Priority.MEDIUM -> AMBER_500 diff --git a/app/src/main/java/org/tasks/themes/ThemeColor.java b/app/src/main/java/org/tasks/themes/ThemeColor.java index 573985d68..b7caee794 100644 --- a/app/src/main/java/org/tasks/themes/ThemeColor.java +++ b/app/src/main/java/org/tasks/themes/ThemeColor.java @@ -248,6 +248,7 @@ public class ThemeColor implements Pickable { return colorPrimary; } + @ColorInt public int getColorOnPrimary() { return colorOnPrimary; } diff --git a/app/src/main/java/org/tasks/ui/CheckBoxProvider.kt b/app/src/main/java/org/tasks/ui/CheckBoxProvider.kt index 31f0f84eb..9de23b6a2 100644 --- a/app/src/main/java/org/tasks/ui/CheckBoxProvider.kt +++ b/app/src/main/java/org/tasks/ui/CheckBoxProvider.kt @@ -1,15 +1,13 @@ package org.tasks.ui import android.content.Context -import android.graphics.Bitmap -import android.graphics.Canvas import android.graphics.drawable.Drawable import androidx.annotation.DrawableRes +import androidx.appcompat.content.res.AppCompatResources import com.todoroo.astrid.data.Task import dagger.hilt.android.qualifiers.ActivityContext import org.tasks.R import org.tasks.themes.ColorProvider -import org.tasks.themes.DrawableUtil import javax.inject.Inject class CheckBoxProvider @Inject constructor( @@ -18,29 +16,13 @@ class CheckBoxProvider @Inject constructor( ) { fun getCheckBox(task: Task) = getDrawable(task.getCheckboxRes(), task.priority) - fun getWidgetCheckBox(task: Task): Bitmap { - val wrapped = - DrawableUtil.getWrapped(context, task.getCheckboxRes()) - DrawableUtil.setTint(wrapped, colorProvider.getPriorityColor(task.priority, false)) - return convertToBitmap(wrapped) - } - private fun getDrawable(@DrawableRes resId: Int, priority: Int): Drawable { - val original = context.getDrawable(resId) + val original = AppCompatResources.getDrawable(context, resId) val wrapped = original!!.mutate() wrapped.setTint(colorProvider.getPriorityColor(priority)) return wrapped } - private fun convertToBitmap(d: Drawable): Bitmap { - val bitmap = - Bitmap.createBitmap(d.intrinsicWidth, d.intrinsicHeight, Bitmap.Config.ARGB_8888) - val canvas = Canvas(bitmap) - d.setBounds(0, 0, canvas.width, canvas.height) - d.draw(canvas) - return bitmap - } - companion object { fun Task.getCheckboxRes() = when { isCompleted -> R.drawable.ic_outline_check_box_24px diff --git a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt b/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt deleted file mode 100644 index 921c6efe7..000000000 --- a/app/src/main/java/org/tasks/widget/ScrollableViewsFactory.kt +++ /dev/null @@ -1,395 +0,0 @@ -package org.tasks.widget - -import android.content.Context -import android.content.Intent -import android.graphics.Bitmap -import android.graphics.Paint -import android.view.View -import android.widget.RemoteViews -import android.widget.RemoteViewsService.RemoteViewsFactory -import com.todoroo.andlib.utility.DateUtilities -import com.todoroo.andlib.utility.DateUtilities.now -import com.todoroo.astrid.api.AstridOrderingFilter -import com.todoroo.astrid.api.Filter -import com.todoroo.astrid.core.SortHelper -import com.todoroo.astrid.data.Task -import com.todoroo.astrid.subtasks.SubtasksHelper -import kotlinx.coroutines.runBlocking -import org.tasks.BuildConfig -import org.tasks.LocalBroadcastManager -import org.tasks.R -import org.tasks.data.TaskContainer -import org.tasks.data.TaskDao -import org.tasks.data.TaskListQuery.getQuery -import org.tasks.date.DateTimeUtils -import org.tasks.extensions.Context.isNightMode -import org.tasks.markdown.Markdown -import org.tasks.preferences.DefaultFilterProvider -import org.tasks.preferences.Preferences -import org.tasks.tasklist.HeaderFormatter -import org.tasks.tasklist.SectionedDataSource -import org.tasks.tasklist.SectionedDataSource.Companion.HEADER_COMPLETED -import org.tasks.time.DateTimeUtils.startOfDay -import org.tasks.ui.CheckBoxProvider -import timber.log.Timber -import java.time.format.FormatStyle -import java.util.Locale -import kotlin.math.max - -internal class ScrollableViewsFactory( - private val subtasksHelper: SubtasksHelper, - preferences: Preferences, - private val context: Context, - private val widgetId: Int, - private val taskDao: TaskDao, - private val defaultFilterProvider: DefaultFilterProvider, - private val checkBoxProvider: CheckBoxProvider, - private val locale: Locale, - private val chipProvider: ChipProvider, - private val localBroadcastManager: LocalBroadcastManager, - private val markdown: Markdown, - private val headerFormatter: HeaderFormatter, -) : RemoteViewsFactory { - private val indentPadding: Int - private var showDueDates = false - private var endDueDate = false - private var showCheckboxes = false - private var textSize = 0f - private var dueDateTextSize = 0f - private var filter: Filter? = null - private var textColorPrimary = 0 - private var textColorSecondary = 0 - private var showFullTaskTitle = false - private var showDescription = false - private var showFullDescription = false - private var vPad = 0 - private var hPad = 0 - private var handleDueDateClick = false - 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 - private var collapsed = mutableSetOf(HEADER_COMPLETED) - private var groupMode = -1 - private var subtaskMode = -1 - private var tasks = SectionedDataSource( - emptyList(), - disableHeaders = false, - groupMode = SortHelper.GROUP_NONE, - subtaskMode = SortHelper.SORT_MANUAL, - collapsed, - preferences.completedTasksAtBottom, - ) - private val widgetPreferences = WidgetPreferences(context, preferences, widgetId) - private var isDark = checkIfDark - private var showFullDate = false - private var compact = false - - private val checkIfDark: Boolean - get() = when (widgetPreferences.themeIndex) { - 0 -> false - 3 -> context.isNightMode - else -> true - } - - override fun onCreate() {} - - override fun onDataSetChanged() { - runBlocking { - updateSettings() - tasks = SectionedDataSource( - taskDao.fetchTasks { getQuery(filter) }, - disableGroups, - groupMode, - subtaskMode, - collapsed, - widgetPreferences.completedTasksAtBottom, - ) - if (collapsed.retainAll(tasks.getSectionValues())) { - widgetPreferences.collapsed = collapsed - } - } - } - - override fun onDestroy() {} - - override fun getCount(): Int { - if (isDark != checkIfDark) { - isDark = !isDark - localBroadcastManager.reconfigureWidget(widgetId) - } - return tasks.size - } - - override fun getViewAt(position: Int): RemoteViews? = - if (tasks.isHeader(position)) buildHeader(position) else buildUpdate(position) - - override fun getLoadingView(): RemoteViews = newRemoteView() - - override fun getViewTypeCount(): Int = 2 - - override fun getItemId(position: Int) = getTask(position)?.id ?: 0 - - override fun hasStableIds(): Boolean = true - - private fun getCheckbox(task: Task): Bitmap = checkBoxProvider.getWidgetCheckBox(task) - - private fun newRemoteView(): RemoteViews = RemoteViews( - BuildConfig.APPLICATION_ID, - if (isDark) R.layout.widget_row_dark else R.layout.widget_row_light - ) - - private fun buildHeader(position: Int): RemoteViews { - val row = RemoteViews( - BuildConfig.APPLICATION_ID, - if (isDark) R.layout.widget_header_dark else R.layout.widget_header_light - ) - val section = tasks.getSection(position) - val sortGroup = section.value - val header: String? = if (filter?.supportsSorting() == true) { - headerFormatter.headerStringBlocking( - value = section.value, - groupMode = groupMode, - alwaysDisplayFullDate = showFullDate, - style = FormatStyle.MEDIUM, - compact = compact, - ) - } else { - null - } - row.setTextViewText(R.id.header, header) - row.setImageViewResource(R.id.arrow, if (section.collapsed) { - R.drawable.ic_keyboard_arrow_down_black_18dp - } else { - R.drawable.ic_keyboard_arrow_up_black_18dp - }) - row.setTextColor( - R.id.header, - section.headerColor( - context, - groupMode, - if (isDark) R.color.white_60 else R.color.black_60 - ) - ) - if (!showDividers) { - row.setViewVisibility(R.id.divider, View.GONE) - } - row.setOnClickFillInIntent( - R.id.row, - Intent(WidgetClickActivity.TOGGLE_GROUP) - .putExtra(WidgetClickActivity.EXTRA_WIDGET, widgetId) - .putExtra(WidgetClickActivity.EXTRA_GROUP, sortGroup) - .putExtra(WidgetClickActivity.EXTRA_COLLAPSED, !section.collapsed) - ) - return row - } - - private fun buildUpdate(position: Int): RemoteViews? { - try { - val taskContainer = getTask(position) ?: return null - val task = taskContainer.task - var textColorTitle = textColorPrimary - val row = newRemoteView() - if (task.isHidden) { - textColorTitle = textColorSecondary - } - if (task.isCompleted) { - textColorTitle = textColorSecondary - row.setInt( - R.id.widget_text, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG or Paint.ANTI_ALIAS_FLAG) - } else { - row.setInt(R.id.widget_text, "setPaintFlags", Paint.ANTI_ALIAS_FLAG) - } - row.setFloat(R.id.widget_text, "setTextSize", textSize) - if (showDueDates) { - formatDueDate(row, taskContainer) - } else { - row.setViewVisibility(R.id.widget_due_bottom, View.GONE) - row.setViewVisibility(R.id.widget_due_end, View.GONE) - if (task.hasDueDate() && task.isOverdue) { - textColorTitle = context.getColor(R.color.overdue) - } - } - if (showFullTaskTitle) { - row.setInt(R.id.widget_text, "setMaxLines", Int.MAX_VALUE) - } - row.setTextViewText( - R.id.widget_text, - markdown.toMarkdown(task.title) - ) - row.setTextColor(R.id.widget_text, textColorTitle) - if (showDescription && task.hasNotes()) { - row.setFloat(R.id.widget_description, "setTextSize", textSize) - row.setTextViewText( - R.id.widget_description, - markdown.toMarkdown(task.notes) - ) - row.setViewVisibility(R.id.widget_description, View.VISIBLE) - if (showFullDescription) { - row.setInt(R.id.widget_description, "setMaxLines", Int.MAX_VALUE) - } - } else { - row.setViewVisibility(R.id.widget_description, View.GONE) - } - row.setOnClickFillInIntent( - R.id.widget_row, - Intent(WidgetClickActivity.EDIT_TASK) - .putExtra(WidgetClickActivity.EXTRA_FILTER, filter) - .putExtra(WidgetClickActivity.EXTRA_TASK, task)) - if (showCheckboxes) { - row.setViewPadding(R.id.widget_complete_box, hPad, vPad, hPad, vPad) - row.setImageViewBitmap(R.id.widget_complete_box, getCheckbox(task)) - row.setOnClickFillInIntent( - R.id.widget_complete_box, - Intent(WidgetClickActivity.COMPLETE_TASK) - .putExtra(WidgetClickActivity.EXTRA_TASK, task)) - } else { - row.setViewPadding(R.id.widget_complete_box, hPad, 0, 0, 0) - row.setInt(R.id.widget_complete_box, "setBackgroundResource", 0) - } - row.setViewPadding(R.id.top_padding, 0, vPad, 0, 0) - row.setViewPadding(R.id.bottom_padding, 0, vPad, 0, 0) - 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.chip, - Intent(WidgetClickActivity.TOGGLE_SUBTASKS) - .putExtra(WidgetClickActivity.EXTRA_TASK, task) - .putExtra(WidgetClickActivity.EXTRA_COLLAPSED, !taskContainer.isCollapsed) - ) - } - if (taskContainer.isHidden && showStartDates) { - val sortByDate = groupMode == SortHelper.SORT_START && !disableGroups - chipProvider - .getStartDateChip(taskContainer, showFullDate, sortByDate) - ?.let { row.addView(R.id.chips, it) } - } - if (taskContainer.hasLocation() && showPlaces) { - chipProvider - .getPlaceChip(filter, taskContainer) - ?.let { row.addView(R.id.chips, it) } - } - if (!taskContainer.hasParent() && showLists) { - chipProvider - .getListChip(filter, taskContainer) - ?.let { row.addView(R.id.chips, it) } - } - if (showTags && taskContainer.tagsString?.isNotBlank() == true) { - chipProvider - .getTagChips(filter, taskContainer) - .forEach { row.addView(R.id.chips, it) } - } - val startPad = taskContainer.indent * indentPadding - row.setViewPadding(R.id.widget_row, startPad, 0, 0, 0) - return row - } catch (e: Exception) { - Timber.e(e) - } - return null - } - - private fun getTask(position: Int): TaskContainer? = tasks.getItem(position) - - private suspend fun getQuery(filter: Filter?): List { - val queries = getQuery(widgetPreferences, filter!!) - val last = queries.size - 1 - queries[last] = - subtasksHelper.applySubtasksToWidgetFilter(filter, widgetPreferences, queries[last]) - return queries - } - - private fun formatDueDate(row: RemoteViews, task: TaskContainer) { - val dueDateRes = if (endDueDate) R.id.widget_due_end else R.id.widget_due_bottom - row.setViewVisibility(if (endDueDate) R.id.widget_due_bottom else R.id.widget_due_end, View.GONE) - val hasDueDate = task.hasDueDate() - val endPad = if (hasDueDate && endDueDate) 0 else hPad - row.setViewPadding(R.id.widget_text, 0, 0, endPad, 0) - if (hasDueDate) { - if (endDueDate) { - row.setViewPadding(R.id.widget_due_end, hPad, vPad, hPad, vPad) - } - row.setViewVisibility(dueDateRes, View.VISIBLE) - val text = if ( - groupMode == SortHelper.SORT_DUE && - (task.sortGroup ?: 0L) >= now().startOfDay() && - !disableGroups - ) { - task.takeIf { it.hasDueTime() }?.let { - DateUtilities.getTimeString(context, DateTimeUtils.newDateTime(task.dueDate)) - } - } else { - DateUtilities.getRelativeDateTime( - context, task.dueDate, locale, FormatStyle.MEDIUM, showFullDate, false) - } - row.setTextViewText(dueDateRes, text) - row.setTextColor( - dueDateRes, - if (task.isOverdue) context.getColor(R.color.overdue) else textColorSecondary) - row.setFloat(dueDateRes, "setTextSize", dueDateTextSize) - if (handleDueDateClick) { - row.setOnClickFillInIntent( - dueDateRes, - Intent(WidgetClickActivity.RESCHEDULE_TASK) - .putExtra(WidgetClickActivity.EXTRA_TASK, task.task)) - } else { - row.setInt(dueDateRes, "setBackgroundResource", 0) - } - } else { - row.setViewVisibility(dueDateRes, View.GONE) - } - } - - private suspend fun updateSettings() { - vPad = widgetPreferences.widgetSpacing - hPad = context.resources.getDimension(R.dimen.widget_padding).toInt() - handleDueDateClick = widgetPreferences.rescheduleOnDueDateClick() - showFullTaskTitle = widgetPreferences.showFullTaskTitle() - showDescription = widgetPreferences.showDescription() - showFullDescription = widgetPreferences.showFullDescription() - 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 - showDueDates = dueDatePosition != 2 - endDueDate = dueDatePosition != 1 - showCheckboxes = widgetPreferences.showCheckboxes() - textSize = widgetPreferences.fontSize.toFloat() - dueDateTextSize = max(10f, textSize - 2) - filter = defaultFilterProvider.getFilterFromPreference(widgetPreferences.filterId) - showDividers = widgetPreferences.showDividers() - disableGroups = filter?.let { - !it.supportsSorting() - || (it.supportsManualSort() && widgetPreferences.isManualSort) - || (it is AstridOrderingFilter && widgetPreferences.isAstridSort) - } == true - showPlaces = widgetPreferences.showPlaces() - showSubtasks = widgetPreferences.showSubtasks() - showStartDates = widgetPreferences.showStartDates() - showLists = widgetPreferences.showLists() - showTags = widgetPreferences.showTags() - showFullDate = widgetPreferences.alwaysDisplayFullDate - widgetPreferences.groupMode.takeIf { it != groupMode } - ?.let { - if (groupMode != SortHelper.GROUP_NONE) { - widgetPreferences.collapsed = mutableSetOf(HEADER_COMPLETED) - } - groupMode = it - } - subtaskMode = widgetPreferences.subtaskMode - collapsed = widgetPreferences.collapsed - compact = widgetPreferences.compact - } - - init { - val metrics = context.resources.displayMetrics - indentPadding = (20 * metrics.density).toInt() - } -} \ No newline at end of file diff --git a/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java b/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java deleted file mode 100644 index cb9ebeace..000000000 --- a/app/src/main/java/org/tasks/widget/ScrollableWidgetUpdateService.java +++ /dev/null @@ -1,74 +0,0 @@ -package org.tasks.widget; - -import android.appwidget.AppWidgetManager; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.widget.RemoteViewsService; - -import com.todoroo.astrid.subtasks.SubtasksHelper; - -import org.tasks.LocalBroadcastManager; -import org.tasks.data.TaskDao; -import org.tasks.markdown.MarkdownProvider; -import org.tasks.preferences.DefaultFilterProvider; -import org.tasks.preferences.Preferences; -import org.tasks.tasklist.HeaderFormatter; -import org.tasks.themes.ColorProvider; -import org.tasks.ui.CheckBoxProvider; - -import java.util.Locale; - -import javax.inject.Inject; - -import dagger.hilt.android.AndroidEntryPoint; - -@AndroidEntryPoint -public class ScrollableWidgetUpdateService extends RemoteViewsService { - - @Inject TaskDao taskDao; - @Inject Preferences preferences; - @Inject SubtasksHelper subtasksHelper; - @Inject DefaultFilterProvider defaultFilterProvider; - @Inject Locale locale; - @Inject ChipProvider chipProvider; - @Inject LocalBroadcastManager localBroadcastManager; - @Inject MarkdownProvider markdownProvider; - @Inject HeaderFormatter headerFormatter; - - @Override - public void onStart(Intent intent, int startId) { - super.onStart(intent, startId); - - stopSelf(); - } - - @Override - public RemoteViewsFactory onGetViewFactory(Intent intent) { - if (intent == null) { - return null; - } - - Bundle extras = intent.getExtras(); - if (extras == null) { - return null; - } - - int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); - Context context = getApplicationContext(); - return new ScrollableViewsFactory( - subtasksHelper, - preferences, - context, - widgetId, - taskDao, - defaultFilterProvider, - new CheckBoxProvider(context, new ColorProvider(context, preferences)), - locale, - chipProvider, - localBroadcastManager, - markdownProvider.markdown(false), - headerFormatter - ); - } -} diff --git a/app/src/main/java/org/tasks/widget/TasksWidget.kt b/app/src/main/java/org/tasks/widget/TasksWidget.kt index 09a54a0f3..3a913abd9 100644 --- a/app/src/main/java/org/tasks/widget/TasksWidget.kt +++ b/app/src/main/java/org/tasks/widget/TasksWidget.kt @@ -10,7 +10,6 @@ import android.os.Bundle import android.view.View import android.widget.RemoteViews import androidx.annotation.ColorInt -import androidx.core.graphics.ColorUtils import com.todoroo.andlib.utility.AndroidUtilities.atLeastS import com.todoroo.astrid.api.Filter import dagger.hilt.android.AndroidEntryPoint @@ -18,7 +17,9 @@ import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.runBlocking import org.tasks.R import org.tasks.dialogs.FilterPicker -import org.tasks.extensions.Context.isNightMode +import org.tasks.extensions.setBackgroundColor +import org.tasks.extensions.setColorFilter +import org.tasks.extensions.setRipple import org.tasks.intents.TaskIntents import org.tasks.preferences.DefaultFilterProvider import org.tasks.preferences.Preferences @@ -33,10 +34,13 @@ class TasksWidget : AppWidgetProvider() { @Inject @ApplicationContext lateinit var context: Context override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { - for (id in appWidgetIds) { + appWidgetIds.forEach { appWidgetId -> try { - val options = appWidgetManager.getAppWidgetOptions(id) - appWidgetManager.updateAppWidget(id, createScrollableWidget(context, id, options)) + val options = appWidgetManager.getAppWidgetOptions(appWidgetId) + appWidgetManager.updateAppWidget( + appWidgetId, + createWidget(context, appWidgetId, options) + ) } catch (e: Exception) { Timber.e(e) } @@ -47,97 +51,123 @@ class TasksWidget : AppWidgetProvider() { context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, - newOptions: Bundle? + newOptions: Bundle ) { - newOptions?.let { - appWidgetManager - .updateAppWidget(appWidgetId, createScrollableWidget(context, appWidgetId, it)) - } + appWidgetManager.updateAppWidget( + appWidgetId, + createWidget(context, appWidgetId, newOptions) + ) } - private fun createScrollableWidget(context: Context, id: Int, options: Bundle): RemoteViews { + private fun createWidget(context: Context, id: Int, options: Bundle): RemoteViews { val widgetPreferences = WidgetPreferences(context, preferences, id) - widgetPreferences.compact = - options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH) < COMPACT_MAX - val filterId = widgetPreferences.filterId - val color = ThemeColor(context, widgetPreferences.color) - val remoteViews = RemoteViews(context.packageName, R.layout.scrollable_widget) - if (widgetPreferences.showHeader()) { - remoteViews.setViewVisibility(R.id.widget_header, View.VISIBLE) - remoteViews.setViewVisibility( - R.id.widget_change_list, - if (widgetPreferences.showMenu()) View.VISIBLE else View.GONE + val settings = widgetPreferences.getWidgetHeaderSettings() + widgetPreferences.setCompact( + options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH) < COMPACT_MAX + ) + val filter = runBlocking { + defaultFilterProvider.getFilterFromPreference(widgetPreferences.filterId) + } + return RemoteViews(context.packageName, R.layout.scrollable_widget).apply { + if (settings.showHeader) { + setViewVisibility(R.id.widget_header, View.VISIBLE) + setupHeader(settings, filter, id) + } else { + setViewVisibility(R.id.widget_header, View.GONE) + } + val bgColor = getBackgroundColor(widgetPreferences.themeIndex) + setBackgroundColor( + viewId = R.id.list_view, + color = bgColor, + opacity = widgetPreferences.rowOpacity, ) - remoteViews.setViewVisibility( - R.id.widget_reconfigure, - if (widgetPreferences.showSettings()) View.VISIBLE else View.GONE + setBackgroundColor( + viewId = R.id.empty_view, + color = bgColor, + opacity = widgetPreferences.footerOpacity, ) - remoteViews.removeAllViews(R.id.title_container) - remoteViews.addView( - R.id.title_container, - RemoteViews(context.packageName, widgetPreferences.headerLayout) + setOnClickPendingIntent(R.id.empty_view, getOpenListIntent(context, filter, id)) + val cacheBuster = Uri.parse("tasks://widget/" + System.currentTimeMillis()) + setRemoteAdapter( + R.id.list_view, + Intent(context, TasksWidgetAdapter::class.java) + .putExtra(TasksWidgetAdapter.EXTRA_FILTER, filter) + .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id) + .setData(cacheBuster) ) - val widgetPadding = context.resources.getDimension(R.dimen.widget_padding).toInt() - val widgetTitlePadding = if (widgetPreferences.showMenu()) 0 else widgetPadding - val vPad = widgetPreferences.headerSpacing - remoteViews.setViewPadding(R.id.widget_title, widgetTitlePadding, 0, 0, 0) - remoteViews.setInt(R.id.widget_title, "setTextColor", color.colorOnPrimary) - buttons.forEach { - remoteViews.setInt(it, "setColorFilter", color.colorOnPrimary) - remoteViews.setViewPadding(it, widgetPadding, vPad, widgetPadding, vPad) - } - } else { - remoteViews.setViewVisibility(R.id.widget_header, View.GONE) + setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context)) } - remoteViews.setInt( - R.id.widget_header, - "setBackgroundColor", - ColorUtils.setAlphaComponent(color.primaryColor, widgetPreferences.headerOpacity)) - val bgColor = getBackgroundColor(widgetPreferences.themeIndex) - remoteViews.setInt( - R.id.list_view, - "setBackgroundColor", - ColorUtils.setAlphaComponent(bgColor, widgetPreferences.rowOpacity)) - remoteViews.setInt( - R.id.empty_view, - "setBackgroundColor", - ColorUtils.setAlphaComponent(bgColor, widgetPreferences.footerOpacity)) - val filter = runBlocking { defaultFilterProvider.getFilterFromPreference(filterId) } - remoteViews.setTextViewText(R.id.widget_title, if (widgetPreferences.showTitle()) { - filter.title - } else { - null - }) - val cacheBuster = Uri.parse("tasks://widget/" + System.currentTimeMillis()) - remoteViews.setRemoteAdapter( - R.id.list_view, - Intent(context, ScrollableWidgetUpdateService::class.java) - .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id) - .setData(cacheBuster)) - setRipple( - remoteViews, color, R.id.widget_button, R.id.widget_change_list, R.id.widget_reconfigure) - remoteViews.setOnClickPendingIntent(R.id.widget_title, getOpenListIntent(context, filter, id)) - remoteViews.setViewVisibility( - R.id.widget_button, - if (filter.isWritable) View.VISIBLE else View.GONE + } + + private fun RemoteViews.setupHeader( + widgetPreferences: WidgetPreferences.WidgetHeaderSettings, + filter: Filter, + id: Int, + ) { + val color = ThemeColor(context, widgetPreferences.color) + setBackgroundColor( + viewId = R.id.widget_header, + color = color.primaryColor, + opacity = widgetPreferences.headerOpacity, + ) + val hPad = context.resources.getDimension(R.dimen.widget_padding).toInt() + val vPad = widgetPreferences.headerSpacing + setupButton( + viewId = R.id.widget_change_list, + enabled = widgetPreferences.showMenu, + color = color, + vPad = vPad, + hPad = hPad, + onClick = getChooseListIntent(context, filter, id), + ) + setupButton( + viewId = R.id.widget_reconfigure, + enabled = widgetPreferences.showSettings, + color = color, + vPad = vPad, + hPad = hPad, + onClick = getWidgetConfigIntent(context, id), + ) + setupButton( + viewId = R.id.widget_button, + enabled = filter.isWritable, + color = color, + vPad = vPad, + hPad = hPad, + onClick = getNewTaskIntent(context, filter, id), + ) + addView( + R.id.title_container, + RemoteViews(context.packageName, widgetPreferences.headerLayout) + ) + setViewPadding( + R.id.widget_title, + if (widgetPreferences.showMenu) 0 else hPad, 0, 0, 0 + ) + setTextColor(R.id.widget_title, color.colorOnPrimary) + setOnClickPendingIntent(R.id.widget_title, getOpenListIntent(context, filter, id)) + setTextViewText( + R.id.widget_title, + if (widgetPreferences.showTitle) filter.title else null ) - remoteViews.setOnClickPendingIntent(R.id.widget_button, getNewTaskIntent(context, filter, id)) - remoteViews.setOnClickPendingIntent(R.id.widget_change_list, getChooseListIntent(context, filter, id)) - remoteViews.setOnClickPendingIntent( - R.id.widget_reconfigure, getWidgetConfigIntent(context, id)) - if (widgetPreferences.openOnFooterClick()) { - remoteViews.setOnClickPendingIntent(R.id.empty_view, getOpenListIntent(context, filter, id)) - } else { - remoteViews.setOnClickPendingIntent(R.id.empty_view, null) - } - remoteViews.setPendingIntentTemplate(R.id.list_view, getPendingIntentTemplate(context)) - return remoteViews } - private fun setRipple(rv: RemoteViews, color: ThemeColor, vararg views: Int) { - val drawableRes = if (color.isDark) R.drawable.widget_ripple_circle_light else R.drawable.widget_ripple_circle_dark - for (view in views) { - rv.setInt(view, "setBackgroundResource", drawableRes) + private fun RemoteViews.setupButton( + viewId: Int, + enabled: Boolean, + color: ThemeColor, + vPad: Int, + hPad: Int, + onClick: PendingIntent, + ) { + if (enabled) { + setViewVisibility(viewId, View.VISIBLE) + setColorFilter(viewId, color.colorOnPrimary) + setViewPadding(viewId, hPad, vPad, hPad, vPad) + setRipple(viewId, color.isDark) + setOnClickPendingIntent(viewId, onClick) + } else { + setViewVisibility(viewId, View.GONE) } } @@ -146,7 +176,7 @@ class TasksWidget : AppWidgetProvider() { val background: Int = when (themeIndex) { 1 -> android.R.color.black 2 -> R.color.md_background_dark - 3 -> if (context.isNightMode) R.color.md_background_dark else android.R.color.white + 3 -> R.color.widget_background_follow_system else -> android.R.color.white } return context.getColor(background) @@ -187,7 +217,7 @@ class TasksWidget : AppWidgetProvider() { private fun getWidgetConfigIntent(context: Context, widgetId: Int): PendingIntent { val intent = Intent(context, WidgetConfigActivity::class.java) - intent.flags = flags + intent.flags = FLAGS intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId) intent.action = "widget_settings" return PendingIntent.getActivity( @@ -200,7 +230,7 @@ class TasksWidget : AppWidgetProvider() { private fun getChooseListIntent(context: Context, filter: Filter, widgetId: Int): PendingIntent { val intent = Intent(context, WidgetFilterSelectionActivity::class.java) - intent.flags = flags + intent.flags = FLAGS intent.putExtra(FilterPicker.EXTRA_FILTER, filter) intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId) intent.action = "choose_list" @@ -214,9 +244,6 @@ class TasksWidget : AppWidgetProvider() { companion object { private const val COMPACT_MAX = 275 - private const val flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP - private val buttons = intArrayOf( - R.id.widget_change_list, R.id.widget_button, R.id.widget_reconfigure - ) + private const val FLAGS = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/widget/TasksWidgetAdapter.kt b/app/src/main/java/org/tasks/widget/TasksWidgetAdapter.kt new file mode 100644 index 000000000..de82117d0 --- /dev/null +++ b/app/src/main/java/org/tasks/widget/TasksWidgetAdapter.kt @@ -0,0 +1,47 @@ +package org.tasks.widget + +import android.appwidget.AppWidgetManager +import android.content.Intent +import android.widget.RemoteViewsService +import androidx.core.content.IntentCompat +import com.todoroo.astrid.api.Filter +import com.todoroo.astrid.subtasks.SubtasksHelper +import dagger.hilt.android.AndroidEntryPoint +import org.tasks.data.TaskDao +import org.tasks.markdown.MarkdownProvider +import org.tasks.preferences.Preferences +import org.tasks.tasklist.HeaderFormatter +import java.util.Locale +import javax.inject.Inject + +@AndroidEntryPoint +class TasksWidgetAdapter : RemoteViewsService() { + @Inject lateinit var taskDao: TaskDao + @Inject lateinit var preferences: Preferences + @Inject lateinit var subtasksHelper: SubtasksHelper + @Inject lateinit var locale: Locale + @Inject lateinit var chipProvider: WidgetChipProvider + @Inject lateinit var markdownProvider: MarkdownProvider + @Inject lateinit var headerFormatter: HeaderFormatter + + override fun onGetViewFactory(intent: Intent): RemoteViewsFactory? { + val widgetId = intent.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: return null + val filter = IntentCompat.getParcelableExtra(intent, EXTRA_FILTER, Filter::class.java) ?: return null + return TasksWidgetViewFactory( + subtasksHelper, + preferences, + filter, + applicationContext, + widgetId, + taskDao, + locale, + chipProvider, + markdownProvider.markdown(false), + headerFormatter, + ) + } + + companion object { + const val EXTRA_FILTER = "extra_filter" + } +} diff --git a/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt b/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt new file mode 100644 index 000000000..abc418a98 --- /dev/null +++ b/app/src/main/java/org/tasks/widget/TasksWidgetViewFactory.kt @@ -0,0 +1,321 @@ +package org.tasks.widget + +import android.content.Context +import android.content.Intent +import android.view.View +import android.widget.RemoteViews +import android.widget.RemoteViewsService.RemoteViewsFactory +import com.todoroo.andlib.utility.DateUtilities +import com.todoroo.andlib.utility.DateUtilities.now +import com.todoroo.astrid.api.AstridOrderingFilter +import com.todoroo.astrid.api.Filter +import com.todoroo.astrid.core.SortHelper +import com.todoroo.astrid.subtasks.SubtasksHelper +import kotlinx.coroutines.runBlocking +import org.tasks.BuildConfig +import org.tasks.R +import org.tasks.data.TaskContainer +import org.tasks.data.TaskDao +import org.tasks.data.TaskListQuery.getQuery +import org.tasks.date.DateTimeUtils +import org.tasks.extensions.Context.isNightMode +import org.tasks.extensions.setBackgroundResource +import org.tasks.extensions.setColorFilter +import org.tasks.extensions.setMaxLines +import org.tasks.extensions.setTextSize +import org.tasks.extensions.strikethrough +import org.tasks.markdown.Markdown +import org.tasks.preferences.Preferences +import org.tasks.tasklist.HeaderFormatter +import org.tasks.tasklist.SectionedDataSource +import org.tasks.themes.ColorProvider.Companion.priorityColor +import org.tasks.time.DateTimeUtils.startOfDay +import org.tasks.ui.CheckBoxProvider.Companion.getCheckboxRes +import timber.log.Timber +import java.time.format.FormatStyle +import java.util.Locale +import kotlin.math.max + +internal class TasksWidgetViewFactory( + private val subtasksHelper: SubtasksHelper, + preferences: Preferences, + private val filter: Filter, + private val context: Context, + private val widgetId: Int, + private val taskDao: TaskDao, + private val locale: Locale, + private val chipProvider: WidgetChipProvider, + private val markdown: Markdown, + private val headerFormatter: HeaderFormatter, +) : RemoteViewsFactory { + private val indentPadding = (20 * context.resources.displayMetrics.density).toInt() + private val widgetPreferences = WidgetPreferences(context, preferences, widgetId) + private val settings = widgetPreferences.getWidgetListSettings() + private val hPad = context.resources.getDimension(R.dimen.widget_padding).toInt() + private val disableGroups = !filter.supportsSorting() + || (filter.supportsManualSort() && widgetPreferences.isManualSort) + || (filter is AstridOrderingFilter && widgetPreferences.isAstridSort) + private var tasks = SectionedDataSource() + private val isDark = when (widgetPreferences.themeIndex) { + 0 -> false + 3 -> context.isNightMode + else -> true + } + private val onSurface = context.getColor(if (isDark) R.color.white_87 else R.color.black_87) + private val onSurfaceVariant = context.getColor(if (isDark) R.color.white_60 else R.color.black_60) + + init { + chipProvider.isDark = isDark + } + + override fun onCreate() {} + + override fun onDataSetChanged() { + runBlocking { + val collapsed = widgetPreferences.collapsed + tasks = SectionedDataSource( + taskDao.fetchTasks { getQuery(filter) }, + disableGroups, + settings.groupMode, + widgetPreferences.subtaskMode, + collapsed, + widgetPreferences.completedTasksAtBottom, + ) + collapsed.toMutableSet().let { + if (it.retainAll(tasks.getSectionValues().toSet())) { + widgetPreferences.collapsed = it + } + } + } + } + + override fun onDestroy() {} + + override fun getCount() = tasks.size + + override fun getViewAt(position: Int): RemoteViews? = + if (tasks.isHeader(position)) buildHeader(position) else buildUpdate(position) + + override fun getLoadingView(): RemoteViews = newRemoteView() + + override fun getViewTypeCount(): Int = 2 + + override fun getItemId(position: Int) = getTask(position)?.id ?: 0 + + override fun hasStableIds(): Boolean = true + + private fun newRemoteView() = RemoteViews(BuildConfig.APPLICATION_ID, R.layout.widget_row) + + private fun buildHeader(position: Int): RemoteViews { + val section = tasks.getSection(position) + val sortGroup = section.value + val header: String? = if (filter.supportsSorting()) { + headerFormatter.headerStringBlocking( + value = section.value, + groupMode = settings.groupMode, + alwaysDisplayFullDate = settings.showFullDate, + style = FormatStyle.MEDIUM, + compact = settings.compact, + ) + } else { + null + } + return RemoteViews(BuildConfig.APPLICATION_ID, R.layout.widget_header).apply { + setTextViewText(R.id.header, header) + setImageViewResource( + R.id.arrow, if (section.collapsed) { + R.drawable.ic_keyboard_arrow_down_black_18dp + } else { + R.drawable.ic_keyboard_arrow_up_black_18dp + } + ) + setTextColor( + R.id.header, + section.headerColor( + context, + settings.groupMode, + if (isDark) R.color.white_60 else R.color.black_60 + ) + ) + if (!settings.showDividers) { + setViewVisibility(R.id.divider, View.GONE) + } + setOnClickFillInIntent( + R.id.row, + Intent(WidgetClickActivity.TOGGLE_GROUP) + .putExtra(WidgetClickActivity.EXTRA_WIDGET, widgetId) + .putExtra(WidgetClickActivity.EXTRA_GROUP, sortGroup) + .putExtra(WidgetClickActivity.EXTRA_COLLAPSED, !section.collapsed) + ) + } + } + + private fun buildUpdate(position: Int): RemoteViews? { + return try { + val taskContainer = getTask(position) ?: return null + val task = taskContainer.task + val textColorTitle = when { + task.isHidden -> onSurfaceVariant + task.isCompleted -> onSurfaceVariant + !settings.showDueDates && task.isOverdue -> context.getColor(R.color.overdue) + else -> onSurface + } + newRemoteView().apply { + strikethrough(R.id.widget_text, task.isCompleted) + setTextSize(R.id.widget_text, settings.textSize) + if (settings.showDueDates) { + formatDueDate(this, taskContainer) + } else { + setViewVisibility(R.id.widget_due_bottom, View.GONE) + setViewVisibility(R.id.widget_due_end, View.GONE) + } + if (settings.showFullTaskTitle) { + setMaxLines(R.id.widget_text, Int.MAX_VALUE) + } + setTextViewText( + R.id.widget_text, + markdown.toMarkdown(task.title) + ) + setTextColor(R.id.widget_text, textColorTitle) + if (settings.showDescription && task.hasNotes()) { + setTextSize(R.id.widget_description, settings.textSize) + setTextColor(R.id.widget_description, onSurfaceVariant) + setTextViewText( + R.id.widget_description, + markdown.toMarkdown(task.notes) + ) + setViewVisibility(R.id.widget_description, View.VISIBLE) + if (settings.showFullDescription) { + setMaxLines(R.id.widget_description, Int.MAX_VALUE) + } + } else { + setViewVisibility(R.id.widget_description, View.GONE) + } + setOnClickFillInIntent( + R.id.widget_row, + Intent(WidgetClickActivity.EDIT_TASK) + .putExtra(WidgetClickActivity.EXTRA_FILTER, filter) + .putExtra(WidgetClickActivity.EXTRA_TASK, task) + ) + if (settings.showCheckboxes) { + setViewPadding( + R.id.widget_complete_box, + hPad, + settings.vPad, + hPad, + settings.vPad + ) + setImageViewResource(R.id.widget_complete_box, task.getCheckboxRes()) + setColorFilter(R.id.widget_complete_box, priorityColor(task.priority)) + setOnClickFillInIntent( + R.id.widget_complete_box, + Intent(WidgetClickActivity.COMPLETE_TASK) + .putExtra(WidgetClickActivity.EXTRA_TASK, task) + ) + } else { + setViewPadding(R.id.widget_complete_box, hPad, 0, 0, 0) + setBackgroundResource(R.id.widget_complete_box, 0) + } + setViewPadding(R.id.top_padding, 0, settings.vPad, 0, 0) + setViewPadding(R.id.bottom_padding, 0, settings.vPad, 0, 0) + if (!settings.showDividers) { + setViewVisibility(R.id.divider, View.GONE) + } + removeAllViews(R.id.chips) + if (settings.showSubtaskChips && taskContainer.hasChildren()) { + val chip = chipProvider.getSubtaskChip(taskContainer) + addView(R.id.chips, chip) + setOnClickFillInIntent( + R.id.chip, + Intent(WidgetClickActivity.TOGGLE_SUBTASKS) + .putExtra(WidgetClickActivity.EXTRA_TASK, task) + .putExtra( + WidgetClickActivity.EXTRA_COLLAPSED, + !taskContainer.isCollapsed + ) + ) + } + if (taskContainer.isHidden && settings.showStartChips) { + val sortByDate = settings.groupMode == SortHelper.SORT_START && !disableGroups + chipProvider + .getStartDateChip(taskContainer, settings.showFullDate, sortByDate) + ?.let { addView(R.id.chips, it) } + } + if (taskContainer.hasLocation() && settings.showPlaceChips) { + chipProvider + .getPlaceChip(filter, taskContainer) + ?.let { addView(R.id.chips, it) } + } + if (!taskContainer.hasParent() && settings.showListChips) { + chipProvider + .getListChip(filter, taskContainer) + ?.let { addView(R.id.chips, it) } + } + if (settings.showTagChips && taskContainer.tagsString?.isNotBlank() == true) { + chipProvider + .getTagChips(filter, taskContainer) + .forEach { addView(R.id.chips, it) } + } + val startPad = taskContainer.indent * indentPadding + setViewPadding(R.id.widget_row, startPad, 0, 0, 0) + } + } catch (e: Exception) { + Timber.e(e) + null + } + } + + private fun getTask(position: Int): TaskContainer? = tasks.getItem(position) + + private suspend fun getQuery(filter: Filter): List { + val queries = getQuery(widgetPreferences, filter) + val last = queries.size - 1 + queries[last] = + subtasksHelper.applySubtasksToWidgetFilter(filter, widgetPreferences, queries[last]) + return queries + } + + private fun formatDueDate(row: RemoteViews, task: TaskContainer) = with(row) { + val dueDateRes = if (settings.endDueDate) R.id.widget_due_end else R.id.widget_due_bottom + setViewVisibility( + if (settings.endDueDate) R.id.widget_due_bottom else R.id.widget_due_end, + View.GONE + ) + val hasDueDate = task.hasDueDate() + val endPad = if (hasDueDate && settings.endDueDate) 0 else hPad + setViewPadding(R.id.widget_text, 0, 0, endPad, 0) + if (hasDueDate) { + if (settings.endDueDate) { + setViewPadding(R.id.widget_due_end, hPad, settings.vPad, hPad, settings.vPad) + } + setViewVisibility(dueDateRes, View.VISIBLE) + val text = if ( + settings.groupMode == SortHelper.SORT_DUE && + (task.sortGroup ?: 0L) >= now().startOfDay() && + !disableGroups + ) { + task.takeIf { it.hasDueTime() }?.let { + DateUtilities.getTimeString(context, DateTimeUtils.newDateTime(task.dueDate)) + } + } else { + DateUtilities.getRelativeDateTime( + context, task.dueDate, locale, FormatStyle.MEDIUM, settings.showFullDate, false + ) + } + setTextViewText(dueDateRes, text) + setTextColor( + dueDateRes, + if (task.isOverdue) context.getColor(R.color.overdue) else onSurfaceVariant + ) + setTextSize(dueDateRes, max(10f, settings.textSize - 2)) + setOnClickFillInIntent( + dueDateRes, + Intent(WidgetClickActivity.RESCHEDULE_TASK) + .putExtra(WidgetClickActivity.EXTRA_TASK, task.task) + ) + } else { + setViewVisibility(dueDateRes, View.GONE) + } + } +} + diff --git a/app/src/main/java/org/tasks/widget/ChipProvider.kt b/app/src/main/java/org/tasks/widget/WidgetChipProvider.kt similarity index 59% rename from app/src/main/java/org/tasks/widget/ChipProvider.kt rename to app/src/main/java/org/tasks/widget/WidgetChipProvider.kt index 96e8db0b4..6478b3471 100644 --- a/app/src/main/java/org/tasks/widget/ChipProvider.kt +++ b/app/src/main/java/org/tasks/widget/WidgetChipProvider.kt @@ -2,6 +2,7 @@ package org.tasks.widget import android.content.Context import android.widget.RemoteViews +import androidx.annotation.ColorInt import com.todoroo.andlib.utility.DateUtilities import com.todoroo.astrid.api.CaldavFilter import com.todoroo.astrid.api.Filter @@ -13,6 +14,7 @@ import org.tasks.BuildConfig import org.tasks.R import org.tasks.data.TaskContainer import org.tasks.date.DateTimeUtils.toDateTime +import org.tasks.extensions.setColorFilter import org.tasks.filters.PlaceFilter import org.tasks.themes.CustomIcons import org.tasks.time.DateTimeUtils.startOfDay @@ -21,7 +23,7 @@ import java.time.format.FormatStyle import java.util.Locale import javax.inject.Inject -class ChipProvider @Inject constructor( +class WidgetChipProvider @Inject constructor( @ApplicationContext private val context: Context, private val chipListCache: ChipListCache, private val locale: Locale, @@ -29,51 +31,51 @@ class ChipProvider @Inject constructor( var isDark = false fun getSubtaskChip(task: TaskContainer): RemoteViews { - val chip = newChip() - chip.setTextViewText( + return newChip().apply { + setTextViewText( R.id.chip_text, context - .resources - .getQuantityString(R.plurals.subtask_count, task.children, task.children) - ) - chip.setImageViewResource( + .resources + .getQuantityString(R.plurals.subtask_count, task.children, task.children) + ) + 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.task.hideUntil.startOfDay()) { task.task.hideUntil - .takeIf { Task.hasDueTime(it) } - ?.let { DateUtilities.getTimeString(context, it.toDateTime()) } - ?: return null + .takeIf { Task.hasDueTime(it) } + ?.let { DateUtilities.getTimeString(context, it.toDateTime()) } + ?: return null } else { DateUtilities.getRelativeDateTime( - context, - task.task.hideUntil, - locale, - FormatStyle.MEDIUM, - showFullDate, - false + context, + task.task.hideUntil, + 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 + newChip().apply { + setTextViewText(R.id.chip_text, time) + setImageViewResource(R.id.chip_icon, R.drawable.ic_pending_actions_24px) + } } else { null } } - fun getListChip(filter: Filter?, task: TaskContainer): RemoteViews? { + fun getListChip(filter: Filter, task: TaskContainer): RemoteViews? { return task.caldav ?.takeIf { filter !is CaldavFilter && filter !is GtasksFilter } ?.let { chipListCache.getCaldavList(it) } @@ -85,14 +87,14 @@ class ChipProvider @Inject constructor( } } - fun getPlaceChip(filter: Filter?, task: TaskContainer): RemoteViews? { + 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 { + fun getTagChips(filter: Filter, task: TaskContainer): List { val tags = task.tagsString?.split(",")?.toHashSet() ?: return emptyList() if (filter is TagFilter) { tags.remove(filter.uuid) @@ -100,30 +102,29 @@ class ChipProvider @Inject constructor( return tags .mapNotNull(chipListCache::getTag) .sortedBy(TagFilter::title) - .mapNotNull { newChip(it, R.drawable.ic_outline_label_24px) } + .map { 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.title) - val icon = filter.icon + private fun newChip(filter: Filter, defaultIcon: Int) = + newChip(filter.tint).apply { + setTextViewText(R.id.chip_text, filter.title) + 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) + setImageViewResource(R.id.chip_icon, icon) } - return chip - } - private fun newChip() = RemoteViews( - BuildConfig.APPLICATION_ID, - if (isDark) R.layout.widget_chip_dark else R.layout.widget_chip_light - ) + private fun newChip(@ColorInt color: Int = 0) = RemoteViews(BuildConfig.APPLICATION_ID, R.layout.widget_chip).apply { + val tint = if (color == 0) { + context.getColor( + if (isDark) R.color.icon_tint_dark_alpha else R.color.icon_tint_light_alpha + ) + } else { + color + } + setColorFilter(R.id.chip_icon, tint) + setColorFilter(R.id.chip_background, tint) + setTextColor(R.id.chip_text, tint) + } } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/widget/WidgetClickActivity.kt b/app/src/main/java/org/tasks/widget/WidgetClickActivity.kt index 1878a994e..36efe8988 100644 --- a/app/src/main/java/org/tasks/widget/WidgetClickActivity.kt +++ b/app/src/main/java/org/tasks/widget/WidgetClickActivity.kt @@ -67,7 +67,7 @@ class WidgetClickActivity : AppCompatActivity(), OnDismissHandler { preferences, intent.getIntExtra(EXTRA_WIDGET, -1) ) - val collapsed = widgetPreferences.collapsed + val collapsed = widgetPreferences.collapsed.toMutableSet() val group = intent.getLongExtra(EXTRA_GROUP, -1) if (intent.getBooleanExtra(EXTRA_COLLAPSED, false)) { collapsed.add(group) diff --git a/app/src/main/java/org/tasks/widget/WidgetConfigActivity.kt b/app/src/main/java/org/tasks/widget/WidgetConfigActivity.kt index 3af2b963e..dfefa9627 100644 --- a/app/src/main/java/org/tasks/widget/WidgetConfigActivity.kt +++ b/app/src/main/java/org/tasks/widget/WidgetConfigActivity.kt @@ -6,7 +6,7 @@ import android.os.Bundle import dagger.hilt.android.AndroidEntryPoint import org.tasks.R import org.tasks.preferences.BasePreferences -import org.tasks.preferences.fragments.ScrollableWidget.Companion.newScrollableWidget +import org.tasks.preferences.fragments.WidgetSettings.Companion.newWidgetSettings @AndroidEntryPoint class WidgetConfigActivity : BasePreferences() { @@ -32,5 +32,5 @@ class WidgetConfigActivity : BasePreferences() { override fun getRootTitle() = R.string.widget_settings - override fun getRootPreference() = newScrollableWidget(appWidgetId) + override fun getRootPreference() = newWidgetSettings(appWidgetId) } \ No newline at end of file diff --git a/app/src/main/java/org/tasks/widget/WidgetPreferences.kt b/app/src/main/java/org/tasks/widget/WidgetPreferences.kt index 55d78dd39..e290a68a1 100644 --- a/app/src/main/java/org/tasks/widget/WidgetPreferences.kt +++ b/app/src/main/java/org/tasks/widget/WidgetPreferences.kt @@ -8,6 +8,7 @@ import com.todoroo.astrid.service.Upgrader.Companion.getLegacyColor import org.tasks.R import org.tasks.preferences.Preferences import org.tasks.preferences.QueryPreferences +import org.tasks.tasklist.SectionedDataSource.Companion.HEADER_COMPLETED import timber.log.Timber class WidgetPreferences( @@ -15,65 +16,77 @@ class WidgetPreferences( private val preferences: Preferences, private val widgetId: Int ) : QueryPreferences { - fun showHeader(): Boolean { - return getBoolean(R.string.p_widget_show_header, true) - } - - fun showTitle(): Boolean { - return getBoolean(R.string.p_widget_show_title, true) - } - - fun showCheckboxes(): Boolean { - return getBoolean(R.string.p_widget_show_checkboxes, true) - } - - fun showSettings(): Boolean { - return getBoolean(R.string.p_widget_show_settings, true) - } - - fun showMenu(): Boolean { - return getBoolean(R.string.p_widget_show_menu, true) - } - - fun showFullTaskTitle(): Boolean { - return getBoolean(R.string.p_widget_show_full_task_title, false) - } - - fun showDescription(): Boolean { - return getBoolean(R.string.p_widget_show_description, true) - } - - fun showFullDescription(): Boolean { - return getBoolean(R.string.p_widget_show_full_description, false) - } - - fun showDividers(): Boolean { - return getBoolean(R.string.p_widget_show_dividers, true) - } - - fun showSubtasks(): Boolean { - return getBoolean(R.string.p_widget_show_subtasks, true) - } - - fun showStartDates(): Boolean { - return getBoolean(R.string.p_widget_show_start_dates, true) - } - - fun showPlaces(): Boolean { - return getBoolean(R.string.p_widget_show_places, true) - } - - fun showLists(): Boolean { - return getBoolean(R.string.p_widget_show_lists, true) - } - fun showTags(): Boolean { - return getBoolean(R.string.p_widget_show_tags, true) + data class WidgetHeaderSettings( + val showHeader: Boolean, + val showTitle: Boolean, + val showSettings: Boolean, + val showMenu: Boolean, + val color: Int, + val headerOpacity: Int, + val headerSpacing: Int, + val headerLayout: Int, + ) + + data class WidgetRowSettings( + val showFullTaskTitle: Boolean, + val showCheckboxes: Boolean, + val showDescription: Boolean, + val showFullDescription: Boolean, + val showDividers: Boolean, + val showSubtaskChips: Boolean, + val showStartChips: Boolean, + val showPlaceChips: Boolean, + val showListChips: Boolean, + val showTagChips: Boolean, + val vPad: Int, + val textSize: Float, + val showFullDate: Boolean, + val compact: Boolean, + val groupMode: Int, + val dueDatePosition: Int, + ) { + val showDueDates get() = dueDatePosition != 2 + val endDueDate get() = dueDatePosition != 1 } - val dueDatePosition: Int - get() = getIntegerFromString(R.string.p_widget_due_date_position) - var collapsed: MutableSet + fun getWidgetHeaderSettings() = WidgetHeaderSettings( + showHeader = getBoolean(R.string.p_widget_show_header, true), + showTitle = getBoolean(R.string.p_widget_show_title, true), + showSettings = getBoolean(R.string.p_widget_show_settings, true), + showMenu = getBoolean(R.string.p_widget_show_menu, true), + color = color, + headerOpacity = getAlphaValue(R.string.p_widget_header_opacity), + headerSpacing = getSpacing(R.string.p_widget_header_spacing), + headerLayout = when (getIntegerFromString(R.string.p_widget_header_spacing)) { + 1 -> R.layout.widget_title_compact + 2 -> R.layout.widget_title_none + else -> R.layout.widget_title_default + }, + ) + + fun getWidgetListSettings() = WidgetRowSettings( + showFullTaskTitle = getBoolean(R.string.p_widget_show_full_task_title, false), + showCheckboxes = getBoolean(R.string.p_widget_show_checkboxes, true), + showDescription = getBoolean(R.string.p_widget_show_description, true), + showFullDescription = getBoolean(R.string.p_widget_show_full_description, false), + showDividers = getBoolean(R.string.p_widget_show_dividers, true), + showSubtaskChips = getBoolean(R.string.p_widget_show_subtasks, true), + showStartChips = getBoolean(R.string.p_widget_show_start_dates, true), + showPlaceChips = getBoolean(R.string.p_widget_show_places, true), + showListChips = getBoolean(R.string.p_widget_show_lists, true), + showTagChips = getBoolean(R.string.p_widget_show_tags, true), + vPad = getSpacing(R.string.p_widget_spacing), + textSize = getInt(R.string.p_widget_font_size, 16).toFloat(), + showFullDate = preferences.alwaysDisplayFullDate, + compact = getBoolean(R.string.p_widget_compact, false), + groupMode = groupMode, + dueDatePosition = dueDatePosition, + ) + + val dueDatePosition: Int get() = getIntegerFromString(R.string.p_widget_due_date_position) + + var collapsed: Set get() { val value = getString(R.string.p_widget_collapsed) val collapsed = HashSet() @@ -91,17 +104,6 @@ class WidgetPreferences( set(collapsed) { setString(R.string.p_widget_collapsed, Joiner.on(",").join(collapsed)) } - val widgetSpacing: Int - get() = getSpacing(R.string.p_widget_spacing) - val headerSpacing: Int - get() = getSpacing(R.string.p_widget_header_spacing) - val headerLayout: Int - get() = when (getIntegerFromString(R.string.p_widget_header_spacing)) { - 1 -> R.layout.widget_title_compact - 2 -> R.layout.widget_title_none - else -> R.layout.widget_title_default - } - private fun getSpacing(pref: Int): Int { val spacing = getIntegerFromString(pref) if (spacing == 2) { @@ -111,13 +113,11 @@ class WidgetPreferences( return context.resources.getDimension(dimen).toInt() } - val fontSize: Int - get() = getInt(R.string.p_widget_font_size, 16) val filterId: String? get() = getString(R.string.p_widget_filter) val themeIndex: Int get() = getInt(R.string.p_widget_theme, 3) - var color: Int + val color: Int get() { var color = getInt(R.string.p_widget_color_v2, 0) if (color != 0) { @@ -128,24 +128,14 @@ class WidgetPreferences( setInt(R.string.p_widget_color_v2, color) return color } - set(color) { - setInt(R.string.p_widget_color_v2, color) - } - val headerOpacity: Int - get() = getAlphaValue(R.string.p_widget_header_opacity) + fun setColor(color: Int) { + setInt(R.string.p_widget_color_v2, color) + } val footerOpacity: Int get() = getAlphaValue(R.string.p_widget_footer_opacity) val rowOpacity: Int get() = getAlphaValue(R.string.p_widget_opacity) - fun openOnFooterClick(): Boolean { - return getIntegerFromString(R.string.p_widget_footer_click) == 1 - } - - fun rescheduleOnDueDateClick(): Boolean { - return getIntegerFromString(R.string.p_widget_due_date_click) == 0 - } - private fun getAlphaValue(resId: Int): Int { return (getInt(resId, 100) / 100.0 * 255.0).toInt() } @@ -159,15 +149,13 @@ class WidgetPreferences( } fun setFilter(filterPreferenceValue: String?) { - collapsed = HashSet() + collapsed = setOf(HEADER_COMPLETED) preferences.setString(getKey(R.string.p_widget_filter), filterPreferenceValue) } - var compact: Boolean - get() = getBoolean(R.string.p_widget_compact, false) - set(value) { - setBoolean(R.string.p_widget_compact, value) - } + fun setCompact(compact: Boolean) { + setBoolean(R.string.p_widget_compact, compact) + } private fun getInt(resId: Int, defValue: Int): Int { return preferences.getInt(getKey(resId), defValue) @@ -246,11 +234,8 @@ class WidgetPreferences( get() = getBoolean(R.string.p_widget_show_hidden, true) override val showCompleted: Boolean get() = getBoolean(R.string.p_widget_show_completed, false) - override var alwaysDisplayFullDate: Boolean + override val alwaysDisplayFullDate: Boolean get() = preferences.alwaysDisplayFullDate - set(noWeekday) { - preferences.alwaysDisplayFullDate = noWeekday - } override var completedTasksAtBottom: Boolean get() = preferences.completedTasksAtBottom set(value) { diff --git a/app/src/main/res/drawable/widget_chip_dark_bg.xml b/app/src/main/res/drawable/widget_chip_bg.xml similarity index 100% rename from app/src/main/res/drawable/widget_chip_dark_bg.xml rename to app/src/main/res/drawable/widget_chip_bg.xml diff --git a/app/src/main/res/drawable/widget_chip_light_bg.xml b/app/src/main/res/drawable/widget_chip_light_bg.xml deleted file mode 100644 index 984174650..000000000 --- a/app/src/main/res/drawable/widget_chip_light_bg.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ 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.xml similarity index 96% rename from app/src/main/res/layout/widget_chip_dark.xml rename to app/src/main/res/layout/widget_chip.xml index 3d35b2be2..8115a44dd 100644 --- a/app/src/main/res/layout/widget_chip_dark.xml +++ b/app/src/main/res/layout/widget_chip.xml @@ -39,7 +39,7 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/widget_header_light.xml b/app/src/main/res/layout/widget_header.xml similarity index 100% rename from app/src/main/res/layout/widget_header_light.xml rename to app/src/main/res/layout/widget_header.xml diff --git a/app/src/main/res/layout/widget_header_dark.xml b/app/src/main/res/layout/widget_header_dark.xml deleted file mode 100644 index 5b6d1dea5..000000000 --- a/app/src/main/res/layout/widget_header_dark.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/layout/widget_row_light.xml b/app/src/main/res/layout/widget_row.xml similarity index 100% rename from app/src/main/res/layout/widget_row_light.xml rename to app/src/main/res/layout/widget_row.xml diff --git a/app/src/main/res/layout/widget_row_dark.xml b/app/src/main/res/layout/widget_row_dark.xml deleted file mode 100644 index 2a24f2087..000000000 --- a/app/src/main/res/layout/widget_row_dark.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 47c80f766..bbb78bc4f 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -249,8 +249,6 @@ المستعمل نسخ المهام المختارة؟ حذف المهام المختارة؟ - لا تفعل شيئًا - عند النّقر إعادة التشغيل الآن لا يمكن أن يكون الاسم فارغًا طوّر Tasks @@ -400,7 +398,6 @@ خطأ: %s رابط مخفي - تذييل إظهار الغير مبدوء رمي رمي التغييرات @@ -565,7 +562,6 @@ حزمة الاشعارات استخدم الإعدادات المحلية الافتراضية أزل المهام المتممة؟ - أعد جدولة المهمة مطلوب دعم الأجهزة أعد تشغيل التطبيق ليأخذ هذا التغيير تأثيره قالب الخارطة diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index def83f8c6..e7cbf8d70 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -517,7 +517,6 @@ Синхронизиране посредством отворени стандарти Избор на услуга Вложени задачи не се поддържат от Google Tasks - При докосване Какво е новото Липсва приложение, което да обработи тази заявка Синхронизация, шифрована от край до край @@ -527,14 +526,12 @@ Сега Незапочнати Непрозрачност на реда - Долен колонтитул Под заглавието Утре вечер Утре през нощта Незапочнати Отхвърляне на промените Непрозрачност на заглавката - Пренасрочване на задачата След заглавието Отваряне на списък Адрес @@ -550,7 +547,6 @@ Tasks събира данни за местоположението, за да прави напомняния на тази основа, дори и когато приложението е затворено или не се използва. При започване Тема на картата - Без действие Показване на известия на носимото устройство Цветно колело Докоснете тук, ако имате проблеми с известията diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 608d36024..d212f3903 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -471,11 +471,7 @@ Skrytý Pod názvem Za názvem - Při kliknutí na - Změnit termín úkolu Otevřít seznam - Nic nedělat - Zápatí Zobrazit oddělovače Co je nového Vybrat toto místo diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 6819cc452..69f76aa9a 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -253,11 +253,7 @@ Skjult Under titel Efter titel - Udsæt opgave Åbn liste - Gør ingenting - Ved tryk - Fodbjælke Rækkeindstillinger Topbjælkeindstillinger Widget-indstillinger diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index be6c97e56..cd228fe20 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -463,9 +463,7 @@ Alles auswählen Teilen Erledigt-Schaltfläche ausblenden - Nach Klick Trennlinien anzeigen - Nichts tun Deckkraft der Fußzeile Deckkraft der Zeilen Deckkraft der Kopfleiste @@ -483,8 +481,6 @@ Automatisch schließen wenn aus der Aufgabenbearbeitung gewählt Automatisch schließen wenn aus der Aufgabenliste gewählt Aufgabenliste - Aufgabe verlegen - Fußzeile UND NICHT ODER diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index dfa4f835e..0d3666aba 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -215,7 +215,6 @@ %s forigitaj %s kopitaj Malfermu liston - Faru nenion Agordoj de fenestraĵo Poste Lingvo @@ -581,8 +580,6 @@ Ripetiĝas %1$s ĝis %2$s Komprenite! Ignori avertojn pri savkopioj se vi ne bezonas savkopiojn aŭ jam havas propran savkopian solvon - Piedlinio - Tempe replani taskon Uzi defaŭltan lokaĵaron Eraro: %s Ĉiu de la datumo de ĉi tiu konto foriĝos el via aparato @@ -720,7 +717,6 @@ Ne inkluzivite per \'Elekti propran prezon\' abonoj Sinkronigi kun klientoj de ekstera liveranto kiel Outlook kaj Apple Reminders Dashclock kromprogramo - Post alklaki Sciigo de listo Anoj de la listo Redakti taskon diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2833c7068..576862e47 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -481,8 +481,6 @@ Predefinido Widget ID: %d Lista abierta - No hacer nada - Al pulsar Mostrar menú Oculto Debajo del título @@ -497,8 +495,6 @@ Edición de tareas Cierre automático al seleccionar de la lista de tareas Lista de tareas - Reprogramar tarea - Pie de página NO O Y diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 933100d69..6967aa2e4 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -491,11 +491,7 @@ Ezkutatuta Izenburuaren azpian Izenburua eta gero - Birprogramatu zeregina Ireki zerrenda - Ez egin ezer - Sakatzean - Oina Oinaren opakotasuna Errenkadaren opakotasuna Goiburuaren opakotasuna diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 6461628af..c70e4aab6 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -496,11 +496,7 @@ Piilotettu Otsikon alle Otsikon jälkeen - Uudelleen aikatauluta tehtävä Avaa lista - Älä tee mitään - Klikattaessa - Alatunniste Rivin läpinäkyvyys Ylätunnisteen läpinäkyvyys Muutettu %s diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9a7d3071b..2ddcd5473 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -482,8 +482,6 @@ Identifiant du widget : %d Afficher le menu Ouvrir la liste - Ne rien faire - Lors d\'un appui Masquée Sous le titre Après le titre @@ -497,8 +495,6 @@ Édition de tâche Fermeture automatique lors de la sélection depuis la liste des tâches Liste des tâches - Replanifier la tâche - Pied de page Critères de filtrage NON OU diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index e19dda7c7..4e89b3d70 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -247,7 +247,6 @@ Sen prioridade data de fin Radio - Reprogramar a tarefa Usar predefinido do sistema Engadir conta Erro: %s @@ -400,8 +399,6 @@ Subtarefas Descartar mudanzas Precísase nome de usuario - Co clic - Non facer nada Abrir lista Usuario/a por hora @@ -439,7 +436,6 @@ Sincroniza as tarefas e os calendarios en aplicativos de terceiros para escritorio ou dispositivos móbiles. Preme aquí para máis información Xerar novo contrasinal Acceso ao escritorio - Rodapé por semana Versión %s Google Tasks diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 6ce63a29b..60c93a772 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -351,11 +351,7 @@ Skriveno Ispod naslova Nakon naslova - Promijeni termin zadatka Otvori popis - Nemoj ništa raditi - Pri pritiskanju - Podnožje Postavke redaka Postavke zaglavlja Podrška za hardver je obavezna diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 0eaab6ca0..122956e34 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -467,8 +467,6 @@ Cím alatt Cím után Lista megnyitása - Nincs művelet - Kattintásra Lábléc átlátszóság Sor átlátszóság Fejléc átlátszóság @@ -479,8 +477,6 @@ Feladat szerkesztés Automatikus bezárás a feladat listáról történő választáskor Feladat lista - Task újraütemezése - Lábléc NEM VAGY ÉS diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index ed33cafde..7047f7d44 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -383,9 +383,7 @@ Daftar Notifikasi Tersembunyi Sesudah judul - Jadwalkan ulang tugas Buka daftar - Jangan lakukan apapun Bawaan sistem Pengulangan bawaan Tag bawaan @@ -549,8 +547,6 @@ Ulangi setiap %1$s pada %2$s Notifikasi Bundel Dibawah judul - Pada klik - Tajuk bawah Opasitas tajuk bawah Opasitas baris Opasitas tajuk diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 579fd3547..b1690b64e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -497,11 +497,7 @@ Nascosto Sotto il titolo Dopo il titolo - Pianifica di nuovo l\'attività Apri lista - Non fare nulla - Al clic - Piè di pagina ieri domani oggi diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 61ec2946b..f2eeb1b5b 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -493,11 +493,7 @@ בחירת פלטפורמה נא למלא שם תגית תת־משימות מקוננות אינן נתמכות על ידי Google Tasks - לתזמן משימה מחדש לפתוח רשימה - לא לעשות כלום - בלחיצה - כותרת תחתונה בררת המחדל של המערכת אטימות הכותרת התחתונה אטימות כותרת diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 69b7a38fc..45b4f805e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -416,11 +416,9 @@ 第五週 ヘルプとフィードバック リストをひらく - 何もしない システムデフォルト 行の透明度 フッターの透明度 - フッター ヘッダーの透明度 地図のテーマ デフォルトのタグ @@ -487,7 +485,6 @@ 完全な日付を表示 「マイタスク」「今日」そしてタグにおいて Astrid の手動並べ替えモードを有効にします。この並べ替えモードは将来のアップデートで「マイ設定」に置き換えられる予定です …に着手 - タスクを再計画 @@ -660,7 +657,6 @@ バッテリー最適化を無効にする バックグラウンド時の位置情報 平均以上 - クリック時 着手日時あり チップの外観 ダークテーマの使用時に彩度が下がります diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 5279d785d..faa233b1b 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -494,12 +494,8 @@ 새 할일 숨기기 제목 밑 - 할일 기한 변경 목록 열기 - 아무 동작 하지 않음 - 클릭 시 푸터 불투명도 - 푸터 줄 불투명도 헤더 불투명도 할일 구분선 표시 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index ecb977f94..2d7c6f22a 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -432,7 +432,6 @@ Pagal sukūrimo datą Filtravimo kriterijai Automatiškai uždaryti renkantis iš užduočių sąrašo - Nieko nedaryti Žemiau pavadinimo Po pavadinimo Apatinės antraštės permatomumas @@ -463,7 +462,6 @@ vakar rytoj šiandien - Apatinė antraštė Paslėpta Numatyta Dalintis @@ -569,8 +567,6 @@ Tasks renka vietovės duomenis, kad įgalintų priminimus pagal vietovę, net kai programa uždaryta arba nenaudojama. Pagalba ir atsiliepimai Klaida: %s - Nukelti užduotį - Paspaudus Numatytos etiketės %s m. Antrinės užduotys diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 0d7ddfa65..f780911b1 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -432,8 +432,6 @@ Miniprograms-ID: %d Fargehjul Åpne liste - Ikke gjør noe - Ved klikk Forkast endringer Vis meny Utseende og oppførsel @@ -458,7 +456,6 @@ Skjult Under tittelen Etter tittel - Bunntekst Bunntekst-dekkevne Rad-dekkevne Topptekst-dekkevne @@ -494,7 +491,6 @@ Kun i dag Ende-til-ende-kryptert synkronisering Synkronisering basert på åpne internettstandarder - Endre gjøremålstidspunkt Etter opprettelsestid Gjøremålsliste Lukk automatisk når valgt fra gjøremålsliste diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 2d1ae9641..81cb64454 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -3,6 +3,9 @@ @color/md_background_dark @color/md_background_dark @color/md_background_dark + @color/white_87 + @color/white_60 + @color/md_background_dark @color/icon_tint_dark @color/icon_tint_dark_alpha @color/drawer_background_dark_selected diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ce94a046c..fb4bfbbe0 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -466,8 +466,6 @@ Widget ID: %d Menu tonen Lijst openen - Niets doen - Bij klikken Verborgen Onder titel Na titel @@ -481,8 +479,6 @@ Widget Taken bewerken Takenlijst - Taak opnieuw inplannen - Voettekst NIET OF EN diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index b49622a10..e1e32d920 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -95,7 +95,6 @@ ହାଲୁକା ଗାଢ଼ ଦିନ/ରାତି - କିଛି କରନ୍ତୁନି ତାରିଖ ଓ ସମୟ ସପ୍ତାହ ଆରମ୍ଭ ଉପଭୋକ୍ତା diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 29175d4b2..5ec3e5efa 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -484,11 +484,7 @@ Ukryte Poniżej tytułu Po tytule - Przesuń zadanie Otwórz listę - Nie rób nic - Po kliknięciu - Stopka Nieprzezroczystość stopki Nieprzezroczystość wierszy Nieprzezroczystość nagłówka diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 45edbe23d..fe7478aae 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -454,11 +454,7 @@ Escondido Abaixo do título Depois do título - Reagendar tarefa Abrir a lista - Não fazer nada - Quando clicado - Rodapé Padrão do Sistema Descartar mudanças Etiqueta: \? diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 590153b66..57e02ebaf 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -426,11 +426,7 @@ Editar tarefa Fechar quando escolher da lista de tarefas automaticamente Lista de tarefas - Reagendar tarefa - Rodapé Abrir lista - Não fazer nada - Quando clicado Escondido Abaixo do título Depois do título diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index bff98d767..eca8d8d99 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -159,11 +159,7 @@ Ascuns Sub titlul După titlu - Reprogramează sarcina Listă deschisă - Nu face nimic - La clic - Subsol Setări de rânduri Setări de antet Setări Widget diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 97acafa66..a23617d12 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -490,11 +490,7 @@ Спрятано Под названием После названия - Перенести задачу Открыть список - Ничего не делать - По щелчку - Футер Непрозрачность футера Непрозрачность строки Непрозрачность заголовка diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 6efd6fc3b..9d3990e13 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -37,7 +37,6 @@ සඟවන්න මාතෘකාවට පහළින් මාතෘකාවෙන් පසු - ක්ලික් කරන විට විජට් සැකසුම් සිතියම් තේමාව පෙරනිමි පුනරාවර්තනය @@ -185,10 +184,7 @@ %s මකා දමන ලදි %s පිටපත් කරන ලදි සම්පුර්ණ කරන ලද කාර්යයන් ඉවත් කරනවාද\? - කාර්යය නැවත සකස් කිරීම ලැයිස්තුව විවෘත කරන්න - කිසිවක් නොකරන්න - පාදකය පේළි සැකසුම් ශීර්ෂ සැකසුම් දෘඩාංග සහාය අවශ්‍යයි diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index d59de2bf4..a1ca16c62 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -433,7 +433,6 @@ Hjälp & återkoppling Dold Öppna lista - Gör ingenting Imorgon natt Imorgon kväll Visa meny @@ -591,9 +590,6 @@ Abonnemang Under titeln Efter titeln - Planera om uppgift - När du klickar på - Sidfot Systemets standardinställning Tema för kartor Opacitet för sidfot diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index eb80fc0ba..bf97b5a2a 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -292,11 +292,7 @@ மறைக்கப்பட்டுள்ளது தலைப்புக்கு கீழே தலைப்புக்குப் பிறகு - பணியை மறுபரிசீலனை செய்யுங்கள் திறந்த பட்டியல் - எதுவும் செய்ய வேண்டாம் - கிளிக் செய்தால் - அடிக்குறிப்பு வரிசை அமைப்புகள் தலைப்பு அமைப்புகள் விட்ஜெட் அமைப்புகள் diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 97be9d932..8ded0d0ce 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -279,11 +279,7 @@ ซ่อนเร้น ใต้ชื่อเรื่อง หลังชื่อเรื่อง - กำหนดการงานใหม่ เปิดรายการ - ไม่ต้องทําอะไร - เมื่อคลิก - ส่วนท้าย การตั้งค่าแถว การตั้งค่าส่วนหัว การตั้งค่าวิดเจ็ต diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 93793d7dd..b0705a49b 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -468,21 +468,17 @@ Başlığın altında Başlıktan sonra Listeyi aç - Bir şey yapma - Tıkladığında Alt bölüm opaklığı Satır opaklığı Başlık opaklığı Ayırıcıları göster Menüyü göster Görev düzenleme - Görevi yeniden zamanla Widget\'tan seçerken kendiliğinden kapat Widget Görev düzenlemeden seçerken kendiliğinden kapat Görev listesinden seçerken kendiliğinden kapat Görev listesi - Alt bölüm Geciken Herhangi bitiş tarihi Önemli veya ivedi değil diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0674468c9..54a0a9075 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -575,11 +575,7 @@ Сховано Під назвою Після назви - Перенести завдання Відкрити список - Нічого не робити - Після натискання - Спід Непрозорість споду Непрозорість строки Непрозорість заголовка diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index b9966b54a..247510d43 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -326,7 +326,6 @@ تبدیلیاں مسترد کریں؟ %1$s کو %2$sسے پہلے آنا چاہیے %1$s کو %2$s سے پہلے آنا چایئے - نچلا حصہ قطار کی سیٹنگ ہیڈر کی سیٹنگ ویجٹ سیٹنگ @@ -387,10 +386,7 @@ چھپا ہوا عنوان کے نیچے عنوان کے بعد - ٹاسک ری شیڈیول کریں فہرست کھولیں - کچھ نہ کریں - کلک پر ٹاسک بنائیں آخری پانچواں diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index cd16ee196..11648d688 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -331,11 +331,7 @@ Ẩn Dưới tiêu đề Sau tiêu đề - Lên lịch lại công việc Mở danh sách - Không làm gì cả - Khi nhấn - Chân trang Cài đặt hàng Cài đặt tiêu đề Cài đặt tiện ích diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index c1f6654fb..77cad6846 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -456,8 +456,6 @@ 部件ID:%d 显示菜单 打开列表 - 什么也不做 - 点击时 从小部件中选择时自动关闭 小部件 从任务编辑中选择时自动关闭 @@ -467,8 +465,6 @@ 隐藏 标题下方 标题后 - 重新安排任务 - 页脚 页脚不透明度 行不透明度 标题不透明度 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e086c06a8..d5e40e38d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -436,11 +436,7 @@ 隱藏 標題之下 標題之後 - 重新規劃工作 開啟清單 - 無動作 - 點擊時 - 註腳 行設定 標頭設定 小工具設定 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index cc578b2ee..63fe6467c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -138,6 +138,9 @@ @color/md_background_light @color/md_background_light @color/md_background_light + @color/black_87 + @color/black_60 + @color/md_background_light @color/icon_tint_light @color/icon_tint_light_alpha @color/drawer_background_light_selected diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index fec7214e7..1deb27cec 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -142,26 +142,6 @@ 2 - - @string/widget_do_nothing - @string/widget_open_list - - - - 0 - 1 - - - - @string/widget_due_date_reschedule - @string/widget_do_nothing - - - - 0 - 1 - - 0 1 @@ -362,8 +342,6 @@ widget-show-menu- widget-header-opacity- widget-empty-space-opacity- - widget-empty-space-click- - widget-due-date-click- widget-due-date-position- widget-header-spacing- widget-spacing- diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 555484bb1..c48e87c36 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -399,11 +399,7 @@ File %1$s contained %2$s.\n\n Widget settings Header settings Row settings - Footer - On click - Do nothing Open list - Reschedule task After title Below title Hidden diff --git a/app/src/main/res/xml/preferences_widget.xml b/app/src/main/res/xml/preferences_widget.xml index 0008aea09..46434b0e8 100644 --- a/app/src/main/res/xml/preferences_widget.xml +++ b/app/src/main/res/xml/preferences_widget.xml @@ -180,24 +180,4 @@ - - - - - - - -