From f0d90c175fe3aa65b8ba9d060a2d760015ddc642 Mon Sep 17 00:00:00 2001 From: yova Date: Thu, 1 Feb 2024 13:07:53 +0100 Subject: [PATCH] default creds update on ghost update --- .../java/org/wntr/mdeditor/MainActivity.kt | 133 ++---------------- .../org/wntr/mdeditor/MetadataActivity.kt | 2 +- .../main/java/org/wntr/mdeditor/helpers.kt | 114 +++++++++++++++ 3 files changed, 130 insertions(+), 119 deletions(-) create mode 100644 app/src/main/java/org/wntr/mdeditor/helpers.kt diff --git a/app/src/main/java/org/wntr/mdeditor/MainActivity.kt b/app/src/main/java/org/wntr/mdeditor/MainActivity.kt index 46cc38d..5ba5673 100644 --- a/app/src/main/java/org/wntr/mdeditor/MainActivity.kt +++ b/app/src/main/java/org/wntr/mdeditor/MainActivity.kt @@ -1,6 +1,5 @@ package org.wntr.mdeditor -import android.annotation.SuppressLint import android.app.Activity import android.app.AlertDialog import android.content.ActivityNotFoundException @@ -12,7 +11,6 @@ import android.os.Build import android.os.Bundle import android.os.ParcelFileDescriptor import android.provider.DocumentsContract -import android.provider.OpenableColumns import android.util.Log import android.view.Menu import android.view.MenuItem @@ -45,7 +43,6 @@ import java.io.BufferedReader import java.io.File import java.io.FileOutputStream import java.io.IOException -import java.io.InputStream import java.io.InputStreamReader import java.lang.Thread.sleep import java.net.URLDecoder @@ -148,7 +145,7 @@ class MainActivity : AppCompatActivity() { supportActionBar!!.setDisplayShowTitleEnabled(false) - deleteCache() + deleteCache(applicationContext) Log.i(javaClass.simpleName, "intent data on start: ${intent.data.toString()}\nIntent action: ${intent.action}") @@ -208,7 +205,7 @@ class MainActivity : AppCompatActivity() { @JavascriptInterface fun triggerDisplayName(): String { - return getDisplayName(thisFileUri) + return getDisplayName(applicationContext, thisFileUri) } @JavascriptInterface @@ -418,7 +415,7 @@ class MainActivity : AppCompatActivity() { R.id.push_ghost -> { with(AlertDialog.Builder(this)){ if (metaData.get("url") != null) setTitle("Update ghost posting to ${metaData.get("url")}?") - else setTitle("Push to ghost instance ${api.baseUrl}?") + else setTitle("Push to ghost instance ${credManager.instance}?") setPositiveButton("Yes", { dialog, id -> webView.evaluateJavascript("getHtml();", { @@ -438,7 +435,7 @@ class MainActivity : AppCompatActivity() { } else { Log.i(javaClass.simpleName,"posting $msg") updatePost( - title = metaData.get("title") ?: getDisplayName(thisFileUri), + title = metaData.get("title") ?: getDisplayName(applicationContext, thisFileUri), author = credManager.username, html = msg, id = metaData.getId()!! @@ -509,49 +506,6 @@ class MainActivity : AppCompatActivity() { return true } - @Throws(IOException::class) - fun getFile(context: Context, uri: Uri): File? { - val destinationFilename = - File(context.filesDir.path + File.separatorChar + queryName(context, uri)) - try { - context.contentResolver.openInputStream(uri!!).use { ins -> - createFileFromStream( - ins!!, - destinationFilename - ) - } - } catch (ex: java.lang.Exception) { - Log.e("Save File", ex.message!!) - ex.printStackTrace() - } - return destinationFilename - } - - fun createFileFromStream(ins: InputStream, destination: File?) { - try { - FileOutputStream(destination).use { os -> - val buffer = ByteArray(4096) - var length: Int - while (ins.read(buffer).also { length = it } > 0) { - os.write(buffer, 0, length) - } - os.flush() - } - } catch (ex: java.lang.Exception) { - Log.e("Save File", ex.message!!) - ex.printStackTrace() - } - } - - private fun queryName(context: Context, uri: Uri): String? { - val returnCursor = context.contentResolver.query(uri, null, null, null, null)!! - val nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) - returnCursor.moveToFirst() - val name = returnCursor.getString(nameIndex) - returnCursor.close() - return name - } - fun pushImage(uri: Uri) { // see https://androidfortechs.blogspot.com/2020/12/how-to-convert-uri-to-file-android-10.html val file = getFile(applicationContext, uri)!! @@ -606,6 +560,7 @@ class MainActivity : AppCompatActivity() { val mApiHost = mUrl.scheme + "://" + mUrl.host if (api.baseUrl != mApiHost) api = ghostAPI(applicationContext, mApiHost) + credManager.saveCredentialsToSharedPrefs(Credentials(mApiHost,author)) Log.d(javaClass.simpleName,"Updating post to ${mUrl}") try { @@ -646,7 +601,7 @@ class MainActivity : AppCompatActivity() { } } fun sendPosting(html: String, author: String): retrofit2.Response { - val title = metaData.get("title") ?: "test" + val title = metaData.get("title") ?: getDisplayName(applicationContext, thisFileUri) val post = sendPost(title, updated_at = Instant.now().toString(), authors = listOf(author), html, feature_image = metaData.get("feature_image")) val postings = sendPostList(listOf(post)) @@ -749,34 +704,6 @@ class MainActivity : AppCompatActivity() { // we have a cookie return true } - // - - fun deleteCache() { - try { - val dir = File(cacheDir, "html") - deleteDir(dir) - deleteDir(applicationContext.filesDir) - } catch (e: java.lang.Exception) { - e.printStackTrace() - } - } - - fun deleteDir(dir: File?): Boolean { - return if (dir != null && dir.isDirectory) { - val children = dir.list() - for (i in children.indices) { - val success = deleteDir(File(dir, children[i])) - if (!success) { - return false - } - } - dir.delete() - } else if (dir != null && dir.isFile) { - dir.delete() - } else { - false - } - } fun shareHtml(htmlString: String): Boolean { try { @@ -828,7 +755,7 @@ class MainActivity : AppCompatActivity() { // Create an image file name val storageDir = File(cacheDir, "html") storageDir.mkdir() - tempFile = File(storageDir.path + "/${getDisplayName(thisFileUri).split(".")[0]}.html") + tempFile = File(storageDir.path + "/${getDisplayName(applicationContext, thisFileUri).split(".")[0]}.html") if (tempFile.exists()) tempFile.delete() tempFile.createNewFile() } @@ -847,36 +774,13 @@ class MainActivity : AppCompatActivity() { startActivityForResult(intent, OPEN_FILE) } - @SuppressLint("Range") - fun getDisplayName(uri: Uri?): String { - // via: https://stackoverflow.com/questions/5568874/how-to-extract-the-file-name-from-uri-returned-from-intent-action-get-content - var result: String? = null; - if (uri == null) return "hauntED.md" - if (uri!!.getScheme().equals("content")) { - val cursor = getContentResolver().query(uri!!, null, null, null, null); - try { - if (cursor != null && cursor.moveToFirst()) { - result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); - } - } finally { - cursor?.close(); - } - } - if (result == null) { - result = uri!!.getPath(); - val cut = result!!.lastIndexOf('/'); - if (cut != -1) { - result = result.substring(cut + 1); - } - } - return result; - } + fun selectFileForSaveAs() { val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "text/*" - putExtra(Intent.EXTRA_TITLE, getDisplayName(thisFileUri)) + putExtra(Intent.EXTRA_TITLE, getDisplayName(applicationContext, thisFileUri)) addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) @@ -922,8 +826,8 @@ class MainActivity : AppCompatActivity() { uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) - Log.d(javaClass.simpleName, "Saving to: ${getDisplayName(uri)}") - if (getDisplayName(thisFileUri) + " (1)" != getDisplayName(uri)) thisFileUri = uri + Log.d(javaClass.simpleName, "Saving to: ${getDisplayName(applicationContext, uri)}") + if (getDisplayName(applicationContext, thisFileUri) + " (1)" != getDisplayName(applicationContext, uri)) thisFileUri = uri saveAs() } } else if (requestCode == OPEN_FILE && resultCode == Activity.RESULT_OK) { @@ -1082,13 +986,6 @@ class MainActivity : AppCompatActivity() { } } - fun checkURIResource(context: Context, uri: Uri?): Boolean { - val cursor = context.contentResolver.query(uri!!, null, null, null, null) - val doesExist = cursor != null && cursor.moveToFirst() - cursor?.close() - return doesExist - } - @Throws(IOException::class) private fun readFile(uri: Uri) { try{ @@ -1153,8 +1050,8 @@ class MainActivity : AppCompatActivity() { } reader.close() mdeValue = metaData.extractMetadataFromMarkdown(i) - if (metaData.metaData.get("url") !== null) { - val url = parse(metaData.metaData.get("url")) + if (metaData.get("url") !== null) { + val url = parse(metaData.get("url")) deleteVisible = true invalidateOptionsMenu() val apiHost = url.scheme + "://" + url.host @@ -1215,7 +1112,7 @@ class MainActivity : AppCompatActivity() { "easyMDE.codemirror.focus();" + "easyMDE.codemirror.doc.setCursor(JSON.parse(`${metaData.cursor}`));" + "pasteText();" + - "easyMDE.updateStatusBar(\"displayName\",\"${getDisplayName(uri)}\");}" + "easyMDE.updateStatusBar(\"displayName\",\"${getDisplayName(applicationContext, uri)}\");}" Log.d(javaClass.simpleName, "executing in webview:\n${script}") webView.evaluateJavascript(script, { @@ -1287,7 +1184,7 @@ class MainActivity : AppCompatActivity() { Log.i(javaClass.simpleName, "\"onPause\" durchlaufen") } - override protected fun onRestoreInstanceState(savedInstanceState: Bundle) { + override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) Log.i(javaClass.simpleName, "\"onRestoreInstanceState\" durchlaufen") } diff --git a/app/src/main/java/org/wntr/mdeditor/MetadataActivity.kt b/app/src/main/java/org/wntr/mdeditor/MetadataActivity.kt index 99504dc..f32a156 100644 --- a/app/src/main/java/org/wntr/mdeditor/MetadataActivity.kt +++ b/app/src/main/java/org/wntr/mdeditor/MetadataActivity.kt @@ -15,7 +15,7 @@ class MetadataActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityMetadataBinding.inflate(layoutInflater) setContentView(binding.root) - binding.title.setText(MainActivity.metaData.get("title")) + binding.title.setText(MainActivity.metaData.get("title") ?: getDisplayName(applicationContext, MainActivity.thisFileUri)) binding.url.setText(MainActivity.metaData.get("url")) binding.featureImage.setText(MainActivity.metaData.get("feature_image")) binding.author.setText(MainActivity.metaData.get("author") ?: MainActivity.credManager.username) diff --git a/app/src/main/java/org/wntr/mdeditor/helpers.kt b/app/src/main/java/org/wntr/mdeditor/helpers.kt new file mode 100644 index 0000000..fee337d --- /dev/null +++ b/app/src/main/java/org/wntr/mdeditor/helpers.kt @@ -0,0 +1,114 @@ +package org.wntr.mdeditor + +import android.annotation.SuppressLint +import android.content.Context +import android.net.Uri +import android.provider.OpenableColumns +import android.util.Log +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.io.InputStream + +fun checkURIResource(context: Context, uri: Uri?): Boolean { + val cursor = context.contentResolver.query(uri!!, null, null, null, null) + val doesExist = cursor != null && cursor.moveToFirst() + cursor?.close() + return doesExist +} + +fun createFileFromStream(ins: InputStream, destination: File?) { + try { + FileOutputStream(destination).use { os -> + val buffer = ByteArray(4096) + var length: Int + while (ins.read(buffer).also { length = it } > 0) { + os.write(buffer, 0, length) + } + os.flush() + } + } catch (ex: java.lang.Exception) { + Log.e("Save File", ex.message!!) + ex.printStackTrace() + } +} + +fun deleteCache(context: Context) { + try { + val dir = File(context.cacheDir, "html") + deleteDir(dir) + deleteDir(context.filesDir) + } catch (e: java.lang.Exception) { + e.printStackTrace() + } +} + +fun deleteDir(dir: File?): Boolean { + return if (dir != null && dir.isDirectory) { + val children = dir.list() + for (i in children.indices) { + val success = deleteDir(File(dir, children[i])) + if (!success) { + return false + } + } + dir.delete() + } else if (dir != null && dir.isFile) { + dir.delete() + } else { + false + } +} + +@SuppressLint("Range") +fun getDisplayName(context: Context, uri: Uri?): String { + // via: https://stackoverflow.com/questions/5568874/how-to-extract-the-file-name-from-uri-returned-from-intent-action-get-content + var result: String? = null; + if (uri == null) return "hauntED.md" + if (uri!!.getScheme().equals("content")) { + val cursor = context.getContentResolver().query(uri!!, null, null, null, null); + try { + if (cursor != null && cursor.moveToFirst()) { + result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); + } + } finally { + cursor?.close(); + } + } + if (result == null) { + result = uri!!.getPath(); + val cut = result!!.lastIndexOf('/'); + if (cut != -1) { + result = result.substring(cut + 1); + } + } + return result; +} + +@Throws(IOException::class) +fun getFile(context: Context, uri: Uri): File? { + val destinationFilename = + File(context.filesDir.path + File.separatorChar + queryName(context, uri)) + try { + context.contentResolver.openInputStream(uri!!).use { ins -> + createFileFromStream( + ins!!, + destinationFilename + ) + } + } catch (ex: java.lang.Exception) { + Log.e("Save File", ex.message!!) + ex.printStackTrace() + } + return destinationFilename +} + +fun queryName(context: Context, uri: Uri): String? { + val returnCursor = context.contentResolver.query(uri, null, null, null, null)!! + val nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) + returnCursor.moveToFirst() + val name = returnCursor.getString(nameIndex) + returnCursor.close() + return name +} +