Browse Source

refactoring to more classes

azivner 6 years ago
parent
commit
869ec0da27

+ 1 - 1
app/src/main/java/io/github/zadam/triliumsender/LoginActivity.kt

@@ -4,7 +4,6 @@ import android.animation.Animator
 import android.animation.AnimatorListenerAdapter
 import android.annotation.TargetApi
 import android.app.LoaderManager.LoaderCallbacks
-import android.content.Context
 import android.content.CursorLoader
 import android.content.Loader
 import android.database.Cursor
@@ -21,6 +20,7 @@ import android.view.inputmethod.EditorInfo
 import android.widget.ArrayAdapter
 import android.widget.TextView
 import android.widget.Toast
+import io.github.zadam.triliumsender.services.TriliumSettings
 import kotlinx.android.synthetic.main.activity_login.*
 import okhttp3.*
 import org.json.JSONObject

+ 1 - 3
app/src/main/java/io/github/zadam/triliumsender/MainActivity.kt

@@ -1,12 +1,10 @@
 package io.github.zadam.triliumsender
 
-import android.content.Context
 import android.content.Intent
 import android.os.Bundle
 import android.support.design.widget.Snackbar
 import android.support.v7.app.AppCompatActivity
-import android.widget.Button
-import android.widget.TextView
+import io.github.zadam.triliumsender.services.TriliumSettings
 
 import kotlinx.android.synthetic.main.activity_main.*
 import kotlinx.android.synthetic.main.content_main.*

+ 6 - 46
app/src/main/java/io/github/zadam/triliumsender/SendNoteActivity.kt

@@ -5,14 +5,14 @@ import android.os.Bundle
 import android.support.v7.app.AppCompatActivity
 import android.util.Log
 import android.widget.Toast
+import io.github.zadam.triliumsender.services.HtmlConverter
+import io.github.zadam.triliumsender.services.TriliumSettings
+import io.github.zadam.triliumsender.services.Utils
 import kotlinx.android.synthetic.main.activity_send_note.*
-import okhttp3.MediaType
 import okhttp3.OkHttpClient
 import okhttp3.Request
 import okhttp3.RequestBody
 import org.json.JSONObject
-import java.text.SimpleDateFormat
-import java.util.*
 
 class SendNoteActivity : AppCompatActivity() {
 
@@ -40,21 +40,20 @@ class SendNoteActivity : AppCompatActivity() {
                                                   private val apiToken: String) : AsyncTask<Void, Void, Boolean>() {
 
         val TAG : String = "SendNoteTask"
-        val JSON = MediaType.parse("application/json; charset=utf-8")
 
         override fun doInBackground(vararg params: Void): Boolean {
             val client = OkHttpClient()
 
             val json = JSONObject()
             json.put("title", noteTitle)
-            json.put("content", escape(noteText))
+            json.put("content", HtmlConverter().convertPlainTextToHtml(noteText))
 
-            val body = RequestBody.create(JSON, json.toString())
+            val body = RequestBody.create(Utils.JSON, json.toString())
 
             val request = Request.Builder()
                     .url(triliumAddress + "/api/sender/note")
                     .addHeader("Authorization", apiToken)
-                    .addHeader("X-Local-Date", now())
+                    .addHeader("X-Local-Date", Utils.localDateStr())
                     .post(body)
                     .build()
 
@@ -80,45 +79,6 @@ class SendNoteActivity : AppCompatActivity() {
             finish()
         }
 
-        private fun now(): String {
-            val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
-            val date = dateFormat.format(Calendar.getInstance().getTime())
-
-            return date!!
-        }
-
-        private fun escape(s: String): String {
-            val builder = StringBuilder()
-            var previousWasASpace = false
-            for (c in s.toCharArray()) {
-                if (c == ' ') {
-                    if (previousWasASpace) {
-                        builder.append("&nbsp;")
-                        previousWasASpace = false
-                        continue
-                    }
-                    previousWasASpace = true
-                } else {
-                    previousWasASpace = false
-                }
-                when (c) {
-                    '<' -> builder.append("&lt;")
-                    '>' -> builder.append("&gt;")
-                    '&' -> builder.append("&amp;")
-                    '"' -> builder.append("&quot;")
-                    '\n' -> builder.append("<p>")
-                    // We need Tab support here, because we print StackTraces as HTML
-                    '\t' -> builder.append("&nbsp; &nbsp; &nbsp;")
-                    else -> if (c.toInt() < 128) {
-                        builder.append(c)
-                    } else {
-                        builder.append("&#").append(c.toInt()).append(";")
-                    }
-                }
-            }
-            return builder.toString()
-        }
-
         override fun onCancelled() {
         }
     }

+ 26 - 86
app/src/main/java/io/github/zadam/triliumsender/ShareActivity.kt

@@ -1,25 +1,20 @@
 package io.github.zadam.triliumsender
 
 import android.content.Intent
-import android.graphics.Bitmap
-import android.graphics.BitmapFactory
 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.ByteArrayInputStream
-import java.io.ByteArrayOutputStream
-import java.io.IOException
-import java.io.InputStream
-import java.text.SimpleDateFormat
-import java.util.*
+import io.github.zadam.triliumsender.services.ImageConverter
+import io.github.zadam.triliumsender.services.RequestBodyUtil
+import io.github.zadam.triliumsender.services.TriliumSettings
+import io.github.zadam.triliumsender.services.Utils
+import okhttp3.MediaType
+import okhttp3.MultipartBody
+import okhttp3.OkHttpClient
+import okhttp3.Request
 
 
 class ShareActivity : AppCompatActivity() {
@@ -54,23 +49,14 @@ class ShareActivity : AppCompatActivity() {
 
         override fun doInBackground(vararg params: Void): SendImageResult {
 
-            val imageStream = contentResolver.openInputStream(imageUri);
-
-            val imageBody = RequestBodyUtil.create(MediaType.parse(mimeType)!!, scaleImage(imageStream, mimeType))
-
-            val contentLength = imageBody.contentLength()
-
-            val requestBody = MultipartBody.Builder()
-                    .setType(MultipartBody.FORM)
-                    .addFormDataPart("upload", "image", imageBody)
-                    .build()
+            val (requestBody, contentLength) = buildRequestBody()
 
             val client = OkHttpClient()
 
             val request = Request.Builder()
                     .url(triliumAddress + "/api/sender/image")
                     .addHeader("Authorization", apiToken)
-                    .addHeader("X-Local-Date", now())
+                    .addHeader("X-Local-Date", Utils.localDateStr())
                     .post(requestBody)
                     .build()
 
@@ -86,6 +72,22 @@ class ShareActivity : AppCompatActivity() {
             }
         }
 
+        private fun buildRequestBody(): Pair<MultipartBody, Long> {
+            val imageStream = contentResolver.openInputStream(imageUri);
+            val scaledImage = ImageConverter().scaleImage(imageStream, mimeType)
+
+            val imageBody = RequestBodyUtil.create(MediaType.parse(mimeType)!!, scaledImage)
+
+            val contentLength = imageBody.contentLength()
+
+            val requestBody = MultipartBody.Builder()
+                    .setType(MultipartBody.FORM)
+                    .addFormDataPart("upload", "image", imageBody)
+                    .build()
+            return Pair(requestBody, contentLength)
+        }
+
+
         override fun onPostExecute(result: SendImageResult) {
             if (result.success) {
                 Toast.makeText(this@ShareActivity, "Image sent to Trilium (" + (result.contentLength!! / 1000) + " KB)", Toast.LENGTH_LONG).show()
@@ -100,66 +102,4 @@ class ShareActivity : AppCompatActivity() {
         override fun onCancelled() {
         }
     }
-
-    private fun now(): String {
-        val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
-        val date = dateFormat.format(Calendar.getInstance().getTime())
-
-        return date!!
-    }
-
-    private fun scaleImage(inputStream: InputStream, mimeType: String): InputStream {
-        // we won't do anything with GIFs, PNGs etc. This is minority use case anyway
-        if (mimeType != "image/jpeg") {
-            return inputStream;
-        }
-
-        val options = BitmapFactory.Options()
-        val bitmap = BitmapFactory.decodeStream(inputStream, null, options)
-
-        val maxWidth = 2000
-        val maxHeight = 2000
-
-        val scale = Math.min(maxHeight.toFloat() / bitmap.width, maxWidth.toFloat() / bitmap.height)
-
-        val newWidth : Int = if (scale < 1) (bitmap.width * scale).toInt() else bitmap.width;
-        val newHeight : Int = if (scale < 1) (bitmap.height * scale).toInt() else bitmap.height;
-
-        val scaledBitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
-
-        val baos = ByteArrayOutputStream()
-        scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 75, baos)
-        val bitmapdata = baos.toByteArray()
-
-        return ByteArrayInputStream(bitmapdata)
-    }
-
-    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)
-                    }
-                }
-            }
-        }
-    }
 }

+ 35 - 0
app/src/main/java/io/github/zadam/triliumsender/services/HtmlConverter.kt

@@ -0,0 +1,35 @@
+package io.github.zadam.triliumsender.services
+
+class HtmlConverter {
+    fun convertPlainTextToHtml(s: String): String {
+        val builder = StringBuilder()
+        var previousWasASpace = false
+        for (c in s.toCharArray()) {
+            if (c == ' ') {
+                if (previousWasASpace) {
+                    builder.append("&nbsp;")
+                    previousWasASpace = false
+                    continue
+                }
+                previousWasASpace = true
+            } else {
+                previousWasASpace = false
+            }
+            when (c) {
+                '<' -> builder.append("&lt;")
+                '>' -> builder.append("&gt;")
+                '&' -> builder.append("&amp;")
+                '"' -> builder.append("&quot;")
+                '\n' -> builder.append("<p>")
+            // We need Tab support here, because we print StackTraces as HTML
+                '\t' -> builder.append("&nbsp; &nbsp; &nbsp;")
+                else -> if (c.toInt() < 128) {
+                    builder.append(c)
+                } else {
+                    builder.append("&#").append(c.toInt()).append(";")
+                }
+            }
+        }
+        return builder.toString()
+    }
+}

+ 35 - 0
app/src/main/java/io/github/zadam/triliumsender/services/ImageConverter.kt

@@ -0,0 +1,35 @@
+package io.github.zadam.triliumsender.services
+
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import java.io.ByteArrayInputStream
+import java.io.ByteArrayOutputStream
+import java.io.InputStream
+
+class ImageConverter {
+    fun scaleImage(inputStream: InputStream, mimeType: String): InputStream {
+        // we won't do anything with GIFs, PNGs etc. This is minority use case anyway
+        if (mimeType != "image/jpeg") {
+            return inputStream;
+        }
+
+        val options = BitmapFactory.Options()
+        val bitmap = BitmapFactory.decodeStream(inputStream, null, options)
+
+        val maxWidth = 2000
+        val maxHeight = 2000
+
+        val scale = Math.min(maxHeight.toFloat() / bitmap.width, maxWidth.toFloat() / bitmap.height)
+
+        val newWidth: Int = if (scale < 1) (bitmap.width * scale).toInt() else bitmap.width;
+        val newHeight: Int = if (scale < 1) (bitmap.height * scale).toInt() else bitmap.height;
+
+        val scaledBitmap = Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
+
+        val baos = ByteArrayOutputStream()
+        scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 75, baos)
+        val bitmapdata = baos.toByteArray()
+
+        return ByteArrayInputStream(bitmapdata)
+    }
+}

+ 39 - 0
app/src/main/java/io/github/zadam/triliumsender/services/RequestBodyUtil.kt

@@ -0,0 +1,39 @@
+package io.github.zadam.triliumsender.services
+
+import okhttp3.MediaType
+import okhttp3.RequestBody
+import okhttp3.internal.Util
+import okio.BufferedSink
+import okio.Okio
+import okio.Source
+import java.io.IOException
+import java.io.InputStream
+
+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)
+                }
+            }
+        }
+    }
+}

+ 1 - 1
app/src/main/java/io/github/zadam/triliumsender/TriliumSettings.kt → app/src/main/java/io/github/zadam/triliumsender/services/TriliumSettings.kt

@@ -1,4 +1,4 @@
-package io.github.zadam.triliumsender
+package io.github.zadam.triliumsender.services
 
 import android.app.Activity
 import android.content.Context

+ 18 - 0
app/src/main/java/io/github/zadam/triliumsender/services/Utils.kt

@@ -0,0 +1,18 @@
+package io.github.zadam.triliumsender.services
+
+import okhttp3.MediaType
+import java.text.SimpleDateFormat
+import java.util.*
+
+class Utils {
+    companion object {
+        val JSON = MediaType.parse("application/json; charset=utf-8")
+
+        fun localDateStr(): String {
+            val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
+            val date = dateFormat.format(Calendar.getInstance().getTime())
+
+            return date!!
+        }
+    }
+}