diff --git a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java index 6f381b1a04..0bccd6d546 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/ImageEditorView.java @@ -327,7 +327,7 @@ public final class ImageEditorView extends FrameLayout { return false; } - if (model.checkTrashIntersectsPoint(point, viewMatrix)) { + if (model.checkTrashIntersectsPoint(point)) { ((TrashRenderer) model.getTrash().getRenderer()).expand(); return true; } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java index 6d71d41a35..031eebde40 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/model/EditorModel.java @@ -184,14 +184,14 @@ public final class EditorModel implements Parcelable, RendererContext.Ready { return editorElementHierarchy.getRoot().findElementAt(point.x, point.y, viewMatrix, outInverseModelMatrix); } - public boolean checkTrashIntersectsPoint(@NonNull PointF point, @NonNull Matrix viewMatrix) { + public boolean checkTrashIntersectsPoint(@NonNull PointF point) { EditorElement trash = editorElementHierarchy.getTrash(); if (trash.getFlags().isVisible()) { trash.getFlags() .setSelectable(true) .persist(); - boolean isIntersecting = trash.findElementAt(point.x, point.y, viewMatrix, new Matrix()) != null; + boolean isIntersecting = trash.findElementAt(point.x, point.y, new Matrix(), new Matrix()) != null; trash.getFlags() .setSelectable(false) diff --git a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/TrashRenderer.kt b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/TrashRenderer.kt index 9ef35c0a7d..518796a4dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/TrashRenderer.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/TrashRenderer.kt @@ -13,8 +13,6 @@ import org.thoughtcrime.securesms.imageeditor.Renderer import org.thoughtcrime.securesms.imageeditor.RendererContext import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations import org.thoughtcrime.securesms.util.ViewUtil -import kotlin.math.pow -import kotlin.math.sqrt internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable { @@ -25,7 +23,7 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable { strokeWidth = ViewUtil.dpToPx(15) / 10f } - private val dst = RectF() + private val bounds = RectF() private val diameterSmall = ViewUtil.dpToPx(41) private val diameterLarge = ViewUtil.dpToPx(54) @@ -36,12 +34,9 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable { private var isExpanding = false - private val origin = FloatArray(2) - private val x = FloatArray(2) - private val a = FloatArray(2) - private val b = FloatArray(2) + private val buttonCenter = FloatArray(2) - constructor() {} + constructor() override fun render(rendererContext: RendererContext) { super.render(rendererContext) @@ -54,17 +49,15 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable { val diameter = getInterpolatedDiameter(frameRenderTime - startTime) rendererContext.canvas.save() - rendererContext.mapRect(dst, Bounds.FULL_BOUNDS) + rendererContext.mapRect(bounds, Bounds.FULL_BOUNDS) + + buttonCenter[0] = bounds.centerX() + buttonCenter[1] = bounds.bottom - diameterLarge / 2f - padBottom rendererContext.canvasMatrix.setToIdentity() - rendererContext.canvasMatrix.mapPoints(origin, floatArrayOf(0f, 0f)) - rendererContext.canvasMatrix.mapPoints(x, floatArrayOf(diameterLarge.toFloat(), 0f)) - rendererContext.canvasMatrix.mapPoints(a, floatArrayOf(0f, diameterLarge.toFloat() / 2f)) - rendererContext.canvasMatrix.mapPoints(b, floatArrayOf(0f, padBottom.toFloat())) - - rendererContext.canvas.drawCircle(dst.centerX(), dst.bottom - diameterLarge / 2f - padBottom, diameter / 2f, outlinePaint) - rendererContext.canvas.translate(dst.centerX(), dst.bottom - diameterLarge / 2f - padBottom) + rendererContext.canvas.drawCircle(buttonCenter[0], buttonCenter[1], diameter / 2f, outlinePaint) + rendererContext.canvas.translate(bounds.centerX(), bounds.bottom - diameterLarge / 2f - padBottom) rendererContext.canvas.translate(- (trashSize / 2f), - (trashSize / 2f)) trash.draw(rendererContext.canvas) rendererContext.canvas.restore() @@ -74,10 +67,6 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable { } } - private fun distance(a: FloatArray, b: FloatArray): Float { - return sqrt((b[1] - a[1]).toDouble().pow(2.0) + (b[0] - a[0]).toDouble().pow(2.0)).toFloat() - } - private fun getInterpolatedDiameter(timeElapsed: Long): Float { return if (timeElapsed >= DURATION) { if (isExpanding) { @@ -122,16 +111,11 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable { private constructor(inParcel: Parcel?) override fun hitTest(x: Float, y: Float): Boolean { - val xDistance = distance(origin, this.x) - val isXInRange = -xDistance <= x && x <= xDistance + val dx = x - buttonCenter[0] + val dy = y - buttonCenter[1] + val radius = diameterLarge / 2 - if (!isXInRange) { - return false - } - - val yDistanceStart = dst.bottom - dst.centerY() - distance(origin, a) - distance(origin, b) - - return y >= yDistanceStart + return dx * dx + dy * dy < radius * radius } override fun describeContents(): Int {