Dbrant has uploaded a new change for review. (
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(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/00/404800/1
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: newchange
Gerrit-Change-Id: Ie4a89cb8a6cc7de1eebe35080c7556615564f8fa
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits