From de4a00ea1bbd79af8d892482de6d080370a83af5 Mon Sep 17 00:00:00 2001 From: Mario Zorz Date: Mon, 25 Nov 2019 10:37:37 -0300 Subject: [PATCH 1/2] added OnDeleteView listener in TextViewSizeAwareTouchListener and re-wired to PhotoEditor --- .../com/automattic/photoeditor/PhotoEditor.kt | 19 ++++- .../gesture/TextViewSizeAwareTouchListener.kt | 75 ++++++++++++++++++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/photoeditor/src/main/java/com/automattic/photoeditor/PhotoEditor.kt b/photoeditor/src/main/java/com/automattic/photoeditor/PhotoEditor.kt index 7d55c6fda..c34c72100 100644 --- a/photoeditor/src/main/java/com/automattic/photoeditor/PhotoEditor.kt +++ b/photoeditor/src/main/java/com/automattic/photoeditor/PhotoEditor.kt @@ -27,6 +27,7 @@ import androidx.emoji.text.EmojiCompat import com.automattic.photoeditor.gesture.MultiTouchListener import com.automattic.photoeditor.gesture.MultiTouchListener.OnMultiTouchListener import com.automattic.photoeditor.gesture.TextViewSizeAwareTouchListener +import com.automattic.photoeditor.gesture.TextViewSizeAwareTouchListener.OnDeleteViewListener import com.automattic.photoeditor.util.BitmapUtil import com.automattic.photoeditor.views.PhotoEditorView import com.automattic.photoeditor.views.ViewType @@ -351,7 +352,23 @@ class PhotoEditor private constructor(builder: Builder) : // }) // setOnTouchListener(multiTouchListenerInstance) - setOnTouchListener(TextViewSizeAwareTouchListener(50, 50)) + setOnTouchListener( + TextViewSizeAwareTouchListener( + 50, 50, + deleteView, + object : OnDeleteViewListener { + override fun onRemoveViewListener(removedView: View) { + // here do actually remove the view + val viewType = removedView.tag as ViewType + viewUndo(removedView, viewType) + } + override fun onRemoveViewReadyListener(removedView: View, ready: Boolean) { + mOnPhotoEditorListener?.onRemoveViewReadyListener(removedView, ready) + } + }, + mOnPhotoEditorListener + ) + ) addViewToParent(this, ViewType.EMOJI) } diff --git a/photoeditor/src/main/java/com/automattic/photoeditor/gesture/TextViewSizeAwareTouchListener.kt b/photoeditor/src/main/java/com/automattic/photoeditor/gesture/TextViewSizeAwareTouchListener.kt index 1f383628a..b1f2f1bda 100644 --- a/photoeditor/src/main/java/com/automattic/photoeditor/gesture/TextViewSizeAwareTouchListener.kt +++ b/photoeditor/src/main/java/com/automattic/photoeditor/gesture/TextViewSizeAwareTouchListener.kt @@ -1,10 +1,19 @@ package com.automattic.photoeditor.gesture import android.annotation.SuppressLint +import android.graphics.Rect import android.view.MotionEvent import android.view.View +import com.automattic.photoeditor.OnPhotoEditorListener +import com.automattic.photoeditor.views.ViewType -class TextViewSizeAwareTouchListener(val minWidth: Int, val minHeight: Int) : View.OnTouchListener { +class TextViewSizeAwareTouchListener( + val minWidth: Int, + val minHeight: Int, + private val deleteView: View?, + private val onDeleteViewListener: OnDeleteViewListener?, + private val onPhotoEditorListener: OnPhotoEditorListener? +) : View.OnTouchListener { private var originX = 0f private var originY = 0f private var secondOriginX = 0f @@ -16,8 +25,25 @@ class TextViewSizeAwareTouchListener(val minWidth: Int, val minHeight: Int) : Vi private var secondOriginUp = false private var rotationDetector: RotationGestureDetector + // will hold deleteView Rect if passed, and location of current dragged view to see if it's a match + private var outRect: Rect? = null + private val location = IntArray(2) + init { rotationDetector = RotationGestureDetector() + if (deleteView != null) { + outRect = Rect( + deleteView.left, deleteView.top, + deleteView.right, deleteView.bottom + ) + } else { + outRect = Rect(0, 0, 0, 0) + } + } + + interface OnDeleteViewListener { + fun onRemoveViewListener(removedView: View) + fun onRemoveViewReadyListener(removedView: View, ready: Boolean) } @SuppressLint("ClickableViewAccessibility") @@ -31,6 +57,11 @@ class TextViewSizeAwareTouchListener(val minWidth: Int, val minHeight: Int) : Vi secondOriginUp = false originX = view.x - event.getX(0) originY = view.y - event.getY(0) + if (deleteView != null) { + deleteView.visibility = View.VISIBLE + } + view.bringToFront() + firePhotoEditorSDKListener(view, true) } MotionEvent.ACTION_POINTER_DOWN -> { secondOriginX = view.x - event.getX(1) @@ -40,6 +71,13 @@ class TextViewSizeAwareTouchListener(val minWidth: Int, val minHeight: Int) : Vi lastDiffY = Math.abs(secondOriginY - originY) } MotionEvent.ACTION_MOVE -> { // a pointer was moved + deleteView?.let { + val readyForDelete = isViewInBounds(it, event.rawX.toInt(), event.rawY.toInt()) + // fade the view a bit to indicate it's going bye bye + setAlphaOnView(view, readyForDelete) + onDeleteViewListener?.onRemoveViewReadyListener(view, readyForDelete) + } + if (event.pointerCount == 2) { val diffX = Math.abs(event.getX(1) - event.getX(0)) val diffY = Math.abs(event.getY(1) - event.getY(0)) @@ -78,6 +116,14 @@ class TextViewSizeAwareTouchListener(val minWidth: Int, val minHeight: Int) : Vi } MotionEvent.ACTION_UP -> { originUp = true + + deleteView?.let { + if (isViewInBounds(it, event.rawX.toInt(), event.rawY.toInt())) { + onDeleteViewListener?.onRemoveViewListener(view) + } + it.visibility = View.GONE + } + firePhotoEditorSDKListener(view, false) } MotionEvent.ACTION_POINTER_UP -> { secondOriginUp = true @@ -85,4 +131,31 @@ class TextViewSizeAwareTouchListener(val minWidth: Int, val minHeight: Int) : Vi } return true } + + private fun isViewInBounds(view: View, x: Int, y: Int): Boolean { + view.getDrawingRect(outRect) + view.getLocationOnScreen(location) + outRect?.offset(location[0], location[1]) + return outRect?.contains(x, y) ?: false + } + + private fun setAlphaOnView(view: View, makeTransparent: Boolean) { + if (makeTransparent) { + view.alpha = 0.5f + } else { + view.alpha = 1f + } + } + + private fun firePhotoEditorSDKListener(view: View, isStart: Boolean) { + onPhotoEditorListener?.let { + val viewTag = view.tag + if (viewTag != null && viewTag is ViewType) { + if (isStart) + it.onStartViewChangeListener(view.tag as ViewType) + else + it.onStopViewChangeListener(view.tag as ViewType) + } + } + } } From 2aa0226f6e9e898f87d1bd8608e6f81a21b560f2 Mon Sep 17 00:00:00 2001 From: Mario Zorz Date: Mon, 25 Nov 2019 10:53:03 -0300 Subject: [PATCH 2/2] adding resizeable view minimum width/height to dimens --- .../src/main/java/com/automattic/photoeditor/PhotoEditor.kt | 3 ++- photoeditor/src/main/res/values/dimens.xml | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/photoeditor/src/main/java/com/automattic/photoeditor/PhotoEditor.kt b/photoeditor/src/main/java/com/automattic/photoeditor/PhotoEditor.kt index c34c72100..2b46e203d 100644 --- a/photoeditor/src/main/java/com/automattic/photoeditor/PhotoEditor.kt +++ b/photoeditor/src/main/java/com/automattic/photoeditor/PhotoEditor.kt @@ -354,7 +354,8 @@ class PhotoEditor private constructor(builder: Builder) : setOnTouchListener( TextViewSizeAwareTouchListener( - 50, 50, + resources.getDimensionPixelSize(R.dimen.autosize_tv_minimum_width), + resources.getDimensionPixelSize(R.dimen.autosize_tv_minimum_height), deleteView, object : OnDeleteViewListener { override fun onRemoveViewListener(removedView: View) { diff --git a/photoeditor/src/main/res/values/dimens.xml b/photoeditor/src/main/res/values/dimens.xml index 16ade2744..c9d11fccb 100644 --- a/photoeditor/src/main/res/values/dimens.xml +++ b/photoeditor/src/main/res/values/dimens.xml @@ -3,4 +3,6 @@ 4dp 96dp 96dp + 36dp + 36dp