Create drop target for bubble bar
When dragging bubble bar in launcher, show drop target when drag passes middle of the screen. Bug: 330585397 Flag: ACONFIG com.android.wm.shell.enable_bubble_bar DEVELOPMENT Test: manual Change-Id: I52c3e9ac0b7c36e2207640baf75dc44300b522ef
This commit is contained in:
@@ -25,10 +25,11 @@ import android.view.ViewConfiguration;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.taskbar.TaskbarActivityContext;
|
||||
|
||||
/**
|
||||
* Controls bubble bar drag to dismiss interaction.
|
||||
* Controls bubble bar drag interactions.
|
||||
* Interacts with {@link BubbleDismissController}, used by {@link BubbleBarViewController}.
|
||||
* Supported interactions:
|
||||
* - Drag a single bubble view into dismiss target to remove it.
|
||||
@@ -39,6 +40,7 @@ public class BubbleDragController {
|
||||
private final TaskbarActivityContext mActivity;
|
||||
private BubbleBarViewController mBubbleBarViewController;
|
||||
private BubbleDismissController mBubbleDismissController;
|
||||
private BubbleBarPinController mBubbleBarPinController;
|
||||
|
||||
public BubbleDragController(TaskbarActivityContext activity) {
|
||||
mActivity = activity;
|
||||
@@ -52,6 +54,12 @@ public class BubbleDragController {
|
||||
public void init(@NonNull BubbleControllers bubbleControllers) {
|
||||
mBubbleBarViewController = bubbleControllers.bubbleBarViewController;
|
||||
mBubbleDismissController = bubbleControllers.bubbleDismissController;
|
||||
mBubbleBarPinController = bubbleControllers.bubbleBarPinController;
|
||||
mBubbleBarPinController.setListener(location -> {
|
||||
// TODO(b/330585397): update bubble bar location in shell
|
||||
});
|
||||
mBubbleDismissController.setListener(
|
||||
stuck -> mBubbleBarPinController.setDropTargetHidden(stuck));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -88,6 +96,10 @@ public class BubbleDragController {
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
public void setupBubbleBarView(@NonNull BubbleBarView bubbleBarView) {
|
||||
PointF initialRelativePivot = new PointF();
|
||||
final int restingElevation = bubbleBarView.getResources().getDimensionPixelSize(
|
||||
R.dimen.bubblebar_elevation);
|
||||
final int dragElevation = bubbleBarView.getResources().getDimensionPixelSize(
|
||||
R.dimen.bubblebar_drag_elevation);
|
||||
bubbleBarView.setOnTouchListener(new BubbleTouchListener() {
|
||||
@Override
|
||||
protected boolean onTouchDown(@NonNull View view, @NonNull MotionEvent event) {
|
||||
@@ -102,12 +114,31 @@ public class BubbleDragController {
|
||||
// By default the bubble bar view pivot is in bottom right corner, while dragging
|
||||
// it should be centered in order to align it with the dismiss target view
|
||||
bubbleBarView.setRelativePivot(/* x = */ 0.5f, /* y = */ 0.5f);
|
||||
bubbleBarView.setElevation(dragElevation);
|
||||
mBubbleBarPinController.onDragStart(
|
||||
bubbleBarView.getBubbleBarLocation().isOnLeft(bubbleBarView.isLayoutRtl()));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDragUpdate(float x, float y) {
|
||||
mBubbleBarPinController.onDragUpdate(x, y);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDragRelease() {
|
||||
mBubbleBarPinController.onDragEnd();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDragDismiss() {
|
||||
mBubbleBarPinController.onDragEnd();
|
||||
}
|
||||
|
||||
@Override
|
||||
void onDragEnd() {
|
||||
// Restoring the initial pivot for the bubble bar view
|
||||
bubbleBarView.setRelativePivot(initialRelativePivot.x, initialRelativePivot.y);
|
||||
bubbleBarView.setElevation(restingElevation);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -169,6 +200,13 @@ public class BubbleDragController {
|
||||
*/
|
||||
abstract void onDragStart();
|
||||
|
||||
/**
|
||||
* Called when bubble is dragged to new coordinates.
|
||||
* Not called while bubble is stuck to the dismiss target.
|
||||
*/
|
||||
protected void onDragUpdate(float x, float y) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the dragging interaction has ended and all the animations have completed
|
||||
*/
|
||||
@@ -232,8 +270,10 @@ public class BubbleDragController {
|
||||
* @param event the motion event
|
||||
*/
|
||||
protected void onTouchMove(@NonNull View view, @NonNull MotionEvent event) {
|
||||
final float dx = event.getRawX() - mTouchDownLocation.x;
|
||||
final float dy = event.getRawY() - mTouchDownLocation.y;
|
||||
float rawX = event.getRawX();
|
||||
float rawY = event.getRawY();
|
||||
final float dx = rawX - mTouchDownLocation.x;
|
||||
final float dy = rawY - mTouchDownLocation.y;
|
||||
switch (mState) {
|
||||
case TOUCHED:
|
||||
final boolean movedOut = Math.hypot(dx, dy) > mTouchSlop;
|
||||
@@ -244,7 +284,7 @@ public class BubbleDragController {
|
||||
}
|
||||
break;
|
||||
case DRAGGING:
|
||||
drag(view, event, dx, dy);
|
||||
drag(view, event, dx, dy, rawX, rawY);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -293,10 +333,12 @@ public class BubbleDragController {
|
||||
mBubbleDismissController.showDismissView();
|
||||
}
|
||||
|
||||
private void drag(@NonNull View view, @NonNull MotionEvent event, float dx, float dy) {
|
||||
private void drag(@NonNull View view, @NonNull MotionEvent event, float dx, float dy,
|
||||
float x, float y) {
|
||||
if (mBubbleDismissController.handleTouchEvent(event)) return;
|
||||
view.setTranslationX(mViewInitialPosition.x + dx);
|
||||
view.setTranslationY(mViewInitialPosition.y + dy);
|
||||
onDragUpdate(x, y);
|
||||
}
|
||||
|
||||
private void stopDragging(@NonNull View view, @NonNull MotionEvent event) {
|
||||
|
||||
Reference in New Issue
Block a user