DeleteDropTarget.java revision f0ea4d3378be7b962c8e0bce2392df5e82491fb8
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; 204c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.res.Resources; 214c98d9235d164680186180974719f551cf935d08Winson Chungimport android.graphics.PorterDuff; 224c98d9235d164680186180974719f551cf935d08Winson Chungimport android.graphics.PorterDuffColorFilter; 234c98d9235d164680186180974719f551cf935d08Winson Chungimport android.graphics.drawable.TransitionDrawable; 244c98d9235d164680186180974719f551cf935d08Winson Chungimport android.util.AttributeSet; 254c98d9235d164680186180974719f551cf935d08Winson Chungimport android.view.View; 264c98d9235d164680186180974719f551cf935d08Winson Chungimport android.view.ViewGroup; 274c98d9235d164680186180974719f551cf935d08Winson Chung 284c98d9235d164680186180974719f551cf935d08Winson Chungimport com.android.launcher.R; 294c98d9235d164680186180974719f551cf935d08Winson Chung 304c98d9235d164680186180974719f551cf935d08Winson Chungpublic class DeleteDropTarget extends IconDropTarget { 314c98d9235d164680186180974719f551cf935d08Winson Chung 324c98d9235d164680186180974719f551cf935d08Winson Chung private static final int sTransitionDuration = 0; 334c98d9235d164680186180974719f551cf935d08Winson Chung 344c98d9235d164680186180974719f551cf935d08Winson Chung private TransitionDrawable mIcon; 354c98d9235d164680186180974719f551cf935d08Winson Chung private int mDefaultTextColor; 364c98d9235d164680186180974719f551cf935d08Winson Chung private int mHoverColor = 0xFFFF0000; 374c98d9235d164680186180974719f551cf935d08Winson Chung 384c98d9235d164680186180974719f551cf935d08Winson Chung public DeleteDropTarget(Context context, AttributeSet attrs) { 394c98d9235d164680186180974719f551cf935d08Winson Chung this(context, attrs, 0); 404c98d9235d164680186180974719f551cf935d08Winson Chung } 414c98d9235d164680186180974719f551cf935d08Winson Chung 424c98d9235d164680186180974719f551cf935d08Winson Chung public DeleteDropTarget(Context context, AttributeSet attrs, int defStyle) { 434c98d9235d164680186180974719f551cf935d08Winson Chung super(context, attrs, defStyle); 444c98d9235d164680186180974719f551cf935d08Winson Chung } 454c98d9235d164680186180974719f551cf935d08Winson Chung 464c98d9235d164680186180974719f551cf935d08Winson Chung @Override 474c98d9235d164680186180974719f551cf935d08Winson Chung protected void onFinishInflate() { 484c98d9235d164680186180974719f551cf935d08Winson Chung super.onFinishInflate(); 494c98d9235d164680186180974719f551cf935d08Winson Chung 504c98d9235d164680186180974719f551cf935d08Winson Chung // Get the drawable 514c98d9235d164680186180974719f551cf935d08Winson Chung mIcon = (TransitionDrawable) getCompoundDrawables()[0]; 524c98d9235d164680186180974719f551cf935d08Winson Chung 534c98d9235d164680186180974719f551cf935d08Winson Chung // Get the hover color 544c98d9235d164680186180974719f551cf935d08Winson Chung Resources r = getResources(); 554c98d9235d164680186180974719f551cf935d08Winson Chung mDefaultTextColor = getTextColors().getDefaultColor(); 564c98d9235d164680186180974719f551cf935d08Winson Chung mHoverColor = r.getColor(R.color.delete_target_hover_tint); 574c98d9235d164680186180974719f551cf935d08Winson Chung mHoverPaint.setColorFilter(new PorterDuffColorFilter( 584c98d9235d164680186180974719f551cf935d08Winson Chung mHoverColor, PorterDuff.Mode.SRC_ATOP)); 594c98d9235d164680186180974719f551cf935d08Winson Chung } 604c98d9235d164680186180974719f551cf935d08Winson Chung 614c98d9235d164680186180974719f551cf935d08Winson Chung private boolean isAllAppsApplication(DragSource source, Object info) { 624c98d9235d164680186180974719f551cf935d08Winson Chung return (source instanceof AppsCustomizePagedView) && (info instanceof ApplicationInfo); 634c98d9235d164680186180974719f551cf935d08Winson Chung } 644c98d9235d164680186180974719f551cf935d08Winson Chung private boolean isAllAppsWidget(DragSource source, Object info) { 654c98d9235d164680186180974719f551cf935d08Winson Chung return (source instanceof AppsCustomizePagedView) && (info instanceof PendingAddWidgetInfo); 664c98d9235d164680186180974719f551cf935d08Winson Chung } 674c98d9235d164680186180974719f551cf935d08Winson Chung private boolean isWorkspaceApplication(DragObject d) { 684c98d9235d164680186180974719f551cf935d08Winson Chung return (d.dragSource instanceof Workspace) && (d.dragInfo instanceof ShortcutInfo); 694c98d9235d164680186180974719f551cf935d08Winson Chung } 704c98d9235d164680186180974719f551cf935d08Winson Chung private boolean isWorkspaceWidget(DragObject d) { 714c98d9235d164680186180974719f551cf935d08Winson Chung return (d.dragSource instanceof Workspace) && (d.dragInfo instanceof LauncherAppWidgetInfo); 724c98d9235d164680186180974719f551cf935d08Winson Chung } 734c98d9235d164680186180974719f551cf935d08Winson Chung private boolean isWorkspaceFolder(DragObject d) { 744c98d9235d164680186180974719f551cf935d08Winson Chung return (d.dragSource instanceof Workspace) && (d.dragInfo instanceof FolderInfo); 754c98d9235d164680186180974719f551cf935d08Winson Chung } 764c98d9235d164680186180974719f551cf935d08Winson Chung 774c98d9235d164680186180974719f551cf935d08Winson Chung @Override 784c98d9235d164680186180974719f551cf935d08Winson Chung public boolean acceptDrop(DragObject d) { 794c98d9235d164680186180974719f551cf935d08Winson Chung // We can remove everything including App shortcuts, folders, widgets, etc. 804c98d9235d164680186180974719f551cf935d08Winson Chung return true; 814c98d9235d164680186180974719f551cf935d08Winson Chung } 824c98d9235d164680186180974719f551cf935d08Winson Chung 834c98d9235d164680186180974719f551cf935d08Winson Chung @Override 844c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragStart(DragSource source, Object info, int dragAction) { 854c98d9235d164680186180974719f551cf935d08Winson Chung ItemInfo item = (ItemInfo) info; 864c98d9235d164680186180974719f551cf935d08Winson Chung boolean isVisible = true; 874c98d9235d164680186180974719f551cf935d08Winson Chung boolean isUninstall = false; 884c98d9235d164680186180974719f551cf935d08Winson Chung 89f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung // If we are dragging a widget from AppsCustomize, hide the delete target 904c98d9235d164680186180974719f551cf935d08Winson Chung if (isAllAppsWidget(source, info)) { 914c98d9235d164680186180974719f551cf935d08Winson Chung isVisible = false; 924c98d9235d164680186180974719f551cf935d08Winson Chung } 934c98d9235d164680186180974719f551cf935d08Winson Chung 944c98d9235d164680186180974719f551cf935d08Winson Chung // If we are dragging an application from AppsCustomize, only show the control if we can 954c98d9235d164680186180974719f551cf935d08Winson Chung // delete the app (it was downloaded), and rename the string to "uninstall" in such a case 964c98d9235d164680186180974719f551cf935d08Winson Chung if (isAllAppsApplication(source, info)) { 974c98d9235d164680186180974719f551cf935d08Winson Chung ApplicationInfo appInfo = (ApplicationInfo) info; 984c98d9235d164680186180974719f551cf935d08Winson Chung if ((appInfo.flags & ApplicationInfo.DOWNLOADED_FLAG) != 0) { 994c98d9235d164680186180974719f551cf935d08Winson Chung isUninstall = true; 1004c98d9235d164680186180974719f551cf935d08Winson Chung } else { 1014c98d9235d164680186180974719f551cf935d08Winson Chung isVisible = false; 1024c98d9235d164680186180974719f551cf935d08Winson Chung } 1034c98d9235d164680186180974719f551cf935d08Winson Chung } 1044c98d9235d164680186180974719f551cf935d08Winson Chung 1054c98d9235d164680186180974719f551cf935d08Winson Chung mActive = isVisible; 1064c98d9235d164680186180974719f551cf935d08Winson Chung ((ViewGroup) getParent()).setVisibility(isVisible ? View.VISIBLE : View.GONE); 1074c98d9235d164680186180974719f551cf935d08Winson Chung if (getText().length() > 0) { 1084c98d9235d164680186180974719f551cf935d08Winson Chung setText(isUninstall ? R.string.delete_target_uninstall_label 1094c98d9235d164680186180974719f551cf935d08Winson Chung : R.string.delete_target_label); 1104c98d9235d164680186180974719f551cf935d08Winson Chung } 1114c98d9235d164680186180974719f551cf935d08Winson Chung } 1124c98d9235d164680186180974719f551cf935d08Winson Chung 1134c98d9235d164680186180974719f551cf935d08Winson Chung @Override 1144c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragEnd() { 1154c98d9235d164680186180974719f551cf935d08Winson Chung super.onDragEnd(); 1164c98d9235d164680186180974719f551cf935d08Winson Chung mActive = false; 1174c98d9235d164680186180974719f551cf935d08Winson Chung } 1184c98d9235d164680186180974719f551cf935d08Winson Chung 1194c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragEnter(DragObject d) { 1204c98d9235d164680186180974719f551cf935d08Winson Chung super.onDragEnter(d); 1214c98d9235d164680186180974719f551cf935d08Winson Chung 1224c98d9235d164680186180974719f551cf935d08Winson Chung mIcon.startTransition(sTransitionDuration); 1234c98d9235d164680186180974719f551cf935d08Winson Chung setTextColor(mHoverColor); 1244c98d9235d164680186180974719f551cf935d08Winson Chung } 1254c98d9235d164680186180974719f551cf935d08Winson Chung 1264c98d9235d164680186180974719f551cf935d08Winson Chung public void onDragExit(DragObject d) { 1274c98d9235d164680186180974719f551cf935d08Winson Chung super.onDragExit(d); 1284c98d9235d164680186180974719f551cf935d08Winson Chung 129b26f3d6a8c62e7c1a603b6c7979375d8dd4f20d4Winson Chung mIcon.resetTransition(); 1304c98d9235d164680186180974719f551cf935d08Winson Chung setTextColor(mDefaultTextColor); 1314c98d9235d164680186180974719f551cf935d08Winson Chung } 1324c98d9235d164680186180974719f551cf935d08Winson Chung 1334c98d9235d164680186180974719f551cf935d08Winson Chung public void onDrop(DragObject d) { 1344c98d9235d164680186180974719f551cf935d08Winson Chung ItemInfo item = (ItemInfo) d.dragInfo; 1354c98d9235d164680186180974719f551cf935d08Winson Chung 1364c98d9235d164680186180974719f551cf935d08Winson Chung if (isAllAppsApplication(d.dragSource, item)) { 1374c98d9235d164680186180974719f551cf935d08Winson Chung // Uninstall the application if it is being dragged from AppsCustomize 1384c98d9235d164680186180974719f551cf935d08Winson Chung mLauncher.startApplicationUninstallActivity((ApplicationInfo) item); 1394c98d9235d164680186180974719f551cf935d08Winson Chung } else if (isWorkspaceApplication(d)) { 1404c98d9235d164680186180974719f551cf935d08Winson Chung LauncherModel.deleteItemFromDatabase(mLauncher, item); 1414c98d9235d164680186180974719f551cf935d08Winson Chung } else if (isWorkspaceFolder(d)) { 1424c98d9235d164680186180974719f551cf935d08Winson Chung // Remove the folder from the workspace and delete the contents from launcher model 1434c98d9235d164680186180974719f551cf935d08Winson Chung FolderInfo folderInfo = (FolderInfo) item; 1444c98d9235d164680186180974719f551cf935d08Winson Chung mLauncher.removeFolder(folderInfo); 1454c98d9235d164680186180974719f551cf935d08Winson Chung LauncherModel.deleteFolderContentsFromDatabase(mLauncher, folderInfo); 1464c98d9235d164680186180974719f551cf935d08Winson Chung } else if (isWorkspaceWidget(d)) { 1474c98d9235d164680186180974719f551cf935d08Winson Chung // Remove the widget from the workspace 1484c98d9235d164680186180974719f551cf935d08Winson Chung mLauncher.removeAppWidget((LauncherAppWidgetInfo) item); 1494c98d9235d164680186180974719f551cf935d08Winson Chung LauncherModel.deleteItemFromDatabase(mLauncher, item); 1504c98d9235d164680186180974719f551cf935d08Winson Chung 1514c98d9235d164680186180974719f551cf935d08Winson Chung final LauncherAppWidgetInfo launcherAppWidgetInfo = (LauncherAppWidgetInfo) item; 1524c98d9235d164680186180974719f551cf935d08Winson Chung final LauncherAppWidgetHost appWidgetHost = mLauncher.getAppWidgetHost(); 1534c98d9235d164680186180974719f551cf935d08Winson Chung if (appWidgetHost != null) { 1544c98d9235d164680186180974719f551cf935d08Winson Chung // Deleting an app widget ID is a void call but writes to disk before returning 1554c98d9235d164680186180974719f551cf935d08Winson Chung // to the caller... 1564c98d9235d164680186180974719f551cf935d08Winson Chung new Thread("deleteAppWidgetId") { 1574c98d9235d164680186180974719f551cf935d08Winson Chung public void run() { 1584c98d9235d164680186180974719f551cf935d08Winson Chung appWidgetHost.deleteAppWidgetId(launcherAppWidgetInfo.appWidgetId); 1594c98d9235d164680186180974719f551cf935d08Winson Chung } 1604c98d9235d164680186180974719f551cf935d08Winson Chung }.start(); 1614c98d9235d164680186180974719f551cf935d08Winson Chung } 1624c98d9235d164680186180974719f551cf935d08Winson Chung } 1634c98d9235d164680186180974719f551cf935d08Winson Chung } 1644c98d9235d164680186180974719f551cf935d08Winson Chung} 165