Mholloway has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/331824 )

Change subject: Handle new Parsoid reference links
......................................................................

Handle new Parsoid reference links

Parsoid recently changed the formatting of reference link hrefs to include
the page title before the URL fragment.  Update the app-side link handling
to handle this format.

Bug: T155070
Change-Id: I6a6b12984807358d3800bd8a6f89c5649f3c2c9f
---
M app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.java
M app/src/main/java/org/wikipedia/page/LinkHandler.java
M app/src/main/java/org/wikipedia/page/PageFragment.java
A app/src/main/java/org/wikipedia/page/PageTitleContextFragment.java
A app/src/test/java/org/wikipedia/page/LinkHandlerTest.java
5 files changed, 78 insertions(+), 12 deletions(-)


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

diff --git 
a/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.java 
b/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.java
index 2bef695..db6059f 100644
--- a/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.java
+++ b/app/src/main/java/org/wikipedia/edit/preview/EditPreviewFragment.java
@@ -31,6 +31,7 @@
 import org.wikipedia.page.LinkHandler;
 import org.wikipedia.page.PageActivity;
 import org.wikipedia.page.PageTitle;
+import org.wikipedia.page.PageTitleContextFragment;
 import org.wikipedia.util.ConfigurationCompat;
 import org.wikipedia.util.L10nUtil;
 import org.wikipedia.util.UriUtil;
@@ -46,10 +47,11 @@
 
 import static org.wikipedia.util.DeviceUtil.hideSoftKeyboard;
 
