diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialog.kt
index 1891cdf07e15..f1116393097c 100644
--- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialog.kt
+++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/tags/TagsDialog.kt
@@ -22,6 +22,7 @@ import androidx.core.content.ContextCompat
import androidx.core.os.BundleCompat
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
+import androidx.core.widget.doAfterTextChanged
import androidx.fragment.app.viewModels
import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
@@ -389,13 +390,58 @@ class TagsDialog : AnalyticsDialogFragment {
addTag(input.toString())
d?.dismiss()
}
+
val inputET = addTagDialog.getInputField()
+
inputET.filters = arrayOf(addTagFilter)
+
if (!prefixTag.isNullOrEmpty()) {
// utilize the addTagFilter to append '::' properly by appending a space to prefixTag
inputET.setText("$prefixTag ")
}
+
inputET.moveCursorToEnd()
+
+ val positiveButton =
+ addTagDialog.getButton(AlertDialog.BUTTON_POSITIVE)
+
+ positiveButton.isEnabled = false
+
+ val textInputLayout =
+ inputET.parent?.parent
+ as? com.google.android.material.textfield.TextInputLayout
+
+ inputET.doAfterTextChanged { text ->
+
+ val rawTag = text?.toString()?.trim()
+
+ if (rawTag.isNullOrEmpty()) {
+ textInputLayout?.error = null
+ positiveButton.isEnabled = false
+ return@doAfterTextChanged
+ }
+
+ lifecycleScope.launch {
+ val tags = viewModel.tags.await()
+
+ val normalized =
+ TagsUtil.getUniformedTag(rawTag)
+
+ val exists =
+ tags.contains(normalized)
+
+ if (exists) {
+ textInputLayout?.error =
+ getString(R.string.tag_already_exists)
+
+ positiveButton.isEnabled = false
+ } else {
+ textInputLayout?.error = null
+
+ positiveButton.isEnabled = true
+ }
+ }
+ }
addTagDialog.show()
}
diff --git a/AnkiDroid/src/main/res/values/02-strings.xml b/AnkiDroid/src/main/res/values/02-strings.xml
index 8c8882821128..5f6a13d1506f 100644
--- a/AnkiDroid/src/main/res/values/02-strings.xml
+++ b/AnkiDroid/src/main/res/values/02-strings.xml
@@ -190,6 +190,7 @@
This is a special deck for studying outside of the normal schedule. Cards will be automatically returned to their original decks after you review them. Deleting this deck from the deck list will return all remaining cards to their original deck.
Touch “%2$s” to confirm adding “%1$s”
Existing tag “%1$s” selected
+ Tag already exists