jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/394595 )
Change subject: Make "Continue Reading" card load pages from existing tabs.
......................................................................
Make "Continue Reading" card load pages from existing tabs.
Bug: T180528
Change-Id: I555a7d75a6bf1fb390c36439993649ff295ad960
---
M app/src/main/java/org/wikipedia/feed/FeedFragment.java
M
app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
M
app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingCardView.java
M
app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
M app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
M app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
M app/src/main/java/org/wikipedia/main/MainFragment.java
M app/src/main/java/org/wikipedia/page/PageActivity.java
M app/src/main/java/org/wikipedia/page/PageFragment.java
M app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
10 files changed, 101 insertions(+), 103 deletions(-)
Approvals:
jenkins-bot: Verified
Cooltey: 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 4c60bea..a6d74c9 100644
--- a/app/src/main/java/org/wikipedia/feed/FeedFragment.java
+++ b/app/src/main/java/org/wikipedia/feed/FeedFragment.java
@@ -78,6 +78,7 @@
void onFeedSearchRequested();
void onFeedVoiceSearchRequested();
void onFeedSelectPage(HistoryEntry entry);
+ void onFeedSelectPageFromExistingTab(HistoryEntry entry);
void onFeedAddPageToList(HistoryEntry entry);
void onFeedAddFeaturedPageToList(FeaturedArticleCardView view,
HistoryEntry entry);
void onFeedRemovePageFromList(FeaturedArticleCardView view,
HistoryEntry entry);
@@ -347,6 +348,14 @@
}
@Override
+ public void onSelectPageFromExistingTab(@NonNull Card card, @NonNull
HistoryEntry entry) {
+ if (getCallback() != null) {
+ getCallback().onFeedSelectPageFromExistingTab(entry);
+ funnel.cardClicked(card.type());
+ }
+ }
+
+ @Override
public void onAddPageToList(@NonNull HistoryEntry entry) {
if (getCallback() != null) {
getCallback().onFeedAddPageToList(entry);
diff --git
a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
index 444c1b3..dff6ec1 100644
---
a/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
+++
b/app/src/main/java/org/wikipedia/feed/becauseyouread/BecauseYouReadCardView.java
@@ -60,7 +60,7 @@
@Override public void onClick(View view) {
if (getCallback() != null) {
- getCallback().onSelectPage(card, new
HistoryEntry(card.getPageTitle(),
+ getCallback().onSelectPageFromExistingTab(card, new
HistoryEntry(card.getPageTitle(),
HistoryEntry.SOURCE_FEED_BECAUSE_YOU_READ));
}
}
diff --git
a/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingCardView.java
b/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingCardView.java
index ad7409a..ffd7560 100644
---
a/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingCardView.java
+++
b/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingCardView.java
@@ -6,12 +6,17 @@
import android.view.View;
import org.wikipedia.R;
+import org.wikipedia.feed.model.Card;
import org.wikipedia.feed.view.ListCardView;
import org.wikipedia.history.HistoryEntry;
import org.wikipedia.views.ItemTouchHelperSwipeAdapter;
public class ContinueReadingCardView extends ListCardView<ContinueReadingCard>
implements ItemTouchHelperSwipeAdapter.SwipeableView {
+ public interface Callback {
+ void onSelectPageFromExistingTab(@NonNull Card card, @NonNull
HistoryEntry entry);
+ }
+
public ContinueReadingCardView(Context context) {
super(context);
}
@@ -47,7 +52,7 @@
@Override
public void onClick(View v) {
if (getCallback() != null && getCard() != null) {
- getCallback().onSelectPage(getCard(), new
HistoryEntry(getCard().pageTitle(),
+ getCallback().onSelectPageFromExistingTab(getCard(), new
HistoryEntry(getCard().pageTitle(),
HistoryEntry.SOURCE_FEED_CONTINUE_READING));
}
}
diff --git
a/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
b/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
index 61a3dbd..cbb1258 100644
---
a/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
+++
b/app/src/main/java/org/wikipedia/feed/continuereading/ContinueReadingClient.java
@@ -13,16 +13,13 @@
import java.util.Collections;
public class ContinueReadingClient implements FeedClient {
- private static final int MIN_DAYS_OLD = 1;
- private static final int MAX_DAYS_OLD = 30;
-
@Nullable private LastPageReadTask lastPageReadTask;
@Override
public void request(@NonNull Context context, @NonNull WikiSite wiki, int
age,
@NonNull final FeedClient.Callback cb) {
cancel();
- lastPageReadTask = new LastPageReadTask(context, age, MIN_DAYS_OLD,
MAX_DAYS_OLD) {
+ lastPageReadTask = new LastPageReadTask(age) {
@Override
public void onFinish(@Nullable HistoryEntry entry) {
cb.success(entry == null ? Collections.emptyList()
diff --git
a/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
b/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
index b62885c..7282730 100644
--- a/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
+++ b/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
@@ -1,74 +1,30 @@
package org.wikipedia.feed.continuereading;
-import android.content.ContentProviderClient;
-import android.content.Context;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.RemoteException;
-import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
-import android.text.format.DateUtils;
-import org.wikipedia.R;
import org.wikipedia.concurrency.SaneAsyncTask;
-import org.wikipedia.database.contract.PageHistoryContract;
-import org.wikipedia.database.contract.PageImageHistoryContract;
import org.wikipedia.history.HistoryEntry;
-import org.wikipedia.util.ContentProviderClientCompat;
+import org.wikipedia.page.PageBackStackItem;
+import org.wikipedia.page.tabs.Tab;
+import org.wikipedia.settings.Prefs;
-import java.util.Date;
+import java.util.List;
public class LastPageReadTask extends SaneAsyncTask<HistoryEntry> {
- @NonNull private final Context context;
private final int age;
- private final long earlierThanTime;
- private final long noEarlierThanTime;
- public LastPageReadTask(@NonNull Context context, int age, int minDaysOld,
int maxDaysOld) {
- this.context = context;
+ public LastPageReadTask(int age) {
this.age = age;
- earlierThanTime = new Date().getTime() - (minDaysOld *
DateUtils.DAY_IN_MILLIS);
- noEarlierThanTime = new Date().getTime() - (maxDaysOld *
DateUtils.DAY_IN_MILLIS);
}
@Nullable @Override public HistoryEntry performTask() throws Throwable {
- Cursor cursor = queryLastPage(earlierThanTime, noEarlierThanTime);
- if (cursor == null) {
- return null;
- }
-
- try {
- if (cursor.moveToPosition(age)) {
- HistoryEntry entry =
HistoryEntry.DATABASE_TABLE.fromCursor(cursor);
-
entry.getTitle().setThumbUrl(PageImageHistoryContract.Col.IMAGE_NAME.val(cursor));
- return entry;
+ List<Tab> tabList = Prefs.getTabs();
+ if (age < tabList.size()) {
+ List<PageBackStackItem> items = tabList.get(tabList.size() - age -
1).getBackStack();
+ if (!items.isEmpty()) {
+ return items.get(items.size() - 1).getHistoryEntry();
}
- } finally {
- cursor.close();
}
return null;
- }
-
- @Nullable private Cursor queryLastPage(long earlierThanTime, long
noEarlierThanTime) {
- ContentProviderClient client =
HistoryEntry.DATABASE_TABLE.acquireClient(context);
- try {
- Uri uri = PageHistoryContract.PageWithImage.URI;
- final String[] projection = null;
- final String selection = ":timestampCol < ? and :timestampCol >= ?
and :sourceCol != ? and :sourceCol != ? and :timeSpentCol >= ?"
- .replaceAll(":timestampCol",
PageHistoryContract.Col.TIMESTAMP.getName())
- .replaceAll(":sourceCol",
PageHistoryContract.Page.SOURCE.qualifiedName())
- .replaceAll(":timeSpentCol",
PageHistoryContract.Page.TIME_SPENT.qualifiedName());
- final String[] selectionArgs = {Long.toString(earlierThanTime),
- Long.toString(noEarlierThanTime),
- Integer.toString(HistoryEntry.SOURCE_MAIN_PAGE),
- Integer.toString(HistoryEntry.SOURCE_FEED_MAIN_PAGE),
-
Integer.toString(context.getResources().getInteger(R.integer.article_engagement_threshold_sec))};
- String order = PageHistoryContract.PageWithImage.ORDER_MRU + "
limit " + (age + 1);
- return client.query(uri, projection, selection, selectionArgs,
order);
- } catch (RemoteException e) {
- throw new RuntimeException(e);
- } finally {
- ContentProviderClientCompat.close(client);
- }
}
}
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 db3e9fd..d98cee7 100644
--- a/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
+++ b/app/src/main/java/org/wikipedia/feed/view/FeedAdapter.java
@@ -10,6 +10,7 @@
import org.wikipedia.feed.FeedCoordinatorBase;
import org.wikipedia.feed.announcement.AnnouncementCardView;
+import org.wikipedia.feed.continuereading.ContinueReadingCardView;
import org.wikipedia.feed.featured.FeaturedArticleCardView;
import org.wikipedia.feed.image.FeaturedImageCardView;
import org.wikipedia.feed.model.Card;
@@ -28,7 +29,8 @@
ListCardItemView.Callback, CardHeaderView.Callback,
FeaturedImageCardView.Callback, SearchCardView.Callback,
NewsListCardView.Callback,
AnnouncementCardView.Callback, FeaturedArticleCardView.Callback,
- RandomCardView.Callback, OfflineCompilationCardView.Callback,
ListCardView.Callback {
+ RandomCardView.Callback, OfflineCompilationCardView.Callback,
ListCardView.Callback,
+ ContinueReadingCardView.Callback {
void onShowCard(@Nullable Card card);
void onRequestMore();
void onRetryFromOffline();
diff --git a/app/src/main/java/org/wikipedia/main/MainFragment.java
b/app/src/main/java/org/wikipedia/main/MainFragment.java
index fdea05a..1002f4f 100644
--- a/app/src/main/java/org/wikipedia/main/MainFragment.java
+++ b/app/src/main/java/org/wikipedia/main/MainFragment.java
@@ -241,6 +241,10 @@
startActivity(PageActivity.newIntentForNewTab(getContext(), entry,
entry.getTitle()));
}
+ @Override public void onFeedSelectPageFromExistingTab(HistoryEntry entry) {
+ startActivity(PageActivity.newIntentForExistingTab(getContext(),
entry, entry.getTitle()));
+ }
+
@Override public void onFeedAddPageToList(HistoryEntry entry) {
bottomSheetPresenter.show(getChildFragmentManager(),
AddToReadingListDialog.newInstance(entry.getTitle(),
diff --git a/app/src/main/java/org/wikipedia/page/PageActivity.java
b/app/src/main/java/org/wikipedia/page/PageActivity.java
index b23a7d7..766da25 100644
--- a/app/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/app/src/main/java/org/wikipedia/page/PageActivity.java
@@ -46,11 +46,7 @@
import org.wikipedia.dataclient.WikiSite;
import org.wikipedia.descriptions.DescriptionEditRevertHelpView;
import org.wikipedia.events.ChangeTextSizeEvent;
-import org.wikipedia.feed.continuereading.ContinueReadingCard;
-import org.wikipedia.feed.continuereading.ContinueReadingClient;
-import org.wikipedia.feed.dataclient.FeedClient;
import org.wikipedia.feed.mainpage.MainPageClient;
-import org.wikipedia.feed.model.Card;
import org.wikipedia.gallery.GalleryActivity;
import org.wikipedia.history.HistoryEntry;
import org.wikipedia.language.LangLinksActivity;
@@ -73,8 +69,6 @@
import org.wikipedia.widgets.WidgetProviderFeaturedPage;
import org.wikipedia.wiktionary.WiktionaryDialog;
-import java.util.List;
-
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
@@ -89,6 +83,7 @@
public static final String ACTION_LOAD_IN_NEW_TAB =
"org.wikipedia.load_in_new_tab";
public static final String ACTION_LOAD_IN_CURRENT_TAB =
"org.wikipedia.load_in_current_tab";
+ public static final String ACTION_LOAD_FROM_EXISTING_TAB =
"org.wikipedia.load_from_existing_tab";
public static final String ACTION_SHOW_TAB_LIST =
"org.wikipedia.show_tab_list";
public static final String ACTION_RESUME_READING =
"org.wikipedia.resume_reading";
public static final String EXTRA_PAGETITLE = "org.wikipedia.pagetitle";
@@ -322,6 +317,15 @@
.putExtra(EXTRA_PAGETITLE, title);
}
+ public static Intent newIntentForExistingTab(@NonNull Context context,
+ @NonNull HistoryEntry entry,
+ @NonNull PageTitle title) {
+ return new Intent(ACTION_LOAD_FROM_EXISTING_TAB)
+ .setClass(context, PageActivity.class)
+ .putExtra(EXTRA_HISTORYENTRY, entry)
+ .putExtra(EXTRA_PAGETITLE, title);
+ }
+
@NonNull
public static Intent newIntentForTabList(@NonNull Context context) {
return new Intent(ACTION_SHOW_TAB_LIST).setClass(context,
PageActivity.class);
@@ -347,13 +351,18 @@
if (ACTION_LOAD_IN_NEW_TAB.equals(intent.getAction())) {
loadPageInForegroundTab(title, historyEntry);
} else if (ACTION_LOAD_IN_CURRENT_TAB.equals(intent.getAction())) {
- loadPageInCurrentTab(title, historyEntry);
+ loadPage(title, historyEntry, TabPosition.CURRENT_TAB);
}
if (intent.hasExtra(Constants.INTENT_EXTRA_REVERT_QNUMBER)) {
showDescriptionEditRevertDialog(intent.getStringExtra(Constants.INTENT_EXTRA_REVERT_QNUMBER));
}
+ } else if (ACTION_LOAD_FROM_EXISTING_TAB.equals(intent.getAction())) {
+ PageTitle title = intent.getParcelableExtra(EXTRA_PAGETITLE);
+ HistoryEntry historyEntry =
intent.getParcelableExtra(EXTRA_HISTORYENTRY);
+ loadPage(title, historyEntry, TabPosition.EXISTING_TAB);
} else if (ACTION_SHOW_TAB_LIST.equals(intent.getAction())
- || ACTION_RESUME_READING.equals(intent.getAction())) {
+ || ACTION_RESUME_READING.equals(intent.getAction())
+ ||
intent.hasExtra(Constants.INTENT_APP_SHORTCUT_CONTINUE_READING)) {
// do nothing, since this will be handled indirectly by
PageFragment.
} else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
@@ -363,8 +372,6 @@
} else if
(intent.hasExtra(Constants.INTENT_FEATURED_ARTICLE_FROM_WIDGET)) {
new IntentFunnel(app).logFeaturedArticleWidgetTap();
loadMainPageInForegroundTab();
- } else if
(intent.hasExtra(Constants.INTENT_APP_SHORTCUT_CONTINUE_READING)) {
- loadContinueReadingPage();
} else {
loadMainPageInCurrentTab();
}
@@ -444,6 +451,8 @@
pageFragment.loadPage(title, entry, true);
} else if (position == TabPosition.NEW_TAB_BACKGROUND) {
pageFragment.openInNewBackgroundTabFromMenu(title, entry);
+ } else if (position == TabPosition.EXISTING_TAB) {
+ pageFragment.openFromExistingTab(title, entry);
} else {
pageFragment.openInNewForegroundTabFromMenu(title, entry);
}
@@ -454,10 +463,6 @@
public void loadPageInForegroundTab(@NonNull PageTitle title, @NonNull
HistoryEntry entry) {
loadPage(title, entry, TabPosition.NEW_TAB_FOREGROUND);
- }
-
- public void loadPageInCurrentTab(@NonNull PageTitle title, @NonNull
HistoryEntry entry) {
- loadPage(title, entry, TabPosition.CURRENT_TAB);
}
public void loadMainPageInForegroundTab() {
@@ -476,21 +481,6 @@
PageTitle title = MainPageClient.getMainPageTitle();
HistoryEntry historyEntry = new HistoryEntry(title,
HistoryEntry.SOURCE_MAIN_PAGE);
loadPage(title, historyEntry, position);
- }
-
- private void loadContinueReadingPage() {
- new ContinueReadingClient().request(this, app.getWikiSite(), 1, new
FeedClient.Callback() {
- @Override
- public void success(@NonNull List<? extends Card> cards) {
- ContinueReadingCard card = (ContinueReadingCard) cards.get(0);
// top?
- loadPageInForegroundTab(card.pageTitle(), new
HistoryEntry(card.pageTitle(),
HistoryEntry.SOURCE_APP_SHORTCUT_CONTINUE_READING));
- }
-
- @Override
- public void error(@NonNull Throwable caught) {
- loadMainPageInForegroundTab();
- }
- });
}
public void showLinkPreview(@NonNull PageTitle title, int entrySource) {
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index 4ded429..34d80cb 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -417,7 +417,11 @@
pageFragmentLoadState.setUp(model, this, refreshView, webView, bridge,
leadImagesHandler, getCurrentTab().getBackStack());
if (shouldLoadFromBackstack(getActivity()) || savedInstanceState !=
null) {
- pageFragmentLoadState.loadFromBackStack();
+ if (!pageFragmentLoadState.backStackEmpty()) {
+ pageFragmentLoadState.loadFromBackStack();
+ } else {
+ loadMainPageInForegroundTab();
+ }
}
if (shouldShowTabList(getActivity())) {
@@ -440,7 +444,8 @@
private boolean shouldLoadFromBackstack(@NonNull Activity activity) {
return activity.getIntent() != null
&&
(ACTION_SHOW_TAB_LIST.equals(activity.getIntent().getAction())
- ||
ACTION_RESUME_READING.equals(activity.getIntent().getAction()));
+ ||
ACTION_RESUME_READING.equals(activity.getIntent().getAction())
+ ||
activity.getIntent().hasExtra(Constants.INTENT_APP_SHORTCUT_CONTINUE_READING));
}
private boolean shouldShowTabList(@NonNull Activity activity) {
@@ -518,16 +523,7 @@
@Override
public void onTabSelected(int position) {
- // move the selected tab to the bottom of the list, and navigate
to it!
- // (but only if it's a different tab than the one currently in
view!
- if (position != tabList.size() - 1) {
- Tab tab = tabList.remove(position);
- tabList.add(tab);
- tabsProvider.invalidate();
- pageFragmentLoadState.updateCurrentBackStackItem();
- pageFragmentLoadState.setBackStack(tab.getBackStack());
- pageFragmentLoadState.loadFromBackStack();
- }
+ setCurrentTab(position, true);
tabsProvider.exitTabMode();
tabFunnel.logSelect(tabList.size(), position);
leadImagesHandler.setAnimationPaused(false);
@@ -622,6 +618,21 @@
tabsProvider.invalidate();
}
+ private void setCurrentTab(int position, boolean updatePrevBackStackItem) {
+ // move the selected tab to the bottom of the list, and navigate to it!
+ // (but only if it's a different tab than the one currently in view!
+ if (position < tabList.size() - 1) {
+ Tab tab = tabList.remove(position);
+ tabList.add(tab);
+ tabsProvider.invalidate();
+ if (updatePrevBackStackItem) {
+ pageFragmentLoadState.updateCurrentBackStackItem();
+ }
+ pageFragmentLoadState.setBackStack(tab.getBackStack());
+ pageFragmentLoadState.loadFromBackStack();
+ }
+ }
+
public void openInNewBackgroundTabFromMenu(@NonNull PageTitle title,
@NonNull HistoryEntry entry) {
if (noPagesOpen()) {
openInNewForegroundTabFromMenu(title, entry);
@@ -641,6 +652,29 @@
tabFunnel.logOpenInNew(tabList.size());
}
+ public void openFromExistingTab(@NonNull PageTitle title, @NonNull
HistoryEntry entry) {
+ // find the tab in which this title appears...
+ int selectedTabPosition = -1;
+ for (Tab tab : tabList) {
+ for (PageBackStackItem item : tab.getBackStack()) {
+ if (item.getTitle().equals(title)) {
+ selectedTabPosition = tabList.indexOf(tab);
+ break;
+ }
+ }
+ }
+ if (selectedTabPosition == -1) {
+ // open the page anyway, in a new tab
+ openInNewForegroundTabFromMenu(title, entry);
+ return;
+ }
+ if (selectedTabPosition == tabList.size() - 1) {
+ pageFragmentLoadState.loadFromBackStack();
+ } else {
+ setCurrentTab(selectedTabPosition, false);
+ }
+ }
+
public void loadPage(@NonNull PageTitle title, @NonNull HistoryEntry
entry, boolean pushBackStack) {
//is the new title the same as what's already being displayed?
if (!getCurrentTab().getBackStack().isEmpty()
diff --git a/app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
b/app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
index 5ccbc05..d506db2 100644
--- a/app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
+++ b/app/src/main/java/org/wikipedia/page/tabs/TabsProvider.java
@@ -47,7 +47,8 @@
public enum TabPosition {
CURRENT_TAB,
NEW_TAB_BACKGROUND,
- NEW_TAB_FOREGROUND
+ NEW_TAB_FOREGROUND,
+ EXISTING_TAB
}
private PageFragment fragment;
--
To view, visit https://gerrit.wikimedia.org/r/394595
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I555a7d75a6bf1fb390c36439993649ff295ad960
Gerrit-PatchSet: 2
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Cooltey <[email protected]>
Gerrit-Reviewer: Sharvaniharan <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits