Implement internal cropping instead of library's built-in function

This commit is contained in:
terofeev 2025-02-07 18:24:10 +04:00
parent a948355d2e
commit 6e5802f021

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
@ -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?) {
@ -313,7 +318,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 +356,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 {
@ -764,7 +789,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()
} }
} }
@ -793,10 +818,13 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
} }
override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult) { override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult) {
if (result.error == null && result.bitmap != null) { onCropImageComplete(result.bitmap, result.error)
}
private fun onCropImageComplete(bitmap: Bitmap?, error: Exception?) {
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 +871,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}")
} }
} }