Mholloway has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/350659 )

Change subject: Insert OfflineCard when offline
......................................................................

Insert OfflineCard when offline

Appends the OfflineCard to the end of the feed when an offline exception
is thrown and halts further loading.

Bug: T157381
Change-Id: Ia0f6a996c23b17f4a27d25cf8e8068609d3eefdd
---
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/offline/OfflineCardView.java
M app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
M app/src/main/res/layout/view_card_offline.xml
5 files changed, 70 insertions(+), 8 deletions(-)


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

diff --git a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java 
b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
index 2bd5662..dd0bf69 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
@@ -10,6 +10,8 @@
 import org.wikipedia.feed.offline.OfflineCard;
 import org.wikipedia.feed.progress.ProgressCard;
 import org.wikipedia.settings.Prefs;
+import org.wikipedia.util.ThrowableUtil;
+import org.wikipedia.util.log.L;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -23,6 +25,7 @@
 
     public interface FeedUpdateListener {
         void insert(Card card, int pos);
+        void swap(Card card, int pos);
         void remove(Card card, int pos);
     }
 
@@ -64,11 +67,15 @@
         }
         pendingClients.clear();
         cards.clear();
-        insertCard(progressCard, 0);
     }
 
     public void more(@NonNull WikiSite wiki) {
         this.wiki = wiki;
+
+        if (cards.size() == 0) {
+            insertCard(progressCard, 0);
+        }
+
         if (cards.size() > 1) {
             currentAge++;
         }
@@ -97,12 +104,12 @@
         insertCard(card, position);
     }
 
-    void moreFromOffline(@NonNull WikiSite wiki) {
-        int lastIndex = cards.size() - 1;
-        Card card = cards.get(lastIndex);
+    void retryFromOffline(@NonNull WikiSite wiki) {
+        Card card = cards.get(lastIndex());
         if (card instanceof OfflineCard) {
-            removeCard(card, lastIndex);
+            swapCard(progressCard, lastIndex());
         }
+        currentAge--;
         more(wiki);
     }
 
@@ -110,6 +117,10 @@
 
     protected void addPendingClient(FeedClient client) {
         pendingClients.add(client);
+    }
+
+    private int lastIndex() {
+        return cards.size() - 1;
     }
 
     private void requestNextCard(@NonNull WikiSite wiki) {
@@ -140,8 +151,14 @@
         }
 
         @Override public void error(@NonNull Throwable caught) {
-            //noinspection ConstantConditions
-            requestNextCard(wiki);
+            if (ThrowableUtil.isOffline(caught)) {
+                appendCard(new OfflineCard());
+                removeProgressCard();
+            } else {
+                //noinspection ConstantConditions
+                requestNextCard(wiki);
+                L.w(caught);
+            }
         }
     }
 
@@ -157,6 +174,14 @@
         }
     }
 
+    private void swapCard(@NonNull Card card, int position) {
+        cards.remove(cards.get(position));
+        cards.add(position, card);
+        if (updateListener != null) {
+            updateListener.swap(card, position);
+        }
+    }
+
     private void removeCard(@NonNull Card card, int position) {
         cards.remove(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 6601a92..dabf4c0 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedFragment.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
@@ -122,6 +122,15 @@
                 }
             }
 
+            @Override public void swap(Card card, int pos) {
+                if (isAdded()) {
+                    swipeRefreshLayout.setRefreshing(false);
+                    if (feedView != null && feedAdapter != null) {
+                        feedAdapter.notifyItemChanged(pos);
+                    }
+                }
+            }
+
             @Override public void remove(Card card, int pos) {
                 if (isAdded()) {
                     swipeRefreshLayout.setRefreshing(false);
@@ -273,7 +282,7 @@
         @Override
         public void onRetryFromOffline() {
             funnel.requestMore(coordinator.getAge());
-            coordinator.moreFromOffline(app.getWikiSite());
+            coordinator.retryFromOffline(app.getWikiSite());
         }
 
         @Override
diff --git a/app/src/main/java/org/wikipedia/feed/offline/OfflineCardView.java 
b/app/src/main/java/org/wikipedia/feed/offline/OfflineCardView.java
index a3f925d..1a3e99d 100644
--- a/app/src/main/java/org/wikipedia/feed/offline/OfflineCardView.java
+++ b/app/src/main/java/org/wikipedia/feed/offline/OfflineCardView.java
@@ -4,16 +4,20 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.widget.LinearLayout;
+import android.widget.Space;
 
 import org.wikipedia.R;
 import org.wikipedia.feed.model.Card;
 import org.wikipedia.feed.view.FeedAdapter;
 import org.wikipedia.feed.view.FeedCardView;
 
+import butterknife.BindView;
 import butterknife.ButterKnife;
 import butterknife.OnClick;
 
 public class OfflineCardView extends LinearLayout implements 
FeedCardView<Card> {
+    @BindView(R.id.view_card_offline_top_padding) Space padding;
+
     @Nullable private FeedAdapter.Callback callback;
 
     public OfflineCardView(Context context) {
@@ -32,6 +36,19 @@
         this.callback = callback;
     }
 
+    // This view has a transparent background, so it'll need a little padding 
if it appears directly
+    // below the search card, so that it doesn't partially overlap the dark 
blue background.
+    public void setTopPadding() {
+        padding.setVisibility(VISIBLE);
+    }
+
+    // Hide the top padding when detached so that if this View is reused 
further down the feed, it
+    // won't have the leftover padding inappropriately.
+    @Override public void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        padding.setVisibility(GONE);
+    }
+
     @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 e56f504..c0eccc3 100644
--- a/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
+++ b/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
@@ -13,6 +13,7 @@
 import org.wikipedia.feed.model.Card;
 import org.wikipedia.feed.model.CardType;
 import org.wikipedia.feed.news.NewsListCardView;
+import org.wikipedia.feed.offline.OfflineCardView;
 import org.wikipedia.feed.searchbar.SearchCardView;
 import org.wikipedia.views.DefaultRecyclerAdapter;
 import org.wikipedia.views.DefaultViewHolder;
@@ -54,6 +55,10 @@
 
         //noinspection unchecked
         ((FeedCardView<Card>) view).setCard(item);
+
+        if (view instanceof OfflineCardView && position == 1) {
+            ((OfflineCardView) view).setTopPadding();
+        }
     }
 
     @Override public void onViewAttachedToWindow(DefaultViewHolder<T> holder) {
diff --git a/app/src/main/res/layout/view_card_offline.xml 
b/app/src/main/res/layout/view_card_offline.xml
index 52eed58..0f0ecfc 100644
--- a/app/src/main/res/layout/view_card_offline.xml
+++ b/app/src/main/res/layout/view_card_offline.xml
@@ -7,6 +7,12 @@
     android:orientation="vertical"
     android:gravity="center">
 
+    <Space
+        android:id="@+id/view_card_offline_top_padding"
+        android:layout_width="match_parent"
+        android:layout_height="36dp"
+        android:visibility="gone"/>
+
     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia0f6a996c23b17f4a27d25cf8e8068609d3eefdd
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