123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- package io.github.zadam.triliumsender
- import android.content.Context
- import android.content.Intent
- import android.net.Uri
- import android.os.AsyncTask
- import android.os.Bundle
- import android.support.v7.app.AppCompatActivity
- import android.util.Log
- import android.widget.Toast
- import okhttp3.*
- import okhttp3.internal.Util
- import okio.BufferedSink
- import okio.Okio
- import okio.Source
- import java.io.IOException
- import java.io.InputStream
- class ShareActivity : AppCompatActivity() {
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_share)
- val prefs = this.getSharedPreferences(MainActivity.PREFRENCES_NAME, Context.MODE_PRIVATE);
- val triliumAddress = prefs.getString(MainActivity.PREF_TRILIUM_ADDRESS, "");
- val token = prefs.getString(MainActivity.PREF_TOKEN, "");
- if (triliumAddress.isBlank() || token.isBlank()) {
- Toast.makeText(this, "Trilium Sender is not configured. Can't sent the image.", Toast.LENGTH_LONG).show()
- finish()
- return
- }
- val imageUri = intent.extras!!.get(Intent.EXTRA_STREAM) as Uri
- val mimeType = contentResolver.getType(imageUri)
- val sendImageTask = SendImageTask(imageUri, mimeType, triliumAddress, token)
- sendImageTask.execute(null as Void?)
- }
- inner class SendImageTask internal constructor(private val imageUri: Uri, private val mimeType: String,
- private val triliumAddress: String, private val token: String) : AsyncTask<Void, Void, Boolean>() {
- val TAG : String = "SendImageTask"
- override fun doInBackground(vararg params: Void): Boolean {
- val imageStream = contentResolver.openInputStream(imageUri);
- val imageBody = RequestBodyUtil.create(MediaType.parse(mimeType)!!, imageStream)
- val requestBody = MultipartBody.Builder()
- .setType(MultipartBody.FORM)
- .addFormDataPart("upload", "image", imageBody)
- .build()
- val client = OkHttpClient()
- val request = Request.Builder()
- .url(triliumAddress + "/api/sender/image")
- .post(requestBody)
- .build()
- try {
- client.newCall(request).execute()
- // FIXME check status code
- return true;
- }
- catch (e: Exception) {
- Log.e(TAG, "Sending to Trilium failed", e)
- return false;
- }
- }
- override fun onPostExecute(result: Boolean) {
- if (result) {
- Toast.makeText(this@ShareActivity, "Image sent to Trilium", Toast.LENGTH_LONG).show()
- }
- else {
- Toast.makeText(this@ShareActivity, "Sending to Trilium failed", Toast.LENGTH_LONG).show()
- }
- }
- override fun onCancelled() {
- }
- }
- object RequestBodyUtil {
- fun create(mediaType: MediaType, inputStream: InputStream): RequestBody {
- return object : RequestBody() {
- override fun contentType(): MediaType? {
- return mediaType
- }
- override fun contentLength(): Long {
- try {
- return inputStream.available().toLong()
- } catch (e: IOException) {
- return 0
- }
- }
- @Throws(IOException::class)
- override fun writeTo(sink: BufferedSink) {
- var source: Source? = null
- try {
- source = Okio.source(inputStream)
- sink.writeAll(source!!)
- } finally {
- Util.closeQuietly(source)
- }
- }
- }
- }
- }
- }
|