Brion VIBBER has submitted this change and it was merged.
Change subject: Add Site object, make it part of PageTitle
......................................................................
Add Site object, make it part of PageTitle
Change-Id: I5bc57d5a7c3e9948703f45b7ba27698237b36713
---
M
wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
M wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
A wikipedia/src/main/java/org/wikimedia/wikipedia/Site.java
M wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java
7 files changed, 136 insertions(+), 52 deletions(-)
Approvals:
Brion VIBBER: Verified; Looks good to me, approved
diff --git
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
index e5f149d..714c377 100644
---
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
+++
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageFetchTaskTests.java
@@ -2,11 +2,11 @@
import android.content.Intent;
import android.test.ActivityUnitTestCase;
-import android.util.Log;
import org.mediawiki.api.json.Api;
import org.wikimedia.wikipedia.Page;
import org.wikimedia.wikipedia.PageFetchTask;
import org.wikimedia.wikipedia.PageTitle;
+import org.wikimedia.wikipedia.Site;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -14,7 +14,8 @@
public class PageFetchTaskTests extends
ActivityUnitTestCase<TestDummyActivity> {
private static final int TASK_COMPLETION_TIMEOUT = 20000;
- private Api enwiki;
+ private Api enwikiAPI;
+ private Site enwiki;
public PageFetchTaskTests() {
super(TestDummyActivity.class);
@@ -23,7 +24,9 @@
@Override
public void setUp() throws Exception {
super.setUp();
- enwiki = new Api("en.wikipedia.org");
+ enwiki = new Site("en.wikipedia.org");
+ enwikiAPI = new Api("en.wikipedia.org");
+
startActivity(new Intent(), null, null);
}
@@ -32,7 +35,7 @@
runTestOnUiThread(new Runnable() {
@Override
public void run() {
- new PageFetchTask(enwiki, new PageTitle(null, "India")) {
+ new PageFetchTask(enwikiAPI, new PageTitle(null, "India",
enwiki)) {
@Override
public void onFinish(Page result) {
assertNotNull(result);
diff --git
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
index 8583d59..b4a70fd 100644
---
a/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
+++
b/wikipedia-it/src/main/java/org/wikimedia/wikipedia/test/PageTitleTests.java
@@ -2,23 +2,35 @@
import junit.framework.TestCase;
import org.wikimedia.wikipedia.PageTitle;
+import org.wikimedia.wikipedia.Site;
public class PageTitleTests extends TestCase {
public void testPrefixedText() throws Exception {
- assertEquals(new PageTitle(null, "Test title").getPrefixedText(),
"Test title");
- assertEquals(new PageTitle(null, "Test title").getPrefixedText(),
"Test title");
- assertEquals(new PageTitle("Talk", "Test title").getPrefixedText(),
"Talk:Test title");
- assertEquals(new PageTitle(null, "Test title").getText(), "Test
title");
+ Site enwiki = new Site("en.wikipedia.org");
+
+ assertEquals(new PageTitle(null, "Test title",
enwiki).getPrefixedText(), "Test title");
+ assertEquals(new PageTitle(null, "Test title",
enwiki).getPrefixedText(), "Test title");
+ assertEquals(new PageTitle("Talk", "Test title",
enwiki).getPrefixedText(), "Talk:Test title");
+ assertEquals(new PageTitle(null, "Test title", enwiki).getText(),
"Test title");
}
public void testFromInternalLink() throws Exception {
-
assertEquals(PageTitle.fromInternalLink("/wiki/India").getPrefixedText(),
"India");
- assertNull(PageTitle.fromInternalLink("/wiki/India").getNamespace());
+ Site enwiki = new Site("en.wikipedia.org");
-
assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India").getNamespace(),
"Talk");
- assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India").getText(),
"India");
+
assertEquals(enwiki.titleForInternalLink("/wiki/India").getPrefixedText(),
"India");
+ assertNull(enwiki.titleForInternalLink("/wiki/India").getNamespace());
-
assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India#History").getNamespace(),
"Talk");
-
assertEquals(PageTitle.fromInternalLink("/wiki/Talk:India#History").getText(),
"India");
+
assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India").getNamespace(),
"Talk");
+
assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India").getText(),
"India");
+
+
assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#History").getNamespace(),
"Talk");
+
assertEquals(enwiki.titleForInternalLink("/wiki/Talk:India#History").getText(),
"India");
+ }
+
+ public void testSite() throws Exception {
+ Site enwiki = new Site("en.wikipedia.org");
+
+ assertEquals(enwiki, new PageTitle(null, "Test", enwiki).getSite());
+ assertEquals(enwiki, new Site("en.wikipedia.org"));
}
}
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
index fb5cbd3..19a795d 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/LinkHandler.java
@@ -15,6 +15,7 @@
private final Context context;
private final CommunicationBridge bridge;
private final Bus bus;
+ private final WikipediaApp app;
public static class NewWikiPageNavigationEvent {
private final PageTitle title;
@@ -31,7 +32,8 @@
public LinkHandler(Context context, CommunicationBridge bridge) {
this.context = context;
this.bridge = bridge;
- this.bus = ((WikipediaApp)context.getApplicationContext()).getBus();
+ this.app = ((WikipediaApp)context.getApplicationContext());
+ this.bus = app.getBus();
this.bridge.addListener("linkClicked", this);
}
@@ -54,7 +56,7 @@
Log.d("Wikipedia", "Link clicked was " + href);
if (href.startsWith("/wiki/")) {
// TODO: Handle fragments
- bus.post(new
NewWikiPageNavigationEvent(PageTitle.fromInternalLink(href)));
+ bus.post(new
NewWikiPageNavigationEvent(app.getPrimarySite().titleForInternalLink(href)));
} else {
// Assume everything else is an external link... for now!
handleExternalLink(href);
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
index e08a5bf..9f30cd8 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageActivity.java
@@ -13,13 +13,15 @@
EditText pageNameText;
private Bus bus;
+ private WikipediaApp app;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
- bus = ((WikipediaApp)getApplicationContext()).getBus();
+ app = ((WikipediaApp)getApplicationContext());
+ bus = app.getBus();
bus.register(this);
pageGoButton = (Button) findViewById(R.id.pageGoButton);
@@ -28,7 +30,7 @@
pageGoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- PageTitle title = new PageTitle(null,
pageNameText.getText().toString());
+ PageTitle title = new PageTitle(null,
pageNameText.getText().toString(), app.getPrimarySite());
displayNewPage(title);
}
});
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
index 83e8313..5329803 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/PageTitle.java
@@ -3,9 +3,6 @@
import android.os.Parcel;
import android.os.Parcelable;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
/**
* Immutable value object representing the text of a page.
*
@@ -15,14 +12,20 @@
public class PageTitle implements Parcelable {
private final String namespace;
private final String text;
+ private final Site site;
- public PageTitle(final String namespace, final String text) {
+ public PageTitle(final String namespace, final String text, final Site
site) {
this.namespace = namespace;
this.text = text;
+ this.site = site;
}
public String getNamespace() {
return namespace;
+ }
+
+ public Site getSite() {
+ return site;
}
public String getText() {
@@ -52,40 +55,14 @@
private PageTitle(Parcel in) {
namespace = in.readString();
text = in.readString();
+ site = in.readParcelable(Site.class.getClassLoader());
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeString(namespace);
parcel.writeString(text);
+ parcel.writeParcelable(site, flags);
}
- /**
- * Regex to match internal relative wikilinks.
- *
- * Start with /wiki/, can contain a Namespace indicator and a fragment.
- * Capturing Group 1 is namespace (or null for no namespace). 2 is Page
Title text. 3 is Fragment.
- */
- public static Pattern internalLinkMatchPattern =
Pattern.compile("/wiki/(?:([^:]+):)?([^#]*)(?:#(.+))?");
-
- /**
- * Create a PageTitle object from an internal link string.
- *
- * @param internalLink Internal link target text (eg. /wiki/Target).
- * Should be URL decoded before passing in
- * @return A {@link PageTitle} object representing the internalLink passed
in.
- */
- public static PageTitle fromInternalLink(String internalLink) {
- //TODO: Do better validation of internal links!
- //TODO: Handle fragments better!
- Matcher matches = internalLinkMatchPattern.matcher(internalLink);
- if (matches.matches()) {
- String namespace = matches.group(1);
- String pageText = matches.group(2);
- return new PageTitle(namespace, pageText);
- } else {
- throw new RuntimeException("Did not match internalLinkPattern: "
+ internalLink);
- }
-
- }
}
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/Site.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/Site.java
new file mode 100644
index 0000000..806654c
--- /dev/null
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/Site.java
@@ -0,0 +1,80 @@
+package org.wikimedia.wikipedia;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.regex.*;
+
+/**
+ * Represents a particular Wikimedia project.
+ */
+public class Site implements Parcelable {
+ private final String domain;
+
+ public Site(String domain) {
+ this.domain = domain;
+ }
+
+ public Site(Parcel in) {
+ domain = in.readString();
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(domain);
+ }
+
+ public static final Parcelable.Creator<Site> CREATOR
+ = new Parcelable.Creator<Site>() {
+ public Site createFromParcel(Parcel in) {
+ return new Site(in);
+ }
+
+ public Site[] newArray(int size) {
+ return new Site[size];
+ }
+ };
+
+ @Override
+ public boolean equals(Object o) {
+ return ((Site)o).getDomain().equals(domain);
+ }
+
+ /**
+ * Regex to match internal relative wikilinks.
+ *
+ * Start with /wiki/, can contain a Namespace indicator and a fragment.
+ * Capturing Group 1 is namespace (or null for no namespace). 2 is Page
Title text. 3 is Fragment.
+ */
+ public static Pattern internalLinkMatchPattern =
Pattern.compile("/wiki/(?:([^:]+):)?([^#]*)(?:#(.+))?");
+
+ /**
+ * Create a PageTitle object from an internal link string.
+ *
+ * @param internalLink Internal link target text (eg. /wiki/Target).
+ * Should be URL decoded before passing in
+ * @return A {@link PageTitle} object representing the internalLink passed
in.
+ */
+ public PageTitle titleForInternalLink(String internalLink) {
+ //TODO: Do better validation of internal links!
+ //TODO: Handle fragments better!
+ Matcher matches = internalLinkMatchPattern.matcher(internalLink);
+ if (matches.matches()) {
+ String namespace = matches.group(1);
+ String pageText = matches.group(2);
+ return new PageTitle(namespace, pageText, this);
+ } else {
+ throw new RuntimeException("Did not match internalLinkPattern: "
+ internalLink);
+ }
+
+ }
+}
diff --git a/wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java
b/wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java
index c7da481..8d396a6 100644
--- a/wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java
+++ b/wikipedia/src/main/java/org/wikimedia/wikipedia/WikipediaApp.java
@@ -20,9 +20,17 @@
Api primarySiteAPI;
public Api getPrimarySiteAPI() {
if (primarySiteAPI == null) {
- //TODO: Make this configurable
- primarySiteAPI = new Api("en.wikipedia.org");
+ primarySiteAPI = new Api(getPrimarySite().getDomain());
}
return primarySiteAPI;
}
+
+ private Site primarySite;
+ public Site getPrimarySite() {
+ if (primarySite == null) {
+ // FIXME: Actually read from SharedPreferences or something
+ primarySite = new Site("en.wikipedia.org");
+ }
+ return primarySite;
+ }
}
--
To view, visit https://gerrit.wikimedia.org/r/93906
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I5bc57d5a7c3e9948703f45b7ba27698237b36713
Gerrit-PatchSet: 3
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits