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