jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/350430 )

Change subject: Add OfflineCard/View
......................................................................


Add OfflineCard/View

Layout, Java class, and callback interface for an offline "card" to be
injected into the feed when a network request fails.

TODO: Add to the feed when offline.
TODO: Add unit tests.

Bug: T157381
Change-Id: I3c5375d075fc4ae8f311a67f730835bc0cff3d8b
---
M app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
M app/src/main/java/org/wikipedia/feed/FeedFragment.java
M app/src/main/java/org/wikipedia/feed/model/CardType.java
A app/src/main/java/org/wikipedia/feed/offline/OfflineCard.java
A app/src/main/java/org/wikipedia/feed/offline/OfflineCardView.java
M app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
M app/src/main/java/org/wikipedia/util/ThrowableUtil.java
A app/src/main/res/layout/view_card_offline.xml
M app/src/main/res/values-qq/strings.xml
M app/src/main/res/values/strings.xml
10 files changed, 117 insertions(+), 11 deletions(-)

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



diff --git a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java 
b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
index 7ec53d7..2bd5662 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
@@ -7,6 +7,7 @@
 import org.wikipedia.dataclient.WikiSite;
 import org.wikipedia.feed.dataclient.FeedClient;
 import org.wikipedia.feed.model.Card;
+import org.wikipedia.feed.offline.OfflineCard;
 import org.wikipedia.feed.progress.ProgressCard;
 import org.wikipedia.settings.Prefs;
 
@@ -96,6 +97,15 @@
         insertCard(card, position);
     }
 
