From 96e9c9f30f1394fc4557ca71325e98107c10a9f6 Mon Sep 17 00:00:00 2001 From: Shrasti Date: Thu, 7 May 2020 19:37:18 +0530 Subject: [PATCH 1/4] publish --- compressor/build.gradle | 2 ++ .../java/id/zelory/compressor/Compressor.kt | 17 ++++++++++ .../main/java/id/zelory/compressor/Util.kt | 34 +++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/compressor/build.gradle b/compressor/build.gradle index 2ab91f1..94cdd86 100644 --- a/compressor/build.gradle +++ b/compressor/build.gradle @@ -3,6 +3,8 @@ apply plugin: 'kotlin-android' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'jacoco-android' +group = 'com.github.shrastiRisor' + buildscript { repositories { mavenCentral() diff --git a/compressor/src/main/java/id/zelory/compressor/Compressor.kt b/compressor/src/main/java/id/zelory/compressor/Compressor.kt index bfc5ffe..4f37892 100644 --- a/compressor/src/main/java/id/zelory/compressor/Compressor.kt +++ b/compressor/src/main/java/id/zelory/compressor/Compressor.kt @@ -1,6 +1,7 @@ package id.zelory.compressor import android.content.Context +import android.net.Uri import id.zelory.compressor.constraint.Compression import id.zelory.compressor.constraint.default import kotlinx.coroutines.Dispatchers @@ -30,4 +31,20 @@ object Compressor { } return@withContext result } + + suspend fun compress( + context: Context, + imageFileUri: Uri, + coroutineContext: CoroutineContext = Dispatchers.IO, + compressionPatch: Compression.() -> Unit = { default() } + ) = withContext(coroutineContext) { + val compression = Compression().apply(compressionPatch) + var result = copyToCache(context, imageFileUri) + compression.constraints.forEach { constraint -> + while (constraint.isSatisfied(result).not()) { + result = constraint.satisfy(result) + } + } + return@withContext result + } } \ No newline at end of file diff --git a/compressor/src/main/java/id/zelory/compressor/Util.kt b/compressor/src/main/java/id/zelory/compressor/Util.kt index bcb1cb3..84e3989 100644 --- a/compressor/src/main/java/id/zelory/compressor/Util.kt +++ b/compressor/src/main/java/id/zelory/compressor/Util.kt @@ -1,11 +1,16 @@ package id.zelory.compressor import android.content.Context +import android.database.Cursor import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Matrix import android.media.ExifInterface +import android.net.Uri +import android.os.ParcelFileDescriptor +import android.provider.OpenableColumns import java.io.File +import java.io.FileNotFoundException import java.io.FileOutputStream /** @@ -82,6 +87,35 @@ internal fun copyToCache(context: Context, imageFile: File): File { return imageFile.copyTo(File("${cachePath(context)}${imageFile.name}"), true) } +fun copyToCache(context: Context, srcFileUri: Uri): File { + val cacheFile = File("${cachePath(context)}${getFileName(context, srcFileUri)}") + cacheFile.parentFile.mkdirs() + if (cacheFile.exists()) { + cacheFile.delete() + } + cacheFile.createNewFile() + cacheFile.deleteOnExit() + val fd = context.contentResolver.openFileDescriptor(srcFileUri, "r") + val inputStream = ParcelFileDescriptor.AutoCloseInputStream(fd) + val outputStream = FileOutputStream(cacheFile) + fd.use { + outputStream.use { + inputStream.copyTo(outputStream) + } + } + return cacheFile +} + +fun getFileName(context: Context, uri: Uri) : String { + val cursor: Cursor = context.contentResolver.query( + uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null + ) ?: throw FileNotFoundException() + + val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) + cursor.moveToFirst() + return cursor.getString(nameIndex) +} + fun overWrite(imageFile: File, bitmap: Bitmap, format: Bitmap.CompressFormat = imageFile.compressFormat(), quality: Int = 100): File { val result = if (format == imageFile.compressFormat()) { imageFile From 02678efff8b28fc1e0e60d71b6795223dce94fd5 Mon Sep 17 00:00:00 2001 From: shrastiRisor Date: Sun, 10 May 2020 20:07:10 +0530 Subject: [PATCH 2/4] close the input stream properly --- compressor/src/main/java/id/zelory/compressor/Util.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compressor/src/main/java/id/zelory/compressor/Util.kt b/compressor/src/main/java/id/zelory/compressor/Util.kt index 84e3989..02474eb 100644 --- a/compressor/src/main/java/id/zelory/compressor/Util.kt +++ b/compressor/src/main/java/id/zelory/compressor/Util.kt @@ -98,7 +98,7 @@ fun copyToCache(context: Context, srcFileUri: Uri): File { val fd = context.contentResolver.openFileDescriptor(srcFileUri, "r") val inputStream = ParcelFileDescriptor.AutoCloseInputStream(fd) val outputStream = FileOutputStream(cacheFile) - fd.use { + inputStream.use { outputStream.use { inputStream.copyTo(outputStream) } From 16ebe559ad58ca1001860abcfe33e27feeb8908b Mon Sep 17 00:00:00 2001 From: shrastiRisor Date: Mon, 15 Jun 2020 18:19:26 +0530 Subject: [PATCH 3/4] port fileutil changes to compressor --- .../main/java/id/zelory/compressor/Util.kt | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/compressor/src/main/java/id/zelory/compressor/Util.kt b/compressor/src/main/java/id/zelory/compressor/Util.kt index 02474eb..bbe9e7d 100644 --- a/compressor/src/main/java/id/zelory/compressor/Util.kt +++ b/compressor/src/main/java/id/zelory/compressor/Util.kt @@ -12,6 +12,9 @@ import android.provider.OpenableColumns import java.io.File import java.io.FileNotFoundException import java.io.FileOutputStream +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale /** * Created on : January 24, 2020 @@ -107,13 +110,33 @@ fun copyToCache(context: Context, srcFileUri: Uri): File { } fun getFileName(context: Context, uri: Uri) : String { - val cursor: Cursor = context.contentResolver.query( - uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null - ) ?: throw FileNotFoundException() - - val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) - cursor.moveToFirst() - return cursor.getString(nameIndex) + val resolver = context.contentResolver + val cursor = resolver.query( + uri, arrayOf(OpenableColumns.DISPLAY_NAME + ), null, null, null + ) + cursor.use { + val nameIndex = it!!.getColumnIndex(OpenableColumns.DISPLAY_NAME) + if (it.moveToFirst()) { + return it.getString(nameIndex) + } else { + val prefix = "IMG_" + SimpleDateFormat( + "yyyyMMdd_", + Locale.getDefault() + ).format(Date()) + System.nanoTime() + return when (val fileMimeType = resolver.getType(fileUri)) { + "image/jpg", "image/jpeg" -> { + "$prefix.jpeg" + } + "image/png" -> { + "$prefix.png" + } + else -> { + throw IllegalStateException("$fileMimeType fallback display name not supported") + } + } + } + } } fun overWrite(imageFile: File, bitmap: Bitmap, format: Bitmap.CompressFormat = imageFile.compressFormat(), quality: Int = 100): File { From 953eb2b9d5386f3b46dfc3c4b8ccc9d6b36c5298 Mon Sep 17 00:00:00 2001 From: shrastiRisor Date: Mon, 15 Jun 2020 18:30:24 +0530 Subject: [PATCH 4/4] fix build --- compressor/src/main/java/id/zelory/compressor/Util.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compressor/src/main/java/id/zelory/compressor/Util.kt b/compressor/src/main/java/id/zelory/compressor/Util.kt index bbe9e7d..4ce1705 100644 --- a/compressor/src/main/java/id/zelory/compressor/Util.kt +++ b/compressor/src/main/java/id/zelory/compressor/Util.kt @@ -124,7 +124,7 @@ fun getFileName(context: Context, uri: Uri) : String { "yyyyMMdd_", Locale.getDefault() ).format(Date()) + System.nanoTime() - return when (val fileMimeType = resolver.getType(fileUri)) { + return when (val fileMimeType = resolver.getType(uri)) { "image/jpg", "image/jpeg" -> { "$prefix.jpeg" }