BearND has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/174365

Change subject: Add SuggestionsTask
......................................................................

Add SuggestionsTask

and refactor the getter for wikidataDescriptions

Change-Id: I3a05e9d66519a8da4d7b677282fea15b0f96573b
---
A wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java
A 
wikipedia-it/src/main/java/org/wikipedia/test/WikidataDescriptionFeederTests.java
A wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java
M wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java
A wikipedia/src/main/java/org/wikipedia/wikidata/WikidataDescriptionFeeder.java
5 files changed, 207 insertions(+), 41 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/65/174365/1

diff --git 
a/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java 
b/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java
new file mode 100644
index 0000000..d4ac13b
--- /dev/null
+++ b/wikipedia-it/src/main/java/org/wikipedia/test/SuggestionsTaskTests.java
@@ -0,0 +1,52 @@
+package org.wikipedia.test;
+
+import org.wikipedia.Site;
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.page.SuggestionsTask;
+import org.wikipedia.search.FullSearchResult;
+import android.content.Intent;
+import android.test.ActivityUnitTestCase;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests for getting suggestions for further reading.
+ */
+public class SuggestionsTaskTests extends 
ActivityUnitTestCase<TestDummyActivity> {
+    private static final int TASK_COMPLETION_TIMEOUT = 200000;
+    private static final int BATCH_SIZE = 3;
+    private static final Site SITE = new Site("test.wikipedia.org");
+
+    public SuggestionsTaskTests() {
+        super(TestDummyActivity.class);
+    }
+
+    public void testFullTextSearchWithResults() throws Throwable {
+        startActivity(new Intent(), null, null);
+        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);
+                        assertEquals(results.getResults().size(), BATCH_SIZE);
+
+                        for (FullSearchResult result : results.getResults()) {
+                            
assertFalse(result.getTitle().getPrefixedText().equals("Test"));
+                        }
+                        completionLatch.countDown();
+                    }
+                }.execute();
+            }
+        });
+        assertTrue(completionLatch.await(TASK_COMPLETION_TIMEOUT, 
TimeUnit.MILLISECONDS));
+    }
+}
diff --git 
a/wikipedia-it/src/main/java/org/wikipedia/test/WikidataDescriptionFeederTests.java
 
b/wikipedia-it/src/main/java/org/wikipedia/test/WikidataDescriptionFeederTests.java
new file mode 100644
index 0000000..fdf8033
--- /dev/null
+++ 
b/wikipedia-it/src/main/java/org/wikipedia/test/WikidataDescriptionFeederTests.java
@@ -0,0 +1,55 @@
+package org.wikipedia.test;
+
+import org.wikipedia.Site;
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.wikidata.WikidataDescriptionsTask;
+import org.wikipedia.wikidata.WikidataSite;
+import android.content.Intent;
+import android.test.ActivityUnitTestCase;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tests retrieval of Wikidata descriptions. Talks to wikidata.org.
+ */
+public class WikidataDescriptionFeederTests extends 
ActivityUnitTestCase<TestDummyActivity> {
+    private static final int TASK_COMPLETION_TIMEOUT = 200000;
+    private static final Site SITE = new WikidataSite();
+
+    public WikidataDescriptionFeederTests() {
+        super(TestDummyActivity.class);
+    }
+
+    public void testOneID() throws Throwable {
+        getWikidataDescriptions(new String[] {"Q42"});
+    }
+
+    public void testThreeIDs() throws Throwable {
+        getWikidataDescriptions(new String[] {"Q1", "Q2", "Q3"});
+    }
+
+    public void getWikidataDescriptions(final String[] ids) throws Throwable {
+        final ArrayList<String> idList = new 
ArrayList<String>(Arrays.asList(ids));
+        startActivity(new Intent(), null, null);
+        final CountDownLatch completionLatch = new CountDownLatch(1);
+        runTestOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                final WikipediaApp app = (WikipediaApp) 
getInstrumentation().getTargetContext().getApplicationContext();
+                new WikidataDescriptionsTask(app.getAPIForSite(SITE), "de", 
idList) {
+                    @Override
+                    public void onFinish(Map<String, String> descriptionsMap) {
+                        assertNotNull(descriptionsMap);
+                        assertEquals(descriptionsMap.size(), idList.size());
+                        completionLatch.countDown();
+                    }
+                }.execute();
+            }
+        });
+        assertTrue(completionLatch.await(TASK_COMPLETION_TIMEOUT, 
TimeUnit.MILLISECONDS));
+    }
+}
+
diff --git a/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java 
b/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java
new file mode 100644
index 0000000..cc41a87
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikipedia/page/SuggestionsTask.java
@@ -0,0 +1,40 @@
+package org.wikipedia.page;
+
+import org.wikipedia.Site;
+import org.wikipedia.search.FullSearchArticlesTask;
+import org.wikipedia.search.FullSearchResult;
+import org.mediawiki.api.json.Api;
+import org.mediawiki.api.json.ApiResult;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Task for getting suggestions for further reading.
+ * Take page title, run full text search with that query, get four results,
+ * show top three that aren't the actual page title in question.
+ */
+public class SuggestionsTask extends FullSearchArticlesTask {
+    private static final int MAX_SIZE = 3;
+    private static final int MAX_REQUESTED = MAX_SIZE + 1;
+    private final String title;
+
+    public SuggestionsTask(Api api, Site site, String title) {
+        super(api, site, title, MAX_REQUESTED, null);
+        this.title = title;
+    }
+
+    @Override
+    public FullSearchResults processResult(final ApiResult result) throws 
Throwable {
+        FullSearchResults searchResults = super.processResult(result);
+        List<FullSearchResult> filteredResults = new 
ArrayList<FullSearchResult>();
+        List<FullSearchResult> results = searchResults.getResults();
+        for (int i = 0, count = 0; i < MAX_REQUESTED && count < MAX_SIZE; i++) 
{
+            final FullSearchResult res = results.get(i);
+            if (!title.equalsIgnoreCase(res.getTitle().getPrefixedText())) {
+                filteredResults.add(res);
+                count++;
+            }
+        }
+        return new FullSearchResults(filteredResults, null, null);
+    }
+}
\ No newline at end of file
diff --git 
a/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java 
b/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java
index 02bb125..6646538 100644
--- a/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java
+++ b/wikipedia/src/main/java/org/wikipedia/search/FullSearchFragment.java
@@ -4,8 +4,7 @@
 import org.wikipedia.R;
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.page.PageActivity;
-import org.wikipedia.wikidata.WikidataDescriptionsTask;
-import org.wikipedia.wikidata.WikidataSite;
+import org.wikipedia.wikidata.WikidataDescriptionFeeder;
 import com.squareup.picasso.Picasso;
 import android.os.Bundle;
 import android.os.Handler;
@@ -24,7 +23,6 @@
 import android.widget.Toast;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 public class FullSearchFragment extends Fragment {
     private static final int BATCH_SIZE = 12;
@@ -186,7 +184,7 @@
                     searchResultsList.setVisibility(View.GONE);
                 } else {
                     searchResultsList.setVisibility(View.VISIBLE);
-                    getWikidataDescriptions(lastResults.getResults());
+                    
WikidataDescriptionFeeder.getWikidataDescriptions(lastResults.getResults(), 
app, (BaseAdapter) searchResultsList.getAdapter());
                 }
 
                 if (continueOffset == null) {
@@ -230,43 +228,6 @@
                 }
             }
         }).execute();
-    }
-
-    private void getWikidataDescriptions(List<FullSearchResult> results) {
-        List<String> idList = new ArrayList<String>();
-        for (FullSearchResult r : results) {
-            if (!TextUtils.isEmpty(r.getWikiBaseId())
-                    && app.getWikidataCache().get(r.getWikiBaseId()) == null) {
-                // not in our cache yet
-                idList.add(r.getWikiBaseId());
-            }
-        }
-        if (idList.isEmpty()) {
-            return;
-        }
-
-        WikidataDescriptionsTask descriptionTask = new 
WikidataDescriptionsTask(
-                app.getAPIForSite(new WikidataSite()),
-                app.getPrimaryLanguage(),
-                idList) {
-            @Override
-            public void onFinish(Map<String, String> result) {
-                for (Map.Entry<String, String> entry : result.entrySet()) {
-                    if (entry.getValue() == null) {
-                        continue;
-                    }
-                    app.getWikidataCache().put(entry.getKey(), 
entry.getValue());
-                }
-                ((BaseAdapter) 
searchResultsList.getAdapter()).notifyDataSetChanged();
-            }
-
-            @Override
-            public void onCatch(Throwable caught) {
-                // Don't actually do anything.
-                // Descriptions are expendable
-            }
-        };
-        descriptionTask.execute();
     }
 
     private final class SearchResultAdapter extends BaseAdapter {
diff --git 
a/wikipedia/src/main/java/org/wikipedia/wikidata/WikidataDescriptionFeeder.java 
b/wikipedia/src/main/java/org/wikipedia/wikidata/WikidataDescriptionFeeder.java
new file mode 100644
index 0000000..a6342b0
--- /dev/null
+++ 
b/wikipedia/src/main/java/org/wikipedia/wikidata/WikidataDescriptionFeeder.java
@@ -0,0 +1,58 @@
+package org.wikipedia.wikidata;
+
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.search.FullSearchResult;
+import android.text.TextUtils;
+import android.widget.BaseAdapter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Utility to add more entries to our shared WikidataCache.
+ */
+public class WikidataDescriptionFeeder {
+    // do not instantiate!
+    private WikidataDescriptionFeeder() {
+    }
+
+    /**
+     * Adds new description entries to our shared WikidataCache.
+     */
+    public static void getWikidataDescriptions(List<FullSearchResult> results, 
final WikipediaApp app, final BaseAdapter adapter) {
+        List<String> idList = new ArrayList<String>();
+        final WikidataCache cache = app.getWikidataCache();
+        for (FullSearchResult r : results) {
+            if (!TextUtils.isEmpty(r.getWikiBaseId()) && 
cache.get(r.getWikiBaseId()) == null) {
+                // not in our cache yet
+                idList.add(r.getWikiBaseId());
+            }
+        }
+        if (idList.isEmpty()) {
+            return;
+        }
+
+        WikidataDescriptionsTask descriptionTask = new 
WikidataDescriptionsTask(
+                app.getAPIForSite(new WikidataSite()),
+                app.getPrimaryLanguage(),
+                idList) {
+            @Override
+            public void onFinish(Map<String, String> result) {
+                for (Map.Entry<String, String> entry : result.entrySet()) {
+                    if (entry.getValue() == null) {
+                        continue;
+                    }
+                    cache.put(entry.getKey(), entry.getValue());
+                }
+                adapter.notifyDataSetChanged();
+            }
+
+            @Override
+            public void onCatch(Throwable caught) {
+                // Don't actually do anything.
+                // Descriptions are expendable
+            }
+        };
+        descriptionTask.execute();
+    }
+}

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3a05e9d66519a8da4d7b677282fea15b0f96573b
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: BearND <bsitzm...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to