1ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyalpackage com.android.launcher3.util;
2ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
3ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyalimport android.graphics.Rect;
4ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
5ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyalimport com.android.launcher3.ItemInfo;
6ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
7ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal/**
8ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal * Utility object to manage the occupancy in a grid.
9ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal */
10ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyalpublic class GridOccupancy {
11ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
12ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    private final int mCountX;
13ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    private final int mCountY;
14ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
15ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public final boolean[][] cells;
16ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
17ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public GridOccupancy(int countX, int countY) {
18ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        mCountX = countX;
19ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        mCountY = countY;
20ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        cells = new boolean[countX][countY];
21ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    }
22ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
23ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    /**
24ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal     * Find the first vacant cell, if there is one.
25ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal     *
26ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal     * @param vacantOut Holds the x and y coordinate of the vacant cell
27ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal     * @param spanX Horizontal cell span.
28ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal     * @param spanY Vertical cell span.
29ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal     *
30ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal     * @return true if a vacant cell was found
31ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal     */
32ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public boolean findVacantCell(int[] vacantOut, int spanX, int spanY) {
33ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        for (int y = 0; (y + spanY) <= mCountY; y++) {
34ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal            for (int x = 0; (x + spanX) <= mCountX; x++) {
35ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                boolean available = !cells[x][y];
36ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                out:
37ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                for (int i = x; i < x + spanX; i++) {
38ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                    for (int j = y; j < y + spanY; j++) {
39ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                        available = available && !cells[i][j];
40ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                        if (!available) break out;
41ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                    }
42ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                }
43ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                if (available) {
44ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                    vacantOut[0] = x;
45ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                    vacantOut[1] = y;
46ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                    return true;
47ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                }
48ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal            }
49ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        }
50ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        return false;
51ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    }
52ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
53ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public void copyTo(GridOccupancy dest) {
54ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        for (int i = 0; i < mCountX; i++) {
55ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal            for (int j = 0; j < mCountY; j++) {
56ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                dest.cells[i][j] = cells[i][j];
57ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal            }
58ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        }
59ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    }
60ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
61ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public boolean isRegionVacant(int x, int y, int spanX, int spanY) {
62ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        int x2 = x + spanX - 1;
63ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        int y2 = y + spanY - 1;
64ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        if (x < 0 || y < 0 || x2 >= mCountX || y2 >= mCountY) {
65ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal            return false;
66ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        }
67ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        for (int i = x; i <= x2; i++) {
68ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal            for (int j = y; j <= y2; j++) {
69ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                if (cells[i][j]) {
70ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                    return false;
71ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                }
72ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal            }
73ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        }
74ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        return true;
75ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    }
76ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
77ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public void markCells(int cellX, int cellY, int spanX, int spanY, boolean value) {
78ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        if (cellX < 0 || cellY < 0) return;
79ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        for (int x = cellX; x < cellX + spanX && x < mCountX; x++) {
80da4fe1a6244457f144e0a331cada3ada17157809Sunny Goyal            for (int y = cellY; y < cellY + spanY && y < mCountY; y++) {
81ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal                cells[x][y] = value;
82ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal            }
83ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        }
84ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    }
85ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
86ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public void markCells(Rect r, boolean value) {
87ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        markCells(r.left, r.top, r.width(), r.height(), value);
88ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    }
89ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
90ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public void markCells(CellAndSpan cell, boolean value) {
91ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        markCells(cell.cellX, cell.cellY, cell.spanX, cell.spanY, value);
92ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    }
93ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
94ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public void markCells(ItemInfo item, boolean value) {
95ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        markCells(item.cellX, item.cellY, item.spanX, item.spanY, value);
96ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    }
97ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal
98ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    public void clear() {
99ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal        markCells(0, 0, mCountX, mCountY, false);
100ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal    }
101ff4ba2d99593ed84963b3f71c555b529dd905835Sunny Goyal}
102