From 47bc59103542618a91fdedcff79c04cfbefe68a4 Mon Sep 17 00:00:00 2001 From: darthpaul Date: Fri, 25 Nov 2022 07:52:10 +0000 Subject: [PATCH 1/3] improve preview alignment - center the PreviewView between the top action icons and the bottom mode switcher view for 4:3, 3:2 (video mode - SD) and 1:1 resolutions, when not full screen --- .../camera/activities/MainActivity.kt | 18 +++++++++++++++++- .../camera/implementations/CameraXPreview.kt | 2 ++ .../implementations/CameraXPreviewListener.kt | 2 +- .../simplemobiletools/camera/models/MySize.kt | 4 ++++ app/src/main/res/layout/activity_main.xml | 4 +++- 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt index 15691056..5ddc51bb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt @@ -11,6 +11,7 @@ import android.os.Bundle import android.provider.MediaStore import android.view.* import android.widget.LinearLayout +import androidx.constraintlayout.widget.ConstraintSet import androidx.core.content.ContextCompat import androidx.core.view.* import androidx.transition.* @@ -318,7 +319,9 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera initInPhotoMode = isInPhotoMode, ) - mFocusCircleView = FocusCircleView(this) + mFocusCircleView = FocusCircleView(this).apply { + id = View.generateViewId() + } view_holder.addView(mFocusCircleView) setupPreviewImage(true) @@ -752,6 +755,19 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera button.iconTint = ColorStateList(states, iconColors) } + override fun adjustPreviewView(requiresCentering: Boolean) { + val constraintSet = ConstraintSet() + constraintSet.clone(view_holder) + if (requiresCentering) { + constraintSet.connect(preview_view.id, ConstraintSet.TOP, top_options.id, ConstraintSet.BOTTOM) + constraintSet.connect(preview_view.id, ConstraintSet.BOTTOM, camera_mode_tab.id, ConstraintSet.TOP) + } else { + constraintSet.connect(preview_view.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP) + constraintSet.connect(preview_view.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM) + } + constraintSet.applyTo(view_holder) + } + override fun mediaSaved(path: String) { rescanPaths(arrayListOf(path)) { setupPreviewImage(true) diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt b/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt index 3025b7fb..a620e1c2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreview.kt @@ -162,6 +162,8 @@ class CameraXPreview( MySize(selectedQuality.width, selectedQuality.height) } + listener.adjustPreviewView(resolution.requiresCentering()) + val isFullSize = resolution.isFullScreen previewView.scaleType = if (isFullSize) ScaleType.FILL_CENTER else ScaleType.FIT_CENTER val rotation = previewView.display.rotation diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreviewListener.kt b/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreviewListener.kt index 5c9f1866..d8756c5a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreviewListener.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/implementations/CameraXPreviewListener.kt @@ -29,6 +29,6 @@ interface CameraXPreviewListener { isFrontCamera: Boolean, onSelect: (index: Int, changed: Boolean) -> Unit, ) - fun showFlashOptions(photoCapture: Boolean) + fun adjustPreviewView(requiresCentering: Boolean) } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/models/MySize.kt b/app/src/main/kotlin/com/simplemobiletools/camera/models/MySize.kt index 4201aa8d..265bcab7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/models/MySize.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/models/MySize.kt @@ -17,6 +17,10 @@ data class MySize(val width: Int, val height: Int, val isFullScreen: Boolean = f val megaPixels: String = String.format("%.1f", (width * height.toFloat()) / ONE_MEGA_PIXEL) + fun requiresCentering(): Boolean { + return !isFullScreen && (isFourToThree() || isThreeToTwo() || isSquare()) + } + fun isSixteenToNine() = ratio == 16 / 9f private fun isFiveToThree() = ratio == 5 / 3f diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 91e32770..31b74910 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -11,7 +11,9 @@ + android:layout_height="0dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" /> Date: Fri, 25 Nov 2022 08:15:28 +0000 Subject: [PATCH 2/3] fix NPE thrown in onFling --- .../camera/activities/MainActivity.kt | 10 +++------- .../camera/helpers/GestureDetectorListener.java | 13 +++++++++++++ 2 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/camera/helpers/GestureDetectorListener.java diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt index 5ddc51bb..3e28fe0e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt @@ -366,20 +366,16 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera @SuppressLint("ClickableViewAccessibility") private fun initModeSwitcher() { - val gestureDetector = GestureDetectorCompat(this, object : GestureDetector.SimpleOnGestureListener() { + val gestureDetector = GestureDetectorCompat(this, object : GestureDetectorListener() { override fun onDown(e: MotionEvent): Boolean { // we have to return true here so ACTION_UP // (and onFling) can be dispatched return true } - override fun onFling(event1: MotionEvent, event2: MotionEvent, velocityX: Float, velocityY: Float): Boolean { + override fun onFling(event1: MotionEvent?, event2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean { // these can be null even if the docs say they cannot, getting event1.x in itself can cause crashes - try { - if (event1 == null || event2 == null || event1.x == null || event2.x == null) { - return true - } - } catch (e: NullPointerException) { + if (event1 == null || event2 == null) { return true } diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/helpers/GestureDetectorListener.java b/app/src/main/kotlin/com/simplemobiletools/camera/helpers/GestureDetectorListener.java new file mode 100644 index 00000000..209a9a20 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/camera/helpers/GestureDetectorListener.java @@ -0,0 +1,13 @@ +package com.simplemobiletools.camera.helpers; + +import android.view.GestureDetector; +import android.view.MotionEvent; + +import androidx.annotation.Nullable; + +public class GestureDetectorListener extends GestureDetector.SimpleOnGestureListener { + @Override + public boolean onFling(@Nullable MotionEvent e1, @Nullable MotionEvent e2, float velocityX, float velocityY) { + return super.onFling(e1, e2, velocityX, velocityY); + } +} From 1e5a4beb8e84445866c0ea4e5909c40446748b54 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Sat, 26 Nov 2022 18:59:33 +0100 Subject: [PATCH 3/3] removing a redundant comment --- .../com/simplemobiletools/camera/activities/MainActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt index 3e28fe0e..3d4664ab 100644 --- a/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/camera/activities/MainActivity.kt @@ -374,7 +374,6 @@ class MainActivity : SimpleActivity(), PhotoProcessor.MediaSavedListener, Camera } override fun onFling(event1: MotionEvent?, event2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean { - // these can be null even if the docs say they cannot, getting event1.x in itself can cause crashes if (event1 == null || event2 == null) { return true }