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