From 27683ea11f37abbecb0c41a0c5049a727429ebc1 Mon Sep 17 00:00:00 2001
From: Dimitry Ivanov <mail@dimitryivanov.ru>
Date: Tue, 5 Jun 2018 15:15:05 +0200
Subject: [PATCH] Add ability to specify MovementMethod when applying markdown
 to a TextView

---
 app/build.gradle                              |  1 +
 .../java/ru/noties/markwon/MainActivity.java  |  7 ++++-
 app/src/main/res/layout/activity_main.xml     |  1 +
 .../main/java/ru/noties/markwon/Markwon.java  | 27 ++++++++++++++++---
 4 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 286e6bb9..9d5e07df 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -31,6 +31,7 @@ dependencies {
     implementation project(':library-image-loader')
 
     implementation 'ru.noties:debug:3.0.0@jar'
+    implementation 'me.saket:better-link-movement-method:2.2.0'
 
     implementation OK_HTTP
 
diff --git a/app/src/main/java/ru/noties/markwon/MainActivity.java b/app/src/main/java/ru/noties/markwon/MainActivity.java
index 8b5b10dc..11212635 100644
--- a/app/src/main/java/ru/noties/markwon/MainActivity.java
+++ b/app/src/main/java/ru/noties/markwon/MainActivity.java
@@ -4,11 +4,14 @@ import android.app.Activity;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.view.View;
 import android.widget.TextView;
 
 import javax.inject.Inject;
 
+import me.saket.bettermovementmethod.BetterLinkMovementMethod;
 import ru.noties.debug.Debug;
 
 public class MainActivity extends Activity {
@@ -64,7 +67,7 @@ public class MainActivity extends Activity {
                 markdownRenderer.render(MainActivity.this, uri(), text, new MarkdownRenderer.MarkdownReadyListener() {
                     @Override
                     public void onMarkdownReady(CharSequence markdown) {
-                        Markwon.setText(textView, markdown);
+                        Markwon.setText(textView, markdown, BetterLinkMovementMethod.getInstance());
                         Views.setVisible(progress, false);
                     }
                 });
@@ -72,6 +75,7 @@ public class MainActivity extends Activity {
         });
     }
 
+    @NonNull
     private AppBarItem.State appBarState() {
 
         final String title;
@@ -100,6 +104,7 @@ public class MainActivity extends Activity {
         }
     }
 
+    @Nullable
     private Uri uri() {
         final Intent intent = getIntent();
         return intent != null
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index b24d050e..638b6e3a 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -17,6 +17,7 @@
             android:layout_margin="16dip"
             android:lineSpacingExtra="2dip"
             android:textSize="16sp"
+            android:textIsSelectable="true"
             tools:context="ru.noties.markwon.MainActivity"
             tools:text="yo\nman" />
 
diff --git a/library/src/main/java/ru/noties/markwon/Markwon.java b/library/src/main/java/ru/noties/markwon/Markwon.java
index 77b397d3..01273b78 100644
--- a/library/src/main/java/ru/noties/markwon/Markwon.java
+++ b/library/src/main/java/ru/noties/markwon/Markwon.java
@@ -2,7 +2,9 @@ package ru.noties.markwon;
 
 import android.content.Context;
 import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
 import android.text.method.LinkMovementMethod;
+import android.text.method.MovementMethod;
 import android.widget.TextView;
 
 import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension;
@@ -67,20 +69,39 @@ public abstract class Markwon {
 
     /**
      * Helper method to apply parsed markdown.
+     * <p>
+     * Since 1.0.6 redirects it\'s call to {@link #setText(TextView, CharSequence, MovementMethod)}
+     * with LinkMovementMethod as an argument to preserve current API.
      *
      * @param view {@link TextView} to set markdown into
      * @param text parsed markdown
-     * @see #scheduleDrawables(TextView)
-     * @see #scheduleTableRows(TextView)
+     * @see #setText(TextView, CharSequence, MovementMethod)
      * @since 1.0.0
      */
     public static void setText(@NonNull TextView view, CharSequence text) {
+        setText(view, text, LinkMovementMethod.getInstance());
+    }
+
+    /**
+     * Helper method to apply parsed markdown with additional argument of a MovementMethod. Used
+     * to workaround problems that occur when using system LinkMovementMethod (for example:
+     * https://issuetracker.google.com/issues/37068143). As a better alternative to it consider
+     * using: https://github.com/saket/Better-Link-Movement-Method
+     *
+     * @param view           TextView to set markdown into
+     * @param text           parsed markdown
+     * @param movementMethod an implementation if MovementMethod or null
+     * @see #scheduleDrawables(TextView)
+     * @see #scheduleTableRows(TextView)
+     * @since 1.0.6
+     */
+    public static void setText(@NonNull TextView view, CharSequence text, @Nullable MovementMethod movementMethod) {
 
         unscheduleDrawables(view);
         unscheduleTableRows(view);
 
         // update movement method (for links to be clickable)
-        view.setMovementMethod(LinkMovementMethod.getInstance());
+        view.setMovementMethod(movementMethod);
         view.setText(text);
 
         // schedule drawables (dynamic drawables that can change bounds/animate will be correctly updated)