Launcher3 to Launchpad 01 布局修改

10 阅读3分钟

Launcher3 to Launchpad 01 布局修改

禁用相关布局 Todo list:

  • 禁用首页搜索框
  • 禁用 Hotseat
  • 禁用 DropTargetBar
  • 禁用上滑桌面展示 AllApps 弹窗
  • 禁用长按桌面展示选项菜单
  • 禁用长按 App 展示选项菜单
  • 禁用拖拽时桌面显示半透明遮罩
  • 禁用拖拽时桌面显示 App 目标位预览框

定义全局功能控制开关

  • FeatureFlags 中添加如下全局功能控制开关:
public final class FeatureFlags {

    public static final BooleanFlag ENABLE_HOTSEAT = getDebugFlag(
            "ENABLE_HOTSEAT", false,
            "Show bottom Hotseat area in the launcher");

    public static final BooleanFlag ENABLE_DROP_TARGET_BAR = getDebugFlag(
            "ENABLE_DROP_TARGET_BAR", false,
            "Show top DropTargetBar in the launcher");

    public static final BooleanFlag ENABLE_APP_OPTIONS_POPUP = getDebugFlag(
            "ENABLE_APP_OPTIONS_POPUP", false,
            "Show app long press options popup in the workspace");

    public static final BooleanFlag ENABLE_WORKSPACE_OPTIONS_POPUP = getDebugFlag(
            "ENABLE_WORKSPACE_OPTIONS_POPUP", false,
            "Show long press empty area options popup in the workspace");

    public static final BooleanFlag ENABLE_ALL_APPS_SHEET = getDebugFlag(
            "ENABLE_ALL_APPS_SHEET", false,
            "Show swipe up all apps sheet in the workspace");
    
    public static final BooleanFlag ENABLE_WORKSPACE_DRAGGING_BACKGROUND = getDebugFlag(
            "ENABLE_WORKSPACE_DRAGGING_BACKGROUND", false,
            "Show dragging background in the workspace");
    
    public static final BooleanFlag ENABLE_APP_DROP_LOCATION_PREVIEW = getDebugFlag(
            "ENABLE_APP_DROP_LOCATION_PREVIEW", false,
            "Show app drop location preview in the workspace");
}

禁用相关布局

禁用搜索按钮

launcher3 目录下的 build.gradle 文件中找到 QSB_ON_FIRST_SCREEN, 将其值设为 false:

buildConfigField("boolean", "QSB_ON_FIRST_SCREEN", "false")

禁用 Hotseat

  1. 修改 default_workspace_axb.xml:
  • launcher:container=-101 表示容器为 Hotseat,清空所有相关配置
<!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
<!-- Mail Calendar Gallery Store Internet Camera -->
<!-- <resolve
    launcher:container="-101"
    launcher:screen="0"
    launcher:x="0"
    launcher:y="0" >
    <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_EMAIL;end" />
    <favorite launcher:uri="mailto:" />
</resolve> -->
  1. 修改 launcher3/src/main/res/layout/launcher.xml 文件:
  • 隐藏 Launcher 中 Hotseat 布局
  • 通过 1 和 2 的修改 Hotseat 区不在展示
<include
    id="@+id/hotseat"
    layout="@layout/hotseat"
    android:visibility="gone" />
  1. 修改 launcher3/src/main/java/com/android/launcher3/DeviceProfile.java
  • 将 Hotseat 区尺寸置为 0
private void updateHotseatIconSize(int hotseatIconSizePx) {
    // Resize Hotseat area
    if (!FeatureFlags.ENABLE_HOTSEAT.get()) {
        hotseatCellHeightPx = 0;
        hotseatBarSizePx = 0;
        return;
    }

    // Ensure there is enough space for folder icons, which have a slightly larger radius.
    hotseatCellHeightPx = (int) Math.ceil(hotseatIconSizePx * ICON_OVERLAP_FACTOR);
    ...
  1. 修改 launcher3/src/main/java/com/android/launcher3/Hotseat.java
  • Hotseat 区不响应手势事件
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    // We allow horizontal workspace scrolling from within the Hotseat. We do this by delegating
    // touch intercept the Workspace, and if it intercepts, delegating touch to the Workspace
    // for the remainder of the this input stream.
    if (!FeatureFlags.ENABLE_HOTSEAT.get()) {
        return false;
    }
    ...
}
  1. 修改 launcher3/src/main/java/com/android/launcher3/Workspace.java
  • Hotseat 区不响应创建文件夹
boolean createUserFolderIfNecessary(View newView, int container, CellLayout target,
            int[] targetCell, float distance, boolean external, DragObject d) {
  // Block HotSeat to create folder
  if (!FeatureFlags.ENABLE_HOTSEAT.get() && container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
      return false;
  }
  ...
}

private void manageFolderFeedback(float distance, DragObject dragObject) {
  if (distance > mDragTargetLayout.getFolderCreationRadius(mTargetCell)) {
      if ((mDragMode == DRAG_MODE_ADD_TO_FOLDER
              || mDragMode == DRAG_MODE_CREATE_FOLDER)) {
          setDragMode(DRAG_MODE_NONE);
      }
      return;
  }
  final View dragOverView = mDragTargetLayout.getChildAt(mTargetCell[0], mTargetCell[1]);
  ItemInfo info = dragObject.dragInfo;

  boolean userFolderPending = willCreateUserFolder(info, dragOverView, false);
  if (!FeatureFlags.ENABLE_HOTSEAT.get()) {
    boolean isHotseat = mLauncher.isHotseatLayout(mDragTargetLayout);
    userFolderPending = !isHotseat && userFolderPending;
  }

  if (mDragMode == DRAG_MODE_NONE && userFolderPending) {
    ...
  }
  ...
}

禁用 DropTargetBar

  1. 修改 launcher3/src/main/java/com/android/launcher3/DeleteDropTarget.java
  • supportsDrop 方法返回 ENABLE_DROP_TARGET_BAR,控制是否展示 DeleteDropTarget:
@Override
protected boolean supportsDrop(ItemInfo info) {
    return FeatureFlags.ENABLE_DROP_TARGET_BAR.get();
}
  1. 修改 launcher3/src/main/java/com/android/launcher3/SecondaryDropTarget.java
  • supportsDrop 方法返回 ENABLE_DROP_TARGET_BAR,控制是否展示 SecondaryDropTarget:
@Override
protected boolean supportsDrop(ItemInfo info) {
    return FeatureFlags.ENABLE_DROP_TARGET_BAR.get();
}

禁用上滑桌面展示 AllApps 弹窗

  1. 修改 launcher3/src/main/java/com/android/launcher3/touch/AllAppsSwipeController.java
  • canInterceptTouch 方法返回 false,控制不响应上滑事件
@Override
protected boolean canInterceptTouch(MotionEvent ev) {
    // Disable AllAppsSheet
    if (!FeatureFlags.ENABLE_ALL_APPS_SHEET.get()) {
        return false;
    }
    if (mCurrentAnimation != null) {
        // If we are already animating from a previous state, we can intercept.
        return true;
    }

禁用长按桌面展示选项菜单

  1. 修改 launcher3/src/main/java/com/android/launcher3/touch/WorkspaceTouchListener.java
  • onLongPress 方法中添加判断,控制不展示长按菜单
@Override
public boolean onLongPress(MotionEvent ev) {
    ...
    if (FeatureFlags.ENABLE_WORKSPACE_OPTIONS_POPUP.get()) {
        mLauncher.showDefaultOptions(mTouchDownPoint.x, mTouchDownPoint.y);
    }
    ...
}

禁用长按 App 展示选项菜单

  1. 修改 launcher3/src/main/java/com/android/launcher3/BubbleTextView.java
  • startLongPressAction 方法中添加判断,控制不展示长按菜单
public PreDragCondition startLongPressAction() {
    // Disable app long press popup
    if (!FeatureFlags.ENABLE_APP_OPTIONS_POPUP.get()) {
        return null;
    }

    PopupContainerWithArrow popup = PopupContainerWithArrow.showForIcon(this);
    return popup != null ? popup.createPreDragCondition(true) : null;
}

禁用拖拽时桌面显示半透明遮罩

  1. 修改 launcher3/src/main/java/com/android/launcher3/Workspace.java
  • onDragStart 方法中添加判断,控制不展示半透明遮罩
@Override
public void onDragStart(DragObject dragObject, DragOptions options) {
    ...
    if (FeatureFlags.ENABLE_WORKSPACE_DRAGGING_BACKGROUND.get()) {
        // Always enter the spring loaded mode
        mLauncher.getStateManager().goToState(SPRING_LOADED);
    }
    ...
}

禁用拖拽 App 时目标位预览框

  1. 修改 launcher3/src/main/java/com/android/launcher3/CellLayout.java
  • mVisualizeDropLocation 变量的值设为 ENABLE_APP_DROP_LOCATION_PREVIEW
private boolean mVisualizeDropLocation = FeatureFlags.ENABLE_APP_DROP_LOCATION_PREVIEW.get();

上面这些步骤做完,就可以获得一个干净的桌面了,下面往桌面添加所有应用图标。