@@ -5,20 +5,22 @@ import android.graphics.Bitmap
55import android.graphics.BitmapFactory
66import android.graphics.Matrix
77import android.net.Uri
8- import android .media.ExifInterface
8+ import androidx.exifinterface .media.ExifInterface
99import java.io.File
10+ import androidx.core.graphics.scale
1011
1112interface ContentReader {
1213 fun readBytes (uri : Uri ): ByteArray?
13- fun copyToCache (uri : Uri , fileName : String ): Uri ?
14+ fun copyToCache (uri : Uri , fileName : String , maxSize : Int = Int .MAX_VALUE ): Uri ?
15+ fun removeFromCache (uri : Uri )
1416}
1517
1618class AndroidContentReader (private val context : Context ) : ContentReader {
1719 override fun readBytes (uri : Uri ): ByteArray? {
1820 return context.contentResolver.openInputStream(uri)?.use { it.readBytes() }
1921 }
2022
21- override fun copyToCache (uri : Uri , fileName : String ): Uri ? {
23+ override fun copyToCache (uri : Uri , fileName : String , maxSize : Int ): Uri ? {
2224 val bytes = readBytes(uri) ? : return null
2325 val bitmap = BitmapFactory .decodeByteArray(bytes, 0 , bytes.size) ? : return null
2426
@@ -39,8 +41,21 @@ class AndroidContentReader(private val context: Context) : ContentReader {
3941 bitmap
4042 }
4143
44+ val scaled = if (oriented.width > maxSize || oriented.height > maxSize) {
45+ val scale = maxSize.toFloat() / maxOf(oriented.width, oriented.height)
46+ val newWidth = (oriented.width * scale).toInt()
47+ val newHeight = (oriented.height * scale).toInt()
48+ oriented.scale(newWidth, newHeight)
49+ } else {
50+ oriented
51+ }
52+
4253 val file = File (context.cacheDir, fileName)
43- file.outputStream().use { oriented .compress(Bitmap .CompressFormat .PNG , 100 , it) }
54+ file.outputStream().use { scaled .compress(Bitmap .CompressFormat .PNG , 100 , it) }
4455 return Uri .fromFile(file)
4556 }
57+
58+ override fun removeFromCache (uri : Uri ) {
59+ uri.path?.let { File (it).delete() }
60+ }
4661}
0 commit comments