Mholloway has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/294372

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.

TODOs (in separate patches):

* Add gray, slightly larger bookmark and share drawables (make or get from
  designers)

* Add larger thumbnail URLs to the standard feed thumbnails generator in
  MCS, and use them in the BigPictureCard (don't want to hold up for this
  now since something we probably didn't do is causing seemingly random
  403s in beta at the moment)

Bug: 129079
Change-Id: I7e4ac7b2f2e81f8cdf40f9649daecb08db0cdfc1
---
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/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/layout/view_big_picture_card.xml
A app/src/main/res/layout/view_card_featured_footer.xml
M app/src/main/res/values/strings_no_translate.xml
17 files changed, 537 insertions(+), 12 deletions(-)


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

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 40fbd8b..caefd4d 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
@@ -4,6 +4,7 @@
 import android.support.annotation.NonNull;
 
 import org.wikipedia.Site;
+import org.wikipedia.feed.aggregated.AggregatedFeedContentClient;
 import org.wikipedia.feed.becauseyouread.BecauseYouReadClient;
 import org.wikipedia.feed.continuereading.ContinueReadingClient;
 import org.wikipedia.feed.demo.IntegerListClient;
@@ -20,6 +21,7 @@
         // hard-coded list of card types to load when continuing the feed
         addPendingClient(new BecauseYouReadClient(site));
         addPendingClient(new ContinueReadingClient());
+        addPendingClient(new AggregatedFeedContentClient());
         addPendingClient(new IntegerListClient());
 
     }
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..54d8f1d
--- /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;
+    // Note: the below just have placeholder strings for now
+    @SuppressWarnings("NullableProblems") @NonNull private String random;
+    @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..af74e23
--- /dev/null
+++ 
b/app/src/main/java/org/wikipedia/feed/aggregated/AggregatedFeedContentClient.java
@@ -0,0 +1,93 @@
+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.WikipediaApp;
+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, int age, @NonNull Callback 
cb) {
+        cancel();
+        DATE = DateUtil.getUtcRequestDateFor(age);
+        Site site = WikipediaApp.getInstance().getSite();
+        // 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.Endpoint client = 
retrofit.create(Endpoint.class);
+        call = client.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 Endpoint {
+
+        /**
+         * 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 t) {
+            L.v(t);
+        }
+    }
+}
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..efcd5c8
--- /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 
now) {
+        super(page, now);
+    }
+
+    @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..32f5b6e
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/featured/FeaturedArticleCardView.java
@@ -0,0 +1,51 @@
+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() != null ? card.image() : null;
+
+        articleTitle(articleTitle);
+
+        if (articleSubtitle != null) {
+            articleSubtitle(articleSubtitle);
+        }
+
+        if (extract != null) {
+            extract(extract);
+        }
+
+        if (imageUri != null) {
+            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..3f58bb6
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/model/BigPictureCard.java
@@ -0,0 +1,58 @@
+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;
+
+import static org.wikipedia.Constants.PREFERRED_THUMBNAIL_KEY;
+
+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.thumbnails() != null
+                && page.thumbnails().containsKey(PREFERRED_THUMBNAIL_KEY)
+                ? Uri.parse(page.thumbnails().get(PREFERRED_THUMBNAIL_KEY)) : 
null;
+        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..08dffa1
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/model/CardPageItem.java
@@ -0,0 +1,33 @@
+package org.wikipedia.feed.model;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+
+import java.util.Map;
+
+public class CardPageItem {
+    @SuppressWarnings("NullableProblems") @NonNull private String title;
+    @Nullable private Map<String, String> thumbnail;
+    @Nullable private String description;
+    @Nullable private String extract;
+
+    @NonNull
+    public String title() {
+        return title;
+    }
+
+    @Nullable
+    public Map<String, String> thumbnails() {
+        return thumbnail;
+    }
+
+    @Nullable
+    public String description() {
+        return description;
+    }
+
+    @Nullable
+    public String extract() {
+        return extract;
+    }
+}
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..e368a39
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/view/BigPictureCardView.java
@@ -0,0 +1,58 @@
+package org.wikipedia.feed.view;
+
+import android.content.Context;
+import android.net.Uri;
+import android.support.annotation.NonNull;
+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(@NonNull String articleSubtitle) {
+        articleSubtitleView.setVisibility(View.VISIBLE);
+        articleSubtitleView.setText(articleSubtitle);
+    }
+
+    protected void image(@NonNull Uri uri) {
+        imageView.setImageURI(uri);
+    }
+
+    protected void extract(@NonNull 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 4d55af8..039f50a 100644
--- a/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java
+++ b/app/src/main/java/org/wikipedia/feed/view/FeedRecyclerAdapter.java
@@ -11,6 +11,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.views.DefaultRecyclerAdapter;
 import org.wikipedia.views.DefaultViewHolder;
@@ -21,6 +23,7 @@
     private static final int VIEW_TYPE_INTEGER_LIST = 0;
     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_FEATURED_ARTICLE = 3;
 
     public FeedRecyclerAdapter(@NonNull List<Card> items) {
         super(items);
@@ -40,6 +43,8 @@
             ((ContinueReadingCardView) view).set((ContinueReadingCard) item);
         } else if (view instanceof BecauseYouReadCardView) {
             ((BecauseYouReadCardView) view).set((BecauseYouReadCard) item);
+        } else if (view instanceof FeaturedArticleCardView) {
+            ((FeaturedArticleCardView) view).set((FeaturedArticleCard) item);
         } else {
             throw new IllegalStateException("Unknown type=" + view.getClass());
         }
@@ -53,6 +58,8 @@
             return VIEW_TYPE_CONTINUE_READING;
         } else if (item instanceof BecauseYouReadCard) {
             return VIEW_TYPE_BECAUSE_YOU_READ;
+        } else if (item instanceof FeaturedArticleCard) {
+            return VIEW_TYPE_FEATURED_ARTICLE;
         } else {
             throw new IllegalStateException("Unknown type=" + item.getClass());
         }
@@ -66,6 +73,8 @@
                 return new ContinueReadingCardView(context);
             case VIEW_TYPE_BECAUSE_YOU_READ:
                 return new BecauseYouReadCardView(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..c746121 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;
+        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/layout/view_big_picture_card.xml 
b/app/src/main/res/layout/view_big_picture_card.xml
new file mode 100644
index 0000000..f420989
--- /dev/null
+++ b/app/src/main/res/layout/view_big_picture_card.xml
@@ -0,0 +1,74 @@
+<?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"
+        android:layout_margin="@dimen/view_list_card_item_margin" />
+
+    <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_margin="@dimen/view_list_card_item_margin"
+        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..43f3679
--- /dev/null
+++ b/app/src/main/res/layout/view_card_featured_footer.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:app="http://schemas.android.com/apk/res-auto";>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="end">
+
+        <ImageButton
+            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="wrap_content"
+            app:srcCompat="@drawable/ic_bookmark_border_black_24dp"
+            android:contentDescription="@string/view_card_footer_button" />
+
+        <ImageButton
+            style="@style/Widget.AppCompat.Toolbar.Button.Navigation"
+            android:id="@+id/view_card_featured_footer_share_button"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            app:srcCompat="@drawable/ic_share_black_24dp"
+            android:contentDescription="@string/view_card_footer_button" />
+
+    </LinearLayout>
+
+</merge>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings_no_translate.xml 
b/app/src/main/res/values/strings_no_translate.xml
index 7494adb..484d123 100644
--- a/app/src/main/res/values/strings_no_translate.xml
+++ b/app/src/main/res/values/strings_no_translate.xml
@@ -48,10 +48,13 @@
     <string name="view_card_footer_button">See more</string>
     <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>
 
     <plurals name="view_continue_reading_card_subtitle">
         <item quantity="one">1 day ago</item>
         <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>

-- 
To view, visit https://gerrit.wikimedia.org/r/294372
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7e4ac7b2f2e81f8cdf40f9649daecb08db0cdfc1
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to