PagedViewCellLayout.java revision 6a70e9fc3c62cc83d6abe59323d622dc6cd224a7
1321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung/* 2321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * Copyright (C) 2010 The Android Open Source Project 3321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * 4321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 5321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * you may not use this file except in compliance with the License. 6321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * You may obtain a copy of the License at 7321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * 8321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * http://www.apache.org/licenses/LICENSE-2.0 9321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * 10321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * Unless required by applicable law or agreed to in writing, software 11321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * distributed under the License is distributed on an "AS IS" BASIS, 12321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * See the License for the specific language governing permissions and 14321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * limitations under the License. 15321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung */ 16321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 17321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chungpackage com.android.launcher2; 18321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 19321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chungimport android.content.Context; 20785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chungimport android.content.res.Resources; 21321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chungimport android.util.AttributeSet; 22321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chungimport android.view.MotionEvent; 23321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chungimport android.view.View; 24321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chungimport android.view.ViewDebug; 25321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chungimport android.view.ViewGroup; 26321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 27785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chungimport com.android.launcher.R; 28785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung 29321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung/** 30321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * An abstraction of the original CellLayout which supports laying out items 31321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * which span multiple cells into a grid-like layout. Also supports dimming 32321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * to give a preview of its contents. 33321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung */ 348245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkapublic class PagedViewCellLayout extends ViewGroup implements Page { 35321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung static final String TAG = "PagedViewCellLayout"; 36321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 37321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung private int mCellCountX; 38321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung private int mCellCountY; 39321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung private int mCellWidth; 40321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung private int mCellHeight; 41df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung private int mWidthGap; 42df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung private int mHeightGap; 438245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka protected PagedViewCellLayoutChildren mChildren; 448245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka private PagedViewCellLayoutChildren mHolographicChildren; 45abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka private boolean mAllowHardwareLayerCreation = false; 46abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka private boolean mCreateHardwareLayersIfAllowed = false; 47321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 48321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public PagedViewCellLayout(Context context) { 49321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this(context, null); 50321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 51321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 52321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public PagedViewCellLayout(Context context, AttributeSet attrs) { 53321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this(context, attrs, 0); 54321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 55321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 56321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public PagedViewCellLayout(Context context, AttributeSet attrs, int defStyle) { 57321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung super(context, attrs, defStyle); 58321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 59321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung setAlwaysDrawnWithCacheEnabled(false); 60321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 61321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // setup default cell parameters 62785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung Resources resources = context.getResources(); 63785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mCellWidth = resources.getDimensionPixelSize(R.dimen.apps_customize_cell_width); 64785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mCellHeight = resources.getDimensionPixelSize(R.dimen.apps_customize_cell_height); 65321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung mCellCountX = LauncherModel.getCellCountX(); 66321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung mCellCountY = LauncherModel.getCellCountY(); 67df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung mWidthGap = mHeightGap = -1; 68321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 698245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren = new PagedViewCellLayoutChildren(context); 708245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren.setCellDimensions(mCellWidth, mCellHeight); 718245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren.setGap(mWidthGap, mHeightGap); 728245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 738245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka addView(mChildren); 748245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHolographicChildren = new PagedViewCellLayoutChildren(context); 758245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHolographicChildren.setAlpha(0f); 768245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHolographicChildren.setCellDimensions(mCellWidth, mCellHeight); 778245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHolographicChildren.setGap(mWidthGap, mHeightGap); 788245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 798245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka addView(mHolographicChildren); 80321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 81321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 82abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka public void allowHardwareLayerCreation() { 83abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka // This is called after the first time we launch into All Apps. Before that point, 84abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka // there's no need for hardware layers here since there's a hardware layer set on the 85abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka // parent, AllAppsTabbed, during the AllApps transition -- creating hardware layers here 86abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka // before the animation is done slows down the animation 87abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka if (!mAllowHardwareLayerCreation) { 88abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka mAllowHardwareLayerCreation = true; 89abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka if (mCreateHardwareLayersIfAllowed) { 90abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka createHardwareLayers(); 91abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka } 92abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka } 93c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka } 94c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka 95321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 96b3347bb9f4ccf41fb7043bca66c3a565bde1083bWinson Chung public void setAlpha(float alpha) { 978245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren.setAlpha(alpha); 988245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHolographicChildren.setAlpha(1.0f - alpha); 99321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 100321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 101c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka void destroyHardwareLayers() { 102abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka // called when a page is no longer visible (triggered by loadAssociatedPages -> 103abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka // removeAllViewsOnPage) 104abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka mCreateHardwareLayersIfAllowed = false; 105abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka if (mAllowHardwareLayerCreation) { 106c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka mChildren.destroyHardwareLayer(); 107c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka mHolographicChildren.destroyHardwareLayer(); 108c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka } 109c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka } 110c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka void createHardwareLayers() { 111abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka // called when a page is visible (triggered by loadAssociatedPages -> syncPageItems) 112abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka mCreateHardwareLayersIfAllowed = true; 113abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka if (mAllowHardwareLayerCreation) { 114c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka mChildren.createHardwareLayer(); 115c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka mHolographicChildren.createHardwareLayer(); 116c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka } 117c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka } 118c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka 119321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 120321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public void cancelLongPress() { 121321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung super.cancelLongPress(); 122321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 123321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // Cancel long press for all children 124321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final int count = getChildCount(); 125321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung for (int i = 0; i < count; i++) { 126321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final View child = getChildAt(i); 127321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung child.cancelLongPress(); 128321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 129321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 130321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 1316a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung /** Syncs the holographic icon views to the child icon views */ 1326a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung public void reloadHolographicIcons(boolean createHolographicOutlines) { 1336a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung if (createHolographicOutlines) { 1346a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung mChildren.loadHolographicOutlines(); 1356a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung } else { 1366a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung mChildren.clearHolographicOutlines(); 1376a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung } 1386a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung } 1396a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung 140321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public boolean addViewToCellLayout(View child, int index, int childId, 1416a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung PagedViewCellLayout.LayoutParams params) { 142321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final PagedViewCellLayout.LayoutParams lp = params; 143321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 144321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // Generate an id for each view, this assumes we have at most 256x256 cells 145321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // per workspace screen 146321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung if (lp.cellX >= 0 && lp.cellX <= (mCellCountX - 1) && 147321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung lp.cellY >= 0 && (lp.cellY <= mCellCountY - 1)) { 148321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // If the horizontal or vertical span is set to -1, it is taken to 149321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // mean that it spans the extent of the CellLayout 150321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung if (lp.cellHSpan < 0) lp.cellHSpan = mCellCountX; 151321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung if (lp.cellVSpan < 0) lp.cellVSpan = mCellCountY; 152321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 153321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung child.setId(childId); 1548245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren.addView(child, index, lp); 155321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 1568245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka if (child instanceof PagedViewIcon) { 1578245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka PagedViewIcon pagedViewIcon = (PagedViewIcon) child; 158abded66084680bb31cc7ea403c88f44f79a3c884Michael Jurka if (mAllowHardwareLayerCreation) { 159c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka pagedViewIcon.disableCache(); 160c0759f5090d9539d82ddc944b9f2da767c36b251Michael Jurka } 1616a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung mHolographicChildren.addView(pagedViewIcon.getHolographicOutlineView(), 1626a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung index, lp); 1638245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 164321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung return true; 165321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 166321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung return false; 167321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 168321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 169321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 1708245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public void removeAllViewsOnPage() { 1718245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren.removeAllViews(); 1728245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHolographicChildren.removeAllViews(); 173c5e49022bea70a1b0b6ada5431afbb6e951cc3f6Michael Jurka destroyHardwareLayers(); 174321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 175321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 176321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 1778245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public void removeViewOnPageAt(int index) { 1788245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren.removeViewAt(index); 1796a70e9fc3c62cc83d6abe59323d622dc6cd224a7Winson Chung mHolographicChildren.removeViewAt(index); 1808245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1818245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1828245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka @Override 1838245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public int getPageChildCount() { 1848245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka return mChildren.getChildCount(); 1858245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1868245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1878245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka @Override 1888245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public View getChildOnPageAt(int i) { 1898245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka return mChildren.getChildAt(i); 1908245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1918245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 1928245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka @Override 1938245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public int indexOfChildOnPage(View v) { 1948245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka return mChildren.indexOfChild(v); 1958245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka } 1968245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 19797d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung public int getCellCountX() { 19897d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung return mCellCountX; 19997d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung } 20097d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung 20197d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung public int getCellCountY() { 20297d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung return mCellCountY; 20397d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung } 20497d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung 205321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 206321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // TODO: currently ignoring padding 207321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 208321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); 209321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); 210321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 211321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); 212321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); 213321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 214321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) { 215321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung throw new RuntimeException("CellLayout cannot have UNSPECIFIED dimensions"); 216321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 217321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 218321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final int cellWidth = mCellWidth; 219321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final int cellHeight = mCellHeight; 220321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 221321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int numWidthGaps = mCellCountX - 1; 222321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int numHeightGaps = mCellCountY - 1; 223321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 224321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int vSpaceLeft = heightSpecSize - mPaddingTop 225321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung - mPaddingBottom - (cellHeight * mCellCountY); 226321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int heightGap = vSpaceLeft / numHeightGaps; 227321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 228321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int hSpaceLeft = widthSpecSize - mPaddingLeft 229321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung - mPaddingRight - (cellWidth * mCellCountX); 230321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int widthGap = hSpaceLeft / numWidthGaps; 231321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 232321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // center it around the min gaps 233321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int minGap = Math.min(widthGap, heightGap); 234321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung /* 235321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung if (minGap < heightGap) { 236321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // vertical space has shrunken, so change padding accordingly 237321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung paddingTop += ((heightGap - minGap) * (mCellCountY - 1)) / 2; 238321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } else if (minGap < widthGap) { 239321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // horizontal space has shrunken, so change padding accordingly 240321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung paddingLeft += ((widthGap - minGap) * (mCellCountX - 1)) / 2; 241321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 242321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung */ 243df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung if (mWidthGap > -1 && mHeightGap > -1) { 244df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung widthGap = mWidthGap; 245df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung heightGap = mHeightGap; 246df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung } else { 247df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung widthGap = heightGap = minGap; 248df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung } 249321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 250321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int newWidth = mPaddingLeft + mPaddingRight + (mCellCountX * cellWidth) + 251df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung ((mCellCountX - 1) * widthGap); 252321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int newHeight = mPaddingTop + mPaddingBottom + (mCellCountY * cellHeight) + 253df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung ((mCellCountY - 1) * heightGap); 254321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 255321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final int count = getChildCount(); 256321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung for (int i = 0; i < count; i++) { 257321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung View child = getChildAt(i); 2588245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int childWidthMeasureSpec = 2598245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka MeasureSpec.makeMeasureSpec(newWidth, MeasureSpec.EXACTLY); 2608245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka int childheightMeasureSpec = 2618245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka MeasureSpec.makeMeasureSpec(newHeight, MeasureSpec.EXACTLY); 262321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung child.measure(childWidthMeasureSpec, childheightMeasureSpec); 263321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 264321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 265321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung setMeasuredDimension(newWidth, newHeight); 266321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 267321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 2687ef959b9177e1e715b0afe010904455a3d961fc4Michael Jurka int getContentWidth() { 269a2eb17095dcffa75c1e9681fdc318fe6e0564321Michael Jurka if (LauncherApplication.isScreenLarge()) { 270785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung // Return the distance from the left edge of the content of the leftmost icon to 271785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung // the right edge of the content of the rightmost icon 2727ef959b9177e1e715b0afe010904455a3d961fc4Michael Jurka 273785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung // icons are centered within cells, find out how much padding that accounts for 274785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung return getWidthBeforeFirstLayout() - (mCellWidth - Utilities.getIconContentSize()); 275785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } else { 276785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung return getWidthBeforeFirstLayout() + mPaddingLeft + mPaddingRight; 277785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 2780413dfa01b822e349092636774dc948b9230adeaMichael Jurka } 2790413dfa01b822e349092636774dc948b9230adeaMichael Jurka 2804b576be59e58072cc03b5a8d36afb6a322513575Winson Chung int getContentHeight() { 2814b576be59e58072cc03b5a8d36afb6a322513575Winson Chung return mCellCountY * mCellHeight + (mCellCountY - 1) * Math.max(0, mHeightGap); 2824b576be59e58072cc03b5a8d36afb6a322513575Winson Chung } 2834b576be59e58072cc03b5a8d36afb6a322513575Winson Chung 284d92e741ca67c58c4be01a64940847feafe26a4b1Michael Jurka int getWidthBeforeFirstLayout() { 2854b576be59e58072cc03b5a8d36afb6a322513575Winson Chung return mCellCountX * mCellWidth + (mCellCountX - 1) * Math.max(0, mWidthGap); 2867ef959b9177e1e715b0afe010904455a3d961fc4Michael Jurka } 2877ef959b9177e1e715b0afe010904455a3d961fc4Michael Jurka 288321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 289321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung protected void onLayout(boolean changed, int l, int t, int r, int b) { 290321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int count = getChildCount(); 291321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung for (int i = 0; i < count; i++) { 292321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung View child = getChildAt(i); 293a2eb17095dcffa75c1e9681fdc318fe6e0564321Michael Jurka if (LauncherApplication.isScreenLarge()) { 294785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung child.layout(0, 0, r - l, b - t); 295785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } else { 296785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung child.layout(mPaddingLeft, mPaddingTop, getMeasuredWidth() - mPaddingRight, 297785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung getMeasuredHeight() - mPaddingBottom); 298785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 299321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 300321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 301321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 302321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 303321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public boolean onTouchEvent(MotionEvent event) { 304321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung return super.onTouchEvent(event) || true; 305321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 306321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 30780baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public void enableCenteredContent(boolean enabled) { 3088245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren.enableCenteredContent(enabled); 3098245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHolographicChildren.enableCenteredContent(enabled); 31080baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 31180baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 312321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 313321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung protected void setChildrenDrawingCacheEnabled(boolean enabled) { 3148245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren.setChildrenDrawingCacheEnabled(enabled); 3158245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHolographicChildren.setChildrenDrawingCacheEnabled(enabled); 316321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 317321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 318321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public void setCellCount(int xCount, int yCount) { 319321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung mCellCountX = xCount; 320321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung mCellCountY = yCount; 321321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung requestLayout(); 322321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 323321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 324df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung public void setGap(int widthGap, int heightGap) { 325df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung mWidthGap = widthGap; 326df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung mHeightGap = heightGap; 3278245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mChildren.setGap(widthGap, heightGap); 3288245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka mHolographicChildren.setGap(widthGap, heightGap); 329df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung } 330df4b83dd9d6380ab963c62d1f9d1312efc87cb0fWinson Chung 33180baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public int[] getCellCountForDimensions(int width, int height) { 33280baf5a6b3c62a62265f626d43d1167783c94131Winson Chung // Always assume we're working with the smallest span to make sure we 33380baf5a6b3c62a62265f626d43d1167783c94131Winson Chung // reserve enough space in both orientations 33480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung int smallerSize = Math.min(mCellWidth, mCellHeight); 33580baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 33680baf5a6b3c62a62265f626d43d1167783c94131Winson Chung // Always round up to next largest cell 33780baf5a6b3c62a62265f626d43d1167783c94131Winson Chung int spanX = (width + smallerSize) / smallerSize; 33880baf5a6b3c62a62265f626d43d1167783c94131Winson Chung int spanY = (height + smallerSize) / smallerSize; 33980baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 34080baf5a6b3c62a62265f626d43d1167783c94131Winson Chung return new int[] { spanX, spanY }; 34180baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 34280baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 343321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung /** 344321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * Start dragging the specified child 345321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * 346321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * @param child The child that is being dragged 347321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung */ 348321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung void onDragChild(View child) { 349321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung PagedViewCellLayout.LayoutParams lp = (PagedViewCellLayout.LayoutParams) child.getLayoutParams(); 350321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung lp.isDragging = true; 351321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 352321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 353e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung /** 354e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung * Estimates the number of cells that the specified width would take up. 355e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung */ 35680baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public int estimateCellHSpan(int width) { 357e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung // TODO: we need to take widthGap into effect 35880baf5a6b3c62a62265f626d43d1167783c94131Winson Chung return (width + mCellWidth) / mCellWidth; 35980baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 360e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung 361e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung /** 362e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung * Estimates the number of cells that the specified height would take up. 363e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung */ 36480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public int estimateCellVSpan(int height) { 365e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung // TODO: we need to take heightGap into effect 36680baf5a6b3c62a62265f626d43d1167783c94131Winson Chung return (height + mCellHeight) / mCellHeight; 36780baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 368e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung 369e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung /** 370e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung * Estimates the width that the number of vSpan cells will take up. 371e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung */ 372e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung public int estimateCellWidth(int hSpan) { 373e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung // TODO: we need to take widthGap into effect 374e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung return hSpan * mCellWidth; 375e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung } 376e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung 377e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung /** 378e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung * Estimates the height that the number of vSpan cells will take up. 379e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung */ 380e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung public int estimateCellHeight(int vSpan) { 381e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung // TODO: we need to take heightGap into effect 382e3193b93ad7bf33e2e45319084a99b9fc986622bWinson Chung return vSpan * mCellHeight; 38380baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 38480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 385321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 386321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { 387321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung return new PagedViewCellLayout.LayoutParams(getContext(), attrs); 388321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 389321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 390321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 391321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 392321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung return p instanceof PagedViewCellLayout.LayoutParams; 393321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 394321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 395321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @Override 396321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 397321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung return new PagedViewCellLayout.LayoutParams(p); 398321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 399321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 400321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public static class LayoutParams extends ViewGroup.MarginLayoutParams { 401321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung /** 402321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * Horizontal location of the item in the grid. 403321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung */ 404321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @ViewDebug.ExportedProperty 405321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public int cellX; 406321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 407321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung /** 408321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * Vertical location of the item in the grid. 409321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung */ 410321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @ViewDebug.ExportedProperty 411321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public int cellY; 412321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 413321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung /** 414321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * Number of cells spanned horizontally by the item. 415321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung */ 416321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @ViewDebug.ExportedProperty 417321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public int cellHSpan; 418321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 419321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung /** 420321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * Number of cells spanned vertically by the item. 421321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung */ 422321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @ViewDebug.ExportedProperty 423321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public int cellVSpan; 424321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 425321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung /** 426321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung * Is this item currently being dragged 427321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung */ 428321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public boolean isDragging; 429321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 43080baf5a6b3c62a62265f626d43d1167783c94131Winson Chung // a data object that you can bind to this layout params 43180baf5a6b3c62a62265f626d43d1167783c94131Winson Chung private Object mTag; 43280baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 433321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // X coordinate of the view in the layout. 434321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @ViewDebug.ExportedProperty 435321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int x; 436321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung // Y coordinate of the view in the layout. 437321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung @ViewDebug.ExportedProperty 438321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int y; 439321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 44080baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public LayoutParams() { 44180baf5a6b3c62a62265f626d43d1167783c94131Winson Chung super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 44280baf5a6b3c62a62265f626d43d1167783c94131Winson Chung cellHSpan = 1; 44380baf5a6b3c62a62265f626d43d1167783c94131Winson Chung cellVSpan = 1; 44480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 44580baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 446321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public LayoutParams(Context c, AttributeSet attrs) { 447321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung super(c, attrs); 448321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung cellHSpan = 1; 449321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung cellVSpan = 1; 450321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 451321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 452321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public LayoutParams(ViewGroup.LayoutParams source) { 453321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung super(source); 454321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung cellHSpan = 1; 455321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung cellVSpan = 1; 456321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 457321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 458321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public LayoutParams(LayoutParams source) { 459321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung super(source); 460321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this.cellX = source.cellX; 461321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this.cellY = source.cellY; 462321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this.cellHSpan = source.cellHSpan; 463321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this.cellVSpan = source.cellVSpan; 464321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 465321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 466321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public LayoutParams(int cellX, int cellY, int cellHSpan, int cellVSpan) { 467321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 468321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this.cellX = cellX; 469321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this.cellY = cellY; 470321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this.cellHSpan = cellHSpan; 471321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung this.cellVSpan = cellVSpan; 472321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 473321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 474321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public void setup(int cellWidth, int cellHeight, int widthGap, int heightGap, 475321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung int hStartPadding, int vStartPadding) { 476321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 477321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final int myCellHSpan = cellHSpan; 478321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final int myCellVSpan = cellVSpan; 479321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final int myCellX = cellX; 480321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung final int myCellY = cellY; 481321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 482321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung width = myCellHSpan * cellWidth + ((myCellHSpan - 1) * widthGap) - 483321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung leftMargin - rightMargin; 484321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung height = myCellVSpan * cellHeight + ((myCellVSpan - 1) * heightGap) - 485321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung topMargin - bottomMargin; 486321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 487a2eb17095dcffa75c1e9681fdc318fe6e0564321Michael Jurka if (LauncherApplication.isScreenLarge()) { 488785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung x = hStartPadding + myCellX * (cellWidth + widthGap) + leftMargin; 489785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung y = vStartPadding + myCellY * (cellHeight + heightGap) + topMargin; 490785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } else { 491785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung x = myCellX * (cellWidth + widthGap) + leftMargin; 492785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung y = myCellY * (cellHeight + heightGap) + topMargin; 493785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 494321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 495321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung 49680baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public Object getTag() { 49780baf5a6b3c62a62265f626d43d1167783c94131Winson Chung return mTag; 49880baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 49980baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 50080baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public void setTag(Object tag) { 50180baf5a6b3c62a62265f626d43d1167783c94131Winson Chung mTag = tag; 50280baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 50380baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 504321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung public String toString() { 50580baf5a6b3c62a62265f626d43d1167783c94131Winson Chung return "(" + this.cellX + ", " + this.cellY + ", " + 50680baf5a6b3c62a62265f626d43d1167783c94131Winson Chung this.cellHSpan + ", " + this.cellVSpan + ")"; 507321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 508321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung } 509321e9ee68848d9e782fd557f69cc070308ffbc9cWinson Chung} 5108245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka 5118245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurkainterface Page { 5128245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public int getPageChildCount(); 5138245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public View getChildOnPageAt(int i); 5148245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public void removeAllViewsOnPage(); 5158245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public void removeViewOnPageAt(int i); 5168245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka public int indexOfChildOnPage(View v); 5178245a8685fc9f4802c9fa29a989854b2522fc588Michael Jurka} 518