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