/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher2; import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.android.launcher.R; public class DeleteDropTarget extends ButtonDropTarget { private TextView mText; private int mHoverColor = 0xFFFF0000; public DeleteDropTarget(Context context, AttributeSet attrs) { this(context, attrs, 0); } public DeleteDropTarget(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onFinishInflate() { super.onFinishInflate(); // Get the drawable mText = (TextView) findViewById(R.id.delete_target_text); // Get the hover color Resources r = getResources(); mHoverColor = r.getColor(R.color.delete_target_hover_tint); mHoverPaint.setColorFilter(new PorterDuffColorFilter( mHoverColor, PorterDuff.Mode.SRC_ATOP)); setBackgroundColor(mHoverColor); getBackground().setAlpha(0); } private boolean isAllAppsApplication(DragSource source, Object info) { return (source instanceof AppsCustomizePagedView) && (info instanceof ApplicationInfo); } private boolean isAllAppsWidget(DragSource source, Object info) { return (source instanceof AppsCustomizePagedView) && (info instanceof PendingAddWidgetInfo); } private boolean isWorkspaceApplication(DragObject d) { return (d.dragSource instanceof Workspace) && (d.dragInfo instanceof ShortcutInfo); } private boolean isWorkspaceWidget(DragObject d) { return (d.dragSource instanceof Workspace) && (d.dragInfo instanceof LauncherAppWidgetInfo); } private boolean isWorkspaceFolder(DragObject d) { return (d.dragSource instanceof Workspace) && (d.dragInfo instanceof FolderInfo); } @Override public boolean acceptDrop(DragObject d) { // We can remove everything including App shortcuts, folders, widgets, etc. return true; } @Override public void onDragStart(DragSource source, Object info, int dragAction) { boolean isVisible = true; boolean isUninstall = false; // If we are dragging a widget from AppsCustomize, hide the delete target if (isAllAppsWidget(source, info)) { isVisible = false; } // If we are dragging an application from AppsCustomize, only show the control if we can // delete the app (it was downloaded), and rename the string to "uninstall" in such a case if (isAllAppsApplication(source, info)) { ApplicationInfo appInfo = (ApplicationInfo) info; if ((appInfo.flags & ApplicationInfo.DOWNLOADED_FLAG) != 0) { isUninstall = true; } else { isVisible = false; } } mActive = isVisible; setVisibility(isVisible ? View.VISIBLE : View.GONE); if (mText.getText().length() > 0) { mText.setText(isUninstall ? R.string.delete_target_uninstall_label : R.string.delete_target_label); } } @Override public void onDragEnd() { super.onDragEnd(); mActive = false; } public void onDragEnter(DragObject d) { super.onDragEnter(d); ObjectAnimator anim = ObjectAnimator.ofInt(getBackground(), "alpha", Color.alpha(mHoverColor)); anim.setDuration(mTransitionDuration); anim.start(); } public void onDragExit(DragObject d) { super.onDragExit(d); ObjectAnimator anim = ObjectAnimator.ofInt(getBackground(), "alpha", 0); anim.setDuration(mTransitionDuration); anim.start(); } public void onDrop(DragObject d) { ItemInfo item = (ItemInfo) d.dragInfo; if (isAllAppsApplication(d.dragSource, item)) { // Uninstall the application if it is being dragged from AppsCustomize mLauncher.startApplicationUninstallActivity((ApplicationInfo) item); } else if (isWorkspaceApplication(d)) { LauncherModel.deleteItemFromDatabase(mLauncher, item); } else if (isWorkspaceFolder(d)) { // Remove the folder from the workspace and delete the contents from launcher model FolderInfo folderInfo = (FolderInfo) item; mLauncher.removeFolder(folderInfo); LauncherModel.deleteFolderContentsFromDatabase(mLauncher, folderInfo); } else if (isWorkspaceWidget(d)) { // Remove the widget from the workspace mLauncher.removeAppWidget((LauncherAppWidgetInfo) item); LauncherModel.deleteItemFromDatabase(mLauncher, item); final LauncherAppWidgetInfo launcherAppWidgetInfo = (LauncherAppWidgetInfo) item; final LauncherAppWidgetHost appWidgetHost = mLauncher.getAppWidgetHost(); if (appWidgetHost != null) { // Deleting an app widget ID is a void call but writes to disk before returning // to the caller... new Thread("deleteAppWidgetId") { public void run() { appWidgetHost.deleteAppWidgetId(launcherAppWidgetInfo.appWidgetId); } }.start(); } } } }