From e5a4dab791e4e6f9840703df2cc6241df2a28714 Mon Sep 17 00:00:00 2001 From: "Jan C. Borchardt" <925062+jancborchardt@users.noreply.github.com> Date: Fri, 22 May 2026 23:18:11 +0200 Subject: [PATCH] fix: show correct placeholder states in single-note widget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three distinct states are now handled correctly: - Startup / system update: the widget shows "Loading note…" while the RemoteViewsAdapter connects. updateAppWidget() sets the placeholder visible with that text on every full reset (ACTION_APPWIDGET_UPDATE). - Note refresh (edit or sync): updateSingleNoteWidgets() now sends a custom ACTION_DATA_CHANGED instead of ACTION_APPWIDGET_UPDATE. onReceive() handles this with notifyAppWidgetViewDataChanged() only, leaving the existing RemoteViews intact so the note content updates in place with no blank gap or flash. - Note missing: once onDataSetChanged() confirms getNoteById() returns null, partiallyUpdateAppWidget() sets the placeholder visible with "Note not found". When the note is found the placeholder is hidden via the same mechanism. Fixes https://github.com/nextcloud/notes-android/issues/1611 AI-assisted: Claude Code (Sonnet 4.6) Signed-off-by: Jan C. Borchardt <925062+jancborchardt@users.noreply.github.com> --- .../widget/singlenote/SingleNoteWidget.kt | 21 ++++++++++++------- .../singlenote/SingleNoteWidgetFactory.java | 9 +++++++- .../main/res/layout/widget_single_note.xml | 5 +++-- app/src/main/res/values/strings.xml | 3 ++- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidget.kt b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidget.kt index 3c7c87e19..38a92d555 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidget.kt +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidget.kt @@ -12,6 +12,7 @@ import android.appwidget.AppWidgetProvider import android.content.ComponentName import android.content.Context import android.content.Intent +import android.view.View import android.widget.RemoteViews import androidx.core.net.toUri import it.niedermann.owncloud.notes.R @@ -35,10 +36,16 @@ class SingleNoteWidget : AppWidgetProvider() { override fun onReceive(context: Context, intent: Intent?) { super.onReceive(context, intent) val awm = AppWidgetManager.getInstance(context) - val provider = ComponentName(context, SingleNoteWidget::class.java) val appWidgetIds = awm.getAppWidgetIds(provider) - updateAppWidget(context, awm, appWidgetIds) + + if (intent?.action == ACTION_DATA_CHANGED) { + appWidgetIds.forEach { appWidgetId -> + awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.single_note_widget_lv) + } + } else { + updateAppWidget(context, awm, appWidgetIds) + } } override fun onDeleted(context: Context, appWidgetIds: IntArray) { @@ -104,19 +111,19 @@ class SingleNoteWidget : AppWidgetProvider() { R.layout.widget_single_note ).apply { setPendingIntentTemplate(R.id.single_note_widget_lv, pendingIntent) - setEmptyView( - R.id.single_note_widget_lv, - R.id.widget_single_note_placeholder_tv - ) setRemoteAdapter(R.id.single_note_widget_lv, serviceIntent) + setViewVisibility(R.id.widget_single_note_placeholder_tv, View.VISIBLE) + setTextViewText(R.id.widget_single_note_placeholder_tv, context.getString(R.string.widget_single_note_loading)) } } companion object { + private const val ACTION_DATA_CHANGED = "it.niedermann.owncloud.notes.ACTION_WIDGET_DATA_CHANGED" + @JvmStatic fun updateSingleNoteWidgets(context: Context) { val intent = Intent(context, SingleNoteWidget::class.java).apply { - setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE) + action = ACTION_DATA_CHANGED } context.sendBroadcast(intent) } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java index d588d121d..44c0ae4d2 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java @@ -10,6 +10,7 @@ import android.content.Context; import android.content.Intent; import android.util.Log; +import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService; @@ -53,9 +54,16 @@ public void onDataSetChanged() { Log.v(TAG, "Fetch note with id " + noteId); note = repo.getNoteById(noteId); + final var views = new RemoteViews(context.getPackageName(), R.layout.widget_single_note); if (note == null) { Log.e(TAG, "Error: note not found"); + views.setViewVisibility(R.id.widget_single_note_placeholder_tv, View.VISIBLE); + views.setTextViewText(R.id.widget_single_note_placeholder_tv, + context.getString(R.string.widget_single_note_note_not_found)); + } else { + views.setViewVisibility(R.id.widget_single_note_placeholder_tv, View.GONE); } + AppWidgetManager.getInstance(context).partiallyUpdateAppWidget(appWidgetId, views); } else { Log.w(TAG, "Widget with ID " + appWidgetId + " seems to be not configured yet."); } @@ -110,7 +118,6 @@ public RemoteViews getViewAt(int position) { } - // TODO Set loading view @Override public RemoteViews getLoadingView() { return null; diff --git a/app/src/main/res/layout/widget_single_note.xml b/app/src/main/res/layout/widget_single_note.xml index 582f37042..0e185bee7 100644 --- a/app/src/main/res/layout/widget_single_note.xml +++ b/app/src/main/res/layout/widget_single_note.xml @@ -25,8 +25,9 @@ android:layout_height="match_parent" android:gravity="center" android:padding="@dimen/spacer_1x" - android:text="@string/widget_single_note_placeholder_tv" + android:text="@string/widget_single_note_note_not_found" android:textAlignment="center" - android:textColor="@color/widget_foreground" /> + android:textColor="@color/widget_foreground" + android:visibility="gone" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1d0c39640..af545a805 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -241,7 +241,8 @@ Note list No notes Single note - Note not found + Loading note… + Note not found Please login to Notes before using this widget Star icon is used to denote an item as a favorite