From 182122babfc1f4051ab883bc8031e3b69b6b21e6 Mon Sep 17 00:00:00 2001 From: yova Date: Tue, 23 Jan 2024 23:43:10 +0100 Subject: [PATCH] revisit Actionbar and File IO add autosave timer --- .idea/deploymentTargetDropDown.xml | 12 +- .../java/org/wntr/mdeditor/MainActivity.kt | 196 ++++++++++-------- .../res/drawable-hdpi/ic_menu_archive.png | Bin 0 -> 1094 bytes .../res/drawable-ldpi/ic_menu_archive.png | Bin 0 -> 1140 bytes .../res/drawable-mdpi/ic_menu_archive.png | Bin 0 -> 831 bytes .../res/drawable-xhdpi/ic_menu_archive.png | Bin 0 -> 1398 bytes .../res/drawable-xxhdpi/ic_menu_archive.png | Bin 0 -> 2359 bytes app/src/main/res/layout/activity_main.xml | 6 +- app/src/main/res/menu/ghost_menu.xml | 26 ++- app/src/main/res/raw/controller.js | 86 ++------ 10 files changed, 162 insertions(+), 164 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_menu_archive.png create mode 100644 app/src/main/res/drawable-ldpi/ic_menu_archive.png create mode 100644 app/src/main/res/drawable-mdpi/ic_menu_archive.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_menu_archive.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_menu_archive.png diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index b1759b1..4264c2f 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,17 +1,17 @@ - + - + - - + + - - + + \ No newline at end of file diff --git a/app/src/main/java/org/wntr/mdeditor/MainActivity.kt b/app/src/main/java/org/wntr/mdeditor/MainActivity.kt index 7e3db00..8e878e3 100644 --- a/app/src/main/java/org/wntr/mdeditor/MainActivity.kt +++ b/app/src/main/java/org/wntr/mdeditor/MainActivity.kt @@ -48,6 +48,7 @@ import java.io.InputStreamReader import java.lang.Thread.sleep import java.net.URLDecoder import java.time.Instant +import kotlin.concurrent.fixedRateTimer class MainActivity : AppCompatActivity() { @@ -62,8 +63,8 @@ class MainActivity : AppCompatActivity() { var metaData = mdMeta() var mdToAppend: String = "" var thisFileUri: Uri? = null + var truncate = false lateinit var tempFile: File - var emptyFile = false lateinit var pickMultipleVisualMedia: ActivityResultLauncher lateinit var ghostSettings: ActivityResultLauncher lateinit var ghostMetaData: ActivityResultLauncher @@ -72,6 +73,7 @@ class MainActivity : AppCompatActivity() { var ghostConnection = false lateinit var credManager: CredentialManager var intentScheme = "none" + var lastSaved = Instant.now().toEpochMilli() } override fun onCreate(savedInstanceState: Bundle?) { @@ -120,7 +122,7 @@ class MainActivity : AppCompatActivity() { @JavascriptInterface fun triggerOpenFile() { - openFile(thisFileUri!!) + openFile() } @JavascriptInterface @@ -145,7 +147,7 @@ class MainActivity : AppCompatActivity() { @JavascriptInterface fun triggerDisplayName(): String { - return getDisplayName() + return getDisplayName(thisFileUri) } @JavascriptInterface @@ -172,6 +174,14 @@ class MainActivity : AppCompatActivity() { Log.i(javaClass.simpleName,"delivering cursor: $cursor") return cursor.toString() } + + @JavascriptInterface + fun toggleBar() { + this@MainActivity.runOnUiThread({ + if (supportActionBar!!.isShowing) supportActionBar!!.hide() + else supportActionBar!!.show() + }) + } } webView.addJavascriptInterface(jsi, "Android") @@ -200,6 +210,18 @@ class MainActivity : AppCompatActivity() { ghostMetaData = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { saveFile() } + fixedRateTimer("timer",true,0,5000){ + this@MainActivity.runOnUiThread { + webView.evaluateJavascript("easyMDE.codemirror.doc.isClean();", { + if (it == "false" && thisFileUri != null) { + saveFile() + this@MainActivity.runOnUiThread { + webView.evaluateJavascript("easyMDE.codemirror.doc.markClean();", {}) + } + } + }) + } + } } override fun onResume() { @@ -305,6 +327,20 @@ class MainActivity : AppCompatActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { val id = item.itemId when (id) { + R.id.new_file -> { + truncate = true + selectFileForSaveAs() + } + + R.id.open_file -> { + openFile() + } + + R.id.save_file -> { + saveFile() + selectFileForSaveAs() + } + R.id.push_ghost -> { webView.evaluateJavascript("getHtml();", { val msg = URLDecoder.decode(it.removeSurrounding("\"")) @@ -323,7 +359,7 @@ class MainActivity : AppCompatActivity() { } else { Log.i(javaClass.simpleName,"posting $msg") updatePost( - title = metaData.get("title") ?: getDisplayName(), + title = metaData.get("title") ?: getDisplayName(thisFileUri), author = credManager.username, html = msg, id = metaData.getId()!! @@ -514,7 +550,7 @@ class MainActivity : AppCompatActivity() { } fun sendPosting(html: String, author: String): retrofit2.Response { - val title = metaData.get("title") ?: "test" //getDisplayName() + val title = metaData.get("title") ?: "test" val post = sendPost(title, updated_at = Instant.now().toString(), authors = listOf(author), html, feature_image = metaData.get("feature_image")) val postings = sendPostList(listOf(post)) var response: retrofit2.Response = retrofit2.Response.error( @@ -690,33 +726,33 @@ class MainActivity : AppCompatActivity() { // Create an image file name val storageDir = File(cacheDir, "html") storageDir.mkdir() - tempFile = File(storageDir.path + "/${getDisplayName().split(".")[0]}.html") + tempFile = File(storageDir.path + "/${getDisplayName(thisFileUri).split(".")[0]}.html") if (tempFile.exists()) tempFile.delete() tempFile.createNewFile() } - fun openFile(uri: Uri) { + fun openFile() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) - putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri) + putExtra(DocumentsContract.EXTRA_INITIAL_URI, thisFileUri) type = "text/*" - getDisplayName().apply { putExtra(Intent.EXTRA_TITLE, getDisplayName()) } + getDisplayName(thisFileUri).apply { putExtra(Intent.EXTRA_TITLE, getDisplayName( + thisFileUri)) } addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) } startActivityForResult(intent, OPEN_FILE) - Log.i(javaClass.simpleName, "Buffer gelesen") } @SuppressLint("Range") - fun getDisplayName(): String { + 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 (thisFileUri == null) return "hauntED.md" - if (thisFileUri!!.getScheme().equals("content")) { - val cursor = getContentResolver().query(thisFileUri!!, null, null, null, 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)); @@ -726,7 +762,7 @@ class MainActivity : AppCompatActivity() { } } if (result == null) { - result = thisFileUri!!.getPath(); + result = uri!!.getPath(); val cut = result!!.lastIndexOf('/'); if (cut != -1) { result = result.substring(cut + 1); @@ -739,7 +775,7 @@ class MainActivity : AppCompatActivity() { val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "text/*" - putExtra(Intent.EXTRA_TITLE, getDisplayName()) + putExtra(Intent.EXTRA_TITLE, getDisplayName(thisFileUri)) addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) @@ -785,11 +821,9 @@ class MainActivity : AppCompatActivity() { uri, Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) - thisFileUri = uri + Log.d(javaClass.simpleName, "Saving to: ${getDisplayName(thisFileUri)}\n${getDisplayName(uri)}") + if (getDisplayName(thisFileUri) + " (1)" != getDisplayName(uri)) thisFileUri = uri saveAs() - - webView.evaluateJavascript("easyMDE.codemirror.focus()", ValueCallback() {}) - Log.i(javaClass.simpleName, "file newly written") } } else if (requestCode == OPEN_FILE && resultCode == Activity.RESULT_OK) { resultData?.data?.also { uri -> @@ -797,8 +831,7 @@ class MainActivity : AppCompatActivity() { uri, Intent.FLAG_GRANT_READ_URI_PERMISSION and Intent.FLAG_GRANT_WRITE_URI_PERMISSION ) - thisFileUri = uri - saveMetaToSharedPrefs() + readFile(uri) if (metaData.metaData.get("url") == null) { deleteVisible = false @@ -811,12 +844,8 @@ class MainActivity : AppCompatActivity() { } } - fun getFileContents(): String { - return metaData.toString() + mdeValue - } - - fun saveFile(): Boolean { - if (thisFileUri == null) return false + fun saveFile() { + if (thisFileUri == null) return lateinit var textFile: ParcelFileDescriptor try { @@ -835,7 +864,7 @@ class MainActivity : AppCompatActivity() { ).show() } ) - return false + return // TODO: implement workaround for this bug. See: https://stackoverflow.com/q/69248596 } catch (e: java.io.FileNotFoundException) { Log.d(javaClass.simpleName, "File not found. Deleted while loaded?\n${e.stackTraceToString()}") @@ -849,7 +878,7 @@ class MainActivity : AppCompatActivity() { } ) selectFileForSaveAs() - return false + return } catch (e: Exception) { @@ -863,77 +892,80 @@ class MainActivity : AppCompatActivity() { ).show() } ) - return false - } - /* This block is currently actually not needed as the change logic is made in js */ - //TODO: Rework this for change check on network file provider - Log.d( - javaClass.simpleName, - "Size in cache: ${mdeValue.toByteArray().size} Size on disk: ${textFile.statSize}" - ) - if (getFileContents().length.toLong() == textFile.statSize) { - Log.d(javaClass.simpleName, "No change on disk, file not saved.") - return false + return } + try { - contentResolver.openFileDescriptor(thisFileUri!!, "wt")?.use { - FileOutputStream(it.fileDescriptor).use { - it.write(getFileContents().toByteArray()) + this. runOnUiThread({ + webView.evaluateJavascript("getValue();") { + mdeValue = + metaData.toString() + URLDecoder.decode(it.removeSurrounding("\"")) + if (mdeValue.length.toLong() == textFile.statSize) { + Log.d(javaClass.simpleName, "No change on disk, file not saved.") + return@evaluateJavascript + } + contentResolver.openFileDescriptor(thisFileUri!!, "wt")?.use { + FileOutputStream(it.fileDescriptor).use { + it.write(mdeValue.toByteArray()) + } + } + Log.d(javaClass.simpleName, "File saved: ${thisFileUri}") + Toast.makeText( + this, + "File saved.", + Toast.LENGTH_SHORT + ).show() + textFile.close() } - } + }) } catch (e: Exception) { Toast.makeText( this, "Error during writing.\n$e", Toast.LENGTH_LONG ).show() - return false + return } - Log.d(javaClass.simpleName, "File saved: ${thisFileUri}") - this.runOnUiThread({ - Toast.makeText( - this, - "File saved.", - Toast.LENGTH_SHORT - ).show() - }) - textFile.close() - return true } - private fun saveAs(): Boolean { - lateinit var textFile: ParcelFileDescriptor + private fun saveAs() { try { - textFile = contentResolver.openFileDescriptor(thisFileUri!!, "w")!! - textFile.checkError() - } catch (e: Exception) { + lateinit var textFile: ParcelFileDescriptor + try { + textFile = contentResolver.openFileDescriptor(thisFileUri!!, "w")!! + textFile.checkError() + } catch (e: Exception) { + Toast.makeText( + this, + "Problem with accessing file\n$e", + Toast.LENGTH_LONG + ).show() + return + } + if (truncate) { + mdeValue = "" + truncate = false + } + FileOutputStream(textFile.fileDescriptor).use { + it.write(mdeValue.toByteArray()) + } Toast.makeText( this, - "Problem with accessing file\n$e", + "File saved.", Toast.LENGTH_LONG ).show() - return false - } - try { - FileOutputStream(textFile.fileDescriptor).use { - it.write(getFileContents().toByteArray()) - } + Log.i(javaClass.simpleName, "file newly written") + webView.evaluateJavascript("onRead();", ValueCallback() {}) + + textFile.close() + saveMetaToSharedPrefs() } catch (e: Exception) { Toast.makeText( this, "Error during writing.\n$e", Toast.LENGTH_LONG ).show() - return false } - Toast.makeText( - this, - "File saved.", - Toast.LENGTH_LONG - ).show() - textFile.close() - saveMetaToSharedPrefs() - return true } @Throws(IOException::class) @@ -962,10 +994,6 @@ class MainActivity : AppCompatActivity() { Toast.LENGTH_LONG ).show() }) -/* - openFile(uri) - return false -*/ } try { contentResolver.openInputStream(uri)?.use { inputStream -> @@ -1004,9 +1032,11 @@ class MainActivity : AppCompatActivity() { }) return false } - thisFileUri = uri saveMetaToSharedPrefs() + this.runOnUiThread({ + webView.evaluateJavascript("onRead();", {}) + }) return true } @@ -1035,7 +1065,7 @@ class MainActivity : AppCompatActivity() { override fun onPause() { super.onPause() /*outState.putString("test", "onSaveInstanceState-String")*/ - webView.evaluateJavascript("saveFile();", ValueCallback() {}) + saveFile() webView.evaluateJavascript("easyMDE.codemirror.doc.getCursor();") { metaData.cursor=it Log.i(javaClass.simpleName,"Cursor: $it") diff --git a/app/src/main/res/drawable-hdpi/ic_menu_archive.png b/app/src/main/res/drawable-hdpi/ic_menu_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d9bc1a3c96d1f3b42520c3b7a8419968489ade GIT binary patch literal 1094 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;S3DSex5FlArXh)PCuV79V&3#{_~%l<4cZkdSp6k zZV_eTa(c__7}_cS=m00@j?fP0orMlgj}F8isBaJ`cyNfZN{3zH$d;^?QH)uv8teg? zj|G-5G&Ic2UB7pCzJ*2Uo3HCS%_mOqdLA2=fB#(iGwb~4Zx6}te(Ni=j@|eF>wxVO z4zhe#JEECv&bQ{=XM_FASU65G#x0q#V_l-(?QXxOiLIONuHM`Ku73ZF@`Wzm4@;*1 zJn?&hZD`y|sX}EXGsYrwca!B-0oksH%8&b<(~(`2lG#6_@nz?ffCIcdN2jyjiJoj@ zXnHx!@WcdQ7)c&D!oyu<^ZUk`TZ#eGLnj><=xm!IaLV@G+fH-2Q*yj>=I_br)LzLj z*QI~v_D|^4-@NeTRoA~$v@Xr|)H$&5?`i>=pC2}Vyr$>;N4Wf@s%22Ve>tNx zUlOBQ(Cp}G*J}=`l}hN&l6lLp>Bog!-Litrwn)4Di07vtwD}qx4Z7;q>z*?Ie&w1| zHfJRo8Y~MRKmPRid+O2LwGPr%5w&Uk=T1&y>O(L-0A15*%vdo9;gZ5p6nmp(yBnw65o9v;$-jlF6+79 zIH$BbboU*>(=Pe{WUl;ueylK2>$`04KHeSQ{FVmy*)=p--d6hT#3#G2X}^w^`dl9#KEkC%GAozAt$@fTMB*Oy#VzPU}p1K*^XI*%`jX^-~^>_21%vT;LNtW0d=A8PJ z$Dy+MT=dP|F58XyD!iB19$%xh+(zr^EdhtB-~~#{U+HvsU4PHVB;#>1G+cd}!*2KE zd`v7)d}dGe4|{1jyNqXn#M+b7eb?=i`6gy`OKY3z1yUO_ zQmvAUQh^kMk%6J1u7RPhkwu7+k(G(Lm8r3=frXWU!4kislPDT;^HVa@DsgMLDtxLG xs6i5BLvVgtNqJ&XDuZK6ep0G}XKrG8YEWuoN@d~6R2!fo22WQ%mvv4FO#njD-yi@0 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-ldpi/ic_menu_archive.png b/app/src/main/res/drawable-ldpi/ic_menu_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..719ecd8582b8c20ee1974a2b3d1047966e85607e GIT binary patch literal 1140 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTQ)s;gd%REeX z#SE*BGh6=nq&>U$d)ExlU#e=8^Iolbf43$^?|kjKo$dU3&+EI_*4dnmmU+&tWn$Svd-IRCEscju%{4E((96rW4cr#ojn?RHvR;NEj^uZhIASqjfI3IzO9N|kg! zeZTdwBhHRh?qT!U-ftgu&1Zzjb~fYEgN6?YCSZ=F?YH5@%dDmr@mx2yM(-*uSQ9D?^glcirBfZwhU%tqb$q zyy*IhC1&gUSA4LMU&pRGL$Xuo%!B|I7sK%0>Bpw(AJ9Mkygf{9@)8-jFYGTKS@Oj* zaB@_nFizH4{KeU5wZz*A+&}$1ytHe3_dWgTsJ;Dr-^O}T5dk^>1I?-bUa9Z<{d0cy zW3_3sZ)`O&DgNGN82k5=ukFdWxIGCX932hElMBm!90~bu{*))z$#Kb&PhpGyU;FO& zuCxEgoQVwm&RixdYvcBsnW(T{TEL5f!}QCs)QglVFu#`{QO(tb1h6q!gbGe7Nljqe}7B zMz6UJ*UX|`PgGVC_;A%&QHn3&)}&+(^ZG@0NAzmvzYlzUmdSD6k2mYq-9OEE@ghg4 zTtWKT%#7sC(FVtB-X8xr_pd8c^i{Q1`uC~lF ztz{oKzAKEq_9jG3;q;^Vn}X#I8O$$CpUro`+vZ4MS;5^r`-FM94o80VO1|m4b6M(u z_L;;r7m^(l-rAoDoB4oC?5*0gE8g<$pA;&laen*6*BrQ|*Ux+9N*6&>xww3m4|;;U zRhcDnt_(>DJxswecfP%O8q@TLdtGIl+qpF*fx!HwTH+c}l9E`GYL#4+3Zxi}3=9o) z4Gnb-j6w_ztqe@8j7@b7%&iOzCW^1RjiMnpKP5A*61Rp2UP7Q8%n!05EibP0l+XkKu$0&( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_menu_archive.png b/app/src/main/res/drawable-mdpi/ic_menu_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..49ac569dc2bb8062b66b2e1341d3ad399eb11931 GIT binary patch literal 831 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE>N4hr;B5V$MLIE_GXJD3bfC!ydQghcejubwz?POxFG<92V8lx;2y~S7h;uaE&CMBlDS2tg>s(wAQW!mn-lgB3- zyl9(HYqdr1fOA0CUHAO*d@iTRXPRNB?;U+BuQo&8Y|TG`Tvi4TyF1cbSf!W`BpyC} z`xjsF`V|wWU4MDtNI)k`=d3=5^|l2Q*4ftW^ssx_x+BAzeWOI%il2-0Sj(3_4tgK6 zAz0{Rm$`N9&cjMRdajo&?$STnM-MT~ib%Ev2#V%AM$P)BdU? z55vaijeYlyOI;2~SiFamD{X(jSCm!QM*n?=Y^!=5ol+8BdgL+d`8K5PTxxPKhDqT- zb>H(7ADFd0PEK_%*k|(mKtS(0(e9>OAq|0V4lpGPTw>u+jNUxOU2vIiX4gu$m!gTr zkt};IoD9s0T{Md!#+Lf@}!RPb(=;EJ|f?Ovz75Rq)JB bOiv9;O-!jQJeg_(RK(!v>gTe~DWM4f2U}0P literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_menu_archive.png b/app/src/main/res/drawable-xhdpi/ic_menu_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..b1be9d5b98a60e3a61125a140ce57e4bb91a4234 GIT binary patch literal 1398 zcmZ{kdpHw%7{`CMX-v!AL&9RZ&@?0WX4vGG%h0A#F58q#la}!$#_3EsF5^Lkm^vhp zr<^I|ehJkH$z@Ki2PK!HN0M>Y`S1L3{`h`B&-*^__xb+!-tcrkfkf;@005BAPDHYV zgrAauNgM>$`AQrT?0SL-c2Y85HA^PhC?~&55<2}W$DVNf&t*)MU8sbFf3>i-5eNV* z!I^01b8dX;)*F^4N##W|i#dElc_zoy*%jhdVvx(<@G>CTqY`9g(R&2r3Q#$X`RWA+t6ghwQ_?B*lFS+sR15A@z6;T+C4(~#k%M*XMAR|<6>|%rywnQm1A^f zW%*TTlgZlLYlzn6L9Y|(x}F{LN6h?gLZB9;_Rmlq4!<*#e8npQ3O=;U?&b};`IL;s zw<}H{lHPu%&FH7yy)qc>5jHemP&}imyD0pZ+9`E zl~REu=3qOf`TSrC?@EP>9E`|(u&*@<(KuJFs=-Wbb=;S~X3@OfA`*{@?eoge@MIW} zk$L;|yFuQ&D9Q*nMNvS@$msr%x0G*iz*}LGtO-}&J9Br(H6z{__xBoJ&q#Ur;KL-t zn}s!N7bvPpK$sTtr1#xHWse`&A7PDtUm4D+kKI(098i5!a^fs{JNRhLeg+1v%#Zl+ z20@)46BgCN0uS9T`PA7|WL%oYuN{h$>Q8gK(!E~h!i7aR!upO)hB zq;6C%ciy{3$XGf}y}F{NOV;I9=X)3oLyhF^+W+EyRKr3qSP2U@V3zjy3l}|JuK7`<%6&p zQ(vYyqHu&Mqd+({Xs+MWW3K}-*W2~^sCY3Qt*zQ%$Spb7Mn~kVu8wupMuCl!xN(yk zUQ>;~r$rLk{VBsW1mur+Z#kGi*Xj8rVX<(#cC$LGOI5yZIk#)4fJcyu4KPS4hE^VJ zJ$&4I-~m-_38xDo#6H{}%TpoP`qqsU3~kTZJs+PsAUiTJ)gVPM*o>DAXO`6K<%ZR1 zki_na0g$#zw>avho8HzS0$vX^xJ}3Wqgb;X{U>k;sxL6VTrkpbJ;3`D0jQ&EO#KL= zfcIBdxID1od&)Jy&_gArIAaft;4s*UtFnGMU$CqNxFFl>EUUZzwrxK<-%=gazxrrX zrER#Swai6{vJC6hTcnGhZ)_D~@E;d<@i8#kuO<2pl+^4`?&-po@U&~N{aSM3ic6uo zV0cic=!`S{0PWTo2u$TCuFm^+ay%2uVaEAJKGDldl@kll&Oe**nQ+CYO^Sebp@;G% zoy>J8NcAH9rMKLNmv6_2u(PW+W|f?mN&($M%xH}8UWV0^`#VxET2SiuzAj8iUXnhW zL}k;1*bJ+XXods;hc!0FU`;VNGasy_mB}$H6B7*9+zN}8*Lzg=pFkvwex4ck|AB-A xHEBse<7b06i^=8$MKgdMofXVLIY$PCGRTY|dfdexhK=M1IFsCokL&}J{{co^R(Jpa literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_archive.png b/app/src/main/res/drawable-xxhdpi/ic_menu_archive.png new file mode 100644 index 0000000000000000000000000000000000000000..a2d93b9f00ba97aaa5cbaaf99fd89e908c5c302c GIT binary patch literal 2359 zcmbVMYgkg*8s3PvOv|#2My)Mnc2Qu1h%yoqNST)uDJZo>*eVhifdX+R8A~V2ZsTN4 zJ<-K(YNe*7j%GMBS!#}UoGGg*=;~4Hc+_(=Q*$o0A!l04&kd~1j=H5CEW)#9Y3b9}!L!%B47gMF*#qDiAaP1ktq$flvag!9+M&ETdujYOiBKv51D{ zks}BZ3MQN)UZqpQF}g^uP$v-vim>$MV33xI5J+LQ0Mtr1%T!b?4f~##imWZ$cr5r{ zMJ=IWKRCsYhys~%B@B{r1YaS+p8)zpIEds&p-_B4A^{@c2}C?Z^o1x?5|K(EfFB1I zv8EIyQ8_I3M_Y(Q!=|X!3MwA2(P(fQ5>Bp6#zTRDfff!T(HGJ1Ri(?+0*P-m3)g*h}0u#!6X>T-CrBBC?eia*C@qEQ3RV=a^V&!EK`TFXjtR~ zClZUO1So(2K@>j%g-GxZfROP0n1N&>gGFMJ87o$hCpkWcC5HIt;Upb)|e z$dAbg@MEz9SZx0lfuu=ns7$36$b|5uT`^*p7(!x_$bkWWiKQ}?us|(Wa^>>PlN}J1 zB3H{*DRKqKj3I*&0-;!DkuBx<5G@NiV;>TvQ{#V=| zu%iDbXL!UJyrnt*t63(ukPfsgKeaw0e7Zca47o8%ZDt`j%pQ?Bh^to^6Cbvv)$%;?9K zoDjuZ+hpvw{pCTt@KnL6hw8#^+0)dHzT?Nt9R>dg+xXJ!=*T-lUAkxA3wWEnexzRh z(rYhwsTV&xe>;i**cuZ7NBs=|1MEg5S9Aj4V`~KXj(XH-lUae$xSbCw>wd5?dSp*? z-5aMZ1*tkyWCGd%Mo^5sXwXAlAOJ~`rb%b^pX9&u2>0B z74H7*;GWEL<>lokOH11d@K-A;7Bt?x*>YZ|f4p*&U-+Eki?2XNN4>JEt;@)e z)|9ohgw3$G4vLM9Jy+>gIIy#M%^6#BVd6EyxsD}lHhV|IbK2RBQBA;RZbn9JiddW$ zb7e#QzjmTJFO-)r^QM0J<&&?|pNE+s;3zpL$fvovd0unx`1iVo zE=ME#_j~tt8w~TfeJzLTe{XW~b#R(CZC6oIkzK#my1?fQGP4T7p1+n z@s7!a&&kOl*w5#ToD4qD7brE%*h!OyN3qdpH1Oo$k^=))vsf>yiYlFVuBq%nMTLZ9 zV>~=&ySTVGWxpBg=!hw=t#vz<%57ZOy8)&Dv9`A3jPr)rSeMq;R`N_^@`E2vaAqMD z(1kT&g3)Vr#--#Z83(>oQrL!e%A#pMSN4R(qWs9@+!VjJyeW^%?8hQS<6-M>+e`by z>yE~8rh*v9Q~l7f>IIvA^mZT}y0BU!f=UkOdDfpJUUWAO3=sX3mBS}ZeZyQHPa=6X z$JOu}4)u;aUPP|0BeHNweKpL9U`R!`d!kJUbYie?PB>waX zBHi;vk-e7QBqBBrnd-*dmI0?zUo74?Tg`7gFMXEZmA`eB$lB3kiCse3#M=1y_zkA< z!NEaA)5QLFbj}?4K`S85k^1z}uB6wkZBBh%nY=AsHo>4XkQNm6Qxu|veS)9vOtLm=d(fgw{1KWm7!`oT_>;ZeLY1UtK z;SQB>l1KN&b-sG#Q(XGEYuigFz}s}m`rhE1Hvzb722vV1y>OboVf?vyS=eCy93ThC zL&e!CPPiL~hWs0Wyn(8(mT!7Hml!|WA=`PX7woem_Ym_1@P~|2u(!5zbVg!QQX}T8 z?ACe7Q-Y<^i=CaFMpfMK{joR_y$#t+k35XsR9;!R!<%0z9ozh!e6#$m$+%Sr2_%>BLTnBcw5 zk=wVYB)<%7n=u{{8JYTe8^_Jq8|rQ16#W)@mHznam>Xlg-8arp?cQo-j7hDHFS%}b z=Q)-c3^^2i>s{l1c$q%$)tKF$#98Z5PrH(bR5Zq2fS+o4!O-S)37>n+{JZC)Y=Jr( UJt&%6U;vO28WPF6v?3wvPlBhnNdN!< literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d0c3d78..5ecf787 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -14,7 +14,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" + app:layout_constraintTop_toBottomOf="@id/toolbar" app:layout_constrainedHeight="true" tools:context=".MainActivity"/> + app:layout_constraintTop_toTopOf="parent"/> \ No newline at end of file diff --git a/app/src/main/res/menu/ghost_menu.xml b/app/src/main/res/menu/ghost_menu.xml index 0977109..995a22d 100644 --- a/app/src/main/res/menu/ghost_menu.xml +++ b/app/src/main/res/menu/ghost_menu.xml @@ -1,19 +1,31 @@ + + + + app:showAsAction="always" /> + android:icon="@android:drawable/ic_menu_preferences" + app:showAsAction="always" /> + android:icon="@android:drawable/ic_menu_gallery" + app:showAsAction="always"/> + android:icon="@android:drawable/ic_menu_more" + app:showAsAction="always"/> diff --git a/app/src/main/res/raw/controller.js b/app/src/main/res/raw/controller.js index 0d4cd30..abe6319 100644 --- a/app/src/main/res/raw/controller.js +++ b/app/src/main/res/raw/controller.js @@ -22,14 +22,13 @@ function openFile() { saveFile() Android.triggerOpenFile() onRead() - easyMDE.codemirror.doc.markClean() } function dispatchCut() { console.log("dispatch cut") easyMDE.codemirror.getTextArea().dispatchEvent(new Event("cut")) } function getValue() { - return easyMDE.value() + return encodeURIComponent(easyMDE.value()) } function myPreview() { saveFile() @@ -48,13 +47,6 @@ function shareText() { Android.triggerShare(easyMDE.markdown(easyMDE.codemirror.doc.getValue())) } -function shareGhostText() { - saveFile() - if (confirm('Are you sure you want to publish this?')) { - Android.triggerGhost(easyMDE.markdown(easyMDE.codemirror.doc.getValue())) - } -} - function getHtml() { return encodeURIComponent(easyMDE.markdown(easyMDE.codemirror.doc.getValue())) } @@ -67,7 +59,6 @@ function appendText() { } } - function pasteText() { data = new DataTransfer() data.setData("text/plain", Android.getMdToAppend()) @@ -77,6 +68,10 @@ function pasteText() { document.getElementsByClassName("CodeMirror-scroll")[0].dispatchEvent(event); saveFile() } +function toggleBar() { + Android.toggleBar() + easyMDE.codemirror.focus() +} const easyMDE = new EasyMDE({ spellChecker: false, @@ -108,66 +103,23 @@ const easyMDE = new EasyMDE({ ], toolbar: [ { - name: "more", - className: "fa-solid fa-angles-down", - title: "more", - children: [ - { - name: "saveAs", - action: saveAs, - className: "fa fa-star", - title: "saveAs" - }, - { - name: "new", - action: blankBuffer, - className: "fa fa-file", - title: "New" - }, -/* { - name: "refresh", - action: refresh, - className: "fa fa-refresh", - title: "Refresh" - },*/ - { - name: "day", - action: () => easyMDE.codemirror.setOption("theme","solarized"), - className: "fa fa-sun", - title: "Day Theme" - }, - { - name: "night", - action: () => easyMDE.codemirror.setOption("theme","3024-night"), - className: "fa fa-moon", - title: "Night Theme" - }, - "guide" - ] - }, - { - name: "save", - action: saveFile, - className: "fa fa-save", - title: "Save" + name: "day", + action: () => easyMDE.codemirror.setOption("theme","solarized"), + className: "fa fa-sun", + title: "Day Theme" }, { - name: "open", - action: openFile, - className: "fa-regular fa-folder-open", - title: "Open" + name: "night", + action: () => easyMDE.codemirror.setOption("theme","3024-night"), + className: "fa fa-moon", + title: "Night Theme" }, + "guide", { name: "share", action: shareText, className: "fa fa-share-nodes", title: "Share" - }, - { - name: "shareGhost", - action: shareGhostText, - className: "fa fa-ghost", - title: "Share Ghost" }, "undo", { name: "preview", @@ -176,7 +128,13 @@ const easyMDE = new EasyMDE({ title: "Preview", noDisable: true },"redo", - "bold", "italic","link","code" + "bold", "italic","link","code", + { + name: "toggle", + action: toggleBar, + className: "fa fa-expand", + title: "Toggle Bar", + } ] }); -onRead(); +onRead(); \ No newline at end of file