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