diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt index 80c159dad..b8293582a 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt @@ -23,6 +23,7 @@ import android.appwidget.* import android.content.* import org.isoron.androidbase.* import org.isoron.uhabits.core.commands.* +import org.isoron.uhabits.core.preferences.* import org.isoron.uhabits.core.tasks.* import javax.inject.* @@ -34,11 +35,12 @@ class WidgetUpdater @Inject constructor( @AppContext private val context: Context, private val commandRunner: CommandRunner, - private val taskRunner: TaskRunner + private val taskRunner: TaskRunner, + private val widgetPrefs: WidgetPreferences ) : CommandRunner.Listener { override fun onCommandExecuted(command: Command, refreshKey: Long?) { - updateWidgets() + updateWidgets(refreshKey) } /** @@ -58,22 +60,34 @@ class WidgetUpdater commandRunner.removeListener(this) } - fun updateWidgets() { + fun updateWidgets(modifiedHabitId: Long?) { taskRunner.execute { - updateWidgets(CheckmarkWidgetProvider::class.java) - updateWidgets(HistoryWidgetProvider::class.java) - updateWidgets(ScoreWidgetProvider::class.java) - updateWidgets(StreakWidgetProvider::class.java) - updateWidgets(FrequencyWidgetProvider::class.java) + updateWidgets(modifiedHabitId, CheckmarkWidgetProvider::class.java) + updateWidgets(modifiedHabitId, HistoryWidgetProvider::class.java) + updateWidgets(modifiedHabitId, ScoreWidgetProvider::class.java) + updateWidgets(modifiedHabitId, StreakWidgetProvider::class.java) + updateWidgets(modifiedHabitId, FrequencyWidgetProvider::class.java) } } - fun updateWidgets(providerClass: Class<*>) { - val ids = AppWidgetManager.getInstance(context).getAppWidgetIds( + private fun updateWidgets(modifiedHabitId: Long?, providerClass: Class<*>) { + val widgetIds = AppWidgetManager.getInstance(context).getAppWidgetIds( ComponentName(context, providerClass)) + + val modifiedWidgetIds = when (modifiedHabitId) { + null -> widgetIds.toList() + else -> widgetIds.filter { w -> + widgetPrefs.getHabitIdsFromWidgetId(w).contains(modifiedHabitId) + } + } + context.sendBroadcast(Intent(context, providerClass).apply { action = AppWidgetManager.ACTION_APPWIDGET_UPDATE - putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids) + putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, modifiedWidgetIds.toIntArray()) }) } + + fun updateWidgets() { + updateWidgets(null) + } }