DeleteDropTarget.java revision ed66b2bac7447febe2e405b4ce725cae4f6b5988
14c98d9235d164680186180974719f551cf935d08Winson Chung/*
24c98d9235d164680186180974719f551cf935d08Winson Chung * Copyright (C) 2011 The Android Open Source Project
34c98d9235d164680186180974719f551cf935d08Winson Chung *
44c98d9235d164680186180974719f551cf935d08Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
54c98d9235d164680186180974719f551cf935d08Winson Chung * you may not use this file except in compliance with the License.
64c98d9235d164680186180974719f551cf935d08Winson Chung * You may obtain a copy of the License at
74c98d9235d164680186180974719f551cf935d08Winson Chung *
84c98d9235d164680186180974719f551cf935d08Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
94c98d9235d164680186180974719f551cf935d08Winson Chung *
104c98d9235d164680186180974719f551cf935d08Winson Chung * Unless required by applicable law or agreed to in writing, software
114c98d9235d164680186180974719f551cf935d08Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
124c98d9235d164680186180974719f551cf935d08Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134c98d9235d164680186180974719f551cf935d08Winson Chung * See the License for the specific language governing permissions and
144c98d9235d164680186180974719f551cf935d08Winson Chung * limitations under the License.
154c98d9235d164680186180974719f551cf935d08Winson Chung */
164c98d9235d164680186180974719f551cf935d08Winson Chung
174c98d9235d164680186180974719f551cf935d08Winson Chungpackage com.android.launcher2;
184c98d9235d164680186180974719f551cf935d08Winson Chung
194c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.Context;
20a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.content.res.ColorStateList;
21201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.content.res.Configuration;
224c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.res.Resources;
234c98d9235d164680186180974719f551cf935d08Winson Chungimport android.graphics.PorterDuff;
244c98d9235d164680186180974719f551cf935d08Winson Chungimport android.graphics.PorterDuffColorFilter;
25d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohenimport android.graphics.Rect;
26967289b6d5fec77f5c381d11ffb2319f3bb5e737Winson Chungimport android.graphics.drawable.TransitionDrawable;
274c98d9235d164680186180974719f551cf935d08Winson Chungimport android.util.AttributeSet;
284c98d9235d164680186180974719f551cf935d08Winson Chungimport android.view.View;
29a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chungimport android.view.ViewGroup;
30d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohenimport android.view.animation.DecelerateInterpolator;
314c98d9235d164680186180974719f551cf935d08Winson Chung
324c98d9235d164680186180974719f551cf935d08Winson Chungimport com.android.launcher.R;
334c98d9235d164680186180974719f551cf935d08Winson Chung
3461fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chungpublic class DeleteDropTarget extends ButtonDropTarget {
354c98d9235d164680186180974719f551cf935d08Winson Chung
364b285c5a60028f7c9ce39cfb318a730d0ae95c27Adam Cohen    private static int DELETE_ANIMATION_DURATION = 250;
37a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private ColorStateList mOriginalTextColor;
384c98d9235d164680186180974719f551cf935d08Winson Chung    private int mHoverColor = 0xFFFF0000;
39ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen    private TransitionDrawable mUninstallDrawable;
40ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen    private TransitionDrawable mRemoveDrawable;
41ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen    private TransitionDrawable mCurrentDrawable;
424c98d9235d164680186180974719f551cf935d08Winson Chung
434c98d9235d164680186180974719f551cf935d08Winson Chung    public DeleteDropTarget(Context context, AttributeSet attrs) {
444c98d9235d164680186180974719f551cf935d08Winson Chung        this(context, attrs, 0);
454c98d9235d164680186180974719f551cf935d08Winson Chung    }
464c98d9235d164680186180974719f551cf935d08Winson Chung
474c98d9235d164680186180974719f551cf935d08Winson Chung    public DeleteDropTarget(Context context, AttributeSet attrs, int defStyle) {
484c98d9235d164680186180974719f551cf935d08Winson Chung        super(context, attrs, defStyle);
494c98d9235d164680186180974719f551cf935d08Winson Chung    }
504c98d9235d164680186180974719f551cf935d08Winson Chung
514c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
524c98d9235d164680186180974719f551cf935d08Winson Chung    protected void onFinishInflate() {
534c98d9235d164680186180974719f551cf935d08Winson Chung        super.onFinishInflate();
544c98d9235d164680186180974719f551cf935d08Winson Chung
554c98d9235d164680186180974719f551cf935d08Winson Chung        // Get the drawable
56a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mOriginalTextColor = getTextColors();
574c98d9235d164680186180974719f551cf935d08Winson Chung
584c98d9235d164680186180974719f551cf935d08Winson Chung        // Get the hover color
594c98d9235d164680186180974719f551cf935d08Winson Chung        Resources r = getResources();
604c98d9235d164680186180974719f551cf935d08Winson Chung        mHoverColor = r.getColor(R.color.delete_target_hover_tint);
614c98d9235d164680186180974719f551cf935d08Winson Chung        mHoverPaint.setColorFilter(new PorterDuffColorFilter(
624c98d9235d164680186180974719f551cf935d08Winson Chung                mHoverColor, PorterDuff.Mode.SRC_ATOP));
63ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        mUninstallDrawable = (TransitionDrawable)
64ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen                r.getDrawable(R.drawable.uninstall_target_selector);
65ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        mRemoveDrawable = (TransitionDrawable) r.getDrawable(R.drawable.remove_target_selector);
66ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen
67ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        mRemoveDrawable.setCrossFadeEnabled(true);
68ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        mUninstallDrawable.setCrossFadeEnabled(true);
69ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen
70ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        // The current drawable is set to either the remove drawable or the uninstall drawable
71ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        // and is initially set to the remove drawable, as set in the layout xml.
72ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        mCurrentDrawable = (TransitionDrawable) getCompoundDrawables()[0];
73201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
74201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        // Remove the text in the Phone UI in landscape
75201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        int orientation = getResources().getConfiguration().orientation;
76201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
77201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung            if (!LauncherApplication.isScreenLarge()) {
78a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung                setText("");
79201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung            }
80201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        }
814c98d9235d164680186180974719f551cf935d08Winson Chung    }
824c98d9235d164680186180974719f551cf935d08Winson Chung
834c98d9235d164680186180974719f551cf935d08Winson Chung    private boolean isAllAppsApplication(DragSource source, Object info) {
844c98d9235d164680186180974719f551cf935d08Winson Chung        return (source instanceof AppsCustomizePagedView) && (info instanceof ApplicationInfo);
854c98d9235d164680186180974719f551cf935d08Winson Chung    }
864c98d9235d164680186180974719f551cf935d08Winson Chung    private boolean isAllAppsWidget(DragSource source, Object info) {
874c98d9235d164680186180974719f551cf935d08Winson Chung        return (source instanceof AppsCustomizePagedView) && (info instanceof PendingAddWidgetInfo);
884c98d9235d164680186180974719f551cf935d08Winson Chung    }
890b4870db57f6e1d96e72d299cfc05dccb1735caaMichael Jurka    private boolean isDragSourceWorkspaceOrFolder(DragObject d) {
900b4870db57f6e1d96e72d299cfc05dccb1735caaMichael Jurka        return (d.dragSource instanceof Workspace) || (d.dragSource instanceof Folder);
914c98d9235d164680186180974719f551cf935d08Winson Chung    }
920b4870db57f6e1d96e72d299cfc05dccb1735caaMichael Jurka    private boolean isWorkspaceOrFolderApplication(DragObject d) {
930b4870db57f6e1d96e72d299cfc05dccb1735caaMichael Jurka        return isDragSourceWorkspaceOrFolder(d) && (d.dragInfo instanceof ShortcutInfo);
940b4870db57f6e1d96e72d299cfc05dccb1735caaMichael Jurka    }
950b4870db57f6e1d96e72d299cfc05dccb1735caaMichael Jurka    private boolean isWorkspaceOrFolderWidget(DragObject d) {
960b4870db57f6e1d96e72d299cfc05dccb1735caaMichael Jurka        return isDragSourceWorkspaceOrFolder(d) && (d.dragInfo instanceof LauncherAppWidgetInfo);
974c98d9235d164680186180974719f551cf935d08Winson Chung    }
984c98d9235d164680186180974719f551cf935d08Winson Chung    private boolean isWorkspaceFolder(DragObject d) {
994c98d9235d164680186180974719f551cf935d08Winson Chung        return (d.dragSource instanceof Workspace) && (d.dragInfo instanceof FolderInfo);
1004c98d9235d164680186180974719f551cf935d08Winson Chung    }
1014c98d9235d164680186180974719f551cf935d08Winson Chung
1024c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1034c98d9235d164680186180974719f551cf935d08Winson Chung    public boolean acceptDrop(DragObject d) {
1044c98d9235d164680186180974719f551cf935d08Winson Chung        // We can remove everything including App shortcuts, folders, widgets, etc.
1054c98d9235d164680186180974719f551cf935d08Winson Chung        return true;
1064c98d9235d164680186180974719f551cf935d08Winson Chung    }
1074c98d9235d164680186180974719f551cf935d08Winson Chung
1084c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1094c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragStart(DragSource source, Object info, int dragAction) {
1104c98d9235d164680186180974719f551cf935d08Winson Chung        boolean isVisible = true;
1114c98d9235d164680186180974719f551cf935d08Winson Chung        boolean isUninstall = false;
1124c98d9235d164680186180974719f551cf935d08Winson Chung
113f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        // If we are dragging a widget from AppsCustomize, hide the delete target
1144c98d9235d164680186180974719f551cf935d08Winson Chung        if (isAllAppsWidget(source, info)) {
1154c98d9235d164680186180974719f551cf935d08Winson Chung            isVisible = false;
1164c98d9235d164680186180974719f551cf935d08Winson Chung        }
1174c98d9235d164680186180974719f551cf935d08Winson Chung
1184c98d9235d164680186180974719f551cf935d08Winson Chung        // If we are dragging an application from AppsCustomize, only show the control if we can
1194c98d9235d164680186180974719f551cf935d08Winson Chung        // delete the app (it was downloaded), and rename the string to "uninstall" in such a case
1204c98d9235d164680186180974719f551cf935d08Winson Chung        if (isAllAppsApplication(source, info)) {
1214c98d9235d164680186180974719f551cf935d08Winson Chung            ApplicationInfo appInfo = (ApplicationInfo) info;
1224c98d9235d164680186180974719f551cf935d08Winson Chung            if ((appInfo.flags & ApplicationInfo.DOWNLOADED_FLAG) != 0) {
1234c98d9235d164680186180974719f551cf935d08Winson Chung                isUninstall = true;
1244c98d9235d164680186180974719f551cf935d08Winson Chung            } else {
1254c98d9235d164680186180974719f551cf935d08Winson Chung                isVisible = false;
1264c98d9235d164680186180974719f551cf935d08Winson Chung            }
1274c98d9235d164680186180974719f551cf935d08Winson Chung        }
1284c98d9235d164680186180974719f551cf935d08Winson Chung
129ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        if (isUninstall) {
130ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen            setCompoundDrawablesWithIntrinsicBounds(mUninstallDrawable, null, null, null);
131ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        } else {
132ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen            setCompoundDrawablesWithIntrinsicBounds(mRemoveDrawable, null, null, null);
133ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        }
134ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        mCurrentDrawable = (TransitionDrawable) getCompoundDrawables()[0];
135ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen
1364c98d9235d164680186180974719f551cf935d08Winson Chung        mActive = isVisible;
137ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        mCurrentDrawable.resetTransition();
138a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        setTextColor(mOriginalTextColor);
139a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        ((ViewGroup) getParent()).setVisibility(isVisible ? View.VISIBLE : View.GONE);
140a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        if (getText().length() > 0) {
141a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung            setText(isUninstall ? R.string.delete_target_uninstall_label
1424c98d9235d164680186180974719f551cf935d08Winson Chung                : R.string.delete_target_label);
1434c98d9235d164680186180974719f551cf935d08Winson Chung        }
1444c98d9235d164680186180974719f551cf935d08Winson Chung    }
1454c98d9235d164680186180974719f551cf935d08Winson Chung
1464c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1474c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragEnd() {
1484c98d9235d164680186180974719f551cf935d08Winson Chung        super.onDragEnd();
1494c98d9235d164680186180974719f551cf935d08Winson Chung        mActive = false;
1504c98d9235d164680186180974719f551cf935d08Winson Chung    }
1514c98d9235d164680186180974719f551cf935d08Winson Chung
1524c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragEnter(DragObject d) {
1534c98d9235d164680186180974719f551cf935d08Winson Chung        super.onDragEnter(d);
1544c98d9235d164680186180974719f551cf935d08Winson Chung
155ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        mCurrentDrawable.startTransition(mTransitionDuration);
156a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        setTextColor(mHoverColor);
1574c98d9235d164680186180974719f551cf935d08Winson Chung    }
1584c98d9235d164680186180974719f551cf935d08Winson Chung
1594c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragExit(DragObject d) {
1604c98d9235d164680186180974719f551cf935d08Winson Chung        super.onDragExit(d);
1614c98d9235d164680186180974719f551cf935d08Winson Chung
162aaa530adc9defb8c2b1599cae27bb268d58b2ddbWinson Chung        if (!d.dragComplete) {
163ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen            mCurrentDrawable.resetTransition();
164a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung            setTextColor(mOriginalTextColor);
165aaa530adc9defb8c2b1599cae27bb268d58b2ddbWinson Chung        }
1664c98d9235d164680186180974719f551cf935d08Winson Chung    }
1674c98d9235d164680186180974719f551cf935d08Winson Chung
168ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    Rect getDeleteRect(int deleteItemWidth, int deleteItemHeight) {
169d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        DragLayer dragLayer = mLauncher.getDragLayer();
170ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen
171d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        Rect to = new Rect();
172a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        dragLayer.getViewRectRelativeToSelf(this, to);
173ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        int width = mCurrentDrawable.getIntrinsicWidth();
174ebea84d1c95f4c38ba8cee46cd586fd757b4fce2Adam Cohen        int height = mCurrentDrawable.getIntrinsicHeight();
175a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        to.set(to.left + getPaddingLeft(), to.top + getPaddingTop(),
176a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung                to.left + getPaddingLeft() + width, to.bottom);
177d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
178d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        // Center the destination rect about the trash icon
179ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        int xOffset = (int) -(deleteItemWidth - width) / 2;
180ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        int yOffset = (int) -(deleteItemHeight - height) / 2;
181d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        to.offset(xOffset, yOffset);
182d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
183ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        return to;
184ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    }
185ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen
186ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen    private void animateToTrashAndCompleteDrop(final DragObject d) {
187ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        DragLayer dragLayer = mLauncher.getDragLayer();
188ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        Rect from = new Rect();
189ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        dragLayer.getViewRectRelativeToSelf(d.dragView, from);
190ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        Rect to = getDeleteRect(d.dragView.getMeasuredWidth(), d.dragView.getMeasuredHeight());
191ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen
192d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mSearchDropTargetBar.deferOnDragEnd();
193d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        Runnable onAnimationEndRunnable = new Runnable() {
194d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            @Override
195d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            public void run() {
196d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen                mSearchDropTargetBar.onDragEnd();
197d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen                mLauncher.exitSpringLoadedDragMode();
198d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen                completeDrop(d);
199d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            }
200d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        };
201ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen        dragLayer.animateView(d.dragView, from, to, 0.1f, 1, 1, 0.1f, 0.1f,
202d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen                DELETE_ANIMATION_DURATION, new DecelerateInterpolator(2),
203ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen                new DecelerateInterpolator(1.5f), onAnimationEndRunnable,
204ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen                DragLayer.ANIMATION_END_DISAPPEAR, null);
205d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    }
206d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
207d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    private void completeDrop(DragObject d) {
2084c98d9235d164680186180974719f551cf935d08Winson Chung        ItemInfo item = (ItemInfo) d.dragInfo;
2094c98d9235d164680186180974719f551cf935d08Winson Chung
2104c98d9235d164680186180974719f551cf935d08Winson Chung        if (isAllAppsApplication(d.dragSource, item)) {
2114c98d9235d164680186180974719f551cf935d08Winson Chung            // Uninstall the application if it is being dragged from AppsCustomize
2124c98d9235d164680186180974719f551cf935d08Winson Chung            mLauncher.startApplicationUninstallActivity((ApplicationInfo) item);
2130b4870db57f6e1d96e72d299cfc05dccb1735caaMichael Jurka        } else if (isWorkspaceOrFolderApplication(d)) {
2144c98d9235d164680186180974719f551cf935d08Winson Chung            LauncherModel.deleteItemFromDatabase(mLauncher, item);
2154c98d9235d164680186180974719f551cf935d08Winson Chung        } else if (isWorkspaceFolder(d)) {
2164c98d9235d164680186180974719f551cf935d08Winson Chung            // Remove the folder from the workspace and delete the contents from launcher model
2174c98d9235d164680186180974719f551cf935d08Winson Chung            FolderInfo folderInfo = (FolderInfo) item;
2184c98d9235d164680186180974719f551cf935d08Winson Chung            mLauncher.removeFolder(folderInfo);
2194c98d9235d164680186180974719f551cf935d08Winson Chung            LauncherModel.deleteFolderContentsFromDatabase(mLauncher, folderInfo);
2200b4870db57f6e1d96e72d299cfc05dccb1735caaMichael Jurka        } else if (isWorkspaceOrFolderWidget(d)) {
2214c98d9235d164680186180974719f551cf935d08Winson Chung            // Remove the widget from the workspace
2224c98d9235d164680186180974719f551cf935d08Winson Chung            mLauncher.removeAppWidget((LauncherAppWidgetInfo) item);
2234c98d9235d164680186180974719f551cf935d08Winson Chung            LauncherModel.deleteItemFromDatabase(mLauncher, item);
2244c98d9235d164680186180974719f551cf935d08Winson Chung
2254c98d9235d164680186180974719f551cf935d08Winson Chung            final LauncherAppWidgetInfo launcherAppWidgetInfo = (LauncherAppWidgetInfo) item;
2264c98d9235d164680186180974719f551cf935d08Winson Chung            final LauncherAppWidgetHost appWidgetHost = mLauncher.getAppWidgetHost();
2274c98d9235d164680186180974719f551cf935d08Winson Chung            if (appWidgetHost != null) {
2284c98d9235d164680186180974719f551cf935d08Winson Chung                // Deleting an app widget ID is a void call but writes to disk before returning
2294c98d9235d164680186180974719f551cf935d08Winson Chung                // to the caller...
2304c98d9235d164680186180974719f551cf935d08Winson Chung                new Thread("deleteAppWidgetId") {
2314c98d9235d164680186180974719f551cf935d08Winson Chung                    public void run() {
2324c98d9235d164680186180974719f551cf935d08Winson Chung                        appWidgetHost.deleteAppWidgetId(launcherAppWidgetInfo.appWidgetId);
2334c98d9235d164680186180974719f551cf935d08Winson Chung                    }
2344c98d9235d164680186180974719f551cf935d08Winson Chung                }.start();
2354c98d9235d164680186180974719f551cf935d08Winson Chung            }
2364c98d9235d164680186180974719f551cf935d08Winson Chung        }
2374c98d9235d164680186180974719f551cf935d08Winson Chung    }
238d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
239d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    public void onDrop(DragObject d) {
240d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        animateToTrashAndCompleteDrop(d);
241d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    }
2424c98d9235d164680186180974719f551cf935d08Winson Chung}
243