From e48726783a2346ff3f7f14d64224ca72915efbd8 Mon Sep 17 00:00:00 2001 From: Saptak Manna Date: Sun, 26 Jan 2025 11:34:13 +0530 Subject: [PATCH] Update layout constraints for gesture display images --- AnkiDroid/src/main/assets/scripts/js-api.js | 13 ++++- .../java/com/ichi2/anki/AnkiDroidJsAPI.kt | 8 ++- .../main/res/layout/activity_shared_decks.xml | 2 +- .../src/main/res/layout/gesture_display.xml | 51 ++++++++++++------- .../java/com/ichi2/anki/AnkiDroidJsAPITest.kt | 42 +++++++++++++++ .../java/com/ichi2/testutils/TestClass.kt | 7 +++ 6 files changed, 102 insertions(+), 21 deletions(-) diff --git a/AnkiDroid/src/main/assets/scripts/js-api.js b/AnkiDroid/src/main/assets/scripts/js-api.js index 20108069bad0..c6dd3fbbc073 100644 --- a/AnkiDroid/src/main/assets/scripts/js-api.js +++ b/AnkiDroid/src/main/assets/scripts/js-api.js @@ -121,7 +121,7 @@ class AnkiDroidJS { Object.keys(jsApiList).forEach(method => { if (method === "ankiAddTagToNote") { AnkiDroidJS.prototype[method] = async function (noteId, tag) { - console.warn("ankiAddTagToNote is deprecated. Use ankiSetNoteTags instead."); + console.warn("ankiAddTagToNote is deprecated. Use ankiSetNoteTags instead"); const endpoint = jsApiList[method]; const data = JSON.stringify({ noteId, tag }); return await this.handleRequest(endpoint, data); @@ -130,6 +130,17 @@ Object.keys(jsApiList).forEach(method => { } if (method === "ankiSetNoteTags") { AnkiDroidJS.prototype[method] = async function (noteId, tags) { + let hasSpaces = false; + for (let i = 0; i < tags.length; i++) { + tags[i] = tags[i].trim(); + if (tags[i].includes(" ") || tags[i].includes("\u3000")) { + tags[i] = tags[i].replace(" ", "_").replace("\u3000", "_"); + hasSpaces = true; + } + } + if (hasSpaces) { + console.warn("Spaces in tags have been converted to underscores"); + } const endpoint = jsApiList[method]; const data = JSON.stringify({ noteId, tags }); return await this.handleRequest(endpoint, data); diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPI.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPI.kt index 8cb61eab5728..8a8fe531da01 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPI.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AnkiDroidJsAPI.kt @@ -206,6 +206,7 @@ open class AnkiDroidJsAPI( * @param returnDefaultValues `true` if default values should be returned (if non-[Reviewer]) * @return */ + @NeedsTest("setNoteTags: Test that tags are set for all edge cases") open suspend fun handleJsApiRequest( methodName: String, bytes: ByteArray, @@ -383,7 +384,12 @@ open class AnkiDroidJsAPI( val tags = jsonObject.getJSONArray("tags") withCol { fun Note.setTagsFromList(tagList: List) { - val tagsAsString = this@withCol.tags.join(tagList) + val sanitizedTags = tagList.map { it.trim() } + val spaces = "\\s|\u3000".toRegex() + if (sanitizedTags.any { it.contains(spaces) }) { + throw IllegalArgumentException("Tags cannot contain spaces") + } + val tagsAsString = this@withCol.tags.join(sanitizedTags) setTagsFromStr(this@withCol, tagsAsString) } diff --git a/AnkiDroid/src/main/res/layout/activity_shared_decks.xml b/AnkiDroid/src/main/res/layout/activity_shared_decks.xml index de0bb9c718a3..a283c196dbc4 100644 --- a/AnkiDroid/src/main/res/layout/activity_shared_decks.xml +++ b/AnkiDroid/src/main/res/layout/activity_shared_decks.xml @@ -17,7 +17,7 @@ android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:theme="@style/ActionBarStyle" - android:background="?attr/colorPrimary" + android:background="?attr/appBarColor" app:popupTheme="@style/ActionBar.Popup" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/AnkiDroid/src/main/res/layout/gesture_display.xml b/AnkiDroid/src/main/res/layout/gesture_display.xml index 6a30a8c2e719..3c755642175c 100644 --- a/AnkiDroid/src/main/res/layout/gesture_display.xml +++ b/AnkiDroid/src/main/res/layout/gesture_display.xml @@ -25,15 +25,18 @@ @@ -41,17 +44,22 @@ + app:layout_constraintHorizontal_bias="0.953" + app:layout_constraintVertical_bias="0.047" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> ): JSONObject = + JSONObject().apply { + for ((key, value) in pairs) { + put(key, value) + } + } diff --git a/AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt b/AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt index 011237a9a934..f794d1342745 100644 --- a/AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt +++ b/AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt @@ -241,6 +241,13 @@ interface TestClass { col.decks.save(deckConfig) } + /** Helper method to update a note */ + fun Note.update(block: Note.() -> Unit): Note { + block(this) + col.updateNote(this) + return this + } + /** Helper method to all cards of a note */ fun Note.updateCards(update: Card.() -> Unit): Note { cards().forEach { it.update(update) }