mirror of https://github.com/jlelse/teleposter
Progress with Editor
This commit is contained in:
parent
90d134dc70
commit
c88dd9c944
|
@ -1,2 +1,6 @@
|
|||
-keep class * extends android.webkit.WebChromeClient { *; }
|
||||
-dontwarn im.delight.android.webview.**
|
||||
-keepclassmembers class telegra.ph.Editor$MyJavaScriptInterface {
|
||||
public *;
|
||||
}
|
||||
-keepattributes JavascriptInterface
|
|
@ -0,0 +1,41 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
|
||||
rel="stylesheet">
|
||||
<link href="https://rawgit.com/summernote/summernote/master/dist/summernote.css"
|
||||
rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<div id="summernote" style="width:100%;height:100%"></div>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
||||
<script src="https://rawgit.com/summernote/summernote/master/dist/summernote.min.js"></script>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('#summernote').summernote({
|
||||
height: 1200,
|
||||
focus: true,
|
||||
placeholder: '',
|
||||
toolbar: [
|
||||
// [groupName, [list of button]]
|
||||
['style', ['bold', 'italic']],
|
||||
['para', ['ul', 'ol']],
|
||||
['insert', ['link']],
|
||||
['history', ['undo', 'redo']],
|
||||
['other', ['codeview']]
|
||||
],
|
||||
callbacks: {
|
||||
onInit: function(e) {
|
||||
$("#summernote").summernote("fullscreen.toggle");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,71 @@
|
|||
package telegra.ph
|
||||
|
||||
import android.content.Context
|
||||
import android.support.annotation.Keep
|
||||
import android.util.AttributeSet
|
||||
import android.webkit.JavascriptInterface
|
||||
import android.webkit.WebSettings
|
||||
import android.webkit.WebView
|
||||
import android.webkit.WebViewClient
|
||||
|
||||
class Editor : WebView {
|
||||
private var text = ""
|
||||
internal var context: Context
|
||||
|
||||
constructor(context: Context) : super(context) {
|
||||
this.context = context
|
||||
init()
|
||||
}
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
|
||||
this.context = context
|
||||
init()
|
||||
}
|
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
|
||||
this.context = context
|
||||
init()
|
||||
}
|
||||
|
||||
private fun init() {
|
||||
this.settings.javaScriptEnabled = true
|
||||
this.settings.cacheMode = WebSettings.LOAD_NO_CACHE
|
||||
this.addJavascriptInterface(MyJavaScriptInterface(), "android")
|
||||
this.settings.loadWithOverviewMode = true
|
||||
this.settings.useWideViewPort = true
|
||||
this.loadUrl("file:///android_asset/editor.html")
|
||||
}
|
||||
|
||||
private inner class MyJavaScriptInterface {
|
||||
@JavascriptInterface
|
||||
fun getText(html: String) {
|
||||
text = html
|
||||
}
|
||||
}
|
||||
|
||||
fun setText(html: String) {
|
||||
setWebViewClient(object : WebViewClient() {
|
||||
override fun onPageFinished(view: WebView, url: String) {
|
||||
setText(html)
|
||||
}
|
||||
})
|
||||
this.loadUrl("javascript:$('#summernote').summernote('reset');")
|
||||
this.loadUrl("javascript:$('#summernote').summernote('code', '" + html.replace("'", "\\'") + "');")
|
||||
}
|
||||
|
||||
fun getText(): String {
|
||||
text = "P/%TE5XpkAijBc%LjA;_-pZcbiU25E6feX5y/n6qxCTmhprLrqC3H%^hU!%q2,k'm`SHheoW^'mQ~zW93,C?~GtYk!wi/&'3KxW8"
|
||||
this.loadUrl("javascript:window.android.getText" + "(document.getElementsByClassName('note-editable')[0].innerHTML);")
|
||||
var i = 0
|
||||
try {
|
||||
while (text == "P/%TE5XpkAijBc%LjA;_-pZcbiU25E6feX5y/n6qxCTmhprLrqC3H%^hU!%q2,k'm`SHheoW^'mQ~zW93,C?~GtYk!wi/&'3KxW8" && i < 100) {
|
||||
Thread.sleep(50)
|
||||
i++
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
text = ""
|
||||
}
|
||||
return text
|
||||
}
|
||||
|
||||
}
|
|
@ -16,14 +16,30 @@ class MainActivity : AppCompatActivity(), AdvancedWebView.Listener {
|
|||
private val htmlHead = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\"><style> * { max-width: 100%; height: auto; word-break: break-all; word-break: break-word; }</style></head><body>"
|
||||
private val htmlEnd = "<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\"></script></body></html>"
|
||||
|
||||
private val webView: AdvancedWebView? by lazy { findViewById(R.id.webView) as AdvancedWebView }
|
||||
private val webView: AdvancedWebView? by lazy { findViewById(R.id.webView) as AdvancedWebView? }
|
||||
private val editor: Editor? by lazy { findViewById(R.id.editor) as Editor? }
|
||||
|
||||
private var url = ""
|
||||
private var editorMode = true
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_main)
|
||||
if (intent.action == Intent.ACTION_VIEW && !intent.dataString.isNullOrBlank() && intent.dataString.contains("telegra.ph")) loadPage(intent.dataString.split("/").last())
|
||||
else loadEditor()
|
||||
}
|
||||
|
||||
private fun loadEditor() {
|
||||
editorMode = true
|
||||
invalidateOptionsMenu()
|
||||
// Init
|
||||
setContentView(R.layout.main_write)
|
||||
}
|
||||
|
||||
private fun loadPage(path: String) {
|
||||
editorMode = false
|
||||
invalidateOptionsMenu()
|
||||
// Init
|
||||
setContentView(R.layout.main_read)
|
||||
webView?.apply {
|
||||
setListener(this@MainActivity, this@MainActivity)
|
||||
setMixedContentAllowed(true)
|
||||
|
@ -34,17 +50,7 @@ class MainActivity : AppCompatActivity(), AdvancedWebView.Listener {
|
|||
isVerticalScrollBarEnabled = false
|
||||
overScrollMode = View.OVER_SCROLL_NEVER
|
||||
}
|
||||
|
||||
if (intent.action == Intent.ACTION_VIEW && !intent.dataString.isNullOrBlank() && intent.dataString.contains("telegra.ph"))
|
||||
loadPage(intent.dataString.split("/").last())
|
||||
else loadEditor()
|
||||
}
|
||||
|
||||
private fun loadEditor() {
|
||||
webView?.loadUrl(TELEGRAPH)
|
||||
}
|
||||
|
||||
private fun loadPage(path: String) {
|
||||
// Load
|
||||
Api().getPage(path) { page ->
|
||||
page?.let {
|
||||
var html = htmlHead
|
||||
|
@ -107,6 +113,13 @@ class MainActivity : AppCompatActivity(), AdvancedWebView.Listener {
|
|||
return true
|
||||
}
|
||||
|
||||
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
|
||||
super.onPrepareOptionsMenu(menu)
|
||||
menu?.findItem(R.id.create)?.isVisible = !editorMode
|
||||
menu?.findItem(R.id.publish)?.isVisible = editorMode
|
||||
return true
|
||||
}
|
||||
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
return when (item.itemId) {
|
||||
R.id.create -> {
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<telegra.ph.Editor
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/editor"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
|
@ -5,6 +5,10 @@
|
|||
android:id="@+id/create"
|
||||
android:title="@string/create"
|
||||
app:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/publish"
|
||||
android:title="@string/publish"
|
||||
app:showAsAction="ifRoom"/>
|
||||
<item
|
||||
android:id="@+id/bookmarks"
|
||||
android:title="@string/bookmarks"
|
||||
|
|
|
@ -12,4 +12,5 @@
|
|||
<string name="title_hint">Awesome Post #1</string>
|
||||
<string name="delete">Delete</string>
|
||||
<string name="delete_question">Do you really want to delete this?</string>
|
||||
<string name="publish">Publish</string>
|
||||
</resources>
|
||||
|
|
Loading…
Reference in New Issue