From 705dec0571d4ebc17efa4726c41631715ca59fa4 Mon Sep 17 00:00:00 2001 From: Dimitry Ivanov Date: Sat, 12 Jan 2019 16:13:15 +0300 Subject: [PATCH] Markwon.hasPlugin method --- .../main/java/ru/noties/markwon/Markwon.java | 13 +++++++++ .../java/ru/noties/markwon/MarkwonImpl.java | 12 ++++++++ .../ru/noties/markwon/MarkwonImplTest.java | 28 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/markwon-core/src/main/java/ru/noties/markwon/Markwon.java b/markwon-core/src/main/java/ru/noties/markwon/Markwon.java index bf963995..6e7e1ba3 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/Markwon.java +++ b/markwon-core/src/main/java/ru/noties/markwon/Markwon.java @@ -88,6 +88,19 @@ public abstract class Markwon { public abstract void setParsedMarkdown(@NonNull TextView textView, @NonNull Spanned markdown); + /** + * Requests information if certain plugin has been registered. Please note that this + * method will check for super classes also, so if supplied with {@code markwon.hasPlugin(MarkwonPlugin.class)} + * this method (if has at least one plugin) will return true. If for example a custom + * (subclassed) version of a {@link CorePlugin} has been registered and given name + * {@code CorePlugin2}, then both {@code markwon.hasPlugin(CorePlugin2.class)} and + * {@code markwon.hasPlugin(CorePlugin.class)} will return true. + * + * @param plugin type to query + * @return true if a plugin is used when configuring this {@link Markwon} instance + */ + public abstract boolean hasPlugin(@NonNull Class plugin); + /** * Builder for {@link Markwon}. *

diff --git a/markwon-core/src/main/java/ru/noties/markwon/MarkwonImpl.java b/markwon-core/src/main/java/ru/noties/markwon/MarkwonImpl.java index 3cf105b5..8d5211d8 100644 --- a/markwon-core/src/main/java/ru/noties/markwon/MarkwonImpl.java +++ b/markwon-core/src/main/java/ru/noties/markwon/MarkwonImpl.java @@ -95,4 +95,16 @@ class MarkwonImpl extends Markwon { plugin.afterSetText(textView); } } + + @Override + public boolean hasPlugin(@NonNull Class type) { + boolean result = false; + for (MarkwonPlugin plugin : plugins) { + if (type.isAssignableFrom(plugin.getClass())) { + result = true; + break; + } + } + return result; + } } diff --git a/markwon-core/src/test/java/ru/noties/markwon/MarkwonImplTest.java b/markwon-core/src/test/java/ru/noties/markwon/MarkwonImplTest.java index 62ab3de0..f0771efa 100644 --- a/markwon-core/src/test/java/ru/noties/markwon/MarkwonImplTest.java +++ b/markwon-core/src/test/java/ru/noties/markwon/MarkwonImplTest.java @@ -16,9 +16,11 @@ import org.robolectric.annotation.Config; import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; @@ -229,4 +231,30 @@ public class MarkwonImplTest { verify(plugin, times(1)).afterSetText(eq(textView)); } + + @Test + public void has_plugin() { + + final class First extends AbstractMarkwonPlugin { + } + + final class Second extends AbstractMarkwonPlugin { + } + + final List plugins = Collections.singletonList((MarkwonPlugin) new First()); + + final MarkwonImpl impl = new MarkwonImpl( + TextView.BufferType.SPANNABLE, + mock(Parser.class), + mock(MarkwonVisitor.class), + plugins); + + assertTrue("First", impl.hasPlugin(First.class)); + assertFalse("Second", impl.hasPlugin(Second.class)); + + // can use super types. So if we ask if CorePlugin is registered, + // but it was subclassed, we would still have true returned from this method + assertTrue("AbstractMarkwonPlugin", impl.hasPlugin(AbstractMarkwonPlugin.class)); + assertTrue("MarkwonPlugin", impl.hasPlugin(MarkwonPlugin.class)); + } } \ No newline at end of file