From 9637472badd09ad4d2165facbf1c38f6ad925afe Mon Sep 17 00:00:00 2001 From: Aldana Belen Rodriguez Date: Mon, 28 Sep 2026 17:56:31 +0200 Subject: [PATCH] Show reply context in Android alerts --- .../ichi2/anki/ankiquest/AnkiquestNotifier.kt | 8 ++++++-- AnkiDroid/src/main/res/values-de/ankiquest.xml | 1 + AnkiDroid/src/main/res/values-es/ankiquest.xml | 1 + AnkiDroid/src/main/res/values-fr/ankiquest.xml | 1 + AnkiDroid/src/main/res/values-pt/ankiquest.xml | 1 + AnkiDroid/src/main/res/values/ankiquest.xml | 1 + .../anki/ankiquest/AnkiquestNotifierTest.kt | 17 +++++++++++++++++ 7 files changed, 28 insertions(+), 2 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/ankiquest/AnkiquestNotifier.kt b/AnkiDroid/src/main/java/com/ichi2/anki/ankiquest/AnkiquestNotifier.kt index ad77a8f9da1c..5f99039d5ba2 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/ankiquest/AnkiquestNotifier.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/ankiquest/AnkiquestNotifier.kt @@ -71,13 +71,17 @@ object AnkiquestNotifier { val tag = 5_140_000 + (id % 1_000_000).toInt() val title = entry.getString("title") val body = entry.getString("body") + val shownBody = + entry.optJSONObject("reply_to")?.optString("body")?.takeIf { it.isNotBlank() }?.let { original -> + AnkiquestLanguage.context(context).getString(R.string.ankiquest_reply_context, body, original) + } ?: body val answerable = entry.optString("sender").isNotEmpty() && !entry.optBoolean("replied") if (fresh && notify( context, tag, title, - body, + shownBody, notificationIntent(context, entry, account), if (answerable) { AnkiquestReply.actions( @@ -85,7 +89,7 @@ object AnkiquestNotifier { id, tag, title, - body, + shownBody, account, scope, entry.optString("kind", "completion"), diff --git a/AnkiDroid/src/main/res/values-de/ankiquest.xml b/AnkiDroid/src/main/res/values-de/ankiquest.xml index 640def4aa3f9..9d6ff39ef845 100644 --- a/AnkiDroid/src/main/res/values-de/ankiquest.xml +++ b/AnkiDroid/src/main/res/values-de/ankiquest.xml @@ -18,6 +18,7 @@ Wähle mindestens eine Person oder schalte das Teilen aus. @string/save Antwort + %1$s\n\nAls Antwort auf: %2$s Anstupser Benachrichtige mich, wenn ein Platz, mein bester Tag oder die nächste Stufe in Reichweite ist Erfolge feiern diff --git a/AnkiDroid/src/main/res/values-es/ankiquest.xml b/AnkiDroid/src/main/res/values-es/ankiquest.xml index 9ae1cb674c49..e841f9d8ea51 100644 --- a/AnkiDroid/src/main/res/values-es/ankiquest.xml +++ b/AnkiDroid/src/main/res/values-es/ankiquest.xml @@ -25,6 +25,7 @@ Selecciona al menos una persona o desactiva el envío. Guardar Responder + %1$s\n\nEn respuesta a: %2$s Toques Avísame cuando pueda alcanzar un puesto, mi mejor día o el siguiente nivel Celebraciones diff --git a/AnkiDroid/src/main/res/values-fr/ankiquest.xml b/AnkiDroid/src/main/res/values-fr/ankiquest.xml index 08f088e9deef..ecae0564f09b 100644 --- a/AnkiDroid/src/main/res/values-fr/ankiquest.xml +++ b/AnkiDroid/src/main/res/values-fr/ankiquest.xml @@ -18,6 +18,7 @@ Choisis au moins une personne ou désactive le partage. @string/save Réponse + %1$s\n\nEn réponse à : %2$s Coups de pouce Préviens-moi quand une place, mon meilleur jour ou le prochain niveau est à portée Célébrations diff --git a/AnkiDroid/src/main/res/values-pt/ankiquest.xml b/AnkiDroid/src/main/res/values-pt/ankiquest.xml index fd4eafe09f30..aa1265a1d3cb 100644 --- a/AnkiDroid/src/main/res/values-pt/ankiquest.xml +++ b/AnkiDroid/src/main/res/values-pt/ankiquest.xml @@ -18,6 +18,7 @@ Escolhe pelo menos uma pessoa ou desativa a partilha. @string/save Responder + %1$s\n\nEm resposta a: %2$s Lembretes Avisa-me quando uma posição, o meu melhor dia ou o próximo nível estiver ao alcance Celebrações diff --git a/AnkiDroid/src/main/res/values/ankiquest.xml b/AnkiDroid/src/main/res/values/ankiquest.xml index d457c1d16794..3a29171d42c5 100644 --- a/AnkiDroid/src/main/res/values/ankiquest.xml +++ b/AnkiDroid/src/main/res/values/ankiquest.xml @@ -23,6 +23,7 @@ Select at least one person, or switch sharing off. @string/save Reply + %1$s\n\nIn reply to: %2$s ankiquestNudges Nudges Tell me when a place, my best day or the next level is within reach diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/ankiquest/AnkiquestNotifierTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/ankiquest/AnkiquestNotifierTest.kt index e3bf80246ecd..9b017c0c4da6 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/ankiquest/AnkiquestNotifierTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/ankiquest/AnkiquestNotifierTest.kt @@ -34,6 +34,23 @@ import kotlin.test.assertTrue @RunWith(AndroidJUnit4::class) @Config(sdk = [32]) class AnkiquestNotifierTest : RobolectricTest() { + @Test + fun `a reply alert shows the message it answers`() { + val manager = targetContext.getSystemService()!! + val account = replyAccount() + val reply = + message(1, 30) + .put("sender", "cerro") + .put("kind", "reply") + .put("body", "Good job!") + .put("reply_to", JSONObject().put("title", "Deck complete").put("body", "Cerro finished Spanish.")) + AnkiquestNotifier.onDeckCompletions(targetContext, account.notificationAccount, JSONArray().put(reply), account.scope) + val posted = shadowOf(manager).getNotification(5_140_001) + val shown = posted.extras.getCharSequence(Notification.EXTRA_BIG_TEXT).toString() + assertTrue(shown.contains("Cerro finished Spanish.")) + assertTrue(shown.contains("Good job!")) + } + @Test fun `Spanish contextual replies follow the Anki language and retain notification kind`() { val manager = targetContext.getSystemService()!!