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