jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/404800 )
Change subject: Enforce Unicode NFC when exchanging strings with Reading List service. ...................................................................... Enforce Unicode NFC when exchanging strings with Reading List service. Since we'll be sharing the Reading List service with different platforms, we need to be consistent about the precise encoding and composition of the Unicode strings that represent the list names and article titles stored in them. This patch enforces Unicode Normalization Form C on the names and descriptions of reading list names and article titles when they're communicated back and forth with the Reading List service. Change-Id: Ie4a89cb8a6cc7de1eebe35080c7556615564f8fa --- M app/src/main/java/org/wikipedia/page/PageTitle.java M app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSyncAdapter.java M app/src/main/java/org/wikipedia/readinglist/sync/SyncedReadingLists.java M app/src/main/java/org/wikipedia/util/StringUtil.java 4 files changed, 27 insertions(+), 12 deletions(-) Approvals: jenkins-bot: Verified Cooltey: Looks good to me, approved diff --git a/app/src/main/java/org/wikipedia/page/PageTitle.java b/app/src/main/java/org/wikipedia/page/PageTitle.java index d23dc71..efbc433 100644 --- a/app/src/main/java/org/wikipedia/page/PageTitle.java +++ b/app/src/main/java/org/wikipedia/page/PageTitle.java @@ -320,7 +320,7 @@ PageTitle other = (PageTitle)o; // Not using namespace directly since that can be null - return other.getPrefixedText().equals(getPrefixedText()) && other.wiki.equals(wiki); + return StringUtil.normalizedEquals(other.getPrefixedText(), getPrefixedText()) && other.wiki.equals(wiki); } @Override public int hashCode() { diff --git a/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSyncAdapter.java b/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSyncAdapter.java index eaccd29..090fcab 100644 --- a/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSyncAdapter.java +++ b/app/src/main/java/org/wikipedia/readinglist/sync/ReadingListSyncAdapter.java @@ -23,6 +23,7 @@ import org.wikipedia.settings.Prefs; import org.wikipedia.util.DateUtil; import org.wikipedia.util.ReleaseUtil; +import org.wikipedia.util.StringUtil; import org.wikipedia.util.log.L; import java.text.ParseException; @@ -239,7 +240,7 @@ if (list.remoteId() == remoteList.id()) { localList = list; break; - } else if (list.title().equals(remoteList.name())) { + } else if (StringUtil.normalizedEquals(list.title(), remoteList.name())) { list.remoteId(remoteList.id()); upsertNeeded = true; localList = list; @@ -265,11 +266,11 @@ allLocalLists.add(localList); upsertNeeded = true; } else { - if (!localList.isDefault() && !localList.title().equals(remoteList.name())) { + if (!localList.isDefault() && !StringUtil.normalizedEquals(localList.title(), remoteList.name())) { localList.title(remoteList.name()); upsertNeeded = true; } - if (!localList.isDefault() && !TextUtils.equals(localList.description(), remoteList.description())) { + if (!localList.isDefault() && !StringUtil.normalizedEquals(localList.description(), remoteList.description())) { localList.description(remoteList.description()); upsertNeeded = true; } diff --git a/app/src/main/java/org/wikipedia/readinglist/sync/SyncedReadingLists.java b/app/src/main/java/org/wikipedia/readinglist/sync/SyncedReadingLists.java index a4c51c5..c0e3176 100644 --- a/app/src/main/java/org/wikipedia/readinglist/sync/SyncedReadingLists.java +++ b/app/src/main/java/org/wikipedia/readinglist/sync/SyncedReadingLists.java @@ -9,6 +9,7 @@ import org.wikipedia.dataclient.restbase.page.RbPageSummary; import org.wikipedia.json.annotations.Required; +import java.text.Normalizer; import java.util.List; public class SyncedReadingLists { @@ -48,8 +49,8 @@ public RemoteReadingList() { } public RemoteReadingList(@NonNull String name, @Nullable String description) { - this.name = name; - this.description = description; + this.name = Normalizer.normalize(name, Normalizer.Form.NFC); + this.description = Normalizer.normalize(description, Normalizer.Form.NFC); } public long id() { @@ -57,11 +58,11 @@ } @NonNull public String name() { - return name; + return Normalizer.normalize(name, Normalizer.Form.NFC); } @NonNull public String description() { - return StringUtils.defaultString(description); + return Normalizer.normalize(StringUtils.defaultString(description), Normalizer.Form.NFC); } public boolean isDefault() { @@ -90,8 +91,8 @@ public RemoteReadingListEntry() { } public RemoteReadingListEntry(@NonNull String project, @NonNull String title) { - this.project = project; - this.title = title; + this.project = Normalizer.normalize(project, Normalizer.Form.NFC); + this.title = Normalizer.normalize(title, Normalizer.Form.NFC); } public long id() { @@ -103,11 +104,11 @@ } @NonNull public String project() { - return project; + return Normalizer.normalize(title, Normalizer.Form.NFC); } @NonNull public String title() { - return title; + return Normalizer.normalize(title, Normalizer.Form.NFC); } @NonNull public String updatedDate() { diff --git a/app/src/main/java/org/wikipedia/util/StringUtil.java b/app/src/main/java/org/wikipedia/util/StringUtil.java index 4c8f35a..93d070d 100644 --- a/app/src/main/java/org/wikipedia/util/StringUtil.java +++ b/app/src/main/java/org/wikipedia/util/StringUtil.java @@ -15,6 +15,7 @@ import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.text.Normalizer; import java.util.Arrays; import java.util.List; @@ -117,6 +118,18 @@ .trim(); } + // Compare two strings based on their normalized form, using the Unicode Normalization Form C. + // This should be used when comparing or verifying strings that will be exchanged between + // different platforms (iOS, desktop, etc) that may encode strings using inconsistent + // composition, especially for accents, diacritics, etc. + public static boolean normalizedEquals(@Nullable String str1, @Nullable String str2) { + if (str1 == null || str2 == null) { + return (str1 == null && str2 == null); + } + return Normalizer.normalize(str1, Normalizer.Form.NFC) + .equals(Normalizer.normalize(str2, Normalizer.Form.NFC)); + } + /** * @param source String that may contain HTML tags. * @return returned Spanned string that may contain spans parsed from the HTML source. -- To view, visit https://gerrit.wikimedia.org/r/404800 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ie4a89cb8a6cc7de1eebe35080c7556615564f8fa Gerrit-PatchSet: 1 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Dbrant <dbr...@wikimedia.org> Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org> Gerrit-Reviewer: Cooltey <cf...@wikimedia.org> Gerrit-Reviewer: Sharvaniharan <sha...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits