jenkins-bot has submitted this change and it was merged.
Change subject: Add Today's Featured Article card
......................................................................
Add Today's Featured Article card
This card adds a feed card for Today's Featured Article, and in doing so
adds some additional components:
* A BigPictureCard and associated View and layout files; and
* An aggregated feed endpoint client.
Bug: T129079
Change-Id: I7e4ac7b2f2e81f8cdf40f9649daecb08db0cdfc1
Depends-On: I4ae8e6bbaeb221872b1bc1d07be92f33002ff606
---
M app/src/main/java/org/wikipedia/Constants.java
M app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
A app/src/main/java/org/wikipedia/feed/UtcDate.java
A app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContent.java
A
app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
A app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCard.java
A app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCardView.java
A app/src/main/java/org/wikipedia/feed/model/BigPictureCard.java
M app/src/main/java/org/wikipedia/feed/model/Card.java
A app/src/main/java/org/wikipedia/feed/model/CardPageItem.java
A app/src/main/java/org/wikipedia/feed/model/Thumbnail.java
M app/src/main/java/org/wikipedia/feed/mostread/MostReadArticle.java
M app/src/main/java/org/wikipedia/feed/mostread/MostReadItemCard.java
A app/src/main/java/org/wikipedia/feed/view/BigPictureCardView.java
A app/src/main/java/org/wikipedia/feed/view/FeaturedCardFooterView.java
M app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java
M app/src/main/java/org/wikipedia/util/DateUtil.java
A app/src/main/res/drawable/ic_bookmark_gray_24dp.xml
A app/src/main/res/drawable/ic_share_gray_24dp.xml
A app/src/main/res/layout/view_big_picture_card.xml
A app/src/main/res/layout/view_card_featured_footer.xml
M app/src/main/res/values/strings.xml
M app/src/main/res/values/strings_no_translate.xml
M app/src/test/java/org/wikipedia/feed/mostread/MostReadArticleTest.java
M app/src/test/res/raw/most_read.json
25 files changed, 662 insertions(+), 115 deletions(-)
Approvals:
Dbrant: Looks good to me, approved
jenkins-bot: Verified
diff --git a/app/src/main/java/org/wikipedia/Constants.java
b/app/src/main/java/org/wikipedia/Constants.java
index 0b87dee..b60ad20 100644
--- a/app/src/main/java/org/wikipedia/Constants.java
+++ b/app/src/main/java/org/wikipedia/Constants.java
@@ -13,6 +13,8 @@
public static final int SUGGESTION_REQUEST_ITEMS = 5;
public static final int PREFERRED_THUMB_SIZE = 320;
+ public static final String PREFERRED_THUMBNAIL_KEY
+ = Integer.toString(Constants.PREFERRED_THUMB_SIZE);
private Constants() { }
}
diff --git a/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
b/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
index 33ad66e..2f0f7aa 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
@@ -3,6 +3,7 @@
import android.content.Context;
import android.support.annotation.NonNull;
+import org.wikipedia.feed.aggregated.AggregatedFeedContentClient;
import org.wikipedia.feed.becauseyouread.BecauseYouReadClient;
import org.wikipedia.feed.continuereading.ContinueReadingClient;
import org.wikipedia.feed.demo.IntegerListClient;
@@ -25,6 +26,7 @@
addPendingClient(new BecauseYouReadClient());
addPendingClient(new ContinueReadingClient());
+ addPendingClient(new AggregatedFeedContentClient());
addPendingClient(new IntegerListClient());
addPendingClient(new MostReadClient());
diff --git a/app/src/main/java/org/wikipedia/feed/UtcDate.java
b/app/src/main/java/org/wikipedia/feed/UtcDate.java
new file mode 100644
index 0000000..3a6bfea
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/UtcDate.java
@@ -0,0 +1,49 @@
+package org.wikipedia.feed;
+
+import android.support.annotation.NonNull;
+
+import java.util.Calendar;
+
+import static java.util.TimeZone.getTimeZone;
+
+public class UtcDate {
+ @NonNull private Calendar cal;
+ @NonNull private String year;
+ @NonNull private String month;
+ @NonNull private String date;
+
+ public UtcDate(int age) {
+ this.cal = Calendar.getInstance(getTimeZone("UTC"));
+ cal.add(Calendar.DATE, -age);
+ this.year = Integer.toString(cal.get(Calendar.YEAR));
+ this.month = pad(Integer.toString(cal.get(Calendar.MONTH) + 1));
+ this.date = pad(Integer.toString(cal.get(Calendar.DATE)));
+ }
+
+ @NonNull
+ public Calendar baseCalendar() {
+ return cal;
+ }
+
+ @NonNull
+ public String year() {
+ return year;
+ }
+
+ @NonNull
+ public String month() {
+ return month;
+ }
+
+ @NonNull
+ public String date() {
+ return date;
+ }
+
+ private String pad(String value) {
+ if (value.length() == 1) {
+ return "0" + value;
+ }
+ return value;
+ }
+}
diff --git
a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContent.java
b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContent.java
new file mode 100644
index 0000000..831a0f9
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContent.java
@@ -0,0 +1,24 @@
+package org.wikipedia.feed.aggregated;
+
+import android.support.annotation.NonNull;
+
+import org.wikipedia.feed.model.CardPageItem;
+import org.wikipedia.feed.mostread.MostReadArticles;
+
+public class AggregatedFeedContent {
+ @SuppressWarnings("NullableProblems") @NonNull private CardPageItem tfa;
+ @SuppressWarnings("NullableProblems") @NonNull private MostReadArticles
mostread;
+ @SuppressWarnings("NullableProblems") @NonNull private CardPageItem random;
+ // Note: the below just have placeholder strings for now
+ @SuppressWarnings("NullableProblems") @NonNull private String news;
+ @SuppressWarnings("NullableProblems") @NonNull private String image;
+ @SuppressWarnings("NullableProblems") @NonNull private String video;
+
+ public CardPageItem tfa() {
+ return tfa;
+ }
+
+ public MostReadArticles mostRead() {
+ return mostread;
+ }
+}
diff --git
a/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
new file mode 100644
index 0000000..9cf62a8
--- /dev/null
+++
b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
@@ -0,0 +1,92 @@
+package org.wikipedia.feed.aggregated;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import org.wikipedia.Site;
+import org.wikipedia.dataclient.retrofit.RetrofitFactory;
+import org.wikipedia.feed.UtcDate;
+import org.wikipedia.feed.FeedClient;
+import org.wikipedia.feed.featured.FeaturedArticleCard;
+import org.wikipedia.feed.model.Card;
+import org.wikipedia.settings.Prefs;
+import org.wikipedia.util.DateUtil;
+import org.wikipedia.util.log.L;
+
+import java.util.Collections;
+import java.util.Locale;
+
+import retrofit2.Call;
+import retrofit2.Response;
+import retrofit2.Retrofit;
+import retrofit2.http.GET;
+import retrofit2.http.Path;
+
+public class AggregatedFeedContentClient implements FeedClient {
+
+ @Nullable private Call<AggregatedFeedContent> call;
+ @Nullable private static UtcDate DATE;
+
+ @Override
+ public void request(@NonNull Context context, @NonNull Site site, int age,
@NonNull Callback cb) {
+ cancel();
+ DATE = DateUtil.getUtcRequestDateFor(age);
+ // TODO: Use app retrofit, etc., when feed endpoints are deployed to
production
+ Retrofit retrofit = RetrofitFactory.newInstance(site,
+ String.format(Locale.ROOT, Prefs.getRestbaseUriFormat(),
"http", site.authority()));
+ AggregatedFeedContentClient.Service service =
retrofit.create(Service.class);
+ call = service.get(DATE.year(), DATE.month(), DATE.date());
+ call.enqueue(new CallbackAdapter(cb));
+ }
+
+ @Override
+ public void cancel() {
+ if (call == null) {
+ return;
+ }
+ call.cancel();
+ call = null;
+ }
+
+ private interface Service {
+
+ /**
+ * Gets aggregated content for the feed for the date provided.
+ *
+ * @param year four-digit year
+ * @param month two-digit month
+ * @param day two-digit day
+ */
+ @NonNull
+ @GET("feed/featured/{year}/{month}/{day}")
+ Call<AggregatedFeedContent> get(@Path("year") String year,
+ @Path("month") String month,
+ @Path("day") String day);
+ }
+
+ private static class CallbackAdapter implements
retrofit2.Callback<AggregatedFeedContent> {
+ @NonNull private final Callback cb;
+
+ CallbackAdapter(@NonNull Callback cb) {
+ this.cb = cb;
+ }
+
+ @Override public void onResponse(Call<AggregatedFeedContent> call,
+ Response<AggregatedFeedContent>
response) {
+ if (response.isSuccessful()) {
+ AggregatedFeedContent content = response.body();
+ FeaturedArticleCard tfaCard = new
FeaturedArticleCard(content.tfa(), DATE);
+ //MostReadCard mostReadCard = new
MostReadCard(content.mostRead());
+ cb.success(Collections.singletonList((Card) tfaCard));
+ } else {
+ L.v(response.message());
+ }
+ }
+
+ @Override public void onFailure(Call<AggregatedFeedContent> call,
Throwable caught) {
+ L.v(caught);
+ cb.error(caught);
+ }
+ }
+}
diff --git
a/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCard.java
b/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCard.java
new file mode 100644
index 0000000..1d45fd9
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCard.java
@@ -0,0 +1,22 @@
+package org.wikipedia.feed.featured;
+
+import android.support.annotation.NonNull;
+
+import org.wikipedia.R;
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.feed.UtcDate;
+import org.wikipedia.feed.model.BigPictureCard;
+import org.wikipedia.feed.model.CardPageItem;
+
+public class FeaturedArticleCard extends BigPictureCard {
+
+ public FeaturedArticleCard(@NonNull CardPageItem page, @NonNull UtcDate
date) {
+ super(page, date);
+ }
+
+ @Override
+ @NonNull
+ public String title() {
+ return
WikipediaApp.getInstance().getString(R.string.view_featured_article_card_title);
+ }
+}
diff --git
a/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCardView.java
b/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCardView.java
new file mode 100644
index 0000000..1b7e03c
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCardView.java
@@ -0,0 +1,42 @@
+package org.wikipedia.feed.featured;
+
+import android.content.Context;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+
+import org.wikipedia.feed.view.BigPictureCardView;
+import org.wikipedia.feed.view.CardHeaderView;
+import org.wikipedia.feed.view.FeaturedCardFooterView;
+
+public class FeaturedArticleCardView extends BigPictureCardView {
+
+ public FeaturedArticleCardView(Context context) {
+ super(context);
+ }
+
+ public void set(@NonNull FeaturedArticleCard card) {
+ String articleTitle = card.articleTitle();
+ String articleSubtitle = card.articleSubtitle();
+ String extract = card.extract();
+ Uri imageUri = card.image();
+
+ articleTitle(articleTitle);
+ articleSubtitle(articleSubtitle);
+ extract(extract);
+ image(imageUri);
+
+ header(card);
+ footer();
+ }
+
+ private void header(@NonNull FeaturedArticleCard card) {
+ CardHeaderView header = new CardHeaderView(getContext())
+ .setTitle(card.title())
+ .setSubtitle(card.subtitle());
+ header(header);
+ }
+
+ private void footer() {
+ footer(new FeaturedCardFooterView(getContext()));
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/feed/model/BigPictureCard.java
b/app/src/main/java/org/wikipedia/feed/model/BigPictureCard.java
new file mode 100644
index 0000000..f9bc6b3
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/model/BigPictureCard.java
@@ -0,0 +1,54 @@
+package org.wikipedia.feed.model;
+
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import org.wikipedia.feed.UtcDate;
+import org.wikipedia.util.DateUtil;
+import org.wikipedia.util.StringUtil;
+
+public abstract class BigPictureCard extends Card {
+ @NonNull private String articleTitle;
+ @Nullable private String articleSubtitle;
+ @Nullable private String extract;
+ @Nullable private Uri image;
+ @NonNull private UtcDate age;
+
+ public BigPictureCard(@NonNull CardPageItem page, @NonNull UtcDate age) {
+ this.articleTitle = page.title();
+ this.articleSubtitle = page.description() != null
+ ? StringUtil.capitalizeFirstChar(page.description()) : null;
+ this.image = page.thumbnail();
+ this.extract = page.extract();
+ this.age = age;
+ }
+
+ @Override
+ @NonNull
+ public String subtitle() {
+ return DateUtil.getFeedCardDateString(age.baseCalendar());
+ }
+
+ @NonNull
+ public String articleTitle() {
+ return articleTitle;
+ }
+
+ @Nullable
+ public String articleSubtitle() {
+ return articleSubtitle;
+ }
+
+ @Override
+ @Nullable
+ public Uri image() {
+ return image;
+ }
+
+ @Nullable
+ @Override
+ public String extract() {
+ return extract;
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/feed/model/Card.java
b/app/src/main/java/org/wikipedia/feed/model/Card.java
index 69431dd..aeb2a2f 100644
--- a/app/src/main/java/org/wikipedia/feed/model/Card.java
+++ b/app/src/main/java/org/wikipedia/feed/model/Card.java
@@ -20,4 +20,8 @@
@Nullable public String footer() {
return null;
}
+
+ @Nullable public String extract() {
+ return null;
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/org/wikipedia/feed/model/CardPageItem.java
b/app/src/main/java/org/wikipedia/feed/model/CardPageItem.java
new file mode 100644
index 0000000..608949a
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/model/CardPageItem.java
@@ -0,0 +1,32 @@
+package org.wikipedia.feed.model;
+
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+public class CardPageItem {
+ @SuppressWarnings("NullableProblems") @NonNull private String title;
+ @Nullable private Thumbnail thumbnail;
+ @Nullable private String description;
+ @Nullable private String extract;
+
+ @NonNull
+ public String title() {
+ return title;
+ }
+
+ @Nullable
+ public Uri thumbnail() {
+ return thumbnail != null ? Uri.parse(thumbnail.source()) : null;
+ }
+
+ @Nullable
+ public String description() {
+ return description;
+ }
+
+ @Nullable
+ public String extract() {
+ return extract;
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/feed/model/Thumbnail.java
b/app/src/main/java/org/wikipedia/feed/model/Thumbnail.java
new file mode 100644
index 0000000..fd79399
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/model/Thumbnail.java
@@ -0,0 +1,22 @@
+package org.wikipedia.feed.model;
+
+import android.support.annotation.NonNull;
+
+public class Thumbnail {
+ @SuppressWarnings("NullableProblems") @NonNull private String source;
+ private int height;
+ private int width;
+
+ @NonNull
+ public String source() {
+ return source;
+ }
+
+ public int height() {
+ return height;
+ }
+
+ public int width() {
+ return width;
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/feed/mostread/MostReadArticle.java
b/app/src/main/java/org/wikipedia/feed/mostread/MostReadArticle.java
index 8d04262..e51faac 100644
--- a/app/src/main/java/org/wikipedia/feed/mostread/MostReadArticle.java
+++ b/app/src/main/java/org/wikipedia/feed/mostread/MostReadArticle.java
@@ -6,15 +6,14 @@
import com.google.gson.annotations.SerializedName;
-import java.util.Collections;
-import java.util.Map;
+import org.wikipedia.feed.model.Thumbnail;
public final class MostReadArticle {
@SerializedName("normalizedtitle") @SuppressWarnings("NullableProblems")
@NonNull private String normalizedTitle;
@SuppressWarnings("NullableProblems") @NonNull private String title;
@Nullable private String description;
@SerializedName("pageid") private int pageId;
- @SerializedName("thumbnail") @SuppressWarnings("NullableProblems")
@NonNull private Map<Integer, Uri> thumbnails;
+ @SerializedName("thumbnail") @Nullable private Thumbnail thumbnail;
private int rank;
private int views;
@@ -34,8 +33,8 @@
return pageId;
}
- public Map<Integer, Uri> thumbnails() {
- return thumbnails;
+ public Uri thumbnail() {
+ return thumbnail != null ? Uri.parse(thumbnail.source()) : null;
}
public int rank() {
@@ -44,12 +43,5 @@
public int views() {
return views;
- }
-
- private MostReadArticle() {
- //noinspection ConstantConditions
- if (thumbnails == null) {
- thumbnails = Collections.emptyMap();
- }
}
}
diff --git
a/app/src/main/java/org/wikipedia/feed/mostread/MostReadItemCard.java
b/app/src/main/java/org/wikipedia/feed/mostread/MostReadItemCard.java
index c966acd..f404c8d 100644
--- a/app/src/main/java/org/wikipedia/feed/mostread/MostReadItemCard.java
+++ b/app/src/main/java/org/wikipedia/feed/mostread/MostReadItemCard.java
@@ -4,9 +4,7 @@
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import org.wikipedia.Constants;
import org.wikipedia.feed.model.Card;
-import org.wikipedia.util.log.L;
public class MostReadItemCard extends Card {
@NonNull private final MostReadArticle article;
@@ -24,7 +22,6 @@
}
@Nullable @Override public Uri image() {
- L.d(article.thumbnails().toString());
- return article.thumbnails().get(Constants.PREFERRED_THUMB_SIZE);
+ return article.thumbnail();
}
}
\ No newline at end of file
diff --git a/app/src/main/java/org/wikipedia/feed/view/BigPictureCardView.java
b/app/src/main/java/org/wikipedia/feed/view/BigPictureCardView.java
new file mode 100644
index 0000000..c582f4a
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/view/BigPictureCardView.java
@@ -0,0 +1,61 @@
+package org.wikipedia.feed.view;
+
+import android.content.Context;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.CardView;
+import android.view.View;
+import android.widget.TextView;
+
+import com.facebook.drawee.view.SimpleDraweeView;
+
+import org.wikipedia.R;
+import org.wikipedia.views.ViewUtil;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class BigPictureCardView extends CardView {
+ @BindView(R.id.view_big_picture_card_header) View headerView;
+ @BindView(R.id.view_big_picture_card_footer) View footerView;
+ @BindView(R.id.view_big_picture_card_image) SimpleDraweeView imageView;
+ @BindView(R.id.view_big_picture_card_article_title) TextView
articleTitleView;
+ @BindView(R.id.view_big_picture_card_article_subtitle) TextView
articleSubtitleView;
+ @BindView(R.id.view_big_picture_card_extract) TextView extractView;
+
+ public BigPictureCardView(@NonNull Context context) {
+ super(context);
+ inflate(getContext(), R.layout.view_big_picture_card, this);
+ ButterKnife.bind(this);
+ }
+
+ protected void articleTitle(@NonNull String articleTitle) {
+ articleTitleView.setText(articleTitle);
+ }
+
+ protected void articleSubtitle(@Nullable String articleSubtitle) {
+ articleSubtitleView.setText(articleSubtitle);
+ if (articleSubtitle != null) {
+ articleSubtitleView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ protected void image(@Nullable Uri uri) {
+ imageView.setImageURI(uri);
+ }
+
+ protected void extract(@Nullable String extract) {
+ extractView.setText(extract);
+ }
+
+ protected void header(@NonNull View view) {
+ ViewUtil.replace(headerView, view);
+ headerView = view;
+ }
+
+ protected void footer(@NonNull View view) {
+ ViewUtil.replace(footerView, view);
+ footerView = view;
+ }
+}
diff --git
a/app/src/main/java/org/wikipedia/feed/view/FeaturedCardFooterView.java
b/app/src/main/java/org/wikipedia/feed/view/FeaturedCardFooterView.java
new file mode 100644
index 0000000..603a302
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/view/FeaturedCardFooterView.java
@@ -0,0 +1,13 @@
+package org.wikipedia.feed.view;
+
+import android.content.Context;
+import android.widget.RelativeLayout;
+
+import org.wikipedia.R;
+
+public class FeaturedCardFooterView extends RelativeLayout {
+ public FeaturedCardFooterView(Context context) {
+ super(context);
+ inflate(getContext(), R.layout.view_card_featured_footer, this);
+ }
+}
diff --git a/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java
b/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java
index bdc84d8..af266db 100644
--- a/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java
+++ b/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java
@@ -13,6 +13,8 @@
import org.wikipedia.feed.continuereading.ContinueReadingCardView;
import org.wikipedia.feed.demo.IntegerListCard;
import org.wikipedia.feed.demo.IntegerListCardView;
+import org.wikipedia.feed.featured.FeaturedArticleCard;
+import org.wikipedia.feed.featured.FeaturedArticleCardView;
import org.wikipedia.feed.model.Card;
import org.wikipedia.feed.mostread.MostReadCardView;
import org.wikipedia.feed.mostread.MostReadListCard;
@@ -28,6 +30,7 @@
private static final int VIEW_TYPE_CONTINUE_READING = 1;
private static final int VIEW_TYPE_BECAUSE_YOU_READ = 2;
private static final int VIEW_TYPE_MOST_READ = 3;
+ private static final int VIEW_TYPE_FEATURED_ARTICLE = 4;
private static final int VIEW_TYPE_INTEGER_LIST = 100;
@Nullable private FeedViewCallback callback;
@@ -61,6 +64,8 @@
((SearchCardView) view).set((SearchCard) item);
} else if (view instanceof MostReadCardView) {
((MostReadCardView) view).set((MostReadListCard) item);
+ } else if (view instanceof FeaturedArticleCardView) {
+ ((FeaturedArticleCardView) view).set((FeaturedArticleCard) item);
} else {
throw new IllegalStateException("Unknown type=" + view.getClass());
}
@@ -78,6 +83,8 @@
return VIEW_TYPE_SEARCH_BAR;
} else if (item instanceof MostReadListCard) {
return VIEW_TYPE_MOST_READ;
+ } else if (item instanceof FeaturedArticleCard) {
+ return VIEW_TYPE_FEATURED_ARTICLE;
} else {
throw new IllegalStateException("Unknown type=" + item.getClass());
}
@@ -95,6 +102,8 @@
return new SearchCardView(context).setCallback(callback);
case VIEW_TYPE_MOST_READ:
return new MostReadCardView(context);
+ case VIEW_TYPE_FEATURED_ARTICLE:
+ return new FeaturedArticleCardView(context);
default:
throw new IllegalArgumentException("viewType=" + viewType);
}
diff --git a/app/src/main/java/org/wikipedia/util/DateUtil.java
b/app/src/main/java/org/wikipedia/util/DateUtil.java
index 6184a82..e41e429 100644
--- a/app/src/main/java/org/wikipedia/util/DateUtil.java
+++ b/app/src/main/java/org/wikipedia/util/DateUtil.java
@@ -1,8 +1,12 @@
package org.wikipedia.util;
-import java.text.ParseException;
+import android.text.format.DateUtils;
+
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.feed.UtcDate;
+
import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
@@ -14,16 +18,13 @@
return simpleDateFormat;
}
- // Ex. "2015-07-18T18:11:52Z"
- public static long fromMwApiTimestamp(String timestamp) {
- long timeInMilliseconds = 0;
- try {
- Date date = getIso8601DateFormat().parse(timestamp);
- timeInMilliseconds = date.getTime();
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return timeInMilliseconds;
+ public static String getFeedCardDateString(Calendar cal) {
+ int flags = DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE
| DateUtils.FORMAT_UTC;
+ return DateUtils.formatDateTime(WikipediaApp.getInstance(),
cal.getTimeInMillis(), flags);
+ }
+
+ public static UtcDate getUtcRequestDateFor(int age) {
+ return new UtcDate(age);
}
private DateUtil() {
diff --git a/app/src/main/res/drawable/ic_bookmark_gray_24dp.xml
b/app/src/main/res/drawable/ic_bookmark_gray_24dp.xml
new file mode 100644
index 0000000..bc8841e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bookmark_gray_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#8F9394"
+ android:pathData="M17,3L7,3c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3
7,3L19,5c0,-1.1 -0.9,-2 -2,-2zM17,18l-5,-2.18L7,18L7,5h10v13z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_share_gray_24dp.xml
b/app/src/main/res/drawable/ic_share_gray_24dp.xml
new file mode 100644
index 0000000..65cd24c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_share_gray_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#8F9394"
+ android:pathData="M18,16.08c-0.76,0 -1.44,0.3
-1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47
-0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3
-3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9
6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31
2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92
2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
+</vector>
diff --git a/app/src/main/res/layout/view_big_picture_card.xml
b/app/src/main/res/layout/view_big_picture_card.xml
new file mode 100644
index 0000000..37e6feb
--- /dev/null
+++ b/app/src/main/res/layout/view_big_picture_card.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <View
+ android:id="@+id/view_big_picture_card_header"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"/>
+
+ <com.facebook.drawee.view.SimpleDraweeView
+ style="@style/SimpleDraweeViewPlaceholder.Article"
+ android:id="@+id/view_big_picture_card_image"
+ android:layout_width="match_parent"
+ android:layout_height="240dp"
+ app:actualImageScaleType="focusCrop" />
+
+ <TextView
+ style="@style/RtlAwareTextView"
+ android:id="@+id/view_big_picture_card_article_title"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:paddingTop="12dp"
+ android:paddingBottom="4dp"
+ android:textSize="28sp"
+ android:fontFamily="serif"
+ android:textColor="?attr/link_preview_text_color"
+ android:lineSpacingMultiplier="0.9"
+ android:maxLines="3"
+ android:ellipsize="end" />
+
+ <TextView
+ style="@style/RtlAwareTextView"
+ android:id="@+id/view_big_picture_card_article_subtitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="@color/gray_disabled"
+ android:paddingTop="4dp"
+ android:paddingBottom="8dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:textSize="14sp"
+ android:maxLines="3"
+ android:ellipsize="end"
+ android:visibility="gone"/>
+
+ <TextView
+ style="@style/RtlAwareTextView"
+ android:id="@+id/view_big_picture_card_extract"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="8dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"
+ android:textSize="16sp"
+ android:maxLines="4"
+ android:ellipsize="end"
+ android:lineSpacingMultiplier="1.4"
+ android:textIsSelectable="true" />
+
+ <View
+ android:id="@+id/view_big_picture_card_footer"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="16dp"
+ android:layout_marginStart="16dp"
+ android:layout_marginTop="4dp"
+ android:layout_marginBottom="4dp"
+ android:visibility="gone" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_card_featured_footer.xml
b/app/src/main/res/layout/view_card_featured_footer.xml
new file mode 100644
index 0000000..5782bf0
--- /dev/null
+++ b/app/src/main/res/layout/view_card_featured_footer.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <Button
+ style="@style/Widget.AppCompat.Toolbar.Button.Navigation"
+ android:id="@+id/view_card_featured_footer_reading_list_button"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentStart="true"
+ android:drawableLeft="@drawable/ic_bookmark_gray_24dp"
+ android:drawableStart="@drawable/ic_bookmark_gray_24dp"
+ android:drawablePadding="12dp"
+
android:text="@string/view_featured_article_footer_save_button_label"
+ android:textColor="#8F9394"
+ android:textAllCaps="true"
+ android:textStyle="bold"
+ android:contentDescription="@string/article_menu_bar_bookmark" />
+
+ <Button
+ style="@style/Widget.AppCompat.Toolbar.Button.Navigation"
+ android:id="@+id/view_card_featured_footer_share_button"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:layout_alignParentRight="true"
+ android:layout_alignParentEnd="true"
+ android:drawableLeft="@drawable/ic_share_gray_24dp"
+ android:drawableStart="@drawable/ic_share_gray_24dp"
+ android:contentDescription="@string/share_via" />
+
+ </RelativeLayout>
+
+</merge>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml
b/app/src/main/res/values/strings.xml
index d1d051c..4cae1e4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -319,5 +319,7 @@
<!-- The Feed -->
<string name="view_continue_reading_card_title">Continue reading</string>
<string name="view_because_you_read_card_title">Because you read</string>
+ <string name="view_featured_article_card_title">Featured article</string>
+ <string name="view_featured_article_footer_save_button_label">Save</string>
<!-- /The Feed -->
</resources>
diff --git a/app/src/main/res/values/strings_no_translate.xml
b/app/src/main/res/values/strings_no_translate.xml
index 97b300d..ff7300e 100644
--- a/app/src/main/res/values/strings_no_translate.xml
+++ b/app/src/main/res/values/strings_no_translate.xml
@@ -54,4 +54,6 @@
<item quantity="other">%d days ago</item>
</plurals>
<!-- /The Feed -->
+
+ <string name="lorem_ipsum">Lorem ipsum dolor sit amet, consectetur
adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint
occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim
id est laborum.</string>
</resources>
diff --git
a/app/src/test/java/org/wikipedia/feed/mostread/MostReadArticleTest.java
b/app/src/test/java/org/wikipedia/feed/mostread/MostReadArticleTest.java
index 963a1b8..a7c7e9b 100644
--- a/app/src/test/java/org/wikipedia/feed/mostread/MostReadArticleTest.java
+++ b/app/src/test/java/org/wikipedia/feed/mostread/MostReadArticleTest.java
@@ -7,13 +7,11 @@
import org.junit.runner.RunWith;
import org.wikipedia.test.TestRunner;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
@RunWith(TestRunner.class)
@SuppressWarnings("checkstyle:magicnumber")
@@ -32,12 +30,8 @@
assertThat(subject.description(), is("American actress, model, and
singer"));
assertThat(subject.pageId(), is(19318));
- Map<Integer, Uri> thumbnails = new HashMap<>();
- thumbnails.put(60,
Uri.parse("http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Marilyn_Monroe_in_1952.jpg/60px-Marilyn_Monroe_in_1952.jpg"));
- thumbnails.put(120,
Uri.parse("http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Marilyn_Monroe_in_1952.jpg/120px-Marilyn_Monroe_in_1952.jpg"));
- thumbnails.put(320,
Uri.parse("http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Marilyn_Monroe_in_1952.jpg/229px-Marilyn_Monroe_in_1952.jpg"));
-
- assertThat(subject.thumbnails(), is(thumbnails));
+ Uri thumbnail =
Uri.parse("https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Marilyn_Monroe_in_1952.jpg/229px-Marilyn_Monroe_in_1952.jpg");
+ assertThat(subject.thumbnail(), is(thumbnail));
assertThat(subject.rank(), is(8));
assertThat(subject.views(), is(201439));
@@ -50,8 +44,7 @@
assertThat(subject.title(), is("Bicycle_Race"));
assertThat(subject.description(), is("rock song by Queen"));
assertThat(subject.pageId(), is(3957496));
- assertThat(subject.thumbnails(), notNullValue());
- assertThat(subject.thumbnails().size(), is(0));
+ assertThat(subject.thumbnail(), nullValue());
assertThat(subject.rank(), is(3));
assertThat(subject.views(), is(330200));
}
diff --git a/app/src/test/res/raw/most_read.json
b/app/src/test/res/raw/most_read.json
index fa2e12a..481f005 100644
--- a/app/src/test/res/raw/most_read.json
+++ b/app/src/test/res/raw/most_read.json
@@ -23,9 +23,9 @@
"title": "Razak_Khan",
"pageid": 40626711,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Razak_Khan.jpg/60px-Razak_Khan.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Razak_Khan.jpg/120px-Razak_Khan.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Razak_Khan.jpg/241px-Razak_Khan.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/1/1a/Razak_Khan.jpg/241px-Razak_Khan.jpg",
+ "width": 241,
+ "height": 320
},
"normalizedtitle": "Razak Khan",
"description": "Indian actor"
@@ -36,9 +36,9 @@
"title": "Marilyn_Monroe",
"pageid": 19318,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Marilyn_Monroe_in_1952.jpg/60px-Marilyn_Monroe_in_1952.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Marilyn_Monroe_in_1952.jpg/120px-Marilyn_Monroe_in_1952.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Marilyn_Monroe_in_1952.jpg/229px-Marilyn_Monroe_in_1952.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Marilyn_Monroe_in_1952.jpg/229px-Marilyn_Monroe_in_1952.jpg",
+ "width": 229,
+ "height": 320
},
"normalizedtitle": "Marilyn Monroe",
"description": "American actress, model, and singer"
@@ -57,9 +57,9 @@
"title": "Big_Trouble_(2002_film)",
"pageid": 1703740,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/en/thumb/b/b5/Big_trouble_ver2.jpg/60px-Big_trouble_ver2.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/en/thumb/b/b5/Big_trouble_ver2.jpg/120px-Big_trouble_ver2.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/en/thumb/b/b5/Big_trouble_ver2.jpg/217px-Big_trouble_ver2.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/en/thumb/b/b5/Big_trouble_ver2.jpg/217px-Big_trouble_ver2.jpg",
+ "width": 217,
+ "height": 320
},
"normalizedtitle": "Big Trouble (2002 film)",
"description": "2002 American comedy film"
@@ -70,9 +70,9 @@
"title": "X-Men:_Apocalypse",
"pageid": 43530847,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Englefield_House_-_geograph.org.uk_-_1824880.jpg/60px-Englefield_House_-_geograph.org.uk_-_1824880.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Englefield_House_-_geograph.org.uk_-_1824880.jpg/120px-Englefield_House_-_geograph.org.uk_-_1824880.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Englefield_House_-_geograph.org.uk_-_1824880.jpg/320px-Englefield_House_-_geograph.org.uk_-_1824880.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/9/98/Englefield_House_-_geograph.org.uk_-_1824880.jpg/320px-Englefield_House_-_geograph.org.uk_-_1824880.jpg",
+ "width": 320,
+ "height": 213
},
"normalizedtitle": "X-Men: Apocalypse",
"description": "2016 superhero film"
@@ -83,9 +83,9 @@
"title": "Gotthard_Base_Tunnel",
"pageid": 692624,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/20141120_gotthard-basistunnel02-wikipedia-hannes-ortlieb.jpg/60px-20141120_gotthard-basistunnel02-wikipedia-hannes-ortlieb.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/20141120_gotthard-basistunnel02-wikipedia-hannes-ortlieb.jpg/120px-20141120_gotthard-basistunnel02-wikipedia-hannes-ortlieb.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/20141120_gotthard-basistunnel02-wikipedia-hannes-ortlieb.jpg/320px-20141120_gotthard-basistunnel02-wikipedia-hannes-ortlieb.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/5/5d/20141120_gotthard-basistunnel02-wikipedia-hannes-ortlieb.jpg/320px-20141120_gotthard-basistunnel02-wikipedia-hannes-ortlieb.jpg",
+ "width": 320,
+ "height": 213
},
"normalizedtitle": "Gotthard Base Tunnel",
"description": "railway tunnel through the Swiss Alps"
@@ -96,9 +96,9 @@
"title": "UEFA_Euro_2016",
"pageid": 7932564,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/UEFA_Euro_2016_qualifying_map.svg/60px-UEFA_Euro_2016_qualifying_map.svg.png",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/UEFA_Euro_2016_qualifying_map.svg/120px-UEFA_Euro_2016_qualifying_map.svg.png",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/UEFA_Euro_2016_qualifying_map.svg/320px-UEFA_Euro_2016_qualifying_map.svg.png"
+ "source":
"https://upload.wikimedia.org/wikipedia/en/thumb/f/f1/UEFA_Euro_2016_Logo.svg/227px-UEFA_Euro_2016_Logo.svg.png",
+ "width": 227,
+ "height": 320
},
"normalizedtitle": "UEFA Euro 2016",
"description": "football tournament held in 2016"
@@ -109,9 +109,9 @@
"title": "Kunta_Kinte",
"pageid": 951527,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/IJzeren_voetring_voor_gevangenen_transparent_background.png/60px-IJzeren_voetring_voor_gevangenen_transparent_background.png",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/IJzeren_voetring_voor_gevangenen_transparent_background.png/120px-IJzeren_voetring_voor_gevangenen_transparent_background.png",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/IJzeren_voetring_voor_gevangenen_transparent_background.png/320px-IJzeren_voetring_voor_gevangenen_transparent_background.png"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9e/IJzeren_voetring_voor_gevangenen_transparent_background.png/320px-IJzeren_voetring_voor_gevangenen_transparent_background.png",
+ "width": 320,
+ "height": 175
},
"normalizedtitle": "Kunta Kinte",
"description": "From Alex Haley's ''Roots''"
@@ -138,9 +138,9 @@
"title": "Amber_Heard",
"pageid": 10784468,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Amber_Heard_2011.jpg/60px-Amber_Heard_2011.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Amber_Heard_2011.jpg/120px-Amber_Heard_2011.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Amber_Heard_2011.jpg/231px-Amber_Heard_2011.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Amber_Heard_2011.jpg/231px-Amber_Heard_2011.jpg",
+ "width": 231,
+ "height": 320
},
"normalizedtitle": "Amber Heard",
"description": "American actress"
@@ -151,9 +151,9 @@
"title": "Game_of_Thrones_(season_6)",
"pageid": 43186937,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Castillo_de_Zafra_-_Exterior.JPG/60px-Castillo_de_Zafra_-_Exterior.JPG",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Castillo_de_Zafra_-_Exterior.JPG/120px-Castillo_de_Zafra_-_Exterior.JPG",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Castillo_de_Zafra_-_Exterior.JPG/320px-Castillo_de_Zafra_-_Exterior.JPG"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/a/af/Castillo_de_Zafra_-_Exterior.JPG/320px-Castillo_de_Zafra_-_Exterior.JPG",
+ "width": 320,
+ "height": 180
},
"normalizedtitle": "Game of Thrones (season 6)",
"description": "sixth season of the fantasy drama television series Game
of Thrones"
@@ -172,9 +172,9 @@
"title": "Game_of_Thrones",
"pageid": 20715044,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Game_of_Thrones_Oslo_exhibition_2014_-_Weapons.jpg/60px-Game_of_Thrones_Oslo_exhibition_2014_-_Weapons.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Game_of_Thrones_Oslo_exhibition_2014_-_Weapons.jpg/120px-Game_of_Thrones_Oslo_exhibition_2014_-_Weapons.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Game_of_Thrones_Oslo_exhibition_2014_-_Weapons.jpg/320px-Game_of_Thrones_Oslo_exhibition_2014_-_Weapons.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Game_of_Thrones_Oslo_exhibition_2014_-_Weapons.jpg/320px-Game_of_Thrones_Oslo_exhibition_2014_-_Weapons.jpg",
+ "width": 320,
+ "height": 253
},
"normalizedtitle": "Game of Thrones",
"description": "American fantasy drama television series"
@@ -192,9 +192,9 @@
"title": "Captain_America:_Civil_War",
"pageid": 41974496,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Cast_of_Captain_America_Civil_War.jpg/60px-Cast_of_Captain_America_Civil_War.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Cast_of_Captain_America_Civil_War.jpg/120px-Cast_of_Captain_America_Civil_War.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Cast_of_Captain_America_Civil_War.jpg/320px-Cast_of_Captain_America_Civil_War.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8e/Cast_of_Captain_America_Civil_War.jpg/320px-Cast_of_Captain_America_Civil_War.jpg",
+ "width": 320,
+ "height": 187
},
"normalizedtitle": "Captain America: Civil War",
"description": "2016 superhero film produced by Marvel Studios"
@@ -213,9 +213,9 @@
"title": "State_of_Origin_series",
"pageid": 1954843,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/en/thumb/e/e8/First_State_of_Origin_Shield.jpg/60px-First_State_of_Origin_Shield.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/en/thumb/e/e8/First_State_of_Origin_Shield.jpg/120px-First_State_of_Origin_Shield.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/en/thumb/e/e8/First_State_of_Origin_Shield.jpg/301px-First_State_of_Origin_Shield.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/en/thumb/e/e8/First_State_of_Origin_Shield.jpg/301px-First_State_of_Origin_Shield.jpg",
+ "width": 301,
+ "height": 320
},
"normalizedtitle": "State of Origin series"
},
@@ -225,9 +225,9 @@
"title": "Gorilla",
"pageid": 12546,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Male_gorilla_in_SF_zoo.jpg/60px-Male_gorilla_in_SF_zoo.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Male_gorilla_in_SF_zoo.jpg/120px-Male_gorilla_in_SF_zoo.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Male_gorilla_in_SF_zoo.jpg/287px-Male_gorilla_in_SF_zoo.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/5/50/Male_gorilla_in_SF_zoo.jpg/287px-Male_gorilla_in_SF_zoo.jpg",
+ "width": 287,
+ "height": 320
},
"normalizedtitle": "Gorilla",
"description": "genus of mammals"
@@ -238,9 +238,9 @@
"title": "Stephen_Curry",
"pageid": 5608488,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Stephen_Curry_dribbling_2016_%28cropped%29.jpg/60px-Stephen_Curry_dribbling_2016_%28cropped%29.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Stephen_Curry_dribbling_2016_%28cropped%29.jpg/120px-Stephen_Curry_dribbling_2016_%28cropped%29.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Stephen_Curry_dribbling_2016_%28cropped%29.jpg/178px-Stephen_Curry_dribbling_2016_%28cropped%29.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/3/36/Stephen_Curry_dribbling_2016_%28cropped%29.jpg/178px-Stephen_Curry_dribbling_2016_%28cropped%29.jpg",
+ "width": 178,
+ "height": 320
},
"normalizedtitle": "Stephen Curry",
"description": "American basketball player"
@@ -251,9 +251,9 @@
"title": "Maya_Rudolph",
"pageid": 511348,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Maya_Rudolph.jpg/60px-Maya_Rudolph.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Maya_Rudolph.jpg/120px-Maya_Rudolph.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Maya_Rudolph.jpg/318px-Maya_Rudolph.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Maya_Rudolph.jpg/318px-Maya_Rudolph.jpg",
+ "width": 318,
+ "height": 320
},
"normalizedtitle": "Maya Rudolph",
"description": "American comedic actress"
@@ -264,9 +264,9 @@
"title": "Johnny_Depp",
"pageid": 71870,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/JohnnyDeppHWOFJune2013.jpg/60px-JohnnyDeppHWOFJune2013.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/JohnnyDeppHWOFJune2013.jpg/120px-JohnnyDeppHWOFJune2013.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/JohnnyDeppHWOFJune2013.jpg/273px-JohnnyDeppHWOFJune2013.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/JohnnyDeppHWOFJune2013.jpg/273px-JohnnyDeppHWOFJune2013.jpg",
+ "width": 273,
+ "height": 320
},
"normalizedtitle": "Johnny Depp",
"description": "American actor, film producer, and musician"
@@ -277,12 +277,12 @@
"title": "Donald_Trump",
"pageid": 4848272,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Donald_Trump_August_19%2C_2015_%28cropped%29.jpg/60px-Donald_Trump_August_19%2C_2015_%28cropped%29.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Donald_Trump_August_19%2C_2015_%28cropped%29.jpg/120px-Donald_Trump_August_19%2C_2015_%28cropped%29.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Donald_Trump_August_19%2C_2015_%28cropped%29.jpg/235px-Donald_Trump_August_19%2C_2015_%28cropped%29.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Donald_Trump_August_19%2C_2015_%28cropped%29.jpg/235px-Donald_Trump_August_19%2C_2015_%28cropped%29.jpg",
+ "width": 235,
+ "height": 320
},
"normalizedtitle": "Donald Trump",
- "description": "American business magnate, television personality,
author and politician"
+ "description": "German American business magnate, television
personality, author and politician"
},
{
"views": 60341,
@@ -290,9 +290,9 @@
"title": "Children's_Day",
"pageid": 494299,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Wikipedia_Children%27s_Day.png/60px-Wikipedia_Children%27s_Day.png",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Wikipedia_Children%27s_Day.png/120px-Wikipedia_Children%27s_Day.png",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Wikipedia_Children%27s_Day.png/320px-Wikipedia_Children%27s_Day.png"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Wikipedia_Children%27s_Day.png/320px-Wikipedia_Children%27s_Day.png",
+ "width": 320,
+ "height": 280
},
"normalizedtitle": "Children's Day",
"description": "day to honor children globally"
@@ -303,9 +303,9 @@
"title": "Louis_XIV_of_France",
"pageid": 18553,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Louis_XIV_of_France.jpg/60px-Louis_XIV_of_France.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Louis_XIV_of_France.jpg/120px-Louis_XIV_of_France.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Louis_XIV_of_France.jpg/225px-Louis_XIV_of_France.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Louis_XIV_of_France.jpg/225px-Louis_XIV_of_France.jpg",
+ "width": 225,
+ "height": 320
},
"normalizedtitle": "Louis XIV of France",
"description": "King of France and Navarra, from 1643 to 1715"
@@ -340,9 +340,9 @@
"title": "List_of_Person_of_Interest_episodes",
"pageid": 32796719,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Person_of_Interest_logo.svg/60px-Person_of_Interest_logo.svg.png",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Person_of_Interest_logo.svg/120px-Person_of_Interest_logo.svg.png",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Person_of_Interest_logo.svg/320px-Person_of_Interest_logo.svg.png"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Person_of_Interest_logo.svg/320px-Person_of_Interest_logo.svg.png",
+ "width": 320,
+ "height": 107
},
"normalizedtitle": "List of Person of Interest episodes",
"description": "Wikimedia list article"
@@ -369,9 +369,9 @@
"title": "Rosenhan_experiment",
"pageid": 449532,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Center_building_at_Saint_Elizabeths%2C_August_23%2C_2006.jpg/60px-Center_building_at_Saint_Elizabeths%2C_August_23%2C_2006.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Center_building_at_Saint_Elizabeths%2C_August_23%2C_2006.jpg/120px-Center_building_at_Saint_Elizabeths%2C_August_23%2C_2006.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Center_building_at_Saint_Elizabeths%2C_August_23%2C_2006.jpg/320px-Center_building_at_Saint_Elizabeths%2C_August_23%2C_2006.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/5/58/Center_building_at_Saint_Elizabeths%2C_August_23%2C_2006.jpg/320px-Center_building_at_Saint_Elizabeths%2C_August_23%2C_2006.jpg",
+ "width": 320,
+ "height": 241
},
"normalizedtitle": "Rosenhan experiment",
"description": "psychological experiment"
@@ -382,9 +382,9 @@
"title": "Emilia_Clarke",
"pageid": 30175038,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Emilia_Clarke_2013_%28Straighten_Colors_2%29.jpg/60px-Emilia_Clarke_2013_%28Straighten_Colors_2%29.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Emilia_Clarke_2013_%28Straighten_Colors_2%29.jpg/120px-Emilia_Clarke_2013_%28Straighten_Colors_2%29.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/0/0b/Emilia_Clarke_2013_%28Straighten_Colors_2%29.jpg/239px-Emilia_Clarke_2013_%28Straighten_Colors_2%29.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/1/19/Emilia_Clarke_by_Gage_Skidmore_2.jpg/260px-Emilia_Clarke_by_Gage_Skidmore_2.jpg",
+ "width": 260,
+ "height": 320
},
"normalizedtitle": "Emilia Clarke",
"description": "English actress"
@@ -395,9 +395,9 @@
"title": "Elizabeth_Holmes",
"pageid": 43573275,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Elizabeth_Holmes_2014_%28cropped%29.jpg/60px-Elizabeth_Holmes_2014_%28cropped%29.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Elizabeth_Holmes_2014_%28cropped%29.jpg/120px-Elizabeth_Holmes_2014_%28cropped%29.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Elizabeth_Holmes_2014_%28cropped%29.jpg/277px-Elizabeth_Holmes_2014_%28cropped%29.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Elizabeth_Holmes_2014_%28cropped%29.jpg/277px-Elizabeth_Holmes_2014_%28cropped%29.jpg",
+ "width": 277,
+ "height": 320
},
"normalizedtitle": "Elizabeth Holmes",
"description": "American business executive"
@@ -408,9 +408,9 @@
"title": "Stephen_Hawking",
"pageid": 19376148,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Stephen_Hawking.StarChild.jpg/60px-Stephen_Hawking.StarChild.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Stephen_Hawking.StarChild.jpg/120px-Stephen_Hawking.StarChild.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Stephen_Hawking.StarChild.jpg/223px-Stephen_Hawking.StarChild.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/e/eb/Stephen_Hawking.StarChild.jpg/223px-Stephen_Hawking.StarChild.jpg",
+ "width": 223,
+ "height": 320
},
"normalizedtitle": "Stephen Hawking",
"description": "British theoretical physicist, cosmologist, and author"
@@ -428,9 +428,9 @@
"title": "Female_genital_mutilation",
"pageid": 11408,
"thumbnail": {
- "60":
"http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Campaign_road_sign_against_female_genital_mutilation_%28cropped%29_2.jpg/60px-Campaign_road_sign_against_female_genital_mutilation_%28cropped%29_2.jpg",
- "120":
"http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Campaign_road_sign_against_female_genital_mutilation_%28cropped%29_2.jpg/120px-Campaign_road_sign_against_female_genital_mutilation_%28cropped%29_2.jpg",
- "320":
"http://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Campaign_road_sign_against_female_genital_mutilation_%28cropped%29_2.jpg/320px-Campaign_road_sign_against_female_genital_mutilation_%28cropped%29_2.jpg"
+ "source":
"https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Campaign_road_sign_against_female_genital_mutilation_%28cropped%29_2.jpg/320px-Campaign_road_sign_against_female_genital_mutilation_%28cropped%29_2.jpg",
+ "width": 320,
+ "height": 212
},
"normalizedtitle": "Female genital mutilation",
"description": "controversial cultural ritual"
--
To view, visit https://gerrit.wikimedia.org/r/294372
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I7e4ac7b2f2e81f8cdf40f9649daecb08db0cdfc1
Gerrit-PatchSet: 14
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[email protected]>
Gerrit-Reviewer: BearND <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Mholloway <[email protected]>
Gerrit-Reviewer: Niedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits