Dbrant has uploaded a new change for review. (
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, 92 insertions(+), 77 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/95/394595/1
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..222b488 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(0).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..0ef9acc 100644
--- a/app/src/main/java/org/wikipedia/page/PageActivity.java
+++ b/app/src/main/java/org/wikipedia/page/PageActivity.java
@@ -89,6 +89,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 +323,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,11 +357,15 @@
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())) {
// do nothing, since this will be handled indirectly by
PageFragment.
@@ -444,6 +458,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 +470,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() {
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index 4ded429..8c49bd8 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -518,16 +518,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 +613,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 +647,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: newchange
Gerrit-Change-Id: I555a7d75a6bf1fb390c36439993649ff295ad960
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits