jenkins-bot has submitted this change and it was merged. Change subject: Announcement cards in the feed. ......................................................................
Announcement cards in the feed. This is not the final design, just the first working version. Design refinements to appear later. Bug: T140012 Change-Id: I1353688655ae6d8695db0d97c1eb51e7718d3d38 --- M app/src/main/java/org/wikipedia/feed/FeedFragment.java A app/src/main/java/org/wikipedia/feed/announcement/AnnouncementCard.java A app/src/main/java/org/wikipedia/feed/announcement/AnnouncementCardView.java M app/src/main/java/org/wikipedia/feed/announcement/AnnouncementClient.java M app/src/main/java/org/wikipedia/feed/model/CardType.java M app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java A app/src/main/res/layout/view_card_announcement.xml 7 files changed, 153 insertions(+), 9 deletions(-) Approvals: jenkins-bot: Verified Niedzielski: Looks good to me, approved diff --git a/app/src/main/java/org/wikipedia/feed/FeedFragment.java b/app/src/main/java/org/wikipedia/feed/FeedFragment.java index 4efad4a..234a63f 100644 --- a/app/src/main/java/org/wikipedia/feed/FeedFragment.java +++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.java @@ -286,6 +286,11 @@ getCallback().onFeaturedImageSelected(card); } } + + @Override + public void onAnnouncementAction(@NonNull Uri uri) { + UriUtil.handleExternalLink(getContext(), uri); + } } private class FeedScrollListener extends RecyclerView.OnScrollListener { diff --git a/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementCard.java b/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementCard.java new file mode 100644 index 0000000..96d242c --- /dev/null +++ b/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementCard.java @@ -0,0 +1,53 @@ +package org.wikipedia.feed.announcement; + +import android.net.Uri; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import org.wikipedia.feed.model.Card; +import org.wikipedia.feed.model.CardType; + +public class AnnouncementCard extends Card { + @NonNull private final Announcement announcement; + + public AnnouncementCard(@NonNull Announcement announcement) { + this.announcement = announcement; + } + + @Override + @NonNull + public String title() { + return announcement.type(); + } + + @Nullable + @Override + public String extract() { + return announcement.text(); + } + + public boolean hasAction() { + return announcement.hasAction(); + } + + @NonNull + public String actionTitle() { + return announcement.actionTitle(); + } + + @NonNull + public Uri actionUri() { + return Uri.parse(announcement.actionUrl()); + } + + @NonNull + @Override + public CardType type() { + return CardType.ANNOUNCEMENT; + } + + @Override + protected int dismissHashCode() { + return announcement.id().hashCode(); + } +} diff --git a/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementCardView.java b/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementCardView.java new file mode 100644 index 0000000..c1fca41 --- /dev/null +++ b/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementCardView.java @@ -0,0 +1,50 @@ +package org.wikipedia.feed.announcement; + +import android.content.Context; +import android.net.Uri; +import android.support.annotation.NonNull; +import android.widget.TextView; + +import org.wikipedia.R; +import org.wikipedia.feed.view.DefaultFeedCardView; +import org.wikipedia.views.ItemTouchHelperSwipeAdapter; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +public class AnnouncementCardView extends DefaultFeedCardView<AnnouncementCard> + implements ItemTouchHelperSwipeAdapter.SwipeableView { + public interface Callback { + void onAnnouncementAction(@NonNull Uri uri); + } + + @BindView(R.id.view_announcement_text) TextView textView; + @BindView(R.id.view_announcement_action) TextView actionView; + + public AnnouncementCardView(Context context) { + super(context); + inflate(context, R.layout.view_card_announcement, this); + ButterKnife.bind(this); + } + + @Override public void setCard(@NonNull AnnouncementCard card) { + super.setCard(card); + + textView.setText(card.extract()); + + if (!card.hasAction()) { + actionView.setVisibility(GONE); + } else { + actionView.setVisibility(VISIBLE); + actionView.setText(card.actionTitle()); + } + } + + @OnClick(R.id.view_announcement_action) + void onActionClick() { + if (getCallback() != null && getCard() != null) { + getCallback().onAnnouncementAction(getCard().actionUri()); + } + } +} diff --git a/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementClient.java b/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementClient.java index aa23fd5..7cf5c9c 100644 --- a/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementClient.java +++ b/app/src/main/java/org/wikipedia/feed/announcement/AnnouncementClient.java @@ -98,19 +98,15 @@ } } - private static List<Card> buildCards(@NonNull List<Announcement> announcements) { + @VisibleForTesting + static List<Card> buildCards(@NonNull List<Announcement> announcements) { List<Card> cards = new ArrayList<>(); String country = getGeoIPCountry(); Date now = new Date(); for (Announcement announcement : announcements) { - if (!shouldShow(announcement, country, now)) { - continue; + if (shouldShow(announcement, country, now)) { + cards.add(new AnnouncementCard(announcement)); } - - // TODO: add this card! - - L.d("yes!!"); - } return cards; } diff --git a/app/src/main/java/org/wikipedia/feed/model/CardType.java b/app/src/main/java/org/wikipedia/feed/model/CardType.java index a6dc189..33f7d22 100644 --- a/app/src/main/java/org/wikipedia/feed/model/CardType.java +++ b/app/src/main/java/org/wikipedia/feed/model/CardType.java @@ -3,6 +3,7 @@ import android.content.Context; import android.support.annotation.NonNull; +import org.wikipedia.feed.announcement.AnnouncementCardView; import org.wikipedia.feed.becauseyouread.BecauseYouReadCardView; import org.wikipedia.feed.continuereading.ContinueReadingCardView; import org.wikipedia.feed.featured.FeaturedArticleCardView; @@ -67,6 +68,11 @@ MOST_READ_ITEM(10), NEWS_ITEM(11), NEWS_ITEM_LINK(12), + ANNOUNCEMENT(13) { + @NonNull @Override public FeedCardView<?> newView(@NonNull Context ctx) { + return new AnnouncementCardView(ctx); + } + }, PROGRESS(99) { @NonNull @Override public FeedCardView<?> newView(@NonNull Context ctx) { return new ProgressCardView(ctx); diff --git a/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java b/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java index 79a7352..4077974 100644 --- a/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java +++ b/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java @@ -7,6 +7,7 @@ import android.view.ViewGroup; import org.wikipedia.feed.FeedCoordinatorBase; +import org.wikipedia.feed.announcement.AnnouncementCardView; import org.wikipedia.feed.image.FeaturedImageCardView; import org.wikipedia.feed.model.Card; import org.wikipedia.feed.model.CardType; @@ -19,7 +20,8 @@ public class FeedAdapter<T extends View & FeedCardView<?>> extends DefaultRecyclerAdapter<Card, T> { public interface Callback extends ItemTouchHelperSwipeAdapter.Callback, PageTitleListCardItemView.Callback, CardHeaderView.Callback, - FeaturedImageCardView.Callback, SearchCardView.Callback, NewsListCardView.Callback { + FeaturedImageCardView.Callback, SearchCardView.Callback, NewsListCardView.Callback, + AnnouncementCardView.Callback { void onRequestMore(); } diff --git a/app/src/main/res/layout/view_card_announcement.xml b/app/src/main/res/layout/view_card_announcement.xml new file mode 100644 index 0000000..32f7095 --- /dev/null +++ b/app/src/main/res/layout/view_card_announcement.xml @@ -0,0 +1,32 @@ +<?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" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingTop="16dp"> + + <TextView + android:id="@+id/view_announcement_text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/RtlAwareTextView" + android:textColor="?attr/feed_text_primary_color" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:textSize="16sp" + tools:text="Lorem ipsum"/> + + <TextView + android:id="@+id/view_announcement_action" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="end" + android:layout_margin="4dp" + style="@style/Widget.AppCompat.Button.Borderless" + android:textColor="?attr/colorPrimary" + tools:text="Lorem ipsum"/> + +</LinearLayout> \ No newline at end of file -- To view, visit https://gerrit.wikimedia.org/r/322782 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I1353688655ae6d8695db0d97c1eb51e7718d3d38 Gerrit-PatchSet: 6 Gerrit-Project: apps/android/wikipedia Gerrit-Branch: master Gerrit-Owner: Dbrant <dbr...@wikimedia.org> Gerrit-Reviewer: BearND <bsitzm...@wikimedia.org> Gerrit-Reviewer: Brion VIBBER <br...@wikimedia.org> Gerrit-Reviewer: Dbrant <dbr...@wikimedia.org> Gerrit-Reviewer: Mholloway <mhollo...@wikimedia.org> Gerrit-Reviewer: Niedzielski <sniedziel...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits