mirror of
https://github.com/leanote/leanote-android.git
synced 2025-10-15 14:51:04 +00:00
temporary commit: add native js callback
This commit is contained in:
@@ -113,6 +113,7 @@
|
|||||||
tinyMCE.editors[0].formatter.apply('link', {
|
tinyMCE.editors[0].formatter.apply('link', {
|
||||||
href: url
|
href: url
|
||||||
});
|
});
|
||||||
|
//TODO:call nativeCallbackHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeLink(title, url) {
|
function removeLink(title, url) {
|
||||||
|
@@ -12,13 +12,18 @@ import android.webkit.WebViewClient;
|
|||||||
|
|
||||||
import org.houxg.leamonax.service.NoteFileService;
|
import org.houxg.leamonax.service.NoteFileService;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public abstract class Editor {
|
public abstract class Editor {
|
||||||
|
|
||||||
public enum Style {
|
public enum Style {
|
||||||
BOLD,
|
BOLD,
|
||||||
ITALIC,
|
ITALIC,
|
||||||
ORDER_LIST,
|
BULLET_LIST,
|
||||||
UNORDER_LIST
|
ORDERED_LIST,
|
||||||
|
BLOCKQUOTE,
|
||||||
|
HEADER,
|
||||||
|
LINK
|
||||||
}
|
}
|
||||||
|
|
||||||
protected EditorListener mListener;
|
protected EditorListener mListener;
|
||||||
@@ -65,6 +70,8 @@ public abstract class Editor {
|
|||||||
void onPageLoaded();
|
void onPageLoaded();
|
||||||
void onClickedLink(String title, String url);
|
void onClickedLink(String title, String url);
|
||||||
void onStyleChanged(Style style, boolean enabled);
|
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 {
|
protected class EditorClient extends WebViewClient {
|
||||||
|
@@ -15,7 +15,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
import static android.view.View.SCROLLBARS_OUTSIDE_OVERLAY;
|
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 TAG = "RichTextEditor";
|
||||||
private static final String JS_CALLBACK_HANDLER = "nativeCallbackHandler";
|
private static final String JS_CALLBACK_HANDLER = "nativeCallbackHandler";
|
||||||
@@ -33,7 +33,7 @@ public class RichTextEditor extends Editor implements OnJsEditorStateChangedList
|
|||||||
mWebView.getSettings().setJavaScriptEnabled(true);
|
mWebView.getSettings().setJavaScriptEnabled(true);
|
||||||
mWebView.setWebViewClient(new EditorClient());
|
mWebView.setWebViewClient(new EditorClient());
|
||||||
mWebView.setWebChromeClient(new EditorChromeClient());
|
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");
|
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());
|
mListener.onStyleChanged(Style.ITALIC, entry.getValue());
|
||||||
break;
|
break;
|
||||||
case "orderedList":
|
case "orderedList":
|
||||||
mListener.onStyleChanged(Style.ORDER_LIST, entry.getValue());
|
mListener.onStyleChanged(Style.ORDERED_LIST, entry.getValue());
|
||||||
break;
|
break;
|
||||||
case "unorderedList":
|
case "unorderedList":
|
||||||
mListener.onStyleChanged(Style.UNORDER_LIST, entry.getValue());
|
mListener.onStyleChanged(Style.BULLET_LIST, entry.getValue());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -178,4 +178,19 @@ public class RichTextEditor extends Editor implements OnJsEditorStateChangedList
|
|||||||
public void onGetHtmlResponse(Map<String, String> responseArgs) {
|
public void onGetHtmlResponse(Map<String, String> responseArgs) {
|
||||||
Log.i(TAG, "onSelectionChanged(), data=" + new Gson().toJson(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) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -28,6 +28,7 @@ import org.houxg.leamonax.utils.DialogUtils;
|
|||||||
import org.houxg.leamonax.widget.ToggleImageButton;
|
import org.houxg.leamonax.widget.ToggleImageButton;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import butterknife.BindView;
|
import butterknife.BindView;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
@@ -281,10 +282,10 @@ public class EditorFragment extends Fragment implements Editor.EditorListener {
|
|||||||
case ITALIC:
|
case ITALIC:
|
||||||
mItalicBtn.setChecked(enabled);
|
mItalicBtn.setChecked(enabled);
|
||||||
break;
|
break;
|
||||||
case ORDER_LIST:
|
case ORDERED_LIST:
|
||||||
mOrderListBtn.setChecked(enabled);
|
mOrderListBtn.setChecked(enabled);
|
||||||
break;
|
break;
|
||||||
case UNORDER_LIST:
|
case BULLET_LIST:
|
||||||
mUnorderListBtn.setChecked(enabled);
|
mUnorderListBtn.setChecked(enabled);
|
||||||
break;
|
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 {
|
public interface EditorFragmentListener {
|
||||||
Uri createImage(String filePath);
|
Uri createImage(String filePath);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user