From 878529d9ce5a9a395fdd94c31a48316995e0090e Mon Sep 17 00:00:00 2001 From: houxg Date: Thu, 15 Dec 2016 10:16:53 +0800 Subject: [PATCH] temporary commit: add native js callback --- .../main/assets/RichTextEditor/editor.html | 1 + .../org/houxg/leamonax/editor/Editor.java | 11 ++- .../houxg/leamonax/editor/RichTextEditor.java | 23 +++++- .../leamonax/editor/TinnyMceCallback.java | 78 +++++++++++++++++++ .../leamonax/ui/edit/EditorFragment.java | 33 +++++++- 5 files changed, 138 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/org/houxg/leamonax/editor/TinnyMceCallback.java diff --git a/app/src/main/assets/RichTextEditor/editor.html b/app/src/main/assets/RichTextEditor/editor.html index 049470c..1a49ce0 100755 --- a/app/src/main/assets/RichTextEditor/editor.html +++ b/app/src/main/assets/RichTextEditor/editor.html @@ -113,6 +113,7 @@ tinyMCE.editors[0].formatter.apply('link', { href: url }); + //TODO:call nativeCallbackHandler } function removeLink(title, url) { diff --git a/app/src/main/java/org/houxg/leamonax/editor/Editor.java b/app/src/main/java/org/houxg/leamonax/editor/Editor.java index d0ee342..34eacd2 100644 --- a/app/src/main/java/org/houxg/leamonax/editor/Editor.java +++ b/app/src/main/java/org/houxg/leamonax/editor/Editor.java @@ -12,13 +12,18 @@ import android.webkit.WebViewClient; import org.houxg.leamonax.service.NoteFileService; +import java.util.Map; + public abstract class Editor { public enum Style { BOLD, ITALIC, - ORDER_LIST, - UNORDER_LIST + BULLET_LIST, + ORDERED_LIST, + BLOCKQUOTE, + HEADER, + LINK } protected EditorListener mListener; @@ -65,6 +70,8 @@ public abstract class Editor { void onPageLoaded(); void onClickedLink(String title, String url); void onStyleChanged(Style style, boolean enabled); + void onStyleChanged(Style style, boolean enabled, Object data); + void onCursorChanged(Map enabledFormats); } protected class EditorClient extends WebViewClient { diff --git a/app/src/main/java/org/houxg/leamonax/editor/RichTextEditor.java b/app/src/main/java/org/houxg/leamonax/editor/RichTextEditor.java index a6e582d..c45709d 100644 --- a/app/src/main/java/org/houxg/leamonax/editor/RichTextEditor.java +++ b/app/src/main/java/org/houxg/leamonax/editor/RichTextEditor.java @@ -15,7 +15,7 @@ import java.util.Map; import static android.view.View.SCROLLBARS_OUTSIDE_OVERLAY; -public class RichTextEditor extends Editor implements OnJsEditorStateChangedListener { +public class RichTextEditor extends Editor implements OnJsEditorStateChangedListener, TinnyMceCallback.TinnyMceListener { private static final String TAG = "RichTextEditor"; private static final String JS_CALLBACK_HANDLER = "nativeCallbackHandler"; @@ -33,7 +33,7 @@ public class RichTextEditor extends Editor implements OnJsEditorStateChangedList mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebViewClient(new EditorClient()); mWebView.setWebChromeClient(new EditorChromeClient()); - mWebView.addJavascriptInterface(new JsCallbackHandler(this), JS_CALLBACK_HANDLER); + mWebView.addJavascriptInterface(new TinnyMceCallback(this), JS_CALLBACK_HANDLER); mWebView.loadUrl("file:///android_asset/RichTextEditor/editor.html"); } @@ -155,10 +155,10 @@ public class RichTextEditor extends Editor implements OnJsEditorStateChangedList mListener.onStyleChanged(Style.ITALIC, entry.getValue()); break; case "orderedList": - mListener.onStyleChanged(Style.ORDER_LIST, entry.getValue()); + mListener.onStyleChanged(Style.ORDERED_LIST, entry.getValue()); break; case "unorderedList": - mListener.onStyleChanged(Style.UNORDER_LIST, entry.getValue()); + mListener.onStyleChanged(Style.BULLET_LIST, entry.getValue()); break; } } @@ -178,4 +178,19 @@ public class RichTextEditor extends Editor implements OnJsEditorStateChangedList public void onGetHtmlResponse(Map responseArgs) { Log.i(TAG, "onSelectionChanged(), data=" + new Gson().toJson(responseArgs)); } + + @Override + public void onFormatChanged(Style format, boolean isEnabled, Object data) { + mListener.onStyleChanged(Style.BULLET_LIST, isEnabled, data); + } + + @Override + public void gotoLink(String url) { + + } + + @Override + public void onCursorChanged(Map enabledFormats) { + + } } diff --git a/app/src/main/java/org/houxg/leamonax/editor/TinnyMceCallback.java b/app/src/main/java/org/houxg/leamonax/editor/TinnyMceCallback.java new file mode 100644 index 0000000..efd241f --- /dev/null +++ b/app/src/main/java/org/houxg/leamonax/editor/TinnyMceCallback.java @@ -0,0 +1,78 @@ +package org.houxg.leamonax.editor; + +import android.webkit.JavascriptInterface; + +import com.google.gson.Gson; + +import java.util.HashMap; +import java.util.Map; + +public class TinnyMceCallback { + + private TinnyMceListener mListener; + private Gson mGson = new Gson(); + + public TinnyMceCallback(TinnyMceListener mListener) { + this.mListener = mListener; + } + + public interface TinnyMceListener { + void onFormatChanged(Editor.Style format, boolean isEnabled, Object data); + + void gotoLink(String url); + + void onCursorChanged(Map enabledFormats); + } + + @JavascriptInterface + public void onFormatChanged(String format, boolean isEnabled, Object data) { + if (mListener != null) { + Editor.Style formatEnume = parseFormat(format); + mListener.onFormatChanged(formatEnume, isEnabled, data); + } + } + + @JavascriptInterface + void gotoLink(String url) { + if (mListener != null) { + mListener.gotoLink(url); + } + } + + @JavascriptInterface + void onCursorChanged(String data) { + if (mListener == null) { + return; + } + Map formats = mGson.fromJson(data, Map.class); + Map enabledFormats = new HashMap<>(); + for (Map.Entry format : formats.entrySet()) { + Editor.Style formatEnume = parseFormat(format.getKey()); + if (formatEnume != null) { + enabledFormats.put(formatEnume, format.getValue()); + } + } + mListener.onCursorChanged(enabledFormats); + } + + private Editor.Style parseFormat(String formatName) { + switch (formatName) { + case "bold": + return Editor.Style.BOLD; + case "italic": + return Editor.Style.ITALIC; + case "ul": + return Editor.Style.BULLET_LIST; + case "ol": + return Editor.Style.ORDERED_LIST; + case "blockquote": + return Editor.Style.BLOCKQUOTE; + case "header": + return Editor.Style.HEADER; + case "link": + return Editor.Style.LINK; + default: + return null; + } + } +} diff --git a/app/src/main/java/org/houxg/leamonax/ui/edit/EditorFragment.java b/app/src/main/java/org/houxg/leamonax/ui/edit/EditorFragment.java index 80db124..f85911a 100644 --- a/app/src/main/java/org/houxg/leamonax/ui/edit/EditorFragment.java +++ b/app/src/main/java/org/houxg/leamonax/ui/edit/EditorFragment.java @@ -28,6 +28,7 @@ import org.houxg.leamonax.utils.DialogUtils; import org.houxg.leamonax.widget.ToggleImageButton; import java.util.List; +import java.util.Map; import butterknife.BindView; import butterknife.ButterKnife; @@ -281,10 +282,10 @@ public class EditorFragment extends Fragment implements Editor.EditorListener { case ITALIC: mItalicBtn.setChecked(enabled); break; - case ORDER_LIST: + case ORDERED_LIST: mOrderListBtn.setChecked(enabled); break; - case UNORDER_LIST: + case BULLET_LIST: mUnorderListBtn.setChecked(enabled); break; } @@ -292,6 +293,34 @@ public class EditorFragment extends Fragment implements Editor.EditorListener { }); } + @Override + public void onStyleChanged(final Editor.Style style, final boolean enabled, final Object data) { + mBoldBtn.post(new Runnable() { + @Override + public void run() { + switch (style) { + case BOLD: + mBoldBtn.setChecked(enabled); + break; + case ITALIC: + mItalicBtn.setChecked(enabled); + break; + case ORDERED_LIST: + mOrderListBtn.setChecked(enabled); + break; + case BULLET_LIST: + mUnorderListBtn.setChecked(enabled); + break; + } + } + }); + } + + @Override + public void onCursorChanged(Map enabledFormats) { + + } + public interface EditorFragmentListener { Uri createImage(String filePath);