From 11f726064ab03d9e4cb255f86b5ed6bb7a3cf2ec Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 8 Sep 2022 20:35:59 -0500 Subject: [PATCH] StackWidget: Avoid storing RemoteViews reference --- .../uhabits/widgets/StackWidgetService.kt | 44 +++++++++---------- 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.kt index c8eabcc1c..91663671e 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.kt @@ -88,8 +88,26 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int } override fun getViewAt(position: Int): RemoteViews? { - Log.i("StackRemoteViewsFactory", "getViewAt $position") - return if (0 <= position && position < remoteViews.size) remoteViews[position] else null + Log.i("StackRemoteViewsFactory", "getViewAt $position started") + if (position < 0 || position >= remoteViews.size) return null + val app = context.applicationContext as HabitsApplication + val prefs = app.component.preferences + val habitList = app.component.habitList + val options = AppWidgetManager.getInstance(context).getAppWidgetOptions(widgetId) + if (Looper.myLooper() == null) Looper.prepare() + val habits = habitIds.map { habitList.getById(it) ?: throw HabitNotFoundException() } + val h = habits[position] + val widget = constructWidget(h, prefs) + widget.setDimensions(getDimensionsFromOptions(context, options)) + val landscapeViews = widget.landscapeRemoteViews + val portraitViews = widget.portraitRemoteViews + val factory = PendingIntentFactory(context, IntentFactory()) + val intent = StackWidgetType.getIntentFillIn(factory, widgetType, h, habits, getToday()) + landscapeViews.setOnClickFillInIntent(R.id.button, intent) + portraitViews.setOnClickFillInIntent(R.id.button, intent) + val remoteViews = RemoteViews(landscapeViews, portraitViews) + Log.i("StackRemoteViewsFactory", "getViewAt $position ended") + return remoteViews } private fun constructWidget( @@ -134,28 +152,6 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int } override fun onDataSetChanged() { - Log.i("StackRemoteViewsFactory", "onDataSetChanged started") - val app = context.applicationContext as HabitsApplication - val prefs = app.component.preferences - val habitList = app.component.habitList - val options = AppWidgetManager.getInstance(context).getAppWidgetOptions(widgetId) - val newRemoteViews = ArrayList() - if (Looper.myLooper() == null) Looper.prepare() - val habits = habitIds.map { habitList.getById(it) ?: throw HabitNotFoundException() } - for (h in habits) { - val widget = constructWidget(h, prefs) - widget.setDimensions(getDimensionsFromOptions(context, options)) - val landscapeViews = widget.landscapeRemoteViews - val portraitViews = widget.portraitRemoteViews - val factory = PendingIntentFactory(context, IntentFactory()) - val intent = StackWidgetType.getIntentFillIn(factory, widgetType, h, habits, getToday()) - landscapeViews.setOnClickFillInIntent(R.id.button, intent) - portraitViews.setOnClickFillInIntent(R.id.button, intent) - newRemoteViews.add(RemoteViews(landscapeViews, portraitViews)) - Log.i("StackRemoteViewsFactory", "onDataSetChanged constructed widget ${h.id}") - } - remoteViews = newRemoteViews - Log.i("StackRemoteViewsFactory", "onDataSetChanged ended") } init {