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

Reply via email to