+    void moreFromOffline(@NonNull WikiSite wiki) {
+        int lastIndex = cards.size() - 1;
+        Card card = cards.get(lastIndex);
+        if (card instanceof OfflineCard) {
+            removeCard(card, lastIndex);
+        }
+        more(wiki);
+    }
+
     protected abstract void buildScript(int age);
 
     protected void addPendingClient(FeedClient client) {
@@ -115,32 +125,31 @@
         if (pos < 0) {
             return;
         }
-        cards.remove(progressCard);
-        if (updateListener != null) {
-            updateListener.remove(progressCard, pos);
-        }
+        removeCard(progressCard, pos);
     }
 
     private class ClientRequestCallback implements FeedClient.Callback {
-        @Override
-        public void success(@NonNull List<? extends Card> cardList) {
+        @Override public void success(@NonNull List<? extends Card> cardList) {
             for (Card card : cardList) {
                 if (!isCardHidden(card)) {
-                    int progressPos = cards.indexOf(progressCard);
-                    insertCard(card, progressPos >= 0 ? progressPos : 
cards.size());
+                    appendCard(card);
                 }
             }
             //noinspection ConstantConditions
             requestNextCard(wiki);
         }
 
-        @Override
-        public void error(@NonNull Throwable caught) {
+        @Override public void error(@NonNull Throwable caught) {
             //noinspection ConstantConditions
             requestNextCard(wiki);
         }
     }
 
+    private void appendCard(@NonNull Card card) {
+        int progressPos = cards.indexOf(progressCard);
+        insertCard(card, progressPos >= 0 ? progressPos : cards.size());
+    }
+
     private void insertCard(@NonNull Card card, int position) {
         cards.add(position, card);
         if (updateListener != null) {
diff --git a/app/src/main/java/org/wikipedia/feed/FeedFragment.java 
b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
index 7af80b2..6601a92 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedFragment.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
@@ -271,6 +271,12 @@
         }
 
         @Override
+        public void onRetryFromOffline() {
+            funnel.requestMore(coordinator.getAge());
+            coordinator.moreFromOffline(app.getWikiSite());
+        }
+
+        @Override
         public void onError(@NonNull Throwable t) {
             FeedbackUtil.showError(getActivity(), t);
         }
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 e7fd770..d721e97 100644
--- a/app/src/main/java/org/wikipedia/feed/model/CardType.java
+++ b/app/src/main/java/org/wikipedia/feed/model/CardType.java
@@ -11,6 +11,7 @@
 import org.wikipedia.feed.mainpage.MainPageCardView;
 import org.wikipedia.feed.mostread.MostReadCardView;
 import org.wikipedia.feed.news.NewsListCardView;
+import org.wikipedia.feed.offline.OfflineCardView;
 import org.wikipedia.feed.progress.ProgressCardView;
 import org.wikipedia.feed.random.RandomCardView;
 import org.wikipedia.feed.searchbar.SearchCardView;
@@ -83,6 +84,11 @@
             return new AnnouncementCardView(ctx);
         }
     },
+    OFFLINE(98) {
+        @NonNull @Override public FeedCardView<?> newView(@NonNull Context 
ctx) {
+            return new OfflineCardView(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/offline/OfflineCard.java 
b/app/src/main/java/org/wikipedia/feed/offline/OfflineCard.java
new file mode 100644
index 0000000..2bd4212
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/offline/OfflineCard.java
@@ -0,0 +1,12 @@
+package org.wikipedia.feed.offline;
+
+import android.support.annotation.NonNull;
+
+import org.wikipedia.feed.model.Card;
+import org.wikipedia.feed.model.CardType;
+
+public class OfflineCard extends Card {
+    @NonNull @Override public CardType type() {
+        return CardType.OFFLINE;
+    }
+}
diff --git a/app/src/main/java/org/wikipedia/feed/offline/OfflineCardView.java 
b/app/src/main/java/org/wikipedia/feed/offline/OfflineCardView.java
new file mode 100644
index 0000000..a3f925d
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/offline/OfflineCardView.java
@@ -0,0 +1,39 @@
+package org.wikipedia.feed.offline;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.widget.LinearLayout;
+
+import org.wikipedia.R;
+import org.wikipedia.feed.model.Card;
+import org.wikipedia.feed.view.FeedAdapter;
+import org.wikipedia.feed.view.FeedCardView;
+
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+
+public class OfflineCardView extends LinearLayout implements 
FeedCardView<Card> {
+    @Nullable private FeedAdapter.Callback callback;
+
+    public OfflineCardView(Context context) {
+        super(context);
+        inflate(getContext(), R.layout.view_card_offline, this);
+        ButterKnife.bind(this);
+    }
+
+    @OnClick(R.id.view_card_offline_button_retry) void onRetryClick() {
+        if (callback != null) {
+            callback.onRetryFromOffline();
+        }
+    }
+
+    @Override public void setCallback(@Nullable FeedAdapter.Callback callback) 
{
+        this.callback = callback;
+    }
+
+    @Override public void setCard(@NonNull Card card) { }
+    @Override @Nullable public Card getCard() {
+        return null;
+    }
+}
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 0d6e1e9..e56f504 100644
--- a/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
+++ b/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
@@ -25,6 +25,7 @@
             AnnouncementCardView.Callback, FeaturedArticleCardView.Callback {
         void onShowCard(@Nullable Card card);
         void onRequestMore();
+        void onRetryFromOffline();
         void onError(@NonNull Throwable t);
     }
 
diff --git a/app/src/main/java/org/wikipedia/util/ThrowableUtil.java 
b/app/src/main/java/org/wikipedia/util/ThrowableUtil.java
index e2d8ed2..e01ec1a 100644
--- a/app/src/main/java/org/wikipedia/util/ThrowableUtil.java
+++ b/app/src/main/java/org/wikipedia/util/ThrowableUtil.java
@@ -83,7 +83,7 @@
         return result;
     }
 
-    public static boolean isOffline(@NonNull Throwable caught) {
+    public static boolean isOffline(@Nullable Throwable caught) {
         return caught instanceof UnknownHostException
                 || caught instanceof SocketException
                 || caught instanceof SocketTimeoutException;
diff --git a/app/src/main/res/layout/view_card_offline.xml 
b/app/src/main/res/layout/view_card_offline.xml
new file mode 100644
index 0000000..52eed58
--- /dev/null
+++ b/app/src/main/res/layout/view_card_offline.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_margin="12dp"
+    android:orientation="vertical"
+    android:gravity="center">
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:text="@string/view_offline_card_text"
+        android:textColor="@color/view_wiki_error_text_color"
+        android:textAlignment="center"
+        android:textSize="16sp" />
+
+    <TextView
+        android:id="@+id/view_card_offline_button_retry"
+        style="@style/Widget.AppCompat.Button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="8dp"
+        android:background="@android:color/white"
+        android:text="@string/page_error_retry"
+        android:minHeight="36dp"
+        android:textSize="14sp"
+        android:fontFamily="sans-serif-medium"
+        android:textColor="@color/view_wiki_error_text_color"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values-qq/strings.xml 
b/app/src/main/res/values-qq/strings.xml
index ba795cf..b335f91 100644
--- a/app/src/main/res/values-qq/strings.xml
+++ b/app/src/main/res/values-qq/strings.xml
@@ -482,6 +482,7 @@
 {{Identical|Today}}</string>
   <string name="view_announcement_card_negative_action">Button label that 
allows the user to decline the action that this card is requesting.
 {{Identical|No thanks}}</string>
+  <string name="view_offline_card_text">Message in the feed informing the user 
that additional content cannot be loaded while offline.</string>
   <string name="description_edit_text_hint">Hint text that is shown when the 
description field is empty.</string>
   <string name="description_edit_save">Hint for the button that is pressed for 
saving the new description.
 {{Identical|Publish}}</string>
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index a6ed98e..96e7674 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -370,6 +370,7 @@
     </plurals>
     <string name="view_continue_reading_card_subtitle_today">Today</string>
     <string name="view_announcement_card_negative_action">No thanks</string>
+    <string name="view_offline_card_text">Content cannot be loaded when 
offline.</string>
     <!-- /The Feed -->
 
     <!-- Description editing -->

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I3c5375d075fc4ae8f311a67f730835bc0cff3d8b
Gerrit-PatchSet: 2
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[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

Reply via email to