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