Implementing TouchDelegate to make full chip clickable.

Bug: 166376182
Tested: Manual
Change-Id: I36b2559908fbf7ab6a863fb6e550a88b5374aefa
This commit is contained in:
Sreyas 2020-08-27 15:48:00 -07:00
parent c6890f8869
commit fee2b25b9c
2 changed files with 37 additions and 9 deletions

View File

@ -79,7 +79,6 @@ import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.TouchDelegate;
import android.view.View;
import android.view.ViewDebug;
import android.view.ViewGroup;
@ -700,12 +699,9 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
super.onTouchEvent(ev);
TaskView taskView = getCurrentPageTaskView();
if (taskView != null) {
TouchDelegate mChildTouchDelegate = taskView.getIconTouchDelegate(ev);
if (mChildTouchDelegate != null && mChildTouchDelegate.onTouchEvent(ev)) {
// Keep consuming events to pass to delegate
return true;
}
if (taskView != null && taskView.offerTouchToChildren(ev)) {
// Keep consuming events to pass to delegate
return true;
}
final int x = (int) ev.getX();

View File

@ -135,6 +135,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
* delegated bounds only to be updated.
*/
private TransformingTouchDelegate mIconTouchDelegate;
private TransformingTouchDelegate mChipTouchDelegate;
private static final List<Rect> SYSTEM_GESTURE_EXCLUSION_RECT =
Collections.singletonList(new Rect());
@ -200,6 +201,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
private View mContextualChipWrapper;
private View mContextualChip;
private final float[] mIconCenterCoords = new float[2];
private final float[] mChipCenterCoords = new float[2];
public TaskView(Context context) {
this(context, null);
@ -263,11 +265,22 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
mIconTouchDelegate = new TransformingTouchDelegate(mIconView);
}
public TouchDelegate getIconTouchDelegate(MotionEvent event) {
/**
* Whether the taskview should take the touch event from parent. Events passed to children
* that might require special handling.
*/
public boolean offerTouchToChildren(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
computeAndSetIconTouchDelegate();
computeAndSetChipTouchDelegate();
}
return mIconTouchDelegate;
if (mIconTouchDelegate != null && mIconTouchDelegate.onTouchEvent(event)) {
return true;
}
if (mChipTouchDelegate != null && mChipTouchDelegate.onTouchEvent(event)) {
return true;
}
return false;
}
private void computeAndSetIconTouchDelegate() {
@ -282,6 +295,23 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
(int) (mIconCenterCoords[1] + iconHalfSize));
}
private void computeAndSetChipTouchDelegate() {
if (mContextualChipWrapper != null) {
float chipHalfWidth = mContextualChipWrapper.getWidth() / 2f;
float chipHalfHeight = mContextualChipWrapper.getHeight() / 2f;
mChipCenterCoords[0] = chipHalfWidth;
mChipCenterCoords[1] = chipHalfHeight;
getDescendantCoordRelativeToAncestor(mContextualChipWrapper, mActivity.getDragLayer(),
mChipCenterCoords,
false);
mChipTouchDelegate.setBounds(
(int) (mChipCenterCoords[0] - chipHalfWidth),
(int) (mChipCenterCoords[1] - chipHalfHeight),
(int) (mChipCenterCoords[0] + chipHalfWidth),
(int) (mChipCenterCoords[1] + chipHalfHeight));
}
}
/**
* The modalness of this view is how it should be displayed when it is shown on its own in the
* modal state of overview.
@ -725,6 +755,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
mContextualChip.animate().scaleX(1f).scaleY(1f).setDuration(50);
}
if (mContextualChipWrapper != null) {
mChipTouchDelegate = new TransformingTouchDelegate(mContextualChipWrapper);
mContextualChipWrapper.animate().alpha(1f).setDuration(50);
}
}
@ -746,6 +777,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
View oldContextualChipWrapper = mContextualChipWrapper;
mContextualChipWrapper = null;
mContextualChip = null;
mChipTouchDelegate = null;
return oldContextualChipWrapper;
}