| /* |
| * Copyright (C) 2026 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.celllayout; |
| |
| import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP; |
| |
| import com.android.launcher3.LauncherSettings.Favorites; |
| import com.android.launcher3.model.data.ItemInfo; |
| |
| import java.util.Objects; |
| |
| /** |
| * Class for mapping between model position and presenter position. |
| */ |
| public class CellPosMapper { |
| |
| public static final CellPosMapper DEFAULT = new CellPosMapper(false, -1); |
| private final boolean mHasVerticalHotseat; |
| private final int mNumOfHotseat; |
| |
| public CellPosMapper(boolean hasVerticalHotseat, int numOfHotseat) { |
| mHasVerticalHotseat = hasVerticalHotseat; |
| mNumOfHotseat = numOfHotseat; |
| } |
| |
| /** |
| * Maps the position in model to the position in view |
| */ |
| public CellPos mapModelToPresenter(ItemInfo info) { |
| return new CellPos(info.cellX, info.cellY, info.screenId); |
| } |
| |
| /** |
| * Maps the position in view to the position in model |
| */ |
| public CellPos mapPresenterToModel(int presenterX, int presenterY, int presenterScreen, |
| int container) { |
| if (container == Favorites.CONTAINER_HOTSEAT) { |
| presenterScreen = mHasVerticalHotseat |
| ? mNumOfHotseat - presenterY - 1 : presenterX; |
| } |
| return new CellPos(presenterX, presenterY, presenterScreen); |
| } |
| |
| /** |
| * Cell mapper which maps two panels into a single layout |
| */ |
| public static class TwoPanelCellPosMapper extends CellPosMapper { |
| |
| private final int mColumnCount; |
| |
| public TwoPanelCellPosMapper(int columnCount) { |
| super(false, -1); |
| mColumnCount = columnCount; |
| } |
| |
| /** |
| * Maps the position in model to the position in view |
| */ |
| public CellPos mapModelToPresenter(ItemInfo info) { |
| if (info.container != CONTAINER_DESKTOP || (info.screenId % 2) == 0) { |
| return super.mapModelToPresenter(info); |
| } |
| return new CellPos(info.cellX + mColumnCount, info.cellY, info.screenId - 1); |
| } |
| |
| @Override |
| public CellPos mapPresenterToModel(int presenterX, int presenterY, int presenterScreen, |
| int container) { |
| if (container == CONTAINER_DESKTOP && (presenterScreen % 2) == 0 |
| && presenterX >= mColumnCount) { |
| return new CellPos(presenterX - mColumnCount, presenterY, presenterScreen + 1); |
| } |
| return super.mapPresenterToModel(presenterX, presenterY, presenterScreen, container); |
| } |
| } |
| |
| /** |
| * Utility class to indicate the position of a cell |
| */ |
| public static class CellPos { |
| public final int cellX; |
| public final int cellY; |
| public final int screenId; |
| |
| public CellPos(int cellX, int cellY, int screenId) { |
| this.cellX = cellX; |
| this.cellY = cellY; |
| this.screenId = screenId; |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (this == o) return true; |
| if (!(o instanceof CellPos)) return false; |
| CellPos cellPos = (CellPos) o; |
| return cellX == cellPos.cellX && cellY == cellPos.cellY && screenId == cellPos.screenId; |
| } |
| |
| @Override |
| public int hashCode() { |
| return Objects.hash(cellX, cellY, screenId); |
| } |
| |
| @Override |
| public String toString() { |
| return "CellPos{" |
| + "cellX=" + cellX |
| + ", cellY=" + cellY |
| + ", screenId=" + screenId + '}'; |
| } |
| } |
| } |