79 lines
3.2 KiB
Kotlin
79 lines
3.2 KiB
Kotlin
package sushi.hardcore.aira.utils
|
|
|
|
import android.content.ContentResolver
|
|
import android.content.ContentValues
|
|
import android.content.Context
|
|
import android.net.Uri
|
|
import android.os.Environment
|
|
import android.provider.MediaStore
|
|
import android.provider.OpenableColumns
|
|
import android.webkit.MimeTypeMap
|
|
import android.widget.Toast
|
|
import sushi.hardcore.aira.background_service.ReceiveFile
|
|
import sushi.hardcore.aira.background_service.SendFile
|
|
import java.io.File
|
|
import java.io.FileNotFoundException
|
|
import java.io.OutputStream
|
|
import java.text.DecimalFormat
|
|
import java.text.SimpleDateFormat
|
|
import java.util.*
|
|
import kotlin.math.pow
|
|
import kotlin.math.log10
|
|
|
|
object FileUtils {
|
|
private val units = arrayOf("B", "kB", "MB", "GB", "TB")
|
|
fun formatSize(size: Long): String {
|
|
if (size <= 0) {
|
|
return "0 B"
|
|
}
|
|
val digitGroups = (log10(size.toDouble()) / log10(1000.0)).toInt()
|
|
return DecimalFormat("#,##0.#").format(size / 1000.0.pow(digitGroups.toDouble())
|
|
) + " " + units[digitGroups]
|
|
}
|
|
|
|
fun openFileFromUri(context: Context, uri: Uri): SendFile? {
|
|
var sendFile: SendFile? = null
|
|
val cursor = context.contentResolver.query(uri, null, null, null, null)
|
|
if (cursor != null) {
|
|
if (cursor.moveToFirst()) {
|
|
try {
|
|
context.contentResolver.openInputStream(uri)?.let { inputStream ->
|
|
val fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
|
|
val fileSize = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE))
|
|
sendFile = SendFile(fileName, fileSize, inputStream)
|
|
}
|
|
} catch (e: FileNotFoundException) {
|
|
Toast.makeText(context, e.localizedMessage, Toast.LENGTH_SHORT).show()
|
|
}
|
|
}
|
|
cursor.close()
|
|
}
|
|
return sendFile
|
|
}
|
|
|
|
fun openFileForDownload(context: Context, fileName: String): OutputStream? {
|
|
val fileExtension = fileName.substringAfterLast(".")
|
|
val dateExtension = SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault()).format(Date())
|
|
val datedFilename = if (fileName.contains(".")) {
|
|
val basename = fileName.substringBeforeLast(".")
|
|
"""${basename}_$dateExtension.$fileExtension"""
|
|
} else {
|
|
fileName + "_" + dateExtension
|
|
}
|
|
return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
|
|
context.contentResolver.insert(
|
|
MediaStore.Downloads.EXTERNAL_CONTENT_URI,
|
|
ContentValues().apply {
|
|
put(MediaStore.Images.Media.TITLE, datedFilename)
|
|
put(MediaStore.Images.Media.DISPLAY_NAME, datedFilename)
|
|
put(MediaStore.Images.Media.MIME_TYPE, MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension))
|
|
}
|
|
)?.let {
|
|
context.contentResolver.openOutputStream(it)
|
|
}
|
|
} else {
|
|
@Suppress("Deprecation")
|
|
File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), File(datedFilename).name).outputStream()
|
|
}
|
|
}
|
|
} |