[MediaWiki-commits] [Gerrit] apps...wikipedia[master]: Fix possible crash in Gallery.

2017-08-07 Thread jenkins-bot (Code Review)
jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/370245 )

Change subject: Fix possible crash in Gallery.
..


Fix possible crash in Gallery.

This fixes a long-standing TODO in the metadata of gallery items,
that no longer retrieves metadata by reflection, and forces consumers
to use the explicit fields provided by ExtMetadata.

I've actually observed a crash that was caused by the old behavior,
and this patch resolves it.

java.lang.ClassCastException: java.lang.Long cannot be cast to 
org.wikipedia.gallery.ExtMetadata$Values
at org.wikipedia.gallery.ExtMetadata.toMap(ExtMetadata.java:64)
at org.wikipedia.gallery.GalleryItem.(GalleryItem.java:37)

Change-Id: I8e1a44d8ec76edc9be43addf43237dc69633f155
---
M app/src/main/java/org/wikipedia/gallery/ExtMetadata.java
M app/src/main/java/org/wikipedia/gallery/GalleryActivity.java
M app/src/main/java/org/wikipedia/gallery/GalleryItem.java
3 files changed, 28 insertions(+), 41 deletions(-)

Approvals:
  jenkins-bot: Verified
  Mholloway: Looks good to me, approved



diff --git a/app/src/main/java/org/wikipedia/gallery/ExtMetadata.java 
b/app/src/main/java/org/wikipedia/gallery/ExtMetadata.java
index 736c5ba..3d152b7 100644
--- a/app/src/main/java/org/wikipedia/gallery/ExtMetadata.java
+++ b/app/src/main/java/org/wikipedia/gallery/ExtMetadata.java
@@ -5,12 +5,6 @@
 
 import com.google.gson.annotations.SerializedName;
 
-import org.apache.commons.lang3.StringUtils;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
 public class ExtMetadata {
 @SuppressWarnings("unused") @SerializedName("DateTime") @Nullable private 
Values dateTime;
 @SuppressWarnings("unused") @SerializedName("ObjectName") @Nullable 
private Values objectName;
@@ -43,6 +37,22 @@
 return license;
 }
 
+@Nullable public Values imageDescription() {
+return imageDescription;
+}
+
+@Nullable public Values objectName() {
+return objectName;
+}
+
+@Nullable public Values usageTerms() {
+return usageTerms;
+}
+
+@Nullable public Values artist() {
+return artist;
+}
+
 public class Values {
 @SuppressWarnings("unused,NullableProblems") @NonNull private String 
value;
 @SuppressWarnings("unused,NullableProblems") @NonNull private String 
source;
@@ -55,17 +65,5 @@
 @NonNull public String source() {
 return source;
 }
-}
-
-// TODO: Update consumers to use a ExtMetadata object and remove ASAP
-@Deprecated @NonNull Map toMap() throws 
IllegalAccessException {
-HashMap result = new HashMap<>();
-for (Field field : this.getClass().getDeclaredFields()) {
-Values values = (Values) field.get(this);
-if (values != null) {
-result.put(StringUtils.capitalize(field.getName()), 
values.value());
-}
-}
-return result;
 }
 }
diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.java 
b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.java
index 2d7e224..e74d996 100644
--- a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.java
+++ b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.java
@@ -577,10 +577,10 @@
 galleryAdapter.notifyFragments(galleryPager.getCurrentItem());
 
 CharSequence descriptionStr = "";
-if (item.getMetadata().containsKey("ImageDescription")) {
-descriptionStr = 
StringUtil.fromHtml(item.getMetadata().get("ImageDescription"));
-} else if (item.getMetadata().containsKey("ObjectName")) {
-descriptionStr = 
StringUtil.fromHtml(item.getMetadata().get("ObjectName"));
+if (item.getMetadata() != null && 
item.getMetadata().imageDescription() != null) {
+descriptionStr = 
StringUtil.fromHtml(item.getMetadata().imageDescription().value());
+} else if (item.getMetadata() != null && 
item.getMetadata().objectName() != null) {
+descriptionStr = 
StringUtil.fromHtml(item.getMetadata().objectName().value());
 }
 if (descriptionStr.length() > 0) {
 descriptionText.setText(strip(descriptionStr));
@@ -593,7 +593,8 @@
 licenseIcon.setImageResource(getLicenseIcon(item));
 // Set the icon's content description to the UsageTerms property.
 // (if UsageTerms is not present, then default to Fair Use)
-String usageTerms = item.getMetadata().get("UsageTerms");
+String usageTerms = (item.getMetadata() == null || 
item.getMetadata().usageTerms() == null)
+? null : item.getMetadata().usageTerms().value();
 if (TextUtils.isEmpty(usageTerms)) {
 usageTerms = getString(R.string.gallery_fair_use_license);
 }
@@ -602,9 +603,9 @@
 licenseIcon.setTag(item.getLicenseUrl());
 
 String creditStr = "";
-

[MediaWiki-commits] [Gerrit] apps...wikipedia[master]: Fix possible crash in Gallery.

2017-08-04 Thread Dbrant (Code Review)
Dbrant has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/370245 )

Change subject: Fix possible crash in Gallery.
..

Fix possible crash in Gallery.

This fixes a long-standing TODO in the metadata of gallery items,
that no longer retrieves metadata by reflection, and forces consumers
to use the explicit fields provided by ExtMetadata.

I've actually observed a crash that was caused by the old behavior,
and this patch resolves it.

java.lang.ClassCastException: java.lang.Long cannot be cast to 
org.wikipedia.gallery.ExtMetadata$Values
at org.wikipedia.gallery.ExtMetadata.toMap(ExtMetadata.java:64)
at org.wikipedia.gallery.GalleryItem.(GalleryItem.java:37)

Change-Id: I8e1a44d8ec76edc9be43addf43237dc69633f155
---
M app/src/main/java/org/wikipedia/gallery/ExtMetadata.java
M app/src/main/java/org/wikipedia/gallery/GalleryActivity.java
M app/src/main/java/org/wikipedia/gallery/GalleryItem.java
3 files changed, 28 insertions(+), 41 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/45/370245/1

diff --git a/app/src/main/java/org/wikipedia/gallery/ExtMetadata.java 
b/app/src/main/java/org/wikipedia/gallery/ExtMetadata.java
index 736c5ba..3d152b7 100644
--- a/app/src/main/java/org/wikipedia/gallery/ExtMetadata.java
+++ b/app/src/main/java/org/wikipedia/gallery/ExtMetadata.java
@@ -5,12 +5,6 @@
 
 import com.google.gson.annotations.SerializedName;
 
-import org.apache.commons.lang3.StringUtils;
-
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
 public class ExtMetadata {
 @SuppressWarnings("unused") @SerializedName("DateTime") @Nullable private 
Values dateTime;
 @SuppressWarnings("unused") @SerializedName("ObjectName") @Nullable 
private Values objectName;
@@ -43,6 +37,22 @@
 return license;
 }
 
+@Nullable public Values imageDescription() {
+return imageDescription;
+}
+
+@Nullable public Values objectName() {
+return objectName;
+}
+
+@Nullable public Values usageTerms() {
+return usageTerms;
+}
+
+@Nullable public Values artist() {
+return artist;
+}
+
 public class Values {
 @SuppressWarnings("unused,NullableProblems") @NonNull private String 
value;
 @SuppressWarnings("unused,NullableProblems") @NonNull private String 
source;
@@ -55,17 +65,5 @@
 @NonNull public String source() {
 return source;
 }
-}
-
-// TODO: Update consumers to use a ExtMetadata object and remove ASAP
-@Deprecated @NonNull Map toMap() throws 
IllegalAccessException {
-HashMap result = new HashMap<>();
-for (Field field : this.getClass().getDeclaredFields()) {
-Values values = (Values) field.get(this);
-if (values != null) {
-result.put(StringUtils.capitalize(field.getName()), 
values.value());
-}
-}
-return result;
 }
 }
diff --git a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.java 
b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.java
index 2d7e224..e74d996 100644
--- a/app/src/main/java/org/wikipedia/gallery/GalleryActivity.java
+++ b/app/src/main/java/org/wikipedia/gallery/GalleryActivity.java
@@ -577,10 +577,10 @@
 galleryAdapter.notifyFragments(galleryPager.getCurrentItem());
 
 CharSequence descriptionStr = "";
-if (item.getMetadata().containsKey("ImageDescription")) {
-descriptionStr = 
StringUtil.fromHtml(item.getMetadata().get("ImageDescription"));
-} else if (item.getMetadata().containsKey("ObjectName")) {
-descriptionStr = 
StringUtil.fromHtml(item.getMetadata().get("ObjectName"));
+if (item.getMetadata() != null && 
item.getMetadata().imageDescription() != null) {
+descriptionStr = 
StringUtil.fromHtml(item.getMetadata().imageDescription().value());
+} else if (item.getMetadata() != null && 
item.getMetadata().objectName() != null) {
+descriptionStr = 
StringUtil.fromHtml(item.getMetadata().objectName().value());
 }
 if (descriptionStr.length() > 0) {
 descriptionText.setText(strip(descriptionStr));
@@ -593,7 +593,8 @@
 licenseIcon.setImageResource(getLicenseIcon(item));
 // Set the icon's content description to the UsageTerms property.
 // (if UsageTerms is not present, then default to Fair Use)
-String usageTerms = item.getMetadata().get("UsageTerms");
+String usageTerms = (item.getMetadata() == null || 
item.getMetadata().usageTerms() == null)
+? null : item.getMetadata().usageTerms().value();
 if (TextUtils.isEmpty(usageTerms)) {
 usageTerms = getString(R.string.gallery_fair_use_license);
 }
@@ -602,9 +603,9 @@
 licenseIcon.setTag(item.getLicenseUrl());
 
 String creditStr = "";
-