DragLayer.java revision 1b607ed454ed22c2fd855cb3e428376520fb2388
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
19d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohenimport com.android.launcher.R;
20d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen
2131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context;
22120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohenimport android.graphics.Bitmap;
2331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.AttributeSet;
2431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.KeyEvent;
250e26059548e429e5d1c973bebe4c561bead2926fMichael Jurkaimport android.view.MotionEvent;
26ea3763c2672f77539538af8cdd395ad97058eaabRomain Guyimport android.view.View;
2731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.FrameLayout;
28120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohenimport android.widget.ImageView;
2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/**
310e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka * A ViewGroup that coordinates dragging across its descendants
3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
3300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onoratopublic class DragLayer extends FrameLayout {
34120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    private DragController mDragController;
35120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    private int[] mTmpXY = new int[2];
3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
3731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Used to create a new DragLayer from XML.
3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     *
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param context The application's context.
410e26059548e429e5d1c973bebe4c561bead2926fMichael Jurka     * @param attrs The attributes set containing the Workspace's customization values.
4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public DragLayer(Context context, AttributeSet attrs) {
4431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        super(context, attrs);
45be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung
46be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung        // Disable multitouch across the workspace/all apps/customize tray
47be62afa34d58edab0fc9ba7499f0dd543039c903Winson Chung        setMotionEventSplittingEnabled(false);
4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
4931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
5000acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato    public void setDragController(DragController controller) {
5100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        mDragController = controller;
5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
5300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato
5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
5531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public boolean dispatchKeyEvent(KeyEvent event) {
5600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato        return mDragController.dispatchKeyEvent(event) || super.dispatchKeyEvent(event);
5731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
6031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public boolean onInterceptTouchEvent(MotionEvent ev) {
611b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen        // If the current CellLayoutChildren has a resize frame, we need to detect if any touch
621b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen        // event has occurred which doesn't result in resizing a widget. In this case, we
631b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen        // dismiss any visible resize frames.
641b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen        final Workspace w = (Workspace) findViewById(R.id.workspace);
651b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen        final CellLayout currentPage = (CellLayout) w.getChildAt(w.getCurrentPage());
661b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen
671b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen        if (currentPage.getChildrenLayout().hasResizeFrames()) {
681b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen            post(new Runnable() {
691b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen                public void run() {
701b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen                    if (!currentPage.getChildrenLayout().isWidgetBeingResized()) {
711b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen                        currentPage.getChildrenLayout().clearAllResizeFrames();
721b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen                    }
731b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen                }
741b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen            });
751b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen        }
764db52312c10e822162a21c60404f06f6e507f0d6Joe Onorato        return mDragController.onInterceptTouchEvent(ev);
7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
7831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public boolean onTouchEvent(MotionEvent ev) {
814db52312c10e822162a21c60404f06f6e507f0d6Joe Onorato        return mDragController.onTouchEvent(ev);
8291a9c9636f10f1e12cd1f660b2e330634fbdc7dcRomain Guy    }
83ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy
84ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    @Override
85ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    public boolean dispatchUnhandledMove(View focused, int direction) {
86ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy        return mDragController.dispatchUnhandledMove(focused, direction);
87ea3763c2672f77539538af8cdd395ad97058eaabRomain Guy    }
88120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen
89120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    public View createDragView(Bitmap b, int xPos, int yPos) {
90120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        ImageView imageView = new ImageView(mContext);
91120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        imageView.setImageBitmap(b);
92120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        imageView.setX(xPos);
93120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        imageView.setY(yPos);
94120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        addView(imageView, b.getWidth(), b.getHeight());
95120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen
96120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        return imageView;
97120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    }
98120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen
99120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    public View createDragView(View v) {
100120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        v.getLocationOnScreen(mTmpXY);
101120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen        return createDragView(mDragController.getViewBitmap(v), mTmpXY[0], mTmpXY[1]);
102120980bd00f5eecec5717f49a3d7db96571025a9Adam Cohen    }
10331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
104