From ce2a9c1c3ad8cfc8006e4dce71b7014147095df7 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Mon, 15 Jun 2026 15:57:22 +0800 Subject: [PATCH 1/3] fix(search): restore mao validation behavior --- .../one/mixin/android/extension/StringExtension.kt | 10 ++++------ .../one/mixin/android/ui/search/SearchFragment.kt | 2 +- .../mixin/android/extension/StringExtensionTest.kt | 11 +++++++++++ .../one/mixin/android/ui/search/SearchFragmentTest.kt | 11 +++++++++++ 4 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 app/src/test/java/one/mixin/android/ui/search/SearchFragmentTest.kt diff --git a/app/src/main/java/one/mixin/android/extension/StringExtension.kt b/app/src/main/java/one/mixin/android/extension/StringExtension.kt index 73d82d72cf..253032f065 100644 --- a/app/src/main/java/one/mixin/android/extension/StringExtension.kt +++ b/app/src/main/java/one/mixin/android/extension/StringExtension.kt @@ -835,12 +835,10 @@ fun BigDecimal.currencyFormat(): String { fun String?.isValidMao(): Boolean { if (this.isNullOrBlank()) return false - val text = this.lowercase() - val regex = Regex("^[^\\sA-Z]{1,128}\\.mao$") - if (!regex.matches(text)) return false - val name = text.removeSuffix(".mao") - if (name.isBlank() || name.all { it.isDigit() }) return false - return true + val text = this.trimEnd('.').lowercase() + if (text.all { it.isDigit() }) return false + val regex = Regex("^[^\\sA-Z]{1,128}$") + return regex.matches(text) } fun String.isMao(): Boolean { diff --git a/app/src/main/java/one/mixin/android/ui/search/SearchFragment.kt b/app/src/main/java/one/mixin/android/ui/search/SearchFragment.kt index 483c49aa6e..5fdf572f19 100644 --- a/app/src/main/java/one/mixin/android/ui/search/SearchFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/search/SearchFragment.kt @@ -69,7 +69,7 @@ class SearchFragment : BaseFragment(R.layout.fragment_search) { companion object { const val TAG = "SearchFragment" - const val SEARCH_DEBOUNCE = 300L + const val SEARCH_DEBOUNCE = 500L } private var keyword: String? = null diff --git a/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt b/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt index ba013bdc27..714c15b918 100644 --- a/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt +++ b/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt @@ -129,6 +129,17 @@ class StringExtensionTest { assertEquals("", s2.filterNonAscii()) } + @Test + fun isValidMaoAllowsSearchBeforeMaoSuffix() { + assertTrue("alice".isValidMao()) + assertTrue("alice.".isValidMao()) + assertTrue("alice.mao".isValidMao()) + assertFalse("123".isValidMao()) + assertFalse("has space".isValidMao()) + assertFalse("".isValidMao()) + assertFalse(null.isValidMao()) + } + @Test fun maxLimit() { var str = diff --git a/app/src/test/java/one/mixin/android/ui/search/SearchFragmentTest.kt b/app/src/test/java/one/mixin/android/ui/search/SearchFragmentTest.kt new file mode 100644 index 0000000000..34029d28bd --- /dev/null +++ b/app/src/test/java/one/mixin/android/ui/search/SearchFragmentTest.kt @@ -0,0 +1,11 @@ +package one.mixin.android.ui.search + +import kotlin.test.Test +import kotlin.test.assertEquals + +class SearchFragmentTest { + @Test + fun searchDebounceIsHalfSecond() { + assertEquals(500L, SearchFragment.SEARCH_DEBOUNCE) + } +} From 0b32844b08b424f59d656ed050dd573971ee15d8 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Mon, 15 Jun 2026 15:57:22 +0800 Subject: [PATCH 2/3] fix(search): restore mao validation behavior --- .../one/mixin/android/extension/StringExtension.kt | 10 ++++------ .../one/mixin/android/ui/search/SearchFragment.kt | 2 +- .../mixin/android/extension/StringExtensionTest.kt | 11 +++++++++++ .../one/mixin/android/ui/search/SearchFragmentTest.kt | 11 +++++++++++ 4 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 app/src/test/java/one/mixin/android/ui/search/SearchFragmentTest.kt diff --git a/app/src/main/java/one/mixin/android/extension/StringExtension.kt b/app/src/main/java/one/mixin/android/extension/StringExtension.kt index 843ec52312..dbdd0d6ce3 100644 --- a/app/src/main/java/one/mixin/android/extension/StringExtension.kt +++ b/app/src/main/java/one/mixin/android/extension/StringExtension.kt @@ -848,12 +848,10 @@ fun BigDecimal.currencyFormat(): String { fun String?.isValidMao(): Boolean { if (this.isNullOrBlank()) return false - val text = this.lowercase() - val regex = Regex("^[^\\sA-Z]{1,128}\\.mao$") - if (!regex.matches(text)) return false - val name = text.removeSuffix(".mao") - if (name.isBlank() || name.all { it.isDigit() }) return false - return true + val text = this.trimEnd('.').lowercase() + if (text.all { it.isDigit() }) return false + val regex = Regex("^[^\\sA-Z]{1,128}$") + return regex.matches(text) } fun String.isMao(): Boolean { diff --git a/app/src/main/java/one/mixin/android/ui/search/SearchFragment.kt b/app/src/main/java/one/mixin/android/ui/search/SearchFragment.kt index 483c49aa6e..5fdf572f19 100644 --- a/app/src/main/java/one/mixin/android/ui/search/SearchFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/search/SearchFragment.kt @@ -69,7 +69,7 @@ class SearchFragment : BaseFragment(R.layout.fragment_search) { companion object { const val TAG = "SearchFragment" - const val SEARCH_DEBOUNCE = 300L + const val SEARCH_DEBOUNCE = 500L } private var keyword: String? = null diff --git a/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt b/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt index 2eb3d753e8..508c114bd4 100644 --- a/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt +++ b/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt @@ -142,6 +142,17 @@ class StringExtensionTest { assertEquals("", s2.filterNonAscii()) } + @Test + fun isValidMaoAllowsSearchBeforeMaoSuffix() { + assertTrue("alice".isValidMao()) + assertTrue("alice.".isValidMao()) + assertTrue("alice.mao".isValidMao()) + assertFalse("123".isValidMao()) + assertFalse("has space".isValidMao()) + assertFalse("".isValidMao()) + assertFalse(null.isValidMao()) + } + @Test fun maxLimit() { var str = diff --git a/app/src/test/java/one/mixin/android/ui/search/SearchFragmentTest.kt b/app/src/test/java/one/mixin/android/ui/search/SearchFragmentTest.kt new file mode 100644 index 0000000000..34029d28bd --- /dev/null +++ b/app/src/test/java/one/mixin/android/ui/search/SearchFragmentTest.kt @@ -0,0 +1,11 @@ +package one.mixin.android.ui.search + +import kotlin.test.Test +import kotlin.test.assertEquals + +class SearchFragmentTest { + @Test + fun searchDebounceIsHalfSecond() { + assertEquals(500L, SearchFragment.SEARCH_DEBOUNCE) + } +} From 1809833fb3b9e291d0ba231a2b226646ca5cc8d0 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Mon, 22 Jun 2026 17:16:55 +0800 Subject: [PATCH 3/3] test(search): cover mao suffix validation --- .../test/java/one/mixin/android/extension/StringExtensionTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt b/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt index 508c114bd4..751ca9ad85 100644 --- a/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt +++ b/app/src/test/java/one/mixin/android/extension/StringExtensionTest.kt @@ -147,6 +147,7 @@ class StringExtensionTest { assertTrue("alice".isValidMao()) assertTrue("alice.".isValidMao()) assertTrue("alice.mao".isValidMao()) + assertTrue("xin.mao".isValidMao()) assertFalse("123".isValidMao()) assertFalse("has space".isValidMao()) assertFalse("".isValidMao())