From b4d82140fe0a385a5949c403d217ee9af178b4c8 Mon Sep 17 00:00:00 2001 From: Jan-Lk Else Date: Wed, 21 Dec 2016 20:57:36 +0100 Subject: [PATCH] Much progress --- app/src/main/assets/editor.html | 84 ++++++++++----- app/src/main/java/telegra/ph/Api.kt | 25 ++++- app/src/main/java/telegra/ph/Editor.kt | 26 ++--- app/src/main/java/telegra/ph/MainActivity.kt | 105 +++++++++++++++---- app/src/main/java/telegra/ph/Prefs.kt | 6 ++ app/src/main/res/layout/activity_main.xml | 21 ++++ app/src/main/res/layout/main_read.xml | 10 -- app/src/main/res/layout/main_write.xml | 6 -- app/src/main/res/menu/activity_main.xml | 4 + app/src/main/res/values/strings.xml | 1 + 10 files changed, 201 insertions(+), 87 deletions(-) create mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/main_read.xml delete mode 100644 app/src/main/res/layout/main_write.xml diff --git a/app/src/main/assets/editor.html b/app/src/main/assets/editor.html index e19a9b3..1a3091f 100644 --- a/app/src/main/assets/editor.html +++ b/app/src/main/assets/editor.html @@ -1,13 +1,13 @@ - - - - - + + + + +
@@ -15,27 +15,59 @@ + \ No newline at end of file diff --git a/app/src/main/java/telegra/ph/Api.kt b/app/src/main/java/telegra/ph/Api.kt index fd1fec3..d4ab1e8 100644 --- a/app/src/main/java/telegra/ph/Api.kt +++ b/app/src/main/java/telegra/ph/Api.kt @@ -8,13 +8,34 @@ class Api { private val ApiBase = "https://api.telegra.ph/" - fun getPage(id: String?, callback: (page: Page?) -> Unit) { - Bridge.get("${ApiBase}getPage/$id?return_content=true").asJsonObject { response, jsonObject, bridgeException -> + fun getPage(id: String?, accessToken: String?, callback: (page: Page?) -> Unit) { + Bridge.get("${ApiBase}getPage/$id?return_content=true" + if (accessToken != null) "&access_token=$accessToken" else "").asJsonObject { response, jsonObject, bridgeException -> if (jsonObject != null) callback(jsonObject.parsePage()) else callback(null) } } + fun createPage(accessToken: String?, content: String?, title: String?, callback: (Page?) -> Unit) { + Bridge.get("${ApiBase}createPage?access_token=$accessToken&title=%s&content=$content&return_content=true", title).asJsonObject { response, jsonObject, bridgeException -> + if (jsonObject != null) callback(jsonObject.parsePage()) + else callback(null) + } + } + + fun editPage(accessToken: String?, path: String?, content: String?, title: String?, callback: (Page?) -> Unit) { + Bridge.get("${ApiBase}editPage/$path?access_token=$accessToken&title=%s&content=$content&return_content=true", title).asJsonObject { response, jsonObject, bridgeException -> + if (jsonObject != null) callback(jsonObject.parsePage()) + else callback(null) + } + } + + fun createAccount(callback: (accessToken: String?) -> Unit) { + Bridge.get("${ApiBase}createAccount?short_name=teleposter").asJsonObject { response, jsonObject, bridgeException -> + if (jsonObject != null) callback(jsonObject.optJSONObject("result")?.optString("access_token")) + else callback(null) + } + } + private fun JSONObject.parsePage(): Page? { val result: Page = Page() if (optBoolean("ok", false)) { diff --git a/app/src/main/java/telegra/ph/Editor.kt b/app/src/main/java/telegra/ph/Editor.kt index fdf523f..23173b3 100644 --- a/app/src/main/java/telegra/ph/Editor.kt +++ b/app/src/main/java/telegra/ph/Editor.kt @@ -9,21 +9,17 @@ import android.webkit.WebView import android.webkit.WebViewClient class Editor : WebView { - private var text = "" - internal var context: Context + private var getCallback: (json: String?) -> Unit? = {} 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() } @@ -38,8 +34,8 @@ class Editor : WebView { private inner class MyJavaScriptInterface { @JavascriptInterface - fun getText(html: String) { - text = html + fun getText(json: String) { + getCallback(json) } } @@ -53,19 +49,9 @@ class Editor : WebView { 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 + fun getText(callback: (json: String?) -> Unit) { + getCallback = callback + this.loadUrl("javascript:getNodeJson();") } } \ No newline at end of file diff --git a/app/src/main/java/telegra/ph/MainActivity.kt b/app/src/main/java/telegra/ph/MainActivity.kt index a293396..b935310 100644 --- a/app/src/main/java/telegra/ph/MainActivity.kt +++ b/app/src/main/java/telegra/ph/MainActivity.kt @@ -12,34 +12,21 @@ import im.delight.android.webview.AdvancedWebView class MainActivity : AppCompatActivity(), AdvancedWebView.Listener { - private val TELEGRAPH = "http://telegra.ph/" private val htmlHead = "" private val htmlEnd = "" 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 currentUrl = "" + private var currentPage: Page? = null private var editorMode = true + private var canEdit = false + private var isEdit = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - 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) + setContentView(R.layout.activity_main) webView?.apply { setListener(this@MainActivity, this@MainActivity) setMixedContentAllowed(true) @@ -50,8 +37,54 @@ class MainActivity : AppCompatActivity(), AdvancedWebView.Listener { isVerticalScrollBarEnabled = false overScrollMode = View.OVER_SCROLL_NEVER } - // Load - Api().getPage(path) { page -> + if (intent.action == Intent.ACTION_VIEW && !intent.dataString.isNullOrBlank() && intent.dataString.contains("telegra.ph")) loadPage(intent.dataString.split("/").last()) + else loadEditor() + } + + private fun loadEditor(path: String? = null) { + runOnUiThread { + editorMode = true + canEdit = false + isEdit = false + invalidateOptionsMenu() + editor?.visibility = View.VISIBLE + webView?.visibility = View.GONE + currentPage = null + // Load + if (path != null) Api().getPage(path, accessToken()) { page -> + runOnUiThread { + isEdit = true + currentPage = page + editor?.setText(page?.content ?: "") + } + } + } + } + + private fun loadPage(path: String) { + runOnUiThread { + editorMode = false + canEdit = false + invalidateOptionsMenu() + webView?.visibility = View.VISIBLE + editor?.visibility = View.GONE + currentPage = null + // Load + Api().getPage(path, accessToken()) { page -> + showPage(page) + } + } + } + + private fun showPage(page: Page?) { + runOnUiThread { + editorMode = false + canEdit = page?.can_edit ?: false + invalidateOptionsMenu() + webView?.visibility = View.VISIBLE + editor?.visibility = View.GONE + currentPage = page + // Show page?.let { var html = htmlHead html += "

${it.title}

" @@ -61,7 +94,7 @@ class MainActivity : AppCompatActivity(), AdvancedWebView.Listener { if (it.content.isNullOrBlank()) html += it.description.replace("\n", "
") else html += it.content html += htmlEnd webView?.loadDataWithBaseURL(it.url, html, "text/html; charset=UTF-8", null, null) - url = it.url + currentUrl = it.url } } } @@ -116,7 +149,9 @@ class MainActivity : AppCompatActivity(), AdvancedWebView.Listener { override fun onPrepareOptionsMenu(menu: Menu?): Boolean { super.onPrepareOptionsMenu(menu) menu?.findItem(R.id.create)?.isVisible = !editorMode + menu?.findItem(R.id.share)?.isVisible = !editorMode menu?.findItem(R.id.publish)?.isVisible = editorMode + menu?.findItem(R.id.edit)?.isVisible = canEdit return true } @@ -126,6 +161,30 @@ class MainActivity : AppCompatActivity(), AdvancedWebView.Listener { loadEditor() true } + R.id.publish -> { + editor?.getText { json -> + MaterialDialog.Builder(this) + .title(R.string.title_question) + .input(getString(R.string.title_hint), currentPage?.title ?: "", { dialog, title -> + if (accessToken().isNullOrBlank()) { + Api().createAccount { accessToken -> + if (accessToken != null) saveAccessToken(accessToken) + if (isEdit) Api().editPage(accessToken(), currentPage?.path, json, title.toString()) { page -> showPage(page) } + else Api().createPage(accessToken(), json, title.toString()) { page -> showPage(page) } + } + } else { + if (isEdit) Api().editPage(accessToken(), currentPage?.path, json, title.toString()) { page -> showPage(page) } + else Api().createPage(accessToken(), json, title.toString()) { page -> showPage(page) } + } + }) + .show() + } + true + } + R.id.edit -> { + loadEditor(currentPage?.path) + true + } R.id.bookmarks -> { MaterialDialog.Builder(this) .title(R.string.bookmarks) @@ -152,7 +211,7 @@ class MainActivity : AppCompatActivity(), AdvancedWebView.Listener { MaterialDialog.Builder(this) .title(R.string.title_question) .input(getString(R.string.title_hint), "", { dialog, input -> - addBookmark("${(if (webView?.url != "about:blank") webView?.url ?: url else url).split("/").last()}xxx;xxx$input") + addBookmark("${(if (webView?.url != "about:blank") webView?.url ?: currentUrl else currentUrl).split("/").last()}xxx;xxx$input") }) .show() true @@ -162,7 +221,7 @@ class MainActivity : AppCompatActivity(), AdvancedWebView.Listener { shareIntent.action = Intent.ACTION_SEND shareIntent.type = "text/plain" shareIntent.putExtra(Intent.EXTRA_TITLE, webView?.title) - shareIntent.putExtra(Intent.EXTRA_TEXT, if (webView?.url != "about:blank") webView?.url ?: url else url) + shareIntent.putExtra(Intent.EXTRA_TEXT, currentUrl) startActivity(Intent.createChooser(shareIntent, getString(R.string.share))) true } diff --git a/app/src/main/java/telegra/ph/Prefs.kt b/app/src/main/java/telegra/ph/Prefs.kt index 6da1b69..6e74809 100644 --- a/app/src/main/java/telegra/ph/Prefs.kt +++ b/app/src/main/java/telegra/ph/Prefs.kt @@ -13,4 +13,10 @@ fun Context.addBookmark(entry: String) { fun Context.deleteBookmark(path: String) { PreferenceManager.getDefaultSharedPreferences(this).edit().putString("bookmarks", bookmarks().filter { !it.contains(path) }.joinToString(separator = "+++;+++")).apply() +} + +fun Context.accessToken(): String? = PreferenceManager.getDefaultSharedPreferences(this).getString("accessToken", null) + +fun Context.saveAccessToken(token: String) { + PreferenceManager.getDefaultSharedPreferences(this).edit().putString("accessToken", token).apply() } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..a96a021 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_read.xml b/app/src/main/res/layout/main_read.xml deleted file mode 100644 index 56bce08..0000000 --- a/app/src/main/res/layout/main_read.xml +++ /dev/null @@ -1,10 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/layout/main_write.xml b/app/src/main/res/layout/main_write.xml deleted file mode 100644 index 300520e..0000000 --- a/app/src/main/res/layout/main_write.xml +++ /dev/null @@ -1,6 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/menu/activity_main.xml b/app/src/main/res/menu/activity_main.xml index a2e0a1d..0095a58 100644 --- a/app/src/main/res/menu/activity_main.xml +++ b/app/src/main/res/menu/activity_main.xml @@ -9,6 +9,10 @@ android:id="@+id/publish" android:title="@string/publish" app:showAsAction="ifRoom"/> + Delete Do you really want to delete this? Publish + Edit