diff --git a/CHANGELOG.md b/CHANGELOG.md index 0aefbfd..e77a5c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ # Not Released -# 0.1.5 +# 0.1.7 +- fixed close buttons + +# 0.1.6 +> 2021-3-25 +- see 0.1.5 + +# 0.1.5 > 2021-3-25 - Moved from CameraX to LifecycleCameraController - Enhanced image preprocessing before contours extraction diff --git a/app/src/main/java/net/kuama/documentscanner/presentation/BaseScannerActivity.kt b/app/src/main/java/net/kuama/documentscanner/presentation/BaseScannerActivity.kt index 782d9a0..f8ce4c4 100644 --- a/app/src/main/java/net/kuama/documentscanner/presentation/BaseScannerActivity.kt +++ b/app/src/main/java/net/kuama/documentscanner/presentation/BaseScannerActivity.kt @@ -1,6 +1,8 @@ package net.kuama.documentscanner.presentation import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent import android.graphics.Bitmap import android.os.Bundle import android.util.Log @@ -14,6 +16,7 @@ import net.kuama.documentscanner.data.Loader import net.kuama.documentscanner.domain.Failure import net.kuama.documentscanner.domain.PerspectiveTransform import java.io.File +import android.graphics.BitmapFactory @androidx.camera.core.ExperimentalGetImage abstract class BaseScannerActivity : AppCompatActivity() { @@ -42,6 +45,12 @@ abstract class BaseScannerActivity : AppCompatActivity() { } }) + viewModel.lastUri.observe(this, Observer { + val intent = Intent(this, CropperActivity::class.java) + intent.putExtra("lastUri", it.toString()) + this.startActivityForResult(intent, 0) + }) + viewModel.errors.observe(this, Observer { onError(it) Log.e(ScannerActivity::class.java.simpleName, it.message, it) @@ -99,10 +108,28 @@ abstract class BaseScannerActivity : AppCompatActivity() { viewModel.onViewCreated(Loader(this), this, viewFinder) } - fun closePreview() { + private fun closePreview() { + root_view.visibility = View.GONE + viewModel.onClosePreview() finish() } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + val bitmapUri = data?.extras?.getString("croppedPath") ?: error("invalid path") + + val image: File = File(bitmapUri) + val bmOptions = BitmapFactory.Options() + val bitmap = BitmapFactory.decodeFile(image.absolutePath, bmOptions) + onDocumentAccepted(bitmap) + + image.delete() + } else { + viewModel.onViewCreated(Loader(this), this, viewFinder) + } + } + abstract fun onError(throwable: Throwable) abstract fun onDocumentAccepted(bitmap: Bitmap) abstract fun onClose() diff --git a/app/src/main/java/net/kuama/documentscanner/presentation/CropperActivity.kt b/app/src/main/java/net/kuama/documentscanner/presentation/CropperActivity.kt index db8b048..cc285a5 100644 --- a/app/src/main/java/net/kuama/documentscanner/presentation/CropperActivity.kt +++ b/app/src/main/java/net/kuama/documentscanner/presentation/CropperActivity.kt @@ -1,7 +1,7 @@ package net.kuama.documentscanner.presentation import android.annotation.SuppressLint -import android.content.Intent +import android.app.Activity import android.graphics.Bitmap import android.graphics.Canvas import android.net.Uri @@ -14,6 +14,10 @@ import androidx.core.net.toUri import androidx.lifecycle.Observer import kotlinx.android.synthetic.main.activity_cropper.* import net.kuama.documentscanner.R +import java.io.ByteArrayOutputStream +import android.content.Intent +import java.io.File +import java.io.FileOutputStream class CropperActivity : AppCompatActivity() { private lateinit var cropModel: CropperModel @@ -51,28 +55,16 @@ class CropperActivity : AppCompatActivity() { } }) - cropModel.finalDocument.observe(this, Observer { - finalResult.setImageBitmap(cropModel.finalDocument.value) - }) - cropModel.bitmapToCrop.observe(this, Observer { cropResultPreview.setImageBitmap(cropModel.bitmapToCrop.value) }) - acceptFinalResult.setOnClickListener { - finish() - } - closeResultPreview.setOnClickListener { - val intent = Intent(this, ScannerActivity::class.java) - finish() - this.startActivity(intent) + closeActivity() } closeCropPreview.setOnClickListener { - val intent = Intent(this, ScannerActivity::class.java) - finish() - this.startActivity(intent) + closeActivity() } confirmCropPreview.setOnClickListener { @@ -83,9 +75,16 @@ class CropperActivity : AppCompatActivity() { } confirmCropResult.setOnClickListener { - cropResultWrap.visibility = View.GONE - cropModel.onAcceptResult() - finalResultWrap.visibility = View.VISIBLE + val file = File("/storage/emulated/0/Documents/croppedDoc.jpg") + val outputStream = FileOutputStream(file) + outputStream.write(cropModel.bitmapToCrop.value?.toByteArray()) + outputStream.close() + + val resultIntent = Intent() + resultIntent.putExtra("croppedPath", "/storage/emulated/0/Documents/croppedDoc.jpg") + setResult(RESULT_OK, resultIntent) + // this.setResult(Activity.RESULT_OK) + finish() } cropPreview.setOnTouchListener { _, motionEvent -> @@ -111,6 +110,17 @@ class CropperActivity : AppCompatActivity() { v.draw(c) return b } + + private fun closeActivity() { + this.setResult(Activity.RESULT_CANCELED) + finish() + } +} +fun Bitmap.toByteArray(): ByteArray { + ByteArrayOutputStream().apply { + compress(Bitmap.CompressFormat.JPEG, 100, this) + return toByteArray() + } } private inline fun View.waitForLayout(crossinline yourAction: () -> Unit) { diff --git a/app/src/main/java/net/kuama/documentscanner/presentation/CropperModel.kt b/app/src/main/java/net/kuama/documentscanner/presentation/CropperModel.kt index b667662..21e2dc3 100644 --- a/app/src/main/java/net/kuama/documentscanner/presentation/CropperModel.kt +++ b/app/src/main/java/net/kuama/documentscanner/presentation/CropperModel.kt @@ -39,10 +39,6 @@ class CropperModel : ViewModel() { } } - fun onAcceptResult() { - finalDocument.value = bitmapToCrop.value - } - fun onCornersAccepted(bitmap: Bitmap) { perspectiveTransform( PerspectiveTransform.Params( diff --git a/app/src/main/java/net/kuama/documentscanner/presentation/ScannerViewModel.kt b/app/src/main/java/net/kuama/documentscanner/presentation/ScannerViewModel.kt index 3088fde..7ef58a2 100644 --- a/app/src/main/java/net/kuama/documentscanner/presentation/ScannerViewModel.kt +++ b/app/src/main/java/net/kuama/documentscanner/presentation/ScannerViewModel.kt @@ -2,8 +2,6 @@ package net.kuama.documentscanner.presentation import android.annotation.SuppressLint import android.content.Context -import android.content.Intent -import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK import android.graphics.* import android.net.Uri import androidx.appcompat.app.AppCompatActivity @@ -112,18 +110,13 @@ class ScannerViewModel : ViewModel() { errors.value = exc } override fun onImageSaved(output: ImageCapture.OutputFileResults) { - lastUri = Uri.fromFile(photoFile) - - val intent = Intent(context, CropperActivity::class.java) - intent.putExtra("lastUri", lastUri.toString()) - intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK - context.startActivity(intent) + lastUri.value = Uri.fromFile(photoFile) } }) } // CameraX setup - private var lastUri: Uri? = null + var lastUri: MutableLiveData = MutableLiveData() @SuppressLint("RestrictedApi", "UnsafeExperimentalUsageError") private fun setupCamera( @@ -187,4 +180,13 @@ class ScannerViewModel : ViewModel() { errors.value = failure.origin isBusy.value = false } + + fun onClosePreview() { + lastUri.value?.let { + val file = File(it.path!!) + if (file.exists()) { + file.delete() + } + } + } } diff --git a/app/src/main/res/layout/activity_cropper.xml b/app/src/main/res/layout/activity_cropper.xml index ff6dc8d..d4cad82 100644 --- a/app/src/main/res/layout/activity_cropper.xml +++ b/app/src/main/res/layout/activity_cropper.xml @@ -86,32 +86,6 @@ - - - - - - - - - - - - - -