-public class EditPreviewFragment extends Fragment {
+public class EditPreviewFragment extends Fragment implements 
PageTitleContextFragment {
     private ObservableWebView webview;
     private ScrollView previewContainer;
     private EditSectionActivity parentActivity;
+    @NonNull private PageTitle pageTitle;
 
     private ViewGroup editSummaryTagsContainer;
 
@@ -62,6 +64,10 @@
 
     private ProgressDialog progressDialog;
     private EditFunnel funnel;
+
+    public PageTitle getTitle() {
+        return pageTitle;
+    }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
@@ -79,8 +85,8 @@
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
 
-        parentActivity = (EditSectionActivity)getActivity();
-        PageTitle pageTitle = parentActivity.getPageTitle();
+        parentActivity = (EditSectionActivity) getActivity();
+        pageTitle = parentActivity.getPageTitle();
         funnel = 
WikipediaApp.getInstance().getFunnelManager().getEditFunnel(pageTitle);
 
         /*
@@ -189,7 +195,7 @@
                 new DarkModeMarshaller(bridge).turnOn(false);
             }
 
-            new LinkHandler(getActivity(), bridge) {
+            new LinkHandler(this) {
                 @Override
                 public void onPageLinkClicked(String href) {
                     // TODO: also need to handle references, issues, disambig, 
... in preview eventually
diff --git a/app/src/main/java/org/wikipedia/page/LinkHandler.java 
b/app/src/main/java/org/wikipedia/page/LinkHandler.java
index 06fa39d..f708343 100644
--- a/app/src/main/java/org/wikipedia/page/LinkHandler.java
+++ b/app/src/main/java/org/wikipedia/page/LinkHandler.java
@@ -20,15 +20,15 @@
  * Handles any html links coming from a {@link org.wikipedia.page.PageFragment}
  */
 public abstract class LinkHandler implements 
CommunicationBridge.JSEventListener, LinkMovementMethodExt.UrlHandler {
-    private final Context context;
+    @NonNull private Context context;
+    @Nullable private PageTitleContextFragment fragment;
 
-    public LinkHandler(Context context, CommunicationBridge bridge) {
-        this(context);
-
-        bridge.addListener("linkClicked", this);
+    public LinkHandler(@NonNull PageTitleContextFragment fragment) {
+        this.context = fragment.getActivity();
+        this.fragment = fragment;
     }
 
-    public LinkHandler(Context context) {
+    LinkHandler(@NonNull Context context) {
         this.context = context;
     }
 
@@ -64,6 +64,8 @@
             onInternalLinkClicked(title);
         } else if (href.startsWith("#")) {
             onPageLinkClicked(href.substring(1));
+        } else if (fragment != null && 
href.startsWith(fragment.getTitle().getText() + "#")) {
+            
onPageLinkClicked(href.substring(fragment.getTitle().getText().length() + 1));
         } else {
             Uri uri = Uri.parse(href);
             String authority = uri.getAuthority();
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java 
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index 49f5432..ae79c50 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -97,7 +97,7 @@
 import static org.wikipedia.util.UriUtil.decodeURL;
 import static org.wikipedia.util.UriUtil.visitInExternalBrowser;
 
-public class PageFragment extends Fragment implements BackPressedHandler {
+public class PageFragment extends Fragment implements BackPressedHandler, 
PageTitleContextFragment {
     public interface Callback {
         void onPageShowBottomSheet(@NonNull BottomSheetDialog dialog);
         void onPageShowBottomSheet(@NonNull BottomSheetDialogFragment dialog);
@@ -330,7 +330,7 @@
         setupMessageHandlers();
         sendDecorOffsetMessage();
 
-        linkHandler = new LinkHandler(getActivity(), bridge) {
+        linkHandler = new LinkHandler(this) {
             @Override
             public void onPageLinkClicked(String anchor) {
                 dismissBottomSheet();
@@ -353,6 +353,7 @@
                 return model.getTitle().getWikiSite();
             }
         };
+        bridge.addListener("linkClicked", linkHandler);
 
         new ReferenceHandler(bridge) {
             @Override
diff --git a/app/src/main/java/org/wikipedia/page/PageTitleContextFragment.java 
b/app/src/main/java/org/wikipedia/page/PageTitleContextFragment.java
new file mode 100644
index 0000000..1091b68
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/page/PageTitleContextFragment.java
@@ -0,0 +1,9 @@
+package org.wikipedia.page;
+
+import android.app.Activity;
+import android.support.annotation.NonNull;
+
+public interface PageTitleContextFragment {
+    @NonNull PageTitle getTitle();
+    @NonNull Activity getActivity();
+}
diff --git a/app/src/test/java/org/wikipedia/page/LinkHandlerTest.java 
b/app/src/test/java/org/wikipedia/page/LinkHandlerTest.java
new file mode 100644
index 0000000..03f7f71
--- /dev/null
+++ b/app/src/test/java/org/wikipedia/page/LinkHandlerTest.java
@@ -0,0 +1,48 @@
+package org.wikipedia.page;
+
+import android.support.annotation.NonNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.wikipedia.dataclient.WikiSite;
+import org.wikipedia.test.TestRunner;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+@RunWith(TestRunner.class) public class LinkHandlerTest {
+
+    @Test public void testParseCitationHref() {
+        String mwApiCitationHref = "#cite_note-CD-1";
+        String restBaseCitationHref = "Barack_Obama#cite_note-CD-1";
+
+        PageFragment fragment = mock(PageFragment.class);
+        PageTitle title = new PageTitle(null, "Barack_Obama", new 
WikiSite("test.wikipedia.org"));
+        when(fragment.getTitle()).thenReturn(title);
+
+        LinkHandler linkHandler = getTestHandler(fragment);
+        linkHandler.onUrlClick(mwApiCitationHref, null);
+        linkHandler.onUrlClick(restBaseCitationHref, null);
+    }
+
+    private LinkHandler getTestHandler(@NonNull PageTitleContextFragment 
fragment) {
+        return new LinkHandler(fragment) {
+            @Override
+            public void onPageLinkClicked(String anchor) {
+                assertEquals(anchor, "cite_note-CD-1");
+            }
+
+            @Override
+            public void onInternalLinkClicked(PageTitle title) {
+                fail("This method should not be called!");
+            }
+
+            @Override
+            public WikiSite getWikiSite() {
+                return null;
+            }
+        };
+    }
+}

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a6b12984807358d3800bd8a6f89c5649f3c2c9f
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <mhollo...@wikimedia.org>

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

Reply via email to