Skip to content

Commit d2d7a30

Browse files
committed
possible fix crashes on Jamo characters in Korean search queries
1 parent 6f60be2 commit d2d7a30

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import androidx.annotation.Nullable;
4646

4747
import java.text.Bidi;
48+
import java.text.Normalizer;
4849
import java.util.ArrayList;
4950
import java.util.Collections;
5051
import java.util.List;
@@ -987,6 +988,17 @@ public static String removePunctuationToLowercase(@Nullable CharSequence origina
987988
.toLowerCase(BaseSettings.REVANCED_LANGUAGE.get().getLocale());
988989
}
989990

991+
/**
992+
* Normalizes text for search: Unicode Unicode NFD decomposition, removes diacritics, and converts to lowercase.
993+
* Ensures correct matching for Korean (jamo), Japanese, Vietnamese, Arabic, etc.
994+
*/
995+
public static String normalizeTextToLowercase(CharSequence original) {
996+
if (original == null) return "";
997+
String normalized = Normalizer.normalize(original.toString(), Normalizer.Form.NFD);
998+
return normalized.replaceAll("\\p{M}", "")
999+
.toLowerCase(BaseSettings.REVANCED_LANGUAGE.get().getLocale());
1000+
}
1001+
9901002
/**
9911003
* Sort a PreferenceGroup and all it's sub groups by title or key.
9921004
* <p>

extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,10 +227,14 @@ private String buildSearchableText(Preference pref) {
227227
return searchBuilder.toString();
228228
}
229229

230+
/**
231+
* Appends normalized searchable text to the builder.
232+
* Uses full Unicode normalization for accurate search across all languages.
233+
*/
230234
private void appendText(StringBuilder builder, CharSequence text) {
231235
if (!TextUtils.isEmpty(text)) {
232236
if (builder.length() > 0) builder.append(" ");
233-
builder.append(Utils.removePunctuationToLowercase(text));
237+
builder.append(Utils.normalizeTextToLowercase(text));
234238
}
235239
}
236240

@@ -275,7 +279,7 @@ public CharSequence getCurrentEffectiveSummary() {
275279
*/
276280
@Override
277281
boolean matchesQuery(String query) {
278-
return searchableText.contains(Utils.removePunctuationToLowercase(query));
282+
return searchableText.contains(Utils.normalizeTextToLowercase(query));
279283
}
280284

281285
/**

extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ protected void filterAndShowResults(String query) {
450450

451451
filteredSearchItems.clear();
452452

453-
String queryLower = Utils.removePunctuationToLowercase(query);
453+
String queryLower = Utils.normalizeTextToLowercase(query);
454454
Pattern queryPattern = Pattern.compile(Pattern.quote(queryLower), Pattern.CASE_INSENSITIVE);
455455

456456
// Clear highlighting only for items that were previously visible.

0 commit comments

Comments
 (0)