diff --git a/appscan/src/main/AndroidManifest.xml b/appscan/src/main/AndroidManifest.xml index 5be0703c66b4..df434e2fe8be 100644 --- a/appscan/src/main/AndroidManifest.xml +++ b/appscan/src/main/AndroidManifest.xml @@ -2,19 +2,18 @@ - + + android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|uiMode|density|fontScale|keyboard|keyboardHidden" + android:theme="@style/Theme.AppCompat.NoActionBar" /> diff --git a/appscan/src/main/java/com/nextcloud/appscan/AppScanActivity.kt b/appscan/src/main/java/com/nextcloud/appscan/AppScanActivity.kt index 4e0f1f417538..58d3b4a99e50 100644 --- a/appscan/src/main/java/com/nextcloud/appscan/AppScanActivity.kt +++ b/appscan/src/main/java/com/nextcloud/appscan/AppScanActivity.kt @@ -8,11 +8,19 @@ */ package com.nextcloud.appscan -import android.app.Activity import android.content.Intent import android.content.pm.PackageManager +import android.content.res.Configuration +import android.graphics.Bitmap +import android.graphics.PointF +import android.graphics.drawable.BitmapDrawable import android.os.Bundle +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.view.children import com.nextcloud.android.common.ui.util.extensions.applyEdgeToEdgeWithSystemBarPadding +import com.zynksoftware.documentscanner.R import com.zynksoftware.documentscanner.ScanActivity import com.zynksoftware.documentscanner.model.DocumentScannerErrorModel import com.zynksoftware.documentscanner.model.ScannerResults @@ -22,16 +30,57 @@ import com.zynksoftware.documentscanner.ui.DocumentScanner class AppScanActivity : ScanActivity() { override fun onCreate(savedInstanceState: Bundle?) { applyEdgeToEdgeWithSystemBarPadding() - super.onCreate(savedInstanceState) + super.onCreate(null) DocumentScanner.init(this) addFragmentContentLayout() } - override fun onError(error: DocumentScannerErrorModel) { - // TODO pass this from app somehow? - println(error) + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + recreateCropFragmentView() } + private fun recreateCropFragmentView() { + val cropFragment = supportFragmentManager.findFragmentByTag(IMAGE_CROP_FRAGMENT_TAG) ?: return + if (!cropFragment.isVisible) { + return + } + + val cornerFractions = cropFragment.view?.let(::cropCornerFractions) + + supportFragmentManager.beginTransaction().detach(cropFragment).commitNow() + supportFragmentManager.beginTransaction().attach(cropFragment).commitNow() + + val cropView = cropFragment.view ?: return + if (cornerFractions == null) { + return + } + + cropView.post { restoreCropCorners(cropView, cornerFractions) } + } + + private fun cropCornerFractions(cropView: View): List? { + val preview = cropPreviewBitmap(cropView) ?: return null + return cropCornerHandles(cropView).map { PointF(it.x / preview.width, it.y / preview.height) } + } + + private fun restoreCropCorners(cropView: View, cornerFractions: List) { + val preview = cropPreviewBitmap(cropView) ?: return + cropCornerHandles(cropView).zip(cornerFractions) { handle, fraction -> + handle.x = fraction.x * preview.width + handle.y = fraction.y * preview.height + } + cropView.findViewById(R.id.polygonView).invalidate() + } + + private fun cropPreviewBitmap(cropView: View): Bitmap? = + (cropView.findViewById(R.id.imagePreview).drawable as? BitmapDrawable)?.bitmap + + private fun cropCornerHandles(cropView: View): List = + cropView.findViewById(R.id.polygonView).children.toList() + + override fun onError(error: DocumentScannerErrorModel) = Unit + override fun onSuccess(scannerResults: ScannerResults) { val intent = Intent() @@ -40,12 +89,16 @@ class AppScanActivity : ScanActivity() { scannerResults.transformedImageFile?.absolutePath ?: scannerResults.croppedImageFile?.absolutePath ) - setResult(Activity.RESULT_OK, intent) + setResult(RESULT_OK, intent) finish() } override fun onClose() { - setResult(Activity.RESULT_CANCELED) + if (isChangingConfigurations) { + return + } + + setResult(RESULT_CANCELED) finish() } @@ -63,5 +116,7 @@ class AppScanActivity : ScanActivity() { val enabled: Boolean = true const val EXTRA_FILE = "file" + + private const val IMAGE_CROP_FRAGMENT_TAG = "ImageCropFragmentTag" } }