diff --git a/opentasks/src/main/java/org/dmfs/tasks/actions/UpdateWidgetsAction.java b/opentasks/src/main/java/org/dmfs/tasks/actions/UpdateWidgetsAction.java new file mode 100644 index 000000000..6541b0800 --- /dev/null +++ b/opentasks/src/main/java/org/dmfs/tasks/actions/UpdateWidgetsAction.java @@ -0,0 +1,58 @@ +/* + * Copyright 2020 dmfs GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.dmfs.tasks.actions; + +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.ContentProviderClient; +import android.content.Context; +import android.net.Uri; + +import org.dmfs.android.contentpal.RowDataSnapshot; +import org.dmfs.tasks.contract.TaskContract; +import org.dmfs.tasks.homescreen.TaskListWidgetProvider; +import org.dmfs.tasks.homescreen.TaskListWidgetProviderLarge; +import org.dmfs.tasks.R; + + +/** + * A {@link TaskAction} that updates the widgets. + * + * @author Trogel + */ +public final class UpdateWidgetsAction implements TaskAction +{ + public UpdateWidgetsAction() + { + } + + + @Override + public void execute(Context context, ContentProviderClient contentProviderClient, RowDataSnapshot rowSnapshot, Uri taskUri) + { + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); + notifyTaskListDataChanged(appWidgetManager, new ComponentName(context, TaskListWidgetProvider.class)); + notifyTaskListDataChanged(appWidgetManager, new ComponentName(context, TaskListWidgetProviderLarge.class)); + } + + + private void notifyTaskListDataChanged(AppWidgetManager appWidgetManager, ComponentName componentName) + { + final int[] appWidgetIds = appWidgetManager.getAppWidgetIds(componentName); + appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.task_list_widget_lv); + } +} diff --git a/opentasks/src/main/java/org/dmfs/tasks/homescreen/TaskListWidgetUpdaterService.java b/opentasks/src/main/java/org/dmfs/tasks/homescreen/TaskListWidgetUpdaterService.java index 323675984..0e90d7c0e 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/homescreen/TaskListWidgetUpdaterService.java +++ b/opentasks/src/main/java/org/dmfs/tasks/homescreen/TaskListWidgetUpdaterService.java @@ -233,7 +233,7 @@ public RemoteViews getViewAt(int position) row.setTextViewText(android.R.id.text1, mDueDateFormatter.format(dueDate, DateFormatContext.WIDGET_VIEW)); // highlight overdue dates & times - if ((!dueDate.allDay && dueDate.before(mNow) || dueDate.allDay + if ((!dueDate.allDay && Time.compare(dueDate, mNow) <= 0 || dueDate.allDay && (dueDate.year < mNow.year || dueDate.yearDay <= mNow.yearDay && dueDate.year == mNow.year)) && !items[position].getIsClosed()) { diff --git a/opentasks/src/main/java/org/dmfs/tasks/notification/ActionService.java b/opentasks/src/main/java/org/dmfs/tasks/notification/ActionService.java index 8972b62a1..76b570820 100644 --- a/opentasks/src/main/java/org/dmfs/tasks/notification/ActionService.java +++ b/opentasks/src/main/java/org/dmfs/tasks/notification/ActionService.java @@ -53,6 +53,7 @@ import org.dmfs.tasks.actions.PostUndoAction; import org.dmfs.tasks.actions.RemoveNotificationAction; import org.dmfs.tasks.actions.TaskAction; +import org.dmfs.tasks.actions.UpdateWidgetsAction; import org.dmfs.tasks.actions.WipeNotificationAction; import org.dmfs.tasks.contract.TaskContract; @@ -180,8 +181,10 @@ private TaskAction resolveAction(String action) case TaskContract.ACTION_BROADCAST_TASK_DUE: case TaskContract.ACTION_BROADCAST_TASK_STARTING: - // post start and due notification on the due date channel - return new NotifyStickyAction(data -> CHANNEL_DUE_DATES, true); + return new Composite( + // post start and due notification on the due date channel + new NotifyStickyAction(data -> CHANNEL_DUE_DATES, true), + new UpdateWidgetsAction()); case ACTION_UNDO_COMPLETE: return new Composite(