Merge pull request #401 from terofeev/dont-save-copy-after-edit-picture

Implement internal cropping instead of library's built-in function
This commit is contained in:
Naveen Singh 2025-03-06 01:05:46 +05:30 committed by GitHub
commit fbdfd05b80
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -10,9 +10,12 @@ import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.provider.MediaStore import android.provider.MediaStore
import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.RelativeLayout import android.widget.RelativeLayout
import androidx.core.view.isInvisible
import androidx.exifinterface.media.ExifInterface import androidx.exifinterface.media.ExifInterface
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.DataSource
@ -25,6 +28,7 @@ import com.bumptech.glide.request.target.Target
import com.canhub.cropper.CropImageView import com.canhub.cropper.CropImageView
import com.zomato.photofilters.FilterPack import com.zomato.photofilters.FilterPack
import com.zomato.photofilters.imageprocessors.Filter import com.zomato.photofilters.imageprocessors.Filter
import kotlinx.coroutines.*
import org.fossify.commons.dialogs.ColorPickerDialog import org.fossify.commons.dialogs.ColorPickerDialog
import org.fossify.commons.extensions.* import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.NavigationIcon import org.fossify.commons.helpers.NavigationIcon
@ -47,7 +51,7 @@ import org.fossify.gallery.models.FilterItem
import java.io.* import java.io.*
import kotlin.math.max import kotlin.math.max
class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener { class EditActivity : SimpleActivity() {
companion object { companion object {
init { init {
System.loadLibrary("NativeImageProcessor") System.loadLibrary("NativeImageProcessor")
@ -87,6 +91,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private var oldExif: ExifInterface? = null private var oldExif: ExifInterface? = null
private var filterInitialBitmap: Bitmap? = null private var filterInitialBitmap: Bitmap? = null
private var originalUri: Uri? = null private var originalUri: Uri? = null
private var bitmapCroppingJob: Job? = null
private val binding by viewBinding(ActivityEditBinding::inflate) private val binding by viewBinding(ActivityEditBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@ -251,7 +256,6 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
binding.editorDrawCanvas.beGone() binding.editorDrawCanvas.beGone()
binding.cropImageView.apply { binding.cropImageView.apply {
beVisible() beVisible()
setOnCropImageCompleteListener(this@EditActivity)
setImageUriAsync(uri) setImageUriAsync(uri)
guidelines = CropImageView.Guidelines.ON guidelines = CropImageView.Guidelines.ON
@ -313,7 +317,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
setOldExif() setOldExif()
if (binding.cropImageView.isVisible()) { if (binding.cropImageView.isVisible()) {
binding.cropImageView.croppedImageAsync() cropImageAsync()
} else if (binding.editorDrawCanvas.isVisible()) { } else if (binding.editorDrawCanvas.isVisible()) {
val bitmap = binding.editorDrawCanvas.getBitmap() val bitmap = binding.editorDrawCanvas.getBitmap()
if (saveUri.scheme == "file") { if (saveUri.scheme == "file") {
@ -351,6 +355,26 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
} }
} }
private fun setCropProgressBarVisibility(visible: Boolean) {
val progressBar: View? = binding.cropImageView.findViewById(com.canhub.cropper.R.id.CropProgressBar)
progressBar?.isInvisible = visible.not()
}
private fun cropImageAsync() {
setCropProgressBarVisibility(visible = true)
bitmapCroppingJob?.cancel()
bitmapCroppingJob = lifecycleScope.launch(CoroutineExceptionHandler { _, t ->
onCropImageComplete(bitmap = null, error = Exception(t))
}) {
val bitmap = withContext(Dispatchers.Default) {
binding.cropImageView.getCroppedImage()
}
onCropImageComplete(bitmap, null)
}.apply {
invokeOnCompletion { setCropProgressBarVisibility(visible = false) }
}
}
private fun setOldExif() { private fun setOldExif() {
var inputStream: InputStream? = null var inputStream: InputStream? = null
try { try {
@ -380,7 +404,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
binding.cropImageView.isVisible() -> { binding.cropImageView.isVisible() -> {
isSharingBitmap = true isSharingBitmap = true
runOnUiThread { runOnUiThread {
binding.cropImageView.croppedImageAsync() cropImageAsync()
} }
} }
@ -764,7 +788,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
ResizeDialog(this, point) { ResizeDialog(this, point) {
resizeWidth = it.x resizeWidth = it.x
resizeHeight = it.y resizeHeight = it.y
binding.cropImageView.croppedImageAsync() cropImageAsync()
} }
} }
@ -792,11 +816,10 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
} }
} }
override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult) { private fun onCropImageComplete(bitmap: Bitmap?, error: Exception?) {
if (result.error == null && result.bitmap != null) { if (error == null && bitmap != null) {
setOldExif() setOldExif()
val bitmap = result.bitmap!!
if (isSharingBitmap) { if (isSharingBitmap) {
isSharingBitmap = false isSharingBitmap = false
shareBitmap(bitmap) shareBitmap(bitmap)
@ -843,7 +866,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
toast(R.string.unknown_file_location) toast(R.string.unknown_file_location)
} }
} else { } else {
toast("${getString(R.string.image_editing_failed)}: ${result.error?.message}") toast("${getString(R.string.image_editing_failed)}: ${error?.message}")
} }
} }