b066f41fa3
Bug: 239246505 Test: Manual Change-Id: I817d8ef700f2d7caec6fa63123935502f17f2d2f Merged-In: I817d8ef700f2d7caec6fa63123935502f17f2d2f
195 lines
6.9 KiB
Java
195 lines
6.9 KiB
Java
/*
|
|
* Copyright (C) 2022 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.launcher3.secondarydisplay;
|
|
|
|
import android.content.res.Resources;
|
|
import android.graphics.Point;
|
|
import android.graphics.Rect;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.util.Log;
|
|
import android.view.HapticFeedbackConstants;
|
|
import android.view.View;
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
import com.android.launcher3.AbstractFloatingView;
|
|
import com.android.launcher3.DragSource;
|
|
import com.android.launcher3.DropTarget;
|
|
import com.android.launcher3.R;
|
|
import com.android.launcher3.accessibility.DragViewStateAnnouncer;
|
|
import com.android.launcher3.dragndrop.DragController;
|
|
import com.android.launcher3.dragndrop.DragDriver;
|
|
import com.android.launcher3.dragndrop.DragOptions;
|
|
import com.android.launcher3.dragndrop.DragView;
|
|
import com.android.launcher3.dragndrop.DraggableView;
|
|
import com.android.launcher3.model.data.ItemInfo;
|
|
import com.android.launcher3.testing.shared.TestProtocol;
|
|
|
|
/**
|
|
* Drag controller for Secondary Launcher activity
|
|
*/
|
|
public class SecondaryDragController extends DragController<SecondaryDisplayLauncher> {
|
|
|
|
private static final boolean PROFILE_DRAWING_DURING_DRAG = false;
|
|
|
|
public SecondaryDragController(SecondaryDisplayLauncher secondaryLauncher) {
|
|
super(secondaryLauncher);
|
|
}
|
|
|
|
@Override
|
|
protected DragView startDrag(@Nullable Drawable drawable, @Nullable View view,
|
|
DraggableView originalView, int dragLayerX, int dragLayerY, DragSource source,
|
|
ItemInfo dragInfo, Point dragOffset, Rect dragRegion, float initialDragViewScale,
|
|
float dragViewScaleOnDrop, DragOptions options) {
|
|
|
|
if (TestProtocol.sDebugTracing) {
|
|
Log.d(TestProtocol.NO_DROP_TARGET, "5");
|
|
}
|
|
|
|
if (PROFILE_DRAWING_DURING_DRAG) {
|
|
android.os.Debug.startMethodTracing("Launcher");
|
|
}
|
|
mActivity.hideKeyboard();
|
|
|
|
mOptions = options;
|
|
if (mOptions.simulatedDndStartPoint != null) {
|
|
mLastTouch.x = mMotionDown.x = mOptions.simulatedDndStartPoint.x;
|
|
mLastTouch.y = mMotionDown.y = mOptions.simulatedDndStartPoint.y;
|
|
}
|
|
|
|
final int registrationX = mMotionDown.x - dragLayerX;
|
|
final int registrationY = mMotionDown.y - dragLayerY;
|
|
|
|
final int dragRegionLeft = dragRegion == null ? 0 : dragRegion.left;
|
|
final int dragRegionTop = dragRegion == null ? 0 : dragRegion.top;
|
|
|
|
mLastDropTarget = null;
|
|
|
|
mDragObject = new DropTarget.DragObject(mActivity.getApplicationContext());
|
|
mDragObject.originalView = originalView;
|
|
|
|
mIsInPreDrag = mOptions.preDragCondition != null
|
|
&& !mOptions.preDragCondition.shouldStartDrag(0);
|
|
|
|
final Resources res = mActivity.getResources();
|
|
final float scaleDps = mIsInPreDrag
|
|
? res.getDimensionPixelSize(R.dimen.pre_drag_view_scale) : 0f;
|
|
|
|
final DragView dragView = mDragObject.dragView = drawable != null
|
|
? new SecondaryDragView(
|
|
mActivity,
|
|
drawable,
|
|
registrationX,
|
|
registrationY,
|
|
initialDragViewScale,
|
|
dragViewScaleOnDrop,
|
|
scaleDps)
|
|
: new SecondaryDragView(
|
|
mActivity,
|
|
view,
|
|
view.getMeasuredWidth(),
|
|
view.getMeasuredHeight(),
|
|
registrationX,
|
|
registrationY,
|
|
initialDragViewScale,
|
|
dragViewScaleOnDrop,
|
|
scaleDps);
|
|
dragView.setItemInfo(dragInfo);
|
|
mDragObject.dragComplete = false;
|
|
|
|
mDragObject.xOffset = mMotionDown.x - (dragLayerX + dragRegionLeft);
|
|
mDragObject.yOffset = mMotionDown.y - (dragLayerY + dragRegionTop);
|
|
|
|
mDragDriver = DragDriver.create(this, mOptions, ev -> {
|
|
});
|
|
if (!mOptions.isAccessibleDrag) {
|
|
mDragObject.stateAnnouncer = DragViewStateAnnouncer.createFor(dragView);
|
|
}
|
|
|
|
mDragObject.dragSource = source;
|
|
mDragObject.dragInfo = dragInfo;
|
|
mDragObject.originalDragInfo = mDragObject.dragInfo.makeShallowCopy();
|
|
|
|
if (dragOffset != null) {
|
|
dragView.setDragVisualizeOffset(new Point(dragOffset));
|
|
}
|
|
if (dragRegion != null) {
|
|
dragView.setDragRegion(new Rect(dragRegion));
|
|
}
|
|
|
|
mActivity.getDragLayer().performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
|
|
dragView.show(mLastTouch.x, mLastTouch.y);
|
|
mDistanceSinceScroll = 0;
|
|
|
|
if (!mIsInPreDrag) {
|
|
callOnDragStart();
|
|
} else if (mOptions.preDragCondition != null) {
|
|
mOptions.preDragCondition.onPreDragStart(mDragObject);
|
|
}
|
|
|
|
handleMoveEvent(mLastTouch.x, mLastTouch.y);
|
|
return dragView;
|
|
}
|
|
|
|
@Override
|
|
protected void exitDrag() { }
|
|
|
|
@Override
|
|
protected DropTarget getDefaultDropTarget(int[] dropCoordinates) {
|
|
DropTarget target = new DropTarget() {
|
|
@Override
|
|
public boolean isDropEnabled() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void onDrop(DragObject dragObject, DragOptions options) {
|
|
((SecondaryDragLayer) mActivity.getDragLayer()).getPinnedAppsAdapter().addPinnedApp(
|
|
dragObject.dragInfo);
|
|
dragObject.dragView.remove();
|
|
}
|
|
|
|
@Override
|
|
public void onDragEnter(DragObject dragObject) {
|
|
if (getDistanceDragged() > mActivity.getResources().getDimensionPixelSize(
|
|
R.dimen.drag_distanceThreshold)) {
|
|
mActivity.showAppDrawer(false);
|
|
AbstractFloatingView.closeAllOpenViews(mActivity);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onDragOver(DragObject dragObject) { }
|
|
|
|
@Override
|
|
public void onDragExit(DragObject dragObject) { }
|
|
|
|
@Override
|
|
public boolean acceptDrop(DragObject dragObject) {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void prepareAccessibilityDrop() { }
|
|
|
|
@Override
|
|
public void getHitRectRelativeToDragLayer(Rect outRect) { }
|
|
};
|
|
return target;
|
|
}
|
|
}
|