temporary commit: add native js callback

This commit is contained in:
houxg
2016-12-15 10:16:53 +08:00
parent e2a6aed953
commit 878529d9ce
5 changed files with 138 additions and 8 deletions

View File

@@ -113,6 +113,7 @@
tinyMCE.editors[0].formatter.apply('link', {
href: url
});
//TODO:call nativeCallbackHandler
}
function removeLink(title, url) {

View File

@@ -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<Style, Object> enabledFormats);
}
protected class EditorClient extends WebViewClient {

View File

@@ -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<String, String> 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<Style, Object> enabledFormats) {
}
}

View File

@@ -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<Editor.Style, Object> 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<String, Object> formats = mGson.fromJson(data, Map.class);
Map<Editor.Style, Object> enabledFormats = new HashMap<>();
for (Map.Entry<String, Object> 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;
}
}
}

View File

@@ -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<Editor.Style, Object> enabledFormats) {
}
public interface EditorFragmentListener {
Uri createImage(String filePath);