18c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka/*
28c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * Copyright (C) 2008 The Android Open Source Project
38c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka *
48c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * Licensed under the Apache License, Version 2.0 (the "License");
58c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * you may not use this file except in compliance with the License.
68c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * You may obtain a copy of the License at
78c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka *
88c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka *      http://www.apache.org/licenses/LICENSE-2.0
98c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka *
108c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * Unless required by applicable law or agreed to in writing, software
118c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * distributed under the License is distributed on an "AS IS" BASIS,
128c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * See the License for the specific language governing permissions and
148c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka * limitations under the License.
158c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka */
168c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3;
188c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
198c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.app.WallpaperManager;
208c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.content.Context;
21eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chungimport android.graphics.Canvas;
22eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chungimport android.graphics.Paint;
238c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.graphics.Rect;
248c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.view.View;
25cf6125c2d30ce02d8ab6cbe8e37a20f6a831e216Michael Jurkaimport android.view.ViewGroup;
268c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
27a52570f8f9ad65b85e33a2f2e87722f9edd6c6f4Michael Jurkapublic class ShortcutAndWidgetContainer extends ViewGroup {
288c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    static final String TAG = "CellLayoutChildren";
298c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
308c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    // These are temporary variables to prevent having to allocate a new object just to
318c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    // return an (x, y) value from helper functions. Do NOT use them to maintain other state.
328c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private final int[] mTmpCellXY = new int[2];
338c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
348c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private final WallpaperManager mWallpaperManager;
358c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
365f8afe6280eae34620067696173e71943e1a30a3Winson Chung    private boolean mIsHotseatLayout;
375f8afe6280eae34620067696173e71943e1a30a3Winson Chung
38d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    private int mCellWidth;
39d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    private int mCellHeight;
40d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
418c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private int mWidthGap;
428c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private int mHeightGap;
438c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
442374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    private int mCountX;
455f8afe6280eae34620067696173e71943e1a30a3Winson Chung    private int mCountY;
462374abfda3e53f84e005df8923170308e4df8c03Adam Cohen
472374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    private boolean mInvertIfRtl = false;
482374abfda3e53f84e005df8923170308e4df8c03Adam Cohen
49a52570f8f9ad65b85e33a2f2e87722f9edd6c6f4Michael Jurka    public ShortcutAndWidgetContainer(Context context) {
508c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        super(context);
518c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mWallpaperManager = WallpaperManager.getInstance(context);
522801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen    }
532801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen
542374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    public void setCellDimensions(int cellWidth, int cellHeight, int widthGap, int heightGap,
555f8afe6280eae34620067696173e71943e1a30a3Winson Chung            int countX, int countY) {
568c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mCellWidth = cellWidth;
578c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mCellHeight = cellHeight;
588c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mWidthGap = widthGap;
598c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mHeightGap = heightGap;
602374abfda3e53f84e005df8923170308e4df8c03Adam Cohen        mCountX = countX;
615f8afe6280eae34620067696173e71943e1a30a3Winson Chung        mCountY = countY;
628c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
638c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
648c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    public View getChildAt(int x, int y) {
658c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        final int count = getChildCount();
668c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
678c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            View child = getChildAt(i);
688c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
698c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
708c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            if ((lp.cellX <= x) && (x < lp.cellX + lp.cellHSpan) &&
71f579b5041afe8272c79f9f13001120d37eeeee7bAdam Cohen                    (lp.cellY <= y) && (y < lp.cellY + lp.cellVSpan)) {
728c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                return child;
738c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            }
748c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
758c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        return null;
768c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
778c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
788c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
79eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung    protected void dispatchDraw(Canvas canvas) {
803a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka        @SuppressWarnings("all") // suppress dead code warning
813a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka        final boolean debug = false;
823a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka        if (debug) {
833a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka            // Debug drawing for hit space
84eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung            Paint p = new Paint();
85eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung            p.setColor(0x6600FF00);
86eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung            for (int i = getChildCount() - 1; i >= 0; i--) {
87eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung                final View child = getChildAt(i);
88eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung                final CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
89eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung
90eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung                canvas.drawRect(lp.x, lp.y, lp.x + lp.width, lp.y + lp.height, p);
91eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung            }
92eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung        }
93eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung        super.dispatchDraw(canvas);
94eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung    }
95eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung
96eecf02da58adef5486bf0c9ff7127ea891f457a4Winson Chung    @Override
978c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
988c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        int count = getChildCount();
99ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen
100ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
101ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen        int heightSpecSize =  MeasureSpec.getSize(heightMeasureSpec);
102ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen        setMeasuredDimension(widthSpecSize, heightSpecSize);
103ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen
1048c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
1058c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            View child = getChildAt(i);
1062824b0750e978e5a63f804a42e9eedba53e8d21dVladimir Marko            if (child.getVisibility() != GONE) {
1072824b0750e978e5a63f804a42e9eedba53e8d21dVladimir Marko                measureChild(child);
1082824b0750e978e5a63f804a42e9eedba53e8d21dVladimir Marko            }
1098c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
1108c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
1118c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
112bfbfd26c627a18f8e1e3e6d0e53e78feab360203Adam Cohen    public void setupLp(CellLayout.LayoutParams lp) {
1132374abfda3e53f84e005df8923170308e4df8c03Adam Cohen        lp.setup(mCellWidth, mCellHeight, mWidthGap, mHeightGap, invertLayoutHorizontally(),
1142374abfda3e53f84e005df8923170308e4df8c03Adam Cohen                mCountX);
1152374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    }
1162374abfda3e53f84e005df8923170308e4df8c03Adam Cohen
1172374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    // Set whether or not to invert the layout horizontally if the layout is in RTL mode.
1182374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    public void setInvertIfRtl(boolean invert) {
1192374abfda3e53f84e005df8923170308e4df8c03Adam Cohen        mInvertIfRtl = invert;
120bfbfd26c627a18f8e1e3e6d0e53e78feab360203Adam Cohen    }
121bfbfd26c627a18f8e1e3e6d0e53e78feab360203Adam Cohen
1225f8afe6280eae34620067696173e71943e1a30a3Winson Chung    public void setIsHotseat(boolean isHotseat) {
1235f8afe6280eae34620067696173e71943e1a30a3Winson Chung        mIsHotseatLayout = isHotseat;
1245f8afe6280eae34620067696173e71943e1a30a3Winson Chung    }
1255f8afe6280eae34620067696173e71943e1a30a3Winson Chung
1263a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung    int getCellContentWidth() {
1273a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung        final LauncherAppState app = LauncherAppState.getInstance();
1283a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung        final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
1293a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung        return Math.min(getMeasuredHeight(), mIsHotseatLayout ?
1303a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung                grid.hotseatCellWidthPx: grid.cellWidthPx);
1313a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung    }
1323a6e7f330e680ef718ca7c0921d842efb4d8bbaeWinson Chung
13369737c3e49ff3edc42899609fdbc96e356f8638eWinson Chung    int getCellContentHeight() {
13469737c3e49ff3edc42899609fdbc96e356f8638eWinson Chung        final LauncherAppState app = LauncherAppState.getInstance();
13569737c3e49ff3edc42899609fdbc96e356f8638eWinson Chung        final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
13669737c3e49ff3edc42899609fdbc96e356f8638eWinson Chung        return Math.min(getMeasuredHeight(), mIsHotseatLayout ?
13769737c3e49ff3edc42899609fdbc96e356f8638eWinson Chung                grid.hotseatCellHeightPx : grid.cellHeightPx);
13869737c3e49ff3edc42899609fdbc96e356f8638eWinson Chung    }
13969737c3e49ff3edc42899609fdbc96e356f8638eWinson Chung
140d5e42733799817d11d739b0a882da8dda721126dAdam Cohen    public void measureChild(View child) {
1415f8afe6280eae34620067696173e71943e1a30a3Winson Chung        final LauncherAppState app = LauncherAppState.getInstance();
1425f8afe6280eae34620067696173e71943e1a30a3Winson Chung        final DeviceProfile grid = app.getDynamicGrid().getDeviceProfile();
143d5e42733799817d11d739b0a882da8dda721126dAdam Cohen        final int cellWidth = mCellWidth;
144d5e42733799817d11d739b0a882da8dda721126dAdam Cohen        final int cellHeight = mCellHeight;
145d5e42733799817d11d739b0a882da8dda721126dAdam Cohen        CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
146ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen        if (!lp.isFullscreen) {
147ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen            lp.setup(cellWidth, cellHeight, mWidthGap, mHeightGap, invertLayoutHorizontally(),
148ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen                    mCountX);
1495f8afe6280eae34620067696173e71943e1a30a3Winson Chung
1505f8afe6280eae34620067696173e71943e1a30a3Winson Chung            if (child instanceof LauncherAppWidgetHostView) {
1515f8afe6280eae34620067696173e71943e1a30a3Winson Chung                // Widgets have their own padding, so skip
1525f8afe6280eae34620067696173e71943e1a30a3Winson Chung            } else {
1535f8afe6280eae34620067696173e71943e1a30a3Winson Chung                // Otherwise, center the icon
15469737c3e49ff3edc42899609fdbc96e356f8638eWinson Chung                int cHeight = getCellContentHeight();
1555f8afe6280eae34620067696173e71943e1a30a3Winson Chung                int cellPaddingY = (int) Math.max(0, ((lp.height - cHeight) / 2f));
156cdef04403695872db8be6342b8dacd437ee02d52Winson Chung                int cellPaddingX = (int) (grid.edgeMarginPx / 2f);
157cdef04403695872db8be6342b8dacd437ee02d52Winson Chung                child.setPadding(cellPaddingX, cellPaddingY, cellPaddingX, 0);
1585f8afe6280eae34620067696173e71943e1a30a3Winson Chung            }
159ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen        } else {
160ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen            lp.x = 0;
161ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen            lp.y = 0;
162ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen            lp.width = getMeasuredWidth();
163ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen            lp.height = getMeasuredHeight();
164ec40b2b90c649be3b513af2ba174db56b54b64f6Adam Cohen        }
165d5e42733799817d11d739b0a882da8dda721126dAdam Cohen        int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY);
166d5e42733799817d11d739b0a882da8dda721126dAdam Cohen        int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height,
167d5e42733799817d11d739b0a882da8dda721126dAdam Cohen                MeasureSpec.EXACTLY);
168d5e42733799817d11d739b0a882da8dda721126dAdam Cohen        child.measure(childWidthMeasureSpec, childheightMeasureSpec);
169d5e42733799817d11d739b0a882da8dda721126dAdam Cohen    }
170d5e42733799817d11d739b0a882da8dda721126dAdam Cohen
1712374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    private boolean invertLayoutHorizontally() {
1722374abfda3e53f84e005df8923170308e4df8c03Adam Cohen        return mInvertIfRtl && isLayoutRtl();
1732374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    }
1742374abfda3e53f84e005df8923170308e4df8c03Adam Cohen
1752374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    public boolean isLayoutRtl() {
1762374abfda3e53f84e005df8923170308e4df8c03Adam Cohen        return (getLayoutDirection() == LAYOUT_DIRECTION_RTL);
1772374abfda3e53f84e005df8923170308e4df8c03Adam Cohen    }
1782374abfda3e53f84e005df8923170308e4df8c03Adam Cohen
1798c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
1808c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    protected void onLayout(boolean changed, int l, int t, int r, int b) {
1818c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        int count = getChildCount();
1828c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
1838c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            final View child = getChildAt(i);
1848c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            if (child.getVisibility() != GONE) {
1858c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
1868c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                int childLeft = lp.x;
1878c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                int childTop = lp.y;
1888c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height);
1898c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1908c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                if (lp.dropped) {
1918c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    lp.dropped = false;
1928c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1938c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    final int[] cellXY = mTmpCellXY;
1948c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    getLocationOnScreen(cellXY);
1958c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    mWallpaperManager.sendWallpaperCommand(getWindowToken(),
1968c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                            WallpaperManager.COMMAND_DROP,
1978c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                            cellXY[0] + childLeft + lp.width / 2,
1988c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                            cellXY[1] + childTop + lp.height / 2, 0, null);
1998c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                }
2008c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            }
2018c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
2028c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
2038c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
2048c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
205e6235dd225404239b55c459245543f3302326112Michael Jurka    public boolean shouldDelayChildPressedState() {
206e6235dd225404239b55c459245543f3302326112Michael Jurka        return false;
207e6235dd225404239b55c459245543f3302326112Michael Jurka    }
208e6235dd225404239b55c459245543f3302326112Michael Jurka
209e6235dd225404239b55c459245543f3302326112Michael Jurka    @Override
2108c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    public void requestChildFocus(View child, View focused) {
2118c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        super.requestChildFocus(child, focused);
2128c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        if (child != null) {
2138c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            Rect r = new Rect();
2148c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            child.getDrawingRect(r);
2158c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            requestRectangleOnScreen(r);
2168c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
2178c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
2188c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
2198c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
2208c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    public void cancelLongPress() {
2218c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        super.cancelLongPress();
2228c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
2238c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        // Cancel long press for all children
2248c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        final int count = getChildCount();
2258c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
2268c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            final View child = getChildAt(i);
2278c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            child.cancelLongPress();
2288c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
2298c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
2308c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
2318c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
2328c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    protected void setChildrenDrawingCacheEnabled(boolean enabled) {
2338c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        final int count = getChildCount();
2348c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
2358c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            final View view = getChildAt(i);
2368c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            view.setDrawingCacheEnabled(enabled);
2378c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            // Update the drawing caches
2388182e5bc3c2d1a0140df345599b89369d457bb4aAdam Cohen            if (!view.isHardwareAccelerated() && enabled) {
2398c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                view.buildDrawingCache(true);
2408c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            }
2418c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
2428c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
2438c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
2448c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
2458c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    protected void setChildrenDrawnWithCacheEnabled(boolean enabled) {
2468c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        super.setChildrenDrawnWithCacheEnabled(enabled);
2478c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
248d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen}
249