Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 32 additions & 9 deletions app/src/main/kotlin/org/fossify/gallery/activities/EditActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.provider.MediaStore
import android.view.View
import android.widget.ImageView
import android.widget.RelativeLayout
import androidx.core.view.isInvisible
import androidx.exifinterface.media.ExifInterface
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
Expand All @@ -25,6 +28,7 @@ import com.bumptech.glide.request.target.Target
import com.canhub.cropper.CropImageView
import com.zomato.photofilters.FilterPack
import com.zomato.photofilters.imageprocessors.Filter
import kotlinx.coroutines.*
import org.fossify.commons.dialogs.ColorPickerDialog
import org.fossify.commons.extensions.*
import org.fossify.commons.helpers.NavigationIcon
Expand All @@ -47,7 +51,7 @@ import org.fossify.gallery.models.FilterItem
import java.io.*
import kotlin.math.max

class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener {
class EditActivity : SimpleActivity() {
companion object {
init {
System.loadLibrary("NativeImageProcessor")
Expand Down Expand Up @@ -87,6 +91,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
private var oldExif: ExifInterface? = null
private var filterInitialBitmap: Bitmap? = null
private var originalUri: Uri? = null
private var bitmapCroppingJob: Job? = null
private val binding by viewBinding(ActivityEditBinding::inflate)

override fun onCreate(savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -251,7 +256,6 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
binding.editorDrawCanvas.beGone()
binding.cropImageView.apply {
beVisible()
setOnCropImageCompleteListener(this@EditActivity)
setImageUriAsync(uri)
guidelines = CropImageView.Guidelines.ON

Expand Down Expand Up @@ -313,7 +317,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
setOldExif()

if (binding.cropImageView.isVisible()) {
binding.cropImageView.croppedImageAsync()
cropImageAsync()
} else if (binding.editorDrawCanvas.isVisible()) {
val bitmap = binding.editorDrawCanvas.getBitmap()
if (saveUri.scheme == "file") {
Expand Down Expand Up @@ -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() {
var inputStream: InputStream? = null
try {
Expand Down Expand Up @@ -380,7 +404,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
binding.cropImageView.isVisible() -> {
isSharingBitmap = true
runOnUiThread {
binding.cropImageView.croppedImageAsync()
cropImageAsync()
}
}

Expand Down Expand Up @@ -764,7 +788,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
ResizeDialog(this, point) {
resizeWidth = it.x
resizeHeight = it.y
binding.cropImageView.croppedImageAsync()
cropImageAsync()
}
}

Expand Down Expand Up @@ -792,11 +816,10 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
}
}

override fun onCropImageComplete(view: CropImageView, result: CropImageView.CropResult) {
if (result.error == null && result.bitmap != null) {
private fun onCropImageComplete(bitmap: Bitmap?, error: Exception?) {
if (error == null && bitmap != null) {
setOldExif()

val bitmap = result.bitmap!!
if (isSharingBitmap) {
isSharingBitmap = false
shareBitmap(bitmap)
Expand Down Expand Up @@ -843,7 +866,7 @@ class EditActivity : SimpleActivity(), CropImageView.OnCropImageCompleteListener
toast(R.string.unknown_file_location)
}
} else {
toast("${getString(R.string.image_editing_failed)}: ${result.error?.message}")
toast("${getString(R.string.image_editing_failed)}: ${error?.message}")
}
}

Expand Down
Loading