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