content: /*
   * 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.util.Log;
  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;
  import com.android.launcher3.testing.TestProtocol;
  
  import java.util.Arrays;
  
  /**
   * 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.getIconsInReadingOrder().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) {
          if (TestProtocol.sDebugTracing) {
              Log.d(TestProtocol.NO_CONTEXT_MENU, "onAllAppsItemLongClick1");
          }
          Launcher launcher = Launcher.getLauncher(v.getContext());
          if (!canStartDrag(launcher)) return false;
          if (TestProtocol.sDebugTracing) {
              Log.d(TestProtocol.NO_CONTEXT_MENU, "onAllAppsItemLongClick2");
          }
          // When we have exited all apps or are in transition, disregard long clicks
          if (!launcher.isInState(ALL_APPS) && !launcher.isInState(OVERVIEW)) return false;
          if (TestProtocol.sDebugTracing) {
              Log.d(TestProtocol.NO_CONTEXT_MENU, "onAllAppsItemLongClick3");
          }
          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;
      }
  }
  