DragLayer.java revision 76fc085d28178a5d4fb3787ede956281a2cc3179
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/*
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License.
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License.
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.launcher2;
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
196788269814a678af976dfc7d6135993e172ce586Adam Cohenimport java.util.ArrayList;
20d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
2131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context;
22120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohenimport android.graphics.Bitmap;
236788269814a678af976dfc7d6135993e172ce586Adam Cohenimport android.graphics.Rect;
2431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.AttributeSet;
2531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.KeyEvent;
260e26059548e429e5d1c973bebe4c561bead2926fMichael Jurkaimport android.view.MotionEvent;
27ea3763c2672f77539538af8cdd395ad97058eaabRomain Guyimport android.view.View;
2876fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohenimport android.view.ViewParent;
2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.FrameLayout;
30120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohenimport android.widget.ImageView;
3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
326788269814a678af976dfc7d6135993e172ce586Adam Cohenimport com.android.launcher.R;
336788269814a678af976dfc7d6135993e172ce586Adam Cohen
3431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/**
350e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka * A ViewGroup that coordinates dragging across its descendants
3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
3700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratopublic class DragLayer extends FrameLayout {
38120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    private DragController mDragController;
39120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    private int[] mTmpXY = new int[2];
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
416788269814a678af976dfc7d6135993e172ce586Adam Cohen    // Variables relating to resizing widgets
426788269814a678af976dfc7d6135993e172ce586Adam Cohen    private final ArrayList<AppWidgetResizeFrame> mResizeFrames =
436788269814a678af976dfc7d6135993e172ce586Adam Cohen            new ArrayList<AppWidgetResizeFrame>();
446788269814a678af976dfc7d6135993e172ce586Adam Cohen    private AppWidgetResizeFrame mCurrentResizeFrame;
456788269814a678af976dfc7d6135993e172ce586Adam Cohen    private int mXDown, mYDown;
462801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen    private Folder mCurrentFolder = null;
472801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen    private Launcher mLauncher;
486788269814a678af976dfc7d6135993e172ce586Adam Cohen
4931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
5031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Used to create a new DragLayer from XML.
5131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     *
5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param context The application's context.
530e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka     * @param attrs The attributes set containing the Workspace's customization values.
5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
5531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public DragLayer(Context context, AttributeSet attrs) {
5631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        super(context, attrs);
57be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung
58be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung        // Disable multitouch across the workspace/all apps/customize tray
59be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung        setMotionEventSplittingEnabled(false);
6031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
624c98d9235d164680186180974719f551cf935d08Winson Chung    public void setup(Launcher launcher, DragController controller) {
634c98d9235d164680186180974719f551cf935d08Winson Chung        mLauncher = launcher;
6400acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mDragController = controller;
6531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
6676fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen
6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public boolean dispatchKeyEvent(KeyEvent event) {
6900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        return mDragController.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
7131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7276fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen    private boolean handleTouchDown(MotionEvent ev, boolean intercept) {
736788269814a678af976dfc7d6135993e172ce586Adam Cohen        Rect hitRect = new Rect();
746788269814a678af976dfc7d6135993e172ce586Adam Cohen        int x = (int) ev.getX();
756788269814a678af976dfc7d6135993e172ce586Adam Cohen        int y = (int) ev.getY();
766788269814a678af976dfc7d6135993e172ce586Adam Cohen
776788269814a678af976dfc7d6135993e172ce586Adam Cohen        for (AppWidgetResizeFrame child: mResizeFrames) {
786788269814a678af976dfc7d6135993e172ce586Adam Cohen            child.getHitRect(hitRect);
796788269814a678af976dfc7d6135993e172ce586Adam Cohen            if (hitRect.contains(x, y)) {
806788269814a678af976dfc7d6135993e172ce586Adam Cohen                if (child.beginResizeIfPointInRegion(x - child.getLeft(), y - child.getTop())) {
816788269814a678af976dfc7d6135993e172ce586Adam Cohen                    mCurrentResizeFrame = child;
826788269814a678af976dfc7d6135993e172ce586Adam Cohen                    mXDown = x;
836788269814a678af976dfc7d6135993e172ce586Adam Cohen                    mYDown = y;
846788269814a678af976dfc7d6135993e172ce586Adam Cohen                    requestDisallowInterceptTouchEvent(true);
856788269814a678af976dfc7d6135993e172ce586Adam Cohen                    return true;
866788269814a678af976dfc7d6135993e172ce586Adam Cohen                }
876788269814a678af976dfc7d6135993e172ce586Adam Cohen            }
886788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
8976fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen
9076fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen        if (mCurrentFolder != null && intercept) {
9176fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen            if (mCurrentFolder.isEditingName()) {
9276fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen                getDescendantRectRelativeToSelf(mCurrentFolder.getEditTextRegion(), hitRect);
932801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                if (!hitRect.contains(x, y)) {
9476fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen                    mCurrentFolder.dismissEditingName();
9576fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen                    return true;
962801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen                }
972801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen            }
9876fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen
9976fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen            getDescendantRectRelativeToSelf(mCurrentFolder, hitRect);
10076fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen            if (!hitRect.contains(x, y)) {
10176fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen                mLauncher.closeFolder();
10276fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen                return true;
10376fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen            }
1042801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen        }
1056788269814a678af976dfc7d6135993e172ce586Adam Cohen        return false;
1066788269814a678af976dfc7d6135993e172ce586Adam Cohen    }
1076788269814a678af976dfc7d6135993e172ce586Adam Cohen
10831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
10931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public boolean onInterceptTouchEvent(MotionEvent ev) {
1106788269814a678af976dfc7d6135993e172ce586Adam Cohen        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
11176fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen            if (handleTouchDown(ev, true)) {
1126788269814a678af976dfc7d6135993e172ce586Adam Cohen                return true;
113d1837cc69eb222371afdd30890f7215d117510f2Patrick Dubroy            }
1141b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen        }
1156788269814a678af976dfc7d6135993e172ce586Adam Cohen        clearAllResizeFrames();
1164db52312c10e822162a21c60404f06f6e507f0d6Joe Onorato        return mDragController.onInterceptTouchEvent(ev);
11731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public boolean onTouchEvent(MotionEvent ev) {
1216788269814a678af976dfc7d6135993e172ce586Adam Cohen        boolean handled = false;
1226788269814a678af976dfc7d6135993e172ce586Adam Cohen        int action = ev.getAction();
1236788269814a678af976dfc7d6135993e172ce586Adam Cohen
1246788269814a678af976dfc7d6135993e172ce586Adam Cohen        int x = (int) ev.getX();
1256788269814a678af976dfc7d6135993e172ce586Adam Cohen        int y = (int) ev.getY();
1266788269814a678af976dfc7d6135993e172ce586Adam Cohen
1276788269814a678af976dfc7d6135993e172ce586Adam Cohen        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
1286788269814a678af976dfc7d6135993e172ce586Adam Cohen            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
12976fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen                if (handleTouchDown(ev, false)) {
1306788269814a678af976dfc7d6135993e172ce586Adam Cohen                    return true;
1316788269814a678af976dfc7d6135993e172ce586Adam Cohen                }
1326788269814a678af976dfc7d6135993e172ce586Adam Cohen            }
1336788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
1346788269814a678af976dfc7d6135993e172ce586Adam Cohen
1356788269814a678af976dfc7d6135993e172ce586Adam Cohen        if (mCurrentResizeFrame != null) {
1366788269814a678af976dfc7d6135993e172ce586Adam Cohen            handled = true;
1376788269814a678af976dfc7d6135993e172ce586Adam Cohen            switch (action) {
1386788269814a678af976dfc7d6135993e172ce586Adam Cohen                case MotionEvent.ACTION_MOVE:
1396788269814a678af976dfc7d6135993e172ce586Adam Cohen                    mCurrentResizeFrame.visualizeResizeForDelta(x - mXDown, y - mYDown);
1406788269814a678af976dfc7d6135993e172ce586Adam Cohen                    break;
1416788269814a678af976dfc7d6135993e172ce586Adam Cohen                case MotionEvent.ACTION_CANCEL:
1426788269814a678af976dfc7d6135993e172ce586Adam Cohen                case MotionEvent.ACTION_UP:
1436788269814a678af976dfc7d6135993e172ce586Adam Cohen                    mCurrentResizeFrame.commitResizeForDelta(x - mXDown, y - mYDown);
1446788269814a678af976dfc7d6135993e172ce586Adam Cohen                    mCurrentResizeFrame = null;
1456788269814a678af976dfc7d6135993e172ce586Adam Cohen            }
1466788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
1476788269814a678af976dfc7d6135993e172ce586Adam Cohen        if (handled) return true;
1484db52312c10e822162a21c60404f06f6e507f0d6Joe Onorato        return mDragController.onTouchEvent(ev);
14991a9c9636f10f1e12cd1f660b2e330634fbdc7dcRomain Guy    }
150ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy
15176fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen    private void getDescendantRectRelativeToSelf(View descendant, Rect r) {
15276fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen        descendant.getHitRect(r);
15376fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen
15476fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen        ViewParent viewParent = descendant.getParent();
15576fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen        while (viewParent instanceof View && viewParent != this) {
15676fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen            final View view = (View)viewParent;
15776fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen            r.offset(view.getLeft() + (int) (view.getTranslationX() + 0.5f) - view.getScrollX(),
15876fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen                    view.getTop() + (int) (view.getTranslationY() + 0.5f) - view.getScrollY());
15976fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen            viewParent = view.getParent();
16076fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen        }
16176fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen    }
16276fc085d28178a5d4fb3787ede956281a2cc3179Adam Cohen
163ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    @Override
164ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    public boolean dispatchUnhandledMove(View focused, int direction) {
165ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy        return mDragController.dispatchUnhandledMove(focused, direction);
166ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    }
167120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen
168120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    public View createDragView(Bitmap b, int xPos, int yPos) {
169120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        ImageView imageView = new ImageView(mContext);
170120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        imageView.setImageBitmap(b);
171120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        imageView.setX(xPos);
172120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        imageView.setY(yPos);
173120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        addView(imageView, b.getWidth(), b.getHeight());
174120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen
175120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        return imageView;
176120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    }
177120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen
178120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    public View createDragView(View v) {
179120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        v.getLocationOnScreen(mTmpXY);
180120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        return createDragView(mDragController.getViewBitmap(v), mTmpXY[0], mTmpXY[1]);
181120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    }
1826788269814a678af976dfc7d6135993e172ce586Adam Cohen
1836788269814a678af976dfc7d6135993e172ce586Adam Cohen    public static class LayoutParams extends FrameLayout.LayoutParams {
1846788269814a678af976dfc7d6135993e172ce586Adam Cohen        public int x, y;
1856788269814a678af976dfc7d6135993e172ce586Adam Cohen        public boolean customPosition = false;
1866788269814a678af976dfc7d6135993e172ce586Adam Cohen
1876788269814a678af976dfc7d6135993e172ce586Adam Cohen        /**
1886788269814a678af976dfc7d6135993e172ce586Adam Cohen         * {@inheritDoc}
1896788269814a678af976dfc7d6135993e172ce586Adam Cohen         */
1906788269814a678af976dfc7d6135993e172ce586Adam Cohen        public LayoutParams(int width, int height) {
1916788269814a678af976dfc7d6135993e172ce586Adam Cohen            super(width, height);
1926788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
1936788269814a678af976dfc7d6135993e172ce586Adam Cohen
1946788269814a678af976dfc7d6135993e172ce586Adam Cohen        public void setWidth(int width) {
1956788269814a678af976dfc7d6135993e172ce586Adam Cohen            this.width = width;
1966788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
1976788269814a678af976dfc7d6135993e172ce586Adam Cohen
1986788269814a678af976dfc7d6135993e172ce586Adam Cohen        public int getWidth() {
1996788269814a678af976dfc7d6135993e172ce586Adam Cohen            return width;
2006788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
2016788269814a678af976dfc7d6135993e172ce586Adam Cohen
2026788269814a678af976dfc7d6135993e172ce586Adam Cohen        public void setHeight(int height) {
2036788269814a678af976dfc7d6135993e172ce586Adam Cohen            this.height = height;
2046788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
2056788269814a678af976dfc7d6135993e172ce586Adam Cohen
2066788269814a678af976dfc7d6135993e172ce586Adam Cohen        public int getHeight() {
2076788269814a678af976dfc7d6135993e172ce586Adam Cohen            return height;
2086788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
2096788269814a678af976dfc7d6135993e172ce586Adam Cohen
2106788269814a678af976dfc7d6135993e172ce586Adam Cohen        public void setX(int x) {
2116788269814a678af976dfc7d6135993e172ce586Adam Cohen            this.x = x;
2126788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
2136788269814a678af976dfc7d6135993e172ce586Adam Cohen
2146788269814a678af976dfc7d6135993e172ce586Adam Cohen        public int getX() {
2156788269814a678af976dfc7d6135993e172ce586Adam Cohen            return x;
2166788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
2176788269814a678af976dfc7d6135993e172ce586Adam Cohen
2186788269814a678af976dfc7d6135993e172ce586Adam Cohen        public void setY(int y) {
2196788269814a678af976dfc7d6135993e172ce586Adam Cohen            this.y = y;
2206788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
2216788269814a678af976dfc7d6135993e172ce586Adam Cohen
2226788269814a678af976dfc7d6135993e172ce586Adam Cohen        public int getY() {
2236788269814a678af976dfc7d6135993e172ce586Adam Cohen            return y;
2246788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
2256788269814a678af976dfc7d6135993e172ce586Adam Cohen    }
2266788269814a678af976dfc7d6135993e172ce586Adam Cohen
2276788269814a678af976dfc7d6135993e172ce586Adam Cohen    protected void onLayout(boolean changed, int l, int t, int r, int b) {
2286788269814a678af976dfc7d6135993e172ce586Adam Cohen        super.onLayout(changed, l, t, r, b);
2296788269814a678af976dfc7d6135993e172ce586Adam Cohen        int count = getChildCount();
2306788269814a678af976dfc7d6135993e172ce586Adam Cohen        for (int i = 0; i < count; i++) {
2316788269814a678af976dfc7d6135993e172ce586Adam Cohen            View child = getChildAt(i);
2326788269814a678af976dfc7d6135993e172ce586Adam Cohen            final FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams) child.getLayoutParams();
2336788269814a678af976dfc7d6135993e172ce586Adam Cohen            if (flp instanceof LayoutParams) {
2346788269814a678af976dfc7d6135993e172ce586Adam Cohen                final LayoutParams lp = (LayoutParams) flp;
2356788269814a678af976dfc7d6135993e172ce586Adam Cohen                if (lp.customPosition) {
2366788269814a678af976dfc7d6135993e172ce586Adam Cohen                    child.layout(lp.x, lp.y, lp.x + lp.width, lp.y + lp.height);
2376788269814a678af976dfc7d6135993e172ce586Adam Cohen                }
2386788269814a678af976dfc7d6135993e172ce586Adam Cohen            }
2396788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
2406788269814a678af976dfc7d6135993e172ce586Adam Cohen    }
2416788269814a678af976dfc7d6135993e172ce586Adam Cohen
2426788269814a678af976dfc7d6135993e172ce586Adam Cohen    public void clearAllResizeFrames() {
2436788269814a678af976dfc7d6135993e172ce586Adam Cohen        if (mResizeFrames.size() > 0) {
2446788269814a678af976dfc7d6135993e172ce586Adam Cohen            for (AppWidgetResizeFrame frame: mResizeFrames) {
2456788269814a678af976dfc7d6135993e172ce586Adam Cohen                removeView(frame);
2466788269814a678af976dfc7d6135993e172ce586Adam Cohen            }
2476788269814a678af976dfc7d6135993e172ce586Adam Cohen            mResizeFrames.clear();
2486788269814a678af976dfc7d6135993e172ce586Adam Cohen        }
2496788269814a678af976dfc7d6135993e172ce586Adam Cohen    }
2506788269814a678af976dfc7d6135993e172ce586Adam Cohen
2516788269814a678af976dfc7d6135993e172ce586Adam Cohen    public boolean hasResizeFrames() {
2526788269814a678af976dfc7d6135993e172ce586Adam Cohen        return mResizeFrames.size() > 0;
2536788269814a678af976dfc7d6135993e172ce586Adam Cohen    }
2546788269814a678af976dfc7d6135993e172ce586Adam Cohen
2556788269814a678af976dfc7d6135993e172ce586Adam Cohen    public boolean isWidgetBeingResized() {
2566788269814a678af976dfc7d6135993e172ce586Adam Cohen        return mCurrentResizeFrame != null;
2576788269814a678af976dfc7d6135993e172ce586Adam Cohen    }
2586788269814a678af976dfc7d6135993e172ce586Adam Cohen
2596788269814a678af976dfc7d6135993e172ce586Adam Cohen    public void addResizeFrame(ItemInfo itemInfo, LauncherAppWidgetHostView widget,
2606788269814a678af976dfc7d6135993e172ce586Adam Cohen            CellLayout cellLayout) {
2616788269814a678af976dfc7d6135993e172ce586Adam Cohen        AppWidgetResizeFrame resizeFrame = new AppWidgetResizeFrame(getContext(),
2626788269814a678af976dfc7d6135993e172ce586Adam Cohen                itemInfo, widget, cellLayout, this);
2636788269814a678af976dfc7d6135993e172ce586Adam Cohen
2646788269814a678af976dfc7d6135993e172ce586Adam Cohen        LayoutParams lp = new LayoutParams(-1, -1);
2656788269814a678af976dfc7d6135993e172ce586Adam Cohen        lp.customPosition = true;
2666788269814a678af976dfc7d6135993e172ce586Adam Cohen
2676788269814a678af976dfc7d6135993e172ce586Adam Cohen        addView(resizeFrame, lp);
2686788269814a678af976dfc7d6135993e172ce586Adam Cohen        mResizeFrames.add(resizeFrame);
2696788269814a678af976dfc7d6135993e172ce586Adam Cohen
2706788269814a678af976dfc7d6135993e172ce586Adam Cohen        resizeFrame.snapToWidget(false);
2716788269814a678af976dfc7d6135993e172ce586Adam Cohen    }
2722801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen
2732801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen    public void setCurrentFolder(Folder f) {
2742801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen        mCurrentFolder = f;
2752801cafe62653131fdc9da402e5c44e5ffd0bf47Adam Cohen    }
27631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
277