SendNoteActivity.kt 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package io.github.zadam.triliumsender
  2. import android.content.Context
  3. import android.os.AsyncTask
  4. import android.os.Bundle
  5. import android.support.v7.app.AppCompatActivity
  6. import android.util.Log
  7. import android.widget.Toast
  8. import kotlinx.android.synthetic.main.activity_send_note.*
  9. import okhttp3.MediaType
  10. import okhttp3.OkHttpClient
  11. import okhttp3.Request
  12. import okhttp3.RequestBody
  13. import org.json.JSONObject
  14. import java.text.SimpleDateFormat
  15. import java.util.*
  16. class SendNoteActivity : AppCompatActivity() {
  17. override fun onCreate(savedInstanceState: Bundle?) {
  18. super.onCreate(savedInstanceState)
  19. setContentView(R.layout.activity_send_note)
  20. val prefs = this.getSharedPreferences(MainActivity.PREFRENCES_NAME, Context.MODE_PRIVATE);
  21. val triliumAddress = prefs.getString(MainActivity.PREF_TRILIUM_ADDRESS, "");
  22. val token = prefs.getString(MainActivity.PREF_TOKEN, "");
  23. if (triliumAddress.isBlank() || token.isBlank()) {
  24. Toast.makeText(this, "Trilium Sender is not configured. Can't sent the image.", Toast.LENGTH_LONG).show()
  25. finish()
  26. return
  27. }
  28. sendNoteButton.setOnClickListener { view ->
  29. val sendImageTask = SendNoteTask(noteTitle.text.toString(), noteText.text.toString(), triliumAddress, token)
  30. sendImageTask.execute(null as Void?)
  31. }
  32. }
  33. inner class SendNoteTask internal constructor(private val noteTitle: String, private val noteText: String,
  34. private val triliumAddress: String, private val token: String) : AsyncTask<Void, Void, Boolean>() {
  35. val TAG : String = "SendNoteTask"
  36. val JSON = MediaType.parse("application/json; charset=utf-8")
  37. override fun doInBackground(vararg params: Void): Boolean {
  38. val client = OkHttpClient()
  39. val json = JSONObject()
  40. json.put("title", noteTitle)
  41. json.put("content", escape(noteText))
  42. val body = RequestBody.create(JSON, json.toString())
  43. val request = Request.Builder()
  44. .url(triliumAddress + "/api/sender/note")
  45. .addHeader("Authorization", token)
  46. .addHeader("X-Local-Date", now())
  47. .post(body)
  48. .build()
  49. return try {
  50. val response = client.newCall(request).execute()
  51. response.code() == 200
  52. } catch (e: Exception) {
  53. Log.e(TAG, "Sending to Trilium failed", e)
  54. false
  55. }
  56. }
  57. override fun onPostExecute(success: Boolean) {
  58. if (success) {
  59. Toast.makeText(this@SendNoteActivity, "Note sent to Trilium", Toast.LENGTH_LONG).show()
  60. }
  61. else {
  62. Toast.makeText(this@SendNoteActivity, "Sending note to Trilium failed", Toast.LENGTH_LONG).show()
  63. }
  64. finish()
  65. }
  66. private fun now(): String {
  67. val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
  68. val date = dateFormat.format(Calendar.getInstance().getTime())
  69. return date!!
  70. }
  71. private fun escape(s: String): String {
  72. val builder = StringBuilder()
  73. var previousWasASpace = false
  74. for (c in s.toCharArray()) {
  75. if (c == ' ') {
  76. if (previousWasASpace) {
  77. builder.append("&nbsp;")
  78. previousWasASpace = false
  79. continue
  80. }
  81. previousWasASpace = true
  82. } else {
  83. previousWasASpace = false
  84. }
  85. when (c) {
  86. '<' -> builder.append("&lt;")
  87. '>' -> builder.append("&gt;")
  88. '&' -> builder.append("&amp;")
  89. '"' -> builder.append("&quot;")
  90. '\n' -> builder.append("<p>")
  91. // We need Tab support here, because we print StackTraces as HTML
  92. '\t' -> builder.append("&nbsp; &nbsp; &nbsp;")
  93. else -> if (c.toInt() < 128) {
  94. builder.append(c)
  95. } else {
  96. builder.append("&#").append(c.toInt()).append(";")
  97. }
  98. }
  99. }
  100. return builder.toString()
  101. }
  102. override fun onCancelled() {
  103. }
  104. }
  105. }