1524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler/*
2524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler * Copyright (C) 2010 The Android Open Source Project
3524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler *
4524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler * Licensed under the Apache License, Version 2.0 (the "License");
5524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler * you may not use this file except in compliance with the License.
6524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler * You may obtain a copy of the License at
7524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler *
8524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler *      http://www.apache.org/licenses/LICENSE-2.0
9524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler *
10524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler * Unless required by applicable law or agreed to in writing, software
11524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler * distributed under the License is distributed on an "AS IS" BASIS,
12524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler * See the License for the specific language governing permissions and
14524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler * limitations under the License.
15524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler */
16524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
17524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerpackage com.android.systemui.statusbar.tablet;
18524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
191cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.animation.Animator;
201cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.animation.AnimatorListenerAdapter;
21524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerimport android.animation.ObjectAnimator;
22524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerimport android.content.ClipData;
23524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerimport android.content.ClipDescription;
241cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.content.Context;
25524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerimport android.graphics.Bitmap;
26524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerimport android.graphics.Canvas;
271cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.graphics.Paint;
281cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.graphics.PixelFormat;
29524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerimport android.graphics.Point;
301cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.util.AttributeSet;
311cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.util.Slog;
321cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.view.DragEvent;
331cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.view.Gravity;
341cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.view.MotionEvent;
351cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.view.View;
36524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerimport android.view.WindowManager;
37524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerimport android.view.WindowManagerImpl;
381cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.widget.FrameLayout;
391cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.widget.ImageView;
401cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandlerimport android.widget.TextView;
41524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
42524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandlerimport com.android.systemui.R;
43524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
440ad460b087abbd4b523a2e61ff27b0bf6fb5be92Daniel Sandlerpublic class ShirtPocket extends ImageView {
45524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    private static final boolean DEBUG = false;
46524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    private static final String  TAG = "StatusBar/ShirtPocket";
47524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
48524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    private ClipData mClipping = null;
49524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
50524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    private ImageView mPreviewIcon;
51524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
521cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    public static class DropZone extends View {
531cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        ShirtPocket mPocket;
541cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        public DropZone(Context context, AttributeSet attrs) {
551cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            super(context, attrs);
561cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        }
571cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        public void setPocket(ShirtPocket p) {
581cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            mPocket = p;
591cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        }
60524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
611cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        public void onAttachedToWindow() {
621cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            super.onAttachedToWindow();
631cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            if (mPocket.holding()) {
641cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                show(false);
651cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            } else {
661cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                hide(false);
671cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            }
681cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        }
69524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
701cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        // Drag API notes: we must be visible to receive drag events
711cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        private void show(boolean animate) {
721cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            setTranslationY(0f);
731cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            if (animate) {
741cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                setAlpha(0f);
751cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                ObjectAnimator.ofFloat(this, "alpha", 0f, 1f).start();
761cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            } else {
771cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                setAlpha(1f);
781cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            }
791cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        }
80524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
811cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        private void hide(boolean animate) {
821cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            AnimatorListenerAdapter onEnd = new AnimatorListenerAdapter() {
831cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                @Override
841cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                public void onAnimationEnd(Animator _a) {
851cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    DropZone.this.setTranslationY(getHeight() + 2);
861cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    DropZone.this.setAlpha(0f);
87524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                }
881cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            };
891cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            if (animate) {
901cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                Animator a = ObjectAnimator.ofFloat(this, "alpha", getAlpha(), 0f);
911cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                a.addListener(onEnd);
921cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                a.start();
931cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            } else {
941cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                onEnd.onAnimationEnd(null);
95524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            }
961cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        }
97524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
981cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        @Override
991cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        public boolean onDragEvent(DragEvent event) {
1001cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            if (DEBUG) Slog.d(TAG, "onDragEvent: " + event);
1011cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            switch (event.getAction()) {
1021cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                // We want to appear whenever a potential drag takes off from anywhere in the UI.
1031cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                case DragEvent.ACTION_DRAG_STARTED:
1041cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    show(true);
1051cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    break;
1061cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                case DragEvent.ACTION_DRAG_ENTERED:
1071cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    if (DEBUG) Slog.d(TAG, "entered!");
1081cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    // XXX: TODO
1091cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    break;
1101cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                case DragEvent.ACTION_DRAG_EXITED:
1111cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    if (DEBUG) Slog.d(TAG, "exited!");
1121cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    break;
1131cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                case DragEvent.ACTION_DROP:
1141cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    if (DEBUG) Slog.d(TAG, "dropped!");
1151cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    mPocket.stash(event.getClipData());
1161cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    break;
1171cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                case DragEvent.ACTION_DRAG_ENDED:
1181cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    hide(true);
1191cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    break;
120524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            }
1211cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            return true; // we want everything, thank you
1221cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        }
123524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    }
124524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
1251cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    public ShirtPocket(Context context, AttributeSet attrs) {
1261cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        super(context, attrs);
127524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    }
1281cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler
1291cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    // TODO: "pin area" panel, dragging things out
1301cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    ObjectAnimator mAnimHide, mAnimShow;
131524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
1321cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    protected void onAttachedToWindow() {
1331cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    }
1341cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler
1351cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    public boolean holding() {
1361cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        return (mClipping != null);
137524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    }
138524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
139524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    private void stash(ClipData clipping) {
140524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        mClipping = clipping;
141524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        if (mClipping != null) {
1421cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            setVisibility(View.VISIBLE);
143524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            Bitmap icon = mClipping.getIcon();
1441cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler//            mDescription.setText(mClipping.getDescription().getLabel());
145524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            if (icon != null) {
1461cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                setImageBitmap(icon);
147524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            } else {
148524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                if (mClipping.getItemCount() > 0) {
149524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                    // TODO: figure out how to visualize every kind of ClipData!
1501cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    //mAltText.setText(mClipping.getItemAt(0).coerceToText(getContext()));
151524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                }
152524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            }
1531cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        } else {
1541cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            setVisibility(View.GONE);
155524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        }
156524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    }
157524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
1581cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    @Override
1591cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    public boolean onTouchEvent(MotionEvent ev) {
1601cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        final int action = ev.getAction();
1611cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        if (action == MotionEvent.ACTION_DOWN) {
1621cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            final ClipData clip = mClipping;
1631cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            if (clip != null) {
1641cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                final Bitmap icon = clip.getIcon();
1651cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                DragShadowBuilder shadow;
1661cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                if (icon != null) {
1671cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    shadow = new DragShadowBuilder(this) {
1681cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                        public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
1691cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                            shadowSize.set(icon.getWidth(), icon.getHeight());
1701cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                            shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
1711cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                        }
1721cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                        public void onDrawShadow(Canvas canvas) {
1731cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                            canvas.drawBitmap(icon, 0, 0, new Paint());
1741cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                        }
1751cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    };
1761cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                } else {
1771cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    // uhhh, what now?
1781cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                    shadow = new DragShadowBuilder(this);
1791cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                }
1801cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler
1811cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                startDrag(clip, shadow, null, 0);
1821cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler
1831cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                // TODO: only discard the clipping if it was accepted
1841cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                stash(null);
1851cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler
1861cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler                return true;
1871cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler            }
1881cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        }
1891cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler        return false;
1901cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    }
1911cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler
1921cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    /*
193524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    private boolean isInViewContentArea(View v, int x, int y) {
194524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        final int l = v.getPaddingLeft();
195524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        final int r = v.getWidth() - v.getPaddingRight();
196524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        final int t = v.getPaddingTop();
197524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        final int b = v.getHeight() - v.getPaddingBottom();
198524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        return x >= l && x < r && y >= t && y < b;
199524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    }
200524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
201524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    View.OnTouchListener mWindowTouchListener = new View.OnTouchListener() {
202524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        public boolean onTouch(View v, MotionEvent ev) {
203524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            final int action = ev.getAction();
204524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            if (action == MotionEvent.ACTION_OUTSIDE
205524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                    || (action == MotionEvent.ACTION_DOWN
206524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                        && !isInViewContentArea(mWindow, (int)ev.getX(), (int)ev.getY()))) {
207524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                hideWindow();
208524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                return true;
209524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            } else if (action == MotionEvent.ACTION_DOWN) {
210524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                final ClipData clip = mClipping;
211524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                if (clip != null) {
212524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                    final Bitmap icon = clip.getIcon();
21336d4c3f02b4c3366b965896bc3da8bb332db1a64Christopher Tate                    DragShadowBuilder shadow;
214524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                    if (icon != null) {
21536d4c3f02b4c3366b965896bc3da8bb332db1a64Christopher Tate                        shadow = new DragShadowBuilder(v) {
21636d4c3f02b4c3366b965896bc3da8bb332db1a64Christopher Tate                            public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
21736d4c3f02b4c3366b965896bc3da8bb332db1a64Christopher Tate                                shadowSize.set(icon.getWidth(), icon.getHeight());
21836d4c3f02b4c3366b965896bc3da8bb332db1a64Christopher Tate                                shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
219524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                            }
22036d4c3f02b4c3366b965896bc3da8bb332db1a64Christopher Tate                            public void onDrawShadow(Canvas canvas) {
221524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                                canvas.drawBitmap(icon, 0, 0, new Paint());
222524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                            }
223524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                        };
224524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                    } else {
225524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                        // uhhh, what now?
22636d4c3f02b4c3366b965896bc3da8bb332db1a64Christopher Tate                        shadow = new DragShadowBuilder(mWindow.findViewById(R.id.preview));
227524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                    }
228524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
22902d2b3ba9ba830a8147db2739613f7bbb2d0fcbfChristopher Tate                    v.startDrag(clip, shadow, null, 0);
230524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
231524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                    // TODO: only discard the clipping if it was accepted
232524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                    stash(null);
233524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
234524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                    return true;
235524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler                }
236524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            }
237524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler            return false;
238524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler        }
239524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler    };
2401cfe75301724d324c4f2e216dfef09ca2a474025Daniel Sandler    */
241524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler}
242524f568802c32ba1126fe2886f3e96d018d7f23dDaniel Sandler
243