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

Change subject: Compilations: Feed card to indicate offline state.
......................................................................


Compilations: Feed card to indicate offline state.

The card will be shown automatically if the device goes offline while in
the Explore feed.

The "My Compilations" button is not yet hooked up to anything.

Bug: T163595
Change-Id: I6186f544cf53f16bddfd280571da501c28f53c09
---
M app/src/main/java/org/wikipedia/activity/BaseActivity.java
M app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
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/OfflineCompilationCard.java
A app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationCardView.java
A app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationClient.java
M app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
M app/src/main/java/org/wikipedia/main/MainActivity.java
M app/src/main/java/org/wikipedia/main/MainFragment.java
M app/src/main/java/org/wikipedia/page/PageActivity.java
A app/src/main/res/drawable/ic_offline_white_24dp.xml
A app/src/main/res/layout/view_card_offline_compilation.xml
M app/src/main/res/values-qq/strings.xml
M app/src/main/res/values/strings.xml
16 files changed, 199 insertions(+), 18 deletions(-)

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



diff --git a/app/src/main/java/org/wikipedia/activity/BaseActivity.java 
b/app/src/main/java/org/wikipedia/activity/BaseActivity.java
index ef253d4..78a6b45 100644
--- a/app/src/main/java/org/wikipedia/activity/BaseActivity.java
+++ b/app/src/main/java/org/wikipedia/activity/BaseActivity.java
@@ -51,6 +51,10 @@
         }
     }
 
+    public void updateOfflineCompilations() {
+        searchOfflineCompilationsWithPermission(true);
+    }
+
     protected void requestFullUserOrientation() {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
             setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
@@ -104,7 +108,6 @@
     }
 
     protected void onGoOffline() {
-        searchOfflineCompilationsWithPermission(false);
     }
 
     protected void onGoOnline() {
diff --git a/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java 
b/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
index e8a850a..2012a1c 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinator.java
@@ -8,8 +8,10 @@
 import org.wikipedia.feed.becauseyouread.BecauseYouReadClient;
 import org.wikipedia.feed.continuereading.ContinueReadingClient;
 import org.wikipedia.feed.mainpage.MainPageClient;
+import org.wikipedia.feed.offline.OfflineCompilationClient;
 import org.wikipedia.feed.random.RandomClient;
 import org.wikipedia.feed.searchbar.SearchClient;
+import org.wikipedia.util.DeviceUtil;
 
 class FeedCoordinator extends FeedCoordinatorBase {
 
@@ -19,18 +21,18 @@
 
     @Override
     protected void buildScript(int age) {
-        if (age == 0) {
-            addPendingClient(new SearchClient());
-            addPendingClient(new AnnouncementClient());
-        }
-        addPendingClient(new AggregatedFeedContentClient());
+        boolean online = DeviceUtil.isOnline();
+
+        conditionallyAddPendingClient(new SearchClient(), age == 0);
+        conditionallyAddPendingClient(new OfflineCompilationClient(), age == 0 
&& !online);
+        conditionallyAddPendingClient(new AnnouncementClient(), age == 0 && 
online);
+        conditionallyAddPendingClient(new AggregatedFeedContentClient(), 
online);
         addPendingClient(new ContinueReadingClient());
-        if (age == 0) {
-            addPendingClient(new MainPageClient());
-        }
-        addPendingClient(new BecauseYouReadClient());
-        if (age == 0) {
-            addPendingClient(new RandomClient());
-        }
+
+        // TODO: enable this for offline when ready:
+        conditionallyAddPendingClient(new MainPageClient(), age == 0 && 
online);
+
+        conditionallyAddPendingClient(new BecauseYouReadClient(), online);
+        conditionallyAddPendingClient(new RandomClient(), age == 0);
     }
 }
diff --git a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java 
b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
index b7d850e..cddf45a 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedCoordinatorBase.java
@@ -116,6 +116,12 @@
         pendingClients.add(client);
     }
 
+    void conditionallyAddPendingClient(FeedClient client, boolean condition) {
+        if (condition) {
+            pendingClients.add(client);
+        }
+    }
+
     // Call to kick off the request chain or to retry a failed request.  To 
move to the next pending
     // client, call requestNextCard.
     private void requestCard(@NonNull WikiSite wiki) {
diff --git a/app/src/main/java/org/wikipedia/feed/FeedFragment.java 
b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
index 62a1a65..471a7a9 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedFragment.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
@@ -20,6 +20,7 @@
 import org.wikipedia.BuildConfig;
 import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
+import org.wikipedia.activity.BaseActivity;
 import org.wikipedia.activity.FragmentUtil;
 import org.wikipedia.analytics.FeedFunnel;
 import org.wikipedia.feed.featured.FeaturedArticleCard;
@@ -33,6 +34,7 @@
 import org.wikipedia.history.HistoryEntry;
 import org.wikipedia.settings.Prefs;
 import org.wikipedia.settings.SettingsActivity;
+import org.wikipedia.util.DeviceUtil;
 import org.wikipedia.util.FeedbackUtil;
 import org.wikipedia.util.ResourceUtil;
 import org.wikipedia.util.ThrowableUtil;
@@ -105,10 +107,10 @@
         swipeRefreshLayout.setOnRefreshListener(new 
SwipeRefreshLayout.OnRefreshListener() {
             @Override
             public void onRefresh() {
-                funnel.refresh(coordinator.getAge());
-                coordinator.reset();
-                feedAdapter.notifyDataSetChanged();
-                coordinator.more(app.getWikiSite());
+                if (!DeviceUtil.isOnline()) {
+                    ((BaseActivity) getActivity()).updateOfflineCompilations();
+                }
+                refresh();
             }
         });
 
@@ -249,6 +251,17 @@
     @Override
     public boolean onBackPressed() {
         return false;
+    }
+
+    public void onOfflineCompilationsFound() {
+        refresh();
+    }
+
+    private void refresh() {
+        funnel.refresh(coordinator.getAge());
+        coordinator.reset();
+        feedAdapter.notifyDataSetChanged();
+        coordinator.more(app.getWikiSite());
     }
 
     @Nullable private Callback getCallback() {
@@ -397,6 +410,10 @@
             });
             snackbar.show();
         }
+
+        public void onViewCompilations() {
+            // TODO
+        }
     }
 
     private class FeedScrollListener extends RecyclerView.OnScrollListener {
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 d721e97..f5e8c1e 100644
--- a/app/src/main/java/org/wikipedia/feed/model/CardType.java
+++ b/app/src/main/java/org/wikipedia/feed/model/CardType.java
@@ -12,6 +12,7 @@
 import org.wikipedia.feed.mostread.MostReadCardView;
 import org.wikipedia.feed.news.NewsListCardView;
 import org.wikipedia.feed.offline.OfflineCardView;
+import org.wikipedia.feed.offline.OfflineCompilationCardView;
 import org.wikipedia.feed.progress.ProgressCardView;
 import org.wikipedia.feed.random.RandomCardView;
 import org.wikipedia.feed.searchbar.SearchCardView;
@@ -84,6 +85,11 @@
             return new AnnouncementCardView(ctx);
         }
     },
+    OFFLINE_COMPILATION(16) {
+        @NonNull @Override public FeedCardView<?> newView(@NonNull Context 
ctx) {
+            return new OfflineCompilationCardView(ctx);
+        }
+    },
     OFFLINE(98) {
         @NonNull @Override public FeedCardView<?> newView(@NonNull Context 
ctx) {
             return new OfflineCardView(ctx);
diff --git 
a/app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationCard.java 
b/app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationCard.java
new file mode 100644
index 0000000..02d05c3
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationCard.java
@@ -0,0 +1,17 @@
+package org.wikipedia.feed.offline;
+
+import android.support.annotation.NonNull;
+
+import org.wikipedia.feed.model.Card;
+import org.wikipedia.feed.model.CardType;
+
+public class OfflineCompilationCard extends Card {
+    @Override @NonNull
+    public String title() {
+        return "";
+    }
+
+    @NonNull @Override public CardType type() {
+        return CardType.OFFLINE_COMPILATION;
+    }
+}
diff --git 
a/app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationCardView.java 
b/app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationCardView.java
new file mode 100644
index 0000000..2786909
--- /dev/null
+++ 
b/app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationCardView.java
@@ -0,0 +1,28 @@
+package org.wikipedia.feed.offline;
+
+import android.content.Context;
+
+import org.wikipedia.R;
+import org.wikipedia.feed.view.DefaultFeedCardView;
+
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+
+public class OfflineCompilationCardView extends 
DefaultFeedCardView<OfflineCard> {
+
+    public interface Callback {
+        void onViewCompilations();
+    }
+
+    public OfflineCompilationCardView(Context context) {
+        super(context);
+        inflate(getContext(), R.layout.view_card_offline_compilation, this);
+        ButterKnife.bind(this);
+    }
+
+    @OnClick(R.id.view_offline_action_my_compilations) void 
onViewCompilationsClick() {
+        if (getCallback() != null) {
+            getCallback().onViewCompilations();
+        }
+    }
+}
diff --git 
a/app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationClient.java 
b/app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationClient.java
new file mode 100644
index 0000000..d190054
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/feed/offline/OfflineCompilationClient.java
@@ -0,0 +1,22 @@
+package org.wikipedia.feed.offline;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+
+import org.wikipedia.dataclient.WikiSite;
+import org.wikipedia.feed.dataclient.FeedClient;
+import org.wikipedia.feed.model.Card;
+
+import java.util.Collections;
+
+public class OfflineCompilationClient implements FeedClient {
+    @Override
+    public void request(@NonNull Context context, @NonNull WikiSite wiki, int 
age,
+                        @NonNull final FeedClient.Callback cb) {
+        cb.success(Collections.singletonList((Card) new 
OfflineCompilationCard()));
+    }
+
+    @Override
+    public void cancel() {
+    }
+}
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 da6898b..e27e567 100644
--- a/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
+++ b/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
@@ -14,6 +14,7 @@
 import org.wikipedia.feed.model.CardType;
 import org.wikipedia.feed.news.NewsListCardView;
 import org.wikipedia.feed.offline.OfflineCardView;
+import org.wikipedia.feed.offline.OfflineCompilationCardView;
 import org.wikipedia.feed.random.RandomCardView;
 import org.wikipedia.feed.searchbar.SearchCardView;
 import org.wikipedia.views.DefaultRecyclerAdapter;
@@ -25,7 +26,7 @@
             ListCardItemView.Callback, CardHeaderView.Callback,
             FeaturedImageCardView.Callback, SearchCardView.Callback, 
NewsListCardView.Callback,
             AnnouncementCardView.Callback, FeaturedArticleCardView.Callback,
-            RandomCardView.Callback {
+            RandomCardView.Callback, OfflineCompilationCardView.Callback {
         void onShowCard(@Nullable Card card);
         void onRequestMore();
         void onRetryFromOffline();
diff --git a/app/src/main/java/org/wikipedia/main/MainActivity.java 
b/app/src/main/java/org/wikipedia/main/MainActivity.java
index d776a81..f6c4fb3 100644
--- a/app/src/main/java/org/wikipedia/main/MainActivity.java
+++ b/app/src/main/java/org/wikipedia/main/MainActivity.java
@@ -84,6 +84,11 @@
     }
 
     @Override
+    protected void onOfflineCompilationsFound() {
+        getFragment().onOfflineCompilationsFound();
+    }
+
+    @Override
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
         setIntent(intent);
@@ -91,6 +96,11 @@
     }
 
     @Override
+    protected void onGoOffline() {
+        searchOfflineCompilationsWithPermission(false);
+    }
+
+    @Override
     public void onBackPressed() {
         if (getFragment().onBackPressed()) {
             return;
diff --git a/app/src/main/java/org/wikipedia/main/MainFragment.java 
b/app/src/main/java/org/wikipedia/main/MainFragment.java
index 7f6ab17..66d8d9c 100644
--- a/app/src/main/java/org/wikipedia/main/MainFragment.java
+++ b/app/src/main/java/org/wikipedia/main/MainFragment.java
@@ -424,6 +424,13 @@
         tabLayout.setVisibility(visible ? View.VISIBLE : View.GONE);
     }
 
+    public void onOfflineCompilationsFound() {
+        Fragment fragment = ((NavTabFragmentPagerAdapter) 
viewPager.getAdapter()).getCurrentFragment();
+        if (fragment instanceof FeedFragment) {
+            ((FeedFragment) fragment).onOfflineCompilationsFound();
+        }
+    }
+
     @OnPageChange(R.id.fragment_main_view_pager) void onTabChanged(int 
position) {
         Callback callback = callback();
         if (callback != null) {
diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.java 
b/app/src/main/java/org/wikipedia/page/PageActivity.java
index eccc44a..14961e1 100644
--- a/app/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/app/src/main/java/org/wikipedia/page/PageActivity.java
@@ -268,6 +268,11 @@
         handleIntent(intent);
     }
 
+    @Override
+    protected void onGoOffline() {
+        searchOfflineCompilationsWithPermission(false);
+    }
+
     private void handleIntent(@NonNull Intent intent) {
         if (Intent.ACTION_VIEW.equals(intent.getAction()) && intent.getData() 
!= null) {
             WikiSite wiki = new WikiSite(intent.getData().getAuthority());
diff --git a/app/src/main/res/drawable/ic_offline_white_24dp.xml 
b/app/src/main/res/drawable/ic_offline_white_24dp.xml
new file mode 100644
index 0000000..c2953f8
--- /dev/null
+++ b/app/src/main/res/drawable/ic_offline_white_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="#FFFFFFFF"
+        android:pathData="M17.56,14.24c0.28,-0.69 0.44,-1.45 0.44,-2.24 
0,-3.31 -2.69,-6 -6,-6 -0.79,0 -1.55,0.16 -2.24,0.44l1.62,1.62c0.2,-0.03 
0.41,-0.06 0.62,-0.06 2.21,0 4,1.79 4,4 0,0.21 -0.02,0.42 
-0.05,0.63l1.61,1.61zM12,4c4.42,0 8,3.58 8,8 0,1.35 -0.35,2.62 
-0.95,3.74l1.47,1.47C21.46,15.69 22,13.91 22,12c0,-5.52 -4.48,-10 -10,-10 
-1.91,0 -3.69,0.55 -5.21,1.47l1.46,1.46C9.37,4.34 10.65,4 
12,4zM3.27,2.5L2,3.77l2.1,2.1C2.79,7.57 2,9.69 2,12c0,3.7 2.01,6.92 
4.99,8.65l1,-1.73C5.61,17.53 4,14.96 4,12c0,-1.76 0.57,-3.38 
1.53,-4.69l1.43,1.44C6.36,9.68 6,10.8 6,12c0,2.22 1.21,4.15 
3,5.19l1,-1.74c-1.19,-0.7 -2,-1.97 -2,-3.45 0,-0.65 0.17,-1.25 
0.44,-1.79l1.58,1.58L10,12c0,1.1 0.9,2 2,2l0.21,-0.02 0.01,0.01 
7.51,7.51L21,20.23 4.27,3.5l-1,-1z"/>
+</vector>
diff --git a/app/src/main/res/layout/view_card_offline_compilation.xml 
b/app/src/main/res/layout/view_card_offline_compilation.xml
new file mode 100644
index 0000000..1d9e1a1
--- /dev/null
+++ b/app/src/main/res/layout/view_card_offline_compilation.xml
@@ -0,0 +1,44 @@
+<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:id="@+id/offline_container"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/green50"
+    android:orientation="vertical">
+
+    <ImageView
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:layout_margin="16dp"
+        app:srcCompat="@drawable/ic_offline_white_24dp"
+        android:tint="@android:color/white"
+        android:contentDescription="@null" />
+
+    <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:paddingLeft="16dp"
+        android:paddingRight="16dp"
+        android:lineSpacingMultiplier="1.2"
+        android:text="@string/offline_card_text"
+        android:textColor="@android:color/white" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:layout_marginTop="16dp"
+        android:background="@color/white_translucent_40"/>
+
+    <TextView
+        android:id="@+id/view_offline_action_my_compilations"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="4dp"
+        android:layout_marginRight="4dp"
+        style="@style/Widget.AppCompat.Button.Borderless"
+        android:textColor="@android:color/white"
+        android:text="@string/offline_my_compilations"/>
+
+</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 39255fd..796749e 100644
--- a/app/src/main/res/values-qq/strings.xml
+++ b/app/src/main/res/values-qq/strings.xml
@@ -415,6 +415,8 @@
   <string name="description_edit_revert_reason2">Reason for an edit being 
reverted, because it looks like vandalism.</string>
   <string name="description_edit_revert_history">Message that allows the user 
to go to the edit history associated with the article. (Please preserve the 
anchor tag in its exact form)</string>
   <string name="offline_read_permission_rationale">Message explaining why we 
need permission to access the device storage when reading articles in offline 
mode.</string>
+  <string name="offline_card_text">Message shown in the Feed card that informs 
the user that they are now browsing Wikipedia in offline mode.</string>
+  <string name="offline_my_compilations">Button label for the user to access 
their list of compilations.</string>
   <string name="onboarding_skip">Button label to skip the current onboarding 
or tutorial screen.\n{{Identical|Skip}}</string>
   <string name="onboarding_continue">Button label to continue to the next 
onboarding or tutorial screen.\n{{Identical|Continue}}</string>
   <string name="onboarding_get_started">Button label to finish the current 
onboarding or tutorial workflow.\n{{Identical|Get started}}</string>
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index 470fc9d..ab12250 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -469,6 +469,8 @@
 
     <!-- Offline -->
     <string name="offline_read_permission_rationale">Permission to access 
storage on your device is required for offline browsing. Please try again, and 
grant the requested permission.</string>
+    <string name="offline_card_text">You are now browsing Wikipedia in offline 
mode. Please note that offline articles may not be fully up to date with the 
online version.</string>
+    <string name="offline_my_compilations">My compilations</string>
     <!-- /Offline -->
 
     <!-- Onboarding -->

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I6186f544cf53f16bddfd280571da501c28f53c09
Gerrit-PatchSet: 4
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <dbr...@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

Reply via email to