ShortcutAndWidgetContainer.java revision d4844c3e731b00547a31f23a00f8bd4a271e2b62
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
178c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkapackage com.android.launcher2;
188c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
19d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohenimport java.util.ArrayList;
20d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
218c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.app.WallpaperManager;
228c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.content.Context;
238c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.graphics.Rect;
24d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohenimport android.view.MotionEvent;
258c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurkaimport android.view.View;
26cf6125c2d30ce02d8ab6cbe8e37a20f6a831e216Michael Jurkaimport android.view.ViewGroup;
278c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
28cf6125c2d30ce02d8ab6cbe8e37a20f6a831e216Michael Jurkapublic class CellLayoutChildren extends ViewGroup {
298c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    static final String TAG = "CellLayoutChildren";
308c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
318c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    // These are temporary variables to prevent having to allocate a new object just to
328c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    // return an (x, y) value from helper functions. Do NOT use them to maintain other state.
338c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private final int[] mTmpCellXY = new int[2];
348c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
358c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private final WallpaperManager mWallpaperManager;
368c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
378c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private int mLeftPadding;
388c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private int mTopPadding;
398c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
40d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    private int mCellWidth;
41d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    private int mCellHeight;
42d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
438c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private int mWidthGap;
448c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    private int mHeightGap;
458c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
468c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    public CellLayoutChildren(Context context) {
478c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        super(context);
488c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mWallpaperManager = WallpaperManager.getInstance(context);
49bdb5c5342adc550559fd723af461e53248f2fba8Michael Jurka        setLayerType(LAYER_TYPE_HARDWARE, null);
50be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung
51be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung        // Disable multitouch for the workspace
52be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung        setMotionEventSplittingEnabled(false);
538c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
548c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
558c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    public void setCellDimensions(int cellWidth, int cellHeight,
568c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            int leftPadding, int topPadding, int widthGap, int heightGap ) {
578c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mCellWidth = cellWidth;
588c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mCellHeight = cellHeight;
598c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mLeftPadding = leftPadding;
608c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mTopPadding = topPadding;
618c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mWidthGap = widthGap;
628c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        mHeightGap = heightGap;
638c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
648c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
658c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    public View getChildAt(int x, int y) {
668c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        final int count = getChildCount();
678c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
688c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            View child = getChildAt(i);
698c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
708c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
718c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            if ((lp.cellX <= x) && (x < lp.cellX + lp.cellHSpan) &&
728c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    (lp.cellY <= y) && (y < lp.cellY + lp.cellHSpan)) {
738c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                return child;
748c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            }
758c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
768c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        return null;
778c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
788c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
798c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
808c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
818c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        final int cellWidth = mCellWidth;
828c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        final int cellHeight = mCellHeight;
838c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        int count = getChildCount();
848c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
858c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            View child = getChildAt(i);
868c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
878c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
888c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            lp.setup(cellWidth, cellHeight, mWidthGap, mHeightGap,
898c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    mLeftPadding, mTopPadding);
908c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
918c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY);
928c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height,
938c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    MeasureSpec.EXACTLY);
948c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
958c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            child.measure(childWidthMeasureSpec, childheightMeasureSpec);
968c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
978c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
988c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        int heightSpecSize =  MeasureSpec.getSize(heightMeasureSpec);
998c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        setMeasuredDimension(widthSpecSize, heightSpecSize);
1008c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
1018c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1028c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
1038c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    protected void onLayout(boolean changed, int l, int t, int r, int b) {
1048c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        int count = getChildCount();
1058c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
1068c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            final View child = getChildAt(i);
1078c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            if (child.getVisibility() != GONE) {
1088c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                CellLayout.LayoutParams lp = (CellLayout.LayoutParams) child.getLayoutParams();
1098c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1108c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                int childLeft = lp.x;
1118c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                int childTop = lp.y;
1128c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                child.layout(childLeft, childTop, childLeft + lp.width, childTop + lp.height);
1138c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1148c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                if (lp.dropped) {
1158c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    lp.dropped = false;
1168c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1178c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    final int[] cellXY = mTmpCellXY;
1188c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    getLocationOnScreen(cellXY);
1198c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    mWallpaperManager.sendWallpaperCommand(getWindowToken(),
1208c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                            WallpaperManager.COMMAND_DROP,
1218c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                            cellXY[0] + childLeft + lp.width / 2,
1228c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                            cellXY[1] + childTop + lp.height / 2, 0, null);
1238c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1248c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    if (lp.animateDrop) {
1258c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                        lp.animateDrop = false;
1268c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1278c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                        // This call does not result in a requestLayout(), but at one point did.
1288c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                        // We need to be cautious about any method calls within the layout pass
1298c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                        // to insure we don't leave the view tree in a bad state.
1308c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                        ((Workspace) mParent.getParent()).animateViewIntoPosition(child);
1318c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                    }
1328c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                }
1338c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            }
1348c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
1358c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
1368c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1378c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
1388c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    public void requestChildFocus(View child, View focused) {
1398c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        super.requestChildFocus(child, focused);
1408c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        if (child != null) {
1418c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            Rect r = new Rect();
1428c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            child.getDrawingRect(r);
1438c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            requestRectangleOnScreen(r);
1448c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
1458c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
1468c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1478c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
1488c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    public void cancelLongPress() {
1498c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        super.cancelLongPress();
1508c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1518c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        // Cancel long press for all children
1528c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        final int count = getChildCount();
1538c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
1548c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            final View child = getChildAt(i);
1558c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            child.cancelLongPress();
1568c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
1578c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
1588c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1598c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
1608c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    protected void setChildrenDrawingCacheEnabled(boolean enabled) {
1618c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        final int count = getChildCount();
1628c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        for (int i = 0; i < count; i++) {
1638c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            final View view = getChildAt(i);
1648c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            view.setDrawingCacheEnabled(enabled);
1658c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            // Update the drawing caches
1668c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            if (!view.isHardwareAccelerated()) {
1678c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka                view.buildDrawingCache(true);
1688c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka            }
1698c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        }
1708c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
1718c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka
1728c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    @Override
1738c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    protected void setChildrenDrawnWithCacheEnabled(boolean enabled) {
1748c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka        super.setChildrenDrawnWithCacheEnabled(enabled);
1758c920dd3683d752aa4c43e964831ce53f9b72887Michael Jurka    }
176d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
177d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    private final ArrayList<AppWidgetResizeFrame> mResizeFrames = new  ArrayList<AppWidgetResizeFrame>();
178d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    private AppWidgetResizeFrame mCurrentResizeFrame;
179d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    private int mXDown, mYDown;
180d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    private boolean mIsWidgetBeingResized;
181d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
182d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    public void clearAllResizeFrames() {
183d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        for (AppWidgetResizeFrame frame: mResizeFrames) {
184d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen            removeView(frame);
185d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        }
186d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        mResizeFrames.clear();
187d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    }
188d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
189d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    public boolean isWidgetBeingResized() {
190d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        return mIsWidgetBeingResized;
191d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    }
192d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
193d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    @Override
194d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    public boolean onInterceptTouchEvent(MotionEvent ev) {
195d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        Rect hitRect = new Rect();
196d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
197d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        int x = (int) ev.getX();
198d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        int y = (int) ev.getY();
199d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
200d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
201d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen            for (AppWidgetResizeFrame child: mResizeFrames) {
202d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                child.getHitRect(hitRect);
203d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                if (hitRect.contains(x, y)) {
204d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                    if (child.beginResizeIfPointInRegion(x - child.getLeft(), y - child.getTop())) {
205d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        mCurrentResizeFrame = child;
206d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        mIsWidgetBeingResized = true;
207d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        mXDown = x;
208d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        mYDown = y;
209d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        requestDisallowInterceptTouchEvent(true);
210d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        return true;
211d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                    }
212d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                }
213d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen            }
214d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen            mCurrentResizeFrame = null;
215d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        }
216d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        return false;
217d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    }
218d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
219d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    @Override
220d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    public boolean onTouchEvent(MotionEvent ev) {
221d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        boolean handled = false;
222d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        Rect hitRect = new Rect();
223d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        int action = ev.getAction();
224d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
225d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        int x = (int) ev.getX();
226d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        int y = (int) ev.getY();
227d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
228d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
229d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen            for (AppWidgetResizeFrame child: mResizeFrames) {
230d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                child.getHitRect(hitRect);
231d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                if (hitRect.contains(x, y)) {
232d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                    if (child.beginResizeIfPointInRegion(x - child.getLeft(), y - child.getTop())) {
233d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        mCurrentResizeFrame = child;
234d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        mIsWidgetBeingResized = true;
235d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        mXDown = x;
236d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        mYDown = y;
237d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        requestDisallowInterceptTouchEvent(true);
238d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                        return true;
239d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                    }
240d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                }
241d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen            }
242d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen            mCurrentResizeFrame = null;
243d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        }
244d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
245d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        // TODO: Need to handle ACTION_POINTER_UP / multi-touch
246d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        if (mCurrentResizeFrame != null) {
247d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen            switch (action) {
248d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                case MotionEvent.ACTION_MOVE:
249d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                    mCurrentResizeFrame.visualizeResizeForDelta(x - mXDown, y - mYDown);
250d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                    break;
251d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                case MotionEvent.ACTION_CANCEL:
252d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                case MotionEvent.ACTION_UP: {
253d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                    mCurrentResizeFrame.commitResizeForDelta(x - mXDown, y - mYDown);
254d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                    mIsWidgetBeingResized = false;
255d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                    handled = true;
256d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                }
257d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen            }
258d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        }
259d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        return handled;
260d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    }
261d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
262d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    public void addResizeFrame(ItemInfo itemInfo, LauncherAppWidgetHostView widget, CellLayout cellLayout) {
263d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        AppWidgetResizeFrame resizeFrame = new AppWidgetResizeFrame(getContext(),
264d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen                itemInfo, widget, cellLayout);
265d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
266d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        CellLayout.LayoutParams lp = new CellLayout.LayoutParams(-1, -1, -1, -1);
267d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        lp.isLockedToGrid = false;
268d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
269d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        addView(resizeFrame, lp);
270d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        mResizeFrames.add(resizeFrame);
271d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
272d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen        resizeFrame.snapToWidget(false);
273d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen    }
274d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen}
275