Dbrant has submitted this change and it was merged.

Change subject: Display native Read more section
......................................................................


Display native Read more section

Hidden on Main page, since there we don't get useful results.
Hooked up backend task and event logging.

Change-Id: Idbe51ef33b24fd35383565b48331ef4461e4137e
---
M wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java
M wikipedia/res/layout/fragment_page.xml
M wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
M wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java
M 
wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
M wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java
6 files changed, 256 insertions(+), 26 deletions(-)

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



diff --git 
a/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java 
b/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java
index b143bfd..e1ae90d 100644
--- a/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java
+++ b/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java
@@ -4,9 +4,13 @@
 import org.wikipedia.Site;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.page.SuggestionsTask;
+import org.wikipedia.search.FullSearchArticlesTask;
 
 import android.content.Intent;
 import android.test.ActivityUnitTestCase;
+
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -18,23 +22,25 @@
     private static final int BATCH_SIZE = 3;
     private static final Site SITE = new Site("test.wikipedia.org");
 
+    private WikipediaApp app;
+
     public SuggestionsTaskTests() {
         super(TestDummyActivity.class);
     }
 
-    public void testFullTextSearchWithResults() throws Throwable {
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
         startActivity(new Intent(), null, null);
+        app = (WikipediaApp) 
getInstrumentation().getTargetContext().getApplicationContext();
+    }
+
+    public void testTask() throws Throwable {
         final CountDownLatch completionLatch = new CountDownLatch(1);
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
-                final WikipediaApp app = (WikipediaApp) 
getInstrumentation().getTargetContext().getApplicationContext();
                 new SuggestionsTask(app.getAPIForSite(SITE), SITE, "test") {
-                    @Override
-                    public void onCatch(Throwable caught) {
-                        super.onCatch(caught);
-                    }
-
                     @Override
                     public void onFinish(FullSearchResults results) {
                         assertNotNull(results);
@@ -50,4 +56,41 @@
         });
         assertTrue(completionLatch.await(TASK_COMPLETION_TIMEOUT, 
TimeUnit.MILLISECONDS));
     }
+
+    //
+    // unit tests:
+    //
+
+    public void testFilterNoResults() throws Throwable {
+        List<PageTitle> originalResults = new ArrayList<PageTitle>();
+        checkFilter(0, originalResults);
+    }
+
+    public void testFilter1ResultSameAsTitleIgnoreCase() throws Throwable {
+        List<PageTitle> originalResults = new ArrayList<PageTitle>();
+        originalResults.add(new PageTitle("Test", SITE, null, null));
+        checkFilter(0, originalResults);
+    }
+
+    public void testFilter1ResultDifferentFromTitle() throws Throwable {
+        List<PageTitle> originalResults = new ArrayList<PageTitle>();
+        originalResults.add(new PageTitle("something else", SITE, null, null));
+        checkFilter(1, originalResults);
+    }
+
+    public void testFilter4ResultsDifferentFromTitle() throws Throwable {
+        List<PageTitle> originalResults = new ArrayList<PageTitle>();
+        originalResults.add(new PageTitle("something else", SITE, null, null));
+        originalResults.add(new PageTitle("something else", SITE, null, null));
+        originalResults.add(new PageTitle("something else", SITE, null, null));
+        originalResults.add(new PageTitle("something else", SITE, null, null));
+        checkFilter(BATCH_SIZE, originalResults);
+    }
+
+    private void checkFilter(int expected, List<PageTitle> originalResults) {
+        SuggestionsTask task = new SuggestionsTask(app.getAPIForSite(SITE), 
SITE, "test");
+        FullSearchArticlesTask.FullSearchResults searchResults = new 
FullSearchArticlesTask.FullSearchResults(originalResults, null, null);
+        List<PageTitle> filteredList = 
task.filterResults(searchResults).getResults();
+        assertEquals(expected, filteredList.size());
+    }
 }
diff --git a/wikipedia/res/layout/fragment_page.xml 
b/wikipedia/res/layout/fragment_page.xml
index c17df72..402ca01 100644
--- a/wikipedia/res/layout/fragment_page.xml
+++ b/wikipedia/res/layout/fragment_page.xml
@@ -2,10 +2,11 @@
 
 <FrameLayout
     xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools";
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="?attr/page_background_color"
-    >
+    tools:context=".page.PageActivity">
     <org.wikipedia.views.DisableableDrawerLayout
             android:id="@+id/page_toc_drawer"
             android:layout_width="match_parent"
@@ -77,22 +78,44 @@
             <FrameLayout
                 android:id="@+id/bottom_content_container"
                 android:layout_width="match_parent"
-                android:layout_height="256dp"
+                android:layout_height="wrap_content"
                 android:orientation="vertical"
-                android:background="?attr/subtle_gray_color"
+                android:background="?attr/page_background_color"
                 android:layout_gravity="bottom"
                 android:visibility="invisible">
-                <View
+                <LinearLayout
+                    android:id="@+id/read_more_container"
                     android:layout_width="match_parent"
-                    android:layout_height="8dp"
-                    android:layout_gravity="top"
-                    android:background="@drawable/toolbar_bottom_shadow"/>
+                    android:layout_height="wrap_content"
+                    android:orientation="vertical">
+                    <TextView
+                        style="?android:textAppearanceLarge"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:paddingBottom="16dp"
+                        android:paddingLeft="16dp"
+                        android:paddingRight="16dp"
+                        android:fontFamily="serif"
+                        android:textSize="24sp"
+                        android:text="@string/read_more_section"
+                        />
+                    <ListView
+                        android:id="@+id/read_more_list"
+                        android:layout_width="match_parent"
+                        android:layout_height="320dp">
+                    </ListView>
+                </LinearLayout>
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     android:orientation="vertical"
-                    android:layout_gravity="bottom">
-                    <View android:layout_width="match_parent" 
android:layout_height="0.5dp" android:background="?attr/list_separator_color" />
+                    android:layout_gravity="bottom"
+                    android:background="?attr/subtle_gray_color">
+                    <View
+                        android:layout_width="match_parent"
+                        android:layout_height="8dp"
+                        android:layout_gravity="top"
+                        android:background="@drawable/toolbar_bottom_shadow"/>
 
                     <TextView
                         android:id="@+id/page_last_updated_text"
diff --git 
a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java 
b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
index f52185f..b6156fd 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/PageViewFragmentInternal.java
@@ -483,7 +483,8 @@
 
                 // create bottom content for this page...
                 new BottomContentHandler(parentFragment, bridge, webView, 
linkHandler,
-                        (ViewGroup) 
parentFragment.getView().findViewById(R.id.bottom_content_container));
+                        (ViewGroup) 
parentFragment.getView().findViewById(R.id.bottom_content_container),
+                        title, page.getPageProperties().isMainPage());
 
             }
         });
diff --git a/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java 
b/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java
index e87481a..0ba938a 100644
--- a/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java
+++ b/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java
@@ -26,10 +26,19 @@
 
     @Override
     public FullSearchResults processResult(final ApiResult result) throws 
Throwable {
-        FullSearchResults searchResults = super.processResult(result);
+        return filterResults(super.processResult(result));
+    }
+
+    /**
+     * Keep only top three entries that aren't the actual page title in 
question.
+     *
+     * @param searchResults original results from server
+     * @return filtered results
+     */
+    public FullSearchResults filterResults(FullSearchResults searchResults) {
         List<PageTitle> filteredResults = new ArrayList<PageTitle>();
         List<PageTitle> results = searchResults.getResults();
-        for (int i = 0, count = 0; i < MAX_REQUESTED && count < MAX_SIZE; i++) 
{
+        for (int i = 0, count = 0; i < results.size() && count < MAX_SIZE; 
i++) {
             final PageTitle res = results.get(i);
             if (!title.equalsIgnoreCase(res.getPrefixedText())) {
                 filteredResults.add(res);
diff --git 
a/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
 
b/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
index 8d594e7..86b1180 100644
--- 
a/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
+++ 
b/wikipedia/src/main/java/org/wikipedia/page/bottomcontent/BottomContentHandler.java
@@ -3,28 +3,51 @@
 import android.graphics.Point;
 import android.os.Build;
 import android.text.Html;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.webkit.WebView;
+import android.widget.AdapterView;
+import android.widget.BaseAdapter;
 import android.widget.FrameLayout;
+import android.widget.ImageView;
+import android.widget.ListView;
 import android.widget.TextView;
+
+import com.squareup.picasso.Picasso;
 
 import org.json.JSONException;
 import org.json.JSONObject;
+import org.wikipedia.PageTitle;
 import org.wikipedia.R;
 import org.wikipedia.Utils;
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.analytics.SuggestedPagesFunnel;
 import org.wikipedia.bridge.CommunicationBridge;
+import org.wikipedia.history.HistoryEntry;
 import org.wikipedia.page.LinkHandler;
 import org.wikipedia.page.LinkMovementMethodExt;
 import org.wikipedia.page.Page;
+import org.wikipedia.page.PageActivity;
 import org.wikipedia.page.PageViewFragment;
+import org.wikipedia.page.SuggestionsTask;
+import org.wikipedia.search.FullSearchArticlesTask;
 import org.wikipedia.views.ObservableWebView;
+import org.wikipedia.wikidata.WikidataCache;
+import org.wikipedia.wikidata.WikidataDescriptionFeeder;
+
+import java.util.List;
+import java.util.Map;
 
 public class BottomContentHandler implements 
ObservableWebView.OnScrollChangeListener {
     private final PageViewFragment parentFragment;
     private final CommunicationBridge bridge;
     private final WebView webView;
     private final LinkHandler linkHandler;
+    private final PageTitle pageTitle;
+    private final PageActivity activity;
+    private final WikipediaApp app;
 
     private int displayHeight;
     private float displayDensity;
@@ -34,11 +57,15 @@
     private TextView pageLicenseText;
 
     public BottomContentHandler(final PageViewFragment parentFragment, 
CommunicationBridge bridge,
-                        ObservableWebView webview, LinkHandler linkHandler, 
ViewGroup hidingView) {
+                                ObservableWebView webview, LinkHandler 
linkHandler, ViewGroup hidingView,
+                                PageTitle pageTitle, boolean isMainPage) {
         this.parentFragment = parentFragment;
         this.bridge = bridge;
         this.webView = webview;
         this.linkHandler = linkHandler;
+        this.pageTitle = pageTitle;
+        activity = parentFragment.getFragment().getActivity();
+        app = (WikipediaApp) activity.getApplicationContext();
         displayDensity = 
parentFragment.getResources().getDisplayMetrics().density;
 
         bottomContentContainer = hidingView;
@@ -60,7 +87,24 @@
                     .getWindowManager().getDefaultDisplay().getHeight() / 
displayDensity);
         }
 
-        layoutContent();
+        if (isMainPage) {
+            
bottomContentContainer.findViewById(R.id.read_more_container).setVisibility(View.GONE);
+        } else {
+            requestReadMoreItems(activity.getLayoutInflater());
+        }
+
+        setupAttribution();
+
+        // give it a chance to redraw, and then see if it fits
+        bottomContentContainer.post(new Runnable() {
+            @Override
+            public void run() {
+                if (!parentFragment.isAdded()) {
+                    return;
+                }
+                layoutContent();
+            }
+        });
     }
 
     @Override
@@ -93,6 +137,13 @@
         }
         bridge.sendMessage("setPaddingBottom", payload);
 
+        // and make it visible!
+        bottomContentContainer.setVisibility(View.VISIBLE);
+        // trigger a manual scroll event to update our position
+        onScrollChanged(webView.getScrollY(), webView.getScrollY());
+    }
+
+    private void setupAttribution() {
         Page page = parentFragment.getFragment().getPage();
         String lastUpdatedHtml = "<a href=\"" + 
page.getTitle().getUriForAction("history")
                 + "\">" + parentFragment.getString(R.string.last_updated_text,
@@ -102,10 +153,109 @@
         pageLastUpdatedText.setMovementMethod(new 
LinkMovementMethodExt(linkHandler));
         
pageLicenseText.setText(Html.fromHtml(parentFragment.getString(R.string.content_license_html)));
         pageLicenseText.setMovementMethod(new 
LinkMovementMethodExt(linkHandler));
+    }
 
-        // and make it visible!
-        bottomContentContainer.setVisibility(View.VISIBLE);
-        // trigger a manual scroll event to update our position
-        onScrollChanged(webView.getScrollY(), webView.getScrollY());
+    private void requestReadMoreItems(final LayoutInflater layoutInflater) {
+        new SuggestionsTask(app.getAPIForSite(pageTitle.getSite()), 
pageTitle.getSite(),
+                pageTitle.getPrefixedText()) {
+            @Override
+            public void onFinish(FullSearchResults results) {
+                setupReadMoreSection(bottomContentContainer, layoutInflater, 
results);
+            }
+
+            @Override
+            public void onCatch(Throwable caught) {
+                super.onCatch(caught);
+            }
+        }.execute();
+    }
+
+    private void setupReadMoreSection(View parentView, LayoutInflater 
layoutInflater,
+                                      final 
FullSearchArticlesTask.FullSearchResults results) {
+        final SuggestedPagesFunnel funnel = new SuggestedPagesFunnel(app, 
pageTitle.getSite());
+        final ReadMoreAdapter adapter = new ReadMoreAdapter(layoutInflater, 
results.getResults());
+        ListView list = (ListView) 
parentView.findViewById(R.id.read_more_list);
+        list.setAdapter(adapter);
+        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int 
position, long id) {
+                PageTitle title = (PageTitle) adapter.getItem(position);
+                HistoryEntry historyEntry = new HistoryEntry(title, 
HistoryEntry.SOURCE_INTERNAL_LINK);
+                // always add the description of the item to the cache so we 
don't even try to get it again
+                app.getWikidataCache().put(title.toString(), 
title.getDescription());
+                activity.displayNewPage(title, historyEntry);
+                funnel.logSuggestionClicked(pageTitle, 
results.getPageTitles(), position);
+            }
+        });
+
+        
WikidataDescriptionFeeder.retrieveWikidataDescriptions(results.getResults(), 
app,
+                new WikidataCache.OnWikidataReceiveListener() {
+                    @Override
+                    public void onWikidataReceived(Map<PageTitle, String> 
result) {
+                        adapter.notifyDataSetChanged();
+                    }
+
+                    @Override
+                    public void onWikidataFailed(Throwable caught) {
+                        // Don't actually do anything.
+                        // Descriptions are expendable
+                    }
+                });
+
+        funnel.logSuggestionsShown(pageTitle, results.getPageTitles());
+    }
+
+    private final class ReadMoreAdapter extends BaseAdapter {
+        private final LayoutInflater inflater;
+        private final List<PageTitle> results;
+
+        private ReadMoreAdapter(LayoutInflater inflater, List<PageTitle> 
results) {
+            this.inflater = inflater;
+            this.results = results;
+        }
+
+        @Override
+        public int getCount() {
+            return results == null ? 0 : results.size();
+        }
+
+        @Override
+        public Object getItem(int position) {
+            return results.get(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            if (convertView == null) {
+                convertView = inflater.inflate(R.layout.item_search_result, 
parent, false);
+            }
+            TextView pageTitleText = (TextView) 
convertView.findViewById(R.id.result_title);
+            PageTitle result = (PageTitle) getItem(position);
+            pageTitleText.setText(result.getDisplayText());
+
+            TextView descriptionText = (TextView) 
convertView.findViewById(R.id.result_description);
+            descriptionText.setText(result.getDescription());
+
+            ImageView imageView = (ImageView) 
convertView.findViewById(R.id.result_image);
+            String thumbnail = result.getThumbUrl();
+            if (thumbnail == null) {
+                Picasso.with(parent.getContext())
+                        .load(R.drawable.ic_pageimage_placeholder)
+                        .into(imageView);
+            } else {
+                Picasso.with(parent.getContext())
+                        .load(thumbnail)
+                        .placeholder(R.drawable.ic_pageimage_placeholder)
+                        .error(R.drawable.ic_pageimage_placeholder)
+                        .into(imageView);
+            }
+
+            return convertView;
+        }
     }
 }
diff --git 
a/wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java 
b/wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java
index fff0ade..ef53574 100644
--- a/wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java
+++ b/wikipedia/src/main/java/org/wikipedia/search/FullSearchArticlesTask.java
@@ -145,7 +145,7 @@
         return new FullSearchResults(Collections.<PageTitle>emptyList(), null, 
"");
     }
 
-    public class FullSearchResults {
+    public static class FullSearchResults {
         private ContinueOffset continueOffset;
         private List<PageTitle> resultsList;
         private String suggestion;
@@ -169,6 +169,10 @@
         public List<PageTitle> getResults() {
             return resultsList;
         }
+
+        public List<PageTitle> getPageTitles() {
+            return resultsList;
+        }
     }
 
     public final class ContinueOffset {

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Idbe51ef33b24fd35383565b48331ef4461e4137e
Gerrit-PatchSet: 10
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: BearND <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to