ShareActivity.kt 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package io.github.zadam.triliumsender
  2. import android.content.Context
  3. import android.content.Intent
  4. import android.net.Uri
  5. import android.os.AsyncTask
  6. import android.os.Bundle
  7. import android.support.v7.app.AppCompatActivity
  8. import android.util.Log
  9. import android.widget.Toast
  10. import okhttp3.*
  11. import okhttp3.internal.Util
  12. import okio.BufferedSink
  13. import okio.Okio
  14. import okio.Source
  15. import java.io.IOException
  16. import java.io.InputStream
  17. class ShareActivity : AppCompatActivity() {
  18. override fun onCreate(savedInstanceState: Bundle?) {
  19. super.onCreate(savedInstanceState)
  20. setContentView(R.layout.activity_share)
  21. val prefs = this.getSharedPreferences(MainActivity.PREFRENCES_NAME, Context.MODE_PRIVATE);
  22. val triliumAddress = prefs.getString(MainActivity.PREF_TRILIUM_ADDRESS, "");
  23. val token = prefs.getString(MainActivity.PREF_TOKEN, "");
  24. if (triliumAddress.isBlank() || token.isBlank()) {
  25. Toast.makeText(this, "Trilium Sender is not configured. Can't sent the image.", Toast.LENGTH_LONG).show()
  26. finish()
  27. return
  28. }
  29. val imageUri = intent.extras!!.get(Intent.EXTRA_STREAM) as Uri
  30. val mimeType = contentResolver.getType(imageUri)
  31. val sendImageTask = SendImageTask(imageUri, mimeType, triliumAddress, token)
  32. sendImageTask.execute(null as Void?)
  33. }
  34. inner class SendImageTask internal constructor(private val imageUri: Uri, private val mimeType: String,
  35. private val triliumAddress: String, private val token: String) : AsyncTask<Void, Void, Boolean>() {
  36. val TAG : String = "SendImageTask"
  37. override fun doInBackground(vararg params: Void): Boolean {
  38. val imageStream = contentResolver.openInputStream(imageUri);
  39. val imageBody = RequestBodyUtil.create(MediaType.parse(mimeType)!!, imageStream)
  40. val requestBody = MultipartBody.Builder()
  41. .setType(MultipartBody.FORM)
  42. .addFormDataPart("upload", "image", imageBody)
  43. .build()
  44. val client = OkHttpClient()
  45. val request = Request.Builder()
  46. .url(triliumAddress + "/api/sender/image")
  47. .post(requestBody)
  48. .build()
  49. try {
  50. client.newCall(request).execute()
  51. // FIXME check status code
  52. return true;
  53. }
  54. catch (e: Exception) {
  55. Log.e(TAG, "Sending to Trilium failed", e)
  56. return false;
  57. }
  58. }
  59. override fun onPostExecute(result: Boolean) {
  60. if (result) {
  61. Toast.makeText(this@ShareActivity, "Image sent to Trilium", Toast.LENGTH_LONG).show()
  62. }
  63. else {
  64. Toast.makeText(this@ShareActivity, "Sending to Trilium failed", Toast.LENGTH_LONG).show()
  65. }
  66. }
  67. override fun onCancelled() {
  68. }
  69. }
  70. object RequestBodyUtil {
  71. fun create(mediaType: MediaType, inputStream: InputStream): RequestBody {
  72. return object : RequestBody() {
  73. override fun contentType(): MediaType? {
  74. return mediaType
  75. }
  76. override fun contentLength(): Long {
  77. try {
  78. return inputStream.available().toLong()
  79. } catch (e: IOException) {
  80. return 0
  81. }
  82. }
  83. @Throws(IOException::class)
  84. override fun writeTo(sink: BufferedSink) {
  85. var source: Source? = null
  86. try {
  87. source = Okio.source(inputStream)
  88. sink.writeAll(source!!)
  89. } finally {
  90. Util.closeQuietly(source)
  91. }
  92. }
  93. }
  94. }
  95. }
  96. }