blob: b133a1d59f9a004af1298640d7289d0de980dce6 [file] [log] [blame]
/*
* 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 + '}';
}
}
}