Fix bug where all saved files were pngs

This commit is contained in:
Matthieu 2022-06-19 14:28:00 +02:00
parent 5c221e004d
commit 3c7f46d75a
2 changed files with 25 additions and 24 deletions

View File

@ -19,7 +19,6 @@ import androidx.activity.viewModels
import androidx.core.net.toFile import androidx.core.net.toFile
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.os.HandlerCompat import androidx.core.os.HandlerCompat
import androidx.core.widget.addTextChangedListener
import androidx.core.widget.doAfterTextChanged import androidx.core.widget.doAfterTextChanged
import androidx.lifecycle.Lifecycle import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
@ -27,29 +26,20 @@ import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.arthenica.ffmpegkit.* import com.arthenica.ffmpegkit.*
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import okhttp3.MultipartBody
import org.pixeldroid.app.MainActivity
import org.pixeldroid.app.R import org.pixeldroid.app.R
import org.pixeldroid.app.databinding.ActivityPostCreationBinding import org.pixeldroid.app.databinding.ActivityPostCreationBinding
import org.pixeldroid.app.postCreation.camera.CameraActivity import org.pixeldroid.app.postCreation.camera.CameraActivity
import org.pixeldroid.app.postCreation.carousel.CarouselItem import org.pixeldroid.app.postCreation.carousel.CarouselItem
import org.pixeldroid.app.postCreation.carousel.ImageCarousel
import org.pixeldroid.app.postCreation.photoEdit.PhotoEditActivity import org.pixeldroid.app.postCreation.photoEdit.PhotoEditActivity
import org.pixeldroid.app.postCreation.photoEdit.VideoEditActivity import org.pixeldroid.app.postCreation.photoEdit.VideoEditActivity
import org.pixeldroid.app.utils.BaseActivity import org.pixeldroid.app.utils.BaseActivity
import org.pixeldroid.app.utils.api.objects.Attachment
import org.pixeldroid.app.utils.db.entities.InstanceDatabaseEntity import org.pixeldroid.app.utils.db.entities.InstanceDatabaseEntity
import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity import org.pixeldroid.app.utils.db.entities.UserDatabaseEntity
import org.pixeldroid.app.utils.ffmpegSafeUri import org.pixeldroid.app.utils.ffmpegSafeUri
import retrofit2.HttpException import org.pixeldroid.app.utils.fileExtension
import java.io.File import java.io.File
import java.io.FileNotFoundException
import java.io.IOException
import java.io.OutputStream import java.io.OutputStream
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.* import java.util.*
@ -214,13 +204,13 @@ class PostCreationActivity : BaseActivity() {
} }
private fun savePicture(button: View, currentPosition: Int) { private fun savePicture(button: View, currentPosition: Int) {
val name = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS", Locale.US) val originalUri = model.getPhotoData().value!![currentPosition].imageUri
.format(System.currentTimeMillis()) + ".png"
val pair = getOutputFile(name) val pair = getOutputFile(originalUri)
val outputStream: OutputStream = pair.first val outputStream: OutputStream = pair.first
val path: String = pair.second val path: String = pair.second
contentResolver.openInputStream(model.getPhotoData().value!![currentPosition].imageUri)!!.use { input -> contentResolver.openInputStream(originalUri)!!.use { input ->
outputStream.use { output -> outputStream.use { output ->
input.copyTo(output) input.copyTo(output)
} }
@ -246,20 +236,28 @@ class PostCreationActivity : BaseActivity() {
).show() ).show()
} }
private fun getOutputFile(name: String): Pair<OutputStream, String> { private fun getOutputFile(uri: Uri): Pair<OutputStream, String> {
val extension = uri.fileExtension(contentResolver)
val name = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS", Locale.US)
.format(System.currentTimeMillis()) + ".$extension"
val outputStream: OutputStream val outputStream: OutputStream
val path: String val path: String
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val resolver: ContentResolver = contentResolver val resolver: ContentResolver = contentResolver
val type = resolver.getType(uri)
val contentValues = ContentValues() val contentValues = ContentValues()
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name) contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name)
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png") contentValues.put(MediaStore.MediaColumns.MIME_TYPE, type)
contentValues.put( contentValues.put(
MediaStore.MediaColumns.RELATIVE_PATH, MediaStore.MediaColumns.RELATIVE_PATH,
Environment.DIRECTORY_PICTURES Environment.DIRECTORY_PICTURES
) )
val imageUri: Uri = val imageUri: Uri = resolver.insert(
resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)!! if (type?.startsWith("image") == true) MediaStore.Images.Media.EXTERNAL_CONTENT_URI
else MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
contentValues)!!
path = imageUri.toString() path = imageUri.toString()
outputStream = resolver.openOutputStream(Objects.requireNonNull(imageUri))!! outputStream = resolver.openOutputStream(Objects.requireNonNull(imageUri))!!
} else { } else {
@ -327,11 +325,7 @@ class PostCreationActivity : BaseActivity() {
val originalUri = model.getPhotoData().value!![position].imageUri val originalUri = model.getPhotoData().value!![position].imageUri
// Having a meaningful suffix is necessary so that ffmpeg knows what to put in output // Having a meaningful suffix is necessary so that ffmpeg knows what to put in output
val suffix = if(originalUri.scheme == "content") { val suffix = originalUri.fileExtension(contentResolver)
contentResolver.getType(model.getPhotoData().value!![position].imageUri)?.takeLastWhile { it != '/' }
} else {
originalUri.toString().takeLastWhile { it != '/' }
}
val file = File.createTempFile("temp_video", ".$suffix") val file = File.createTempFile("temp_video", ".$suffix")
//val file = File.createTempFile("temp_video", ".webm") //val file = File.createTempFile("temp_video", ".webm")
model.trackTempFile(file) model.trackTempFile(file)

View File

@ -45,6 +45,13 @@ fun validDomain(domain: String?): Boolean {
return true return true
} }
fun Uri.fileExtension(contentResolver: ContentResolver): String? {
return if (scheme == "content") {
contentResolver.getType(this)?.takeLastWhile { it != '/' }
} else {
toString().takeLastWhile { it != '/' }
}
}
fun Context.displayDimensionsInPx(): Pair<Int, Int> { fun Context.displayDimensionsInPx(): Pair<Int, Int> {
val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager