/*
|
* Copyright (C) 2018 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.touch;
|
|
import static android.view.View.INVISIBLE;
|
import static android.view.View.VISIBLE;
|
import static com.android.launcher3.LauncherState.ALL_APPS;
|
import static com.android.launcher3.LauncherState.NORMAL;
|
import static com.android.launcher3.LauncherState.OVERVIEW;
|
|
import android.view.View;
|
import android.view.View.OnLongClickListener;
|
|
import com.android.launcher3.CellLayout;
|
import com.android.launcher3.DeviceProfile;
|
import com.android.launcher3.DropTarget;
|
import com.android.launcher3.ItemInfo;
|
import com.android.launcher3.Launcher;
|
import com.android.launcher3.dragndrop.DragController;
|
import com.android.launcher3.dragndrop.DragOptions;
|
import com.android.launcher3.folder.Folder;
|
|
/**
|
* Class to handle long-clicks on workspace items and start drag as a result.
|
*/
|
public class ItemLongClickListener {
|
|
public static OnLongClickListener INSTANCE_WORKSPACE =
|
ItemLongClickListener::onWorkspaceItemLongClick;
|
|
public static OnLongClickListener INSTANCE_ALL_APPS =
|
ItemLongClickListener::onAllAppsItemLongClick;
|
|
private static boolean onWorkspaceItemLongClick(View v) {
|
Launcher launcher = Launcher.getLauncher(v.getContext());
|
if (!canStartDrag(launcher)) return false;
|
if (!launcher.isInState(NORMAL) && !launcher.isInState(OVERVIEW)) return false;
|
if (!(v.getTag() instanceof ItemInfo)) return false;
|
|
launcher.setWaitingForResult(null);
|
beginDrag(v, launcher, (ItemInfo) v.getTag(), new DragOptions());
|
return true;
|
}
|
|
public static void beginDrag(View v, Launcher launcher, ItemInfo info,
|
DragOptions dragOptions) {
|
if (info.container >= 0) {
|
Folder folder = Folder.getOpen(launcher);
|
if (folder != null) {
|
if (!folder.getItemsInReadingOrder().contains(v)) {
|
folder.close(true);
|
} else {
|
folder.startDrag(v, dragOptions);
|
return;
|
}
|
}
|
}
|
|
CellLayout.CellInfo longClickCellInfo = new CellLayout.CellInfo(v, info);
|
launcher.getWorkspace().startDrag(longClickCellInfo, dragOptions);
|
}
|
|
private static boolean onAllAppsItemLongClick(View v) {
|
Launcher launcher = Launcher.getLauncher(v.getContext());
|
if (!canStartDrag(launcher)) return false;
|
// When we have exited all apps or are in transition, disregard long clicks
|
if (!launcher.isInState(ALL_APPS) && !launcher.isInState(OVERVIEW)) return false;
|
if (launcher.getWorkspace().isSwitchingState()) return false;
|
|
// Start the drag
|
final DragController dragController = launcher.getDragController();
|
dragController.addDragListener(new DragController.DragListener() {
|
@Override
|
public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) {
|
v.setVisibility(INVISIBLE);
|
}
|
|
@Override
|
public void onDragEnd() {
|
v.setVisibility(VISIBLE);
|
dragController.removeDragListener(this);
|
}
|
});
|
|
DeviceProfile grid = launcher.getDeviceProfile();
|
DragOptions options = new DragOptions();
|
options.intrinsicIconScaleFactor = (float) grid.allAppsIconSizePx / grid.iconSizePx;
|
launcher.getWorkspace().beginDragShared(v, launcher.getAppsView(), options);
|
return false;
|
}
|
|
public static boolean canStartDrag(Launcher launcher) {
|
if (launcher == null) {
|
return false;
|
}
|
// We prevent dragging when we are loading the workspace as it is possible to pick up a view
|
// that is subsequently removed from the workspace in startBinding().
|
if (launcher.isWorkspaceLocked()) return false;
|
// Return early if an item is already being dragged (e.g. when long-pressing two shortcuts)
|
if (launcher.getDragController().isDragging()) return false;
|
|
return true;
|
}
|
}
|