1
0

ShareActivity.kt 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package io.github.zadam.triliumsender
  2. import android.content.Intent
  3. import android.net.Uri
  4. import android.os.AsyncTask
  5. import android.os.Bundle
  6. import android.support.v7.app.AppCompatActivity
  7. import android.util.Log
  8. import android.widget.Toast
  9. import io.github.zadam.triliumsender.services.ImageConverter
  10. import io.github.zadam.triliumsender.services.RequestBodyUtil
  11. import io.github.zadam.triliumsender.services.TriliumSettings
  12. import io.github.zadam.triliumsender.services.Utils
  13. import okhttp3.MediaType
  14. import okhttp3.MultipartBody
  15. import okhttp3.OkHttpClient
  16. import okhttp3.Request
  17. class ShareActivity : AppCompatActivity() {
  18. override fun onCreate(savedInstanceState: Bundle?) {
  19. super.onCreate(savedInstanceState)
  20. setContentView(R.layout.activity_share)
  21. val settings = TriliumSettings(this)
  22. if (!settings.isConfigured()) {
  23. Toast.makeText(this, "Trilium Sender is not configured. Can't sent the image.", Toast.LENGTH_LONG).show()
  24. finish()
  25. return
  26. }
  27. val imageUri = intent.extras!!.get(Intent.EXTRA_STREAM) as Uri
  28. val mimeType = contentResolver.getType(imageUri)
  29. val sendImageTask = SendImageTask(imageUri, mimeType, settings.triliumAddress, settings.apiToken)
  30. sendImageTask.execute(null as Void?)
  31. }
  32. inner class SendImageResult (val success: Boolean, val contentLength: Long? = null)
  33. inner class SendImageTask internal constructor(private val imageUri: Uri,
  34. private val mimeType: String,
  35. private val triliumAddress: String,
  36. private val apiToken: String) : AsyncTask<Void, Void, SendImageResult>() {
  37. val TAG : String = "SendImageTask"
  38. override fun doInBackground(vararg params: Void): SendImageResult {
  39. val (requestBody, contentLength) = buildRequestBody()
  40. val client = OkHttpClient()
  41. val request = Request.Builder()
  42. .url(triliumAddress + "/api/sender/image")
  43. .addHeader("Authorization", apiToken)
  44. .addHeader("X-Local-Date", Utils.localDateStr())
  45. .post(requestBody)
  46. .build()
  47. try {
  48. val response = client.newCall(request).execute()
  49. return SendImageResult(response.code() == 200, contentLength)
  50. }
  51. catch (e: Exception) {
  52. Log.e(TAG, "Sending to Trilium failed", e)
  53. return SendImageResult(false)
  54. }
  55. }
  56. private fun buildRequestBody(): Pair<MultipartBody, Long> {
  57. val imageStream = contentResolver.openInputStream(imageUri);
  58. val scaledImage = ImageConverter().scaleImage(imageStream, mimeType)
  59. val imageBody = RequestBodyUtil.create(MediaType.parse(mimeType)!!, scaledImage)
  60. val contentLength = imageBody.contentLength()
  61. val requestBody = MultipartBody.Builder()
  62. .setType(MultipartBody.FORM)
  63. .addFormDataPart("upload", "image", imageBody)
  64. .build()
  65. return Pair(requestBody, contentLength)
  66. }
  67. override fun onPostExecute(result: SendImageResult) {
  68. if (result.success) {
  69. Toast.makeText(this@ShareActivity, "Image sent to Trilium (" + (result.contentLength!! / 1000) + " KB)", Toast.LENGTH_LONG).show()
  70. }
  71. else {
  72. Toast.makeText(this@ShareActivity, "Sending to Trilium failed", Toast.LENGTH_LONG).show()
  73. }
  74. finish()
  75. }
  76. override fun onCancelled() {
  77. }
  78. }
  79. }