From 4c98d9235d164680186180974719f551cf935d08 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 31 May 2011 16:50:48 -0700 Subject: Adding drag target bar. Change-Id: Ia00ed30264ea5f1d3c919111d15588ef441bfe20 --- src/com/android/launcher2/DeleteDropTarget.java | 164 ++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 src/com/android/launcher2/DeleteDropTarget.java (limited to 'src/com/android/launcher2/DeleteDropTarget.java') diff --git a/src/com/android/launcher2/DeleteDropTarget.java b/src/com/android/launcher2/DeleteDropTarget.java new file mode 100644 index 000000000..5c67793ac --- /dev/null +++ b/src/com/android/launcher2/DeleteDropTarget.java @@ -0,0 +1,164 @@ +/* + * 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.content.Context; +import android.content.res.Resources; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.TransitionDrawable; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; + +import com.android.launcher.R; + +public class DeleteDropTarget extends IconDropTarget { + + private static final int sTransitionDuration = 0; + + private TransitionDrawable mIcon; + private int mDefaultTextColor; + 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 + mIcon = (TransitionDrawable) getCompoundDrawables()[0]; + + // Get the hover color + Resources r = getResources(); + mDefaultTextColor = getTextColors().getDefaultColor(); + mHoverColor = r.getColor(R.color.delete_target_hover_tint); + mHoverPaint.setColorFilter(new PorterDuffColorFilter( + mHoverColor, PorterDuff.Mode.SRC_ATOP)); + } + + 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) { + ItemInfo item = (ItemInfo) info; + 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; + ((ViewGroup) getParent()).setVisibility(isVisible ? View.VISIBLE : View.GONE); + if (getText().length() > 0) { + 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); + + mIcon.startTransition(sTransitionDuration); + setTextColor(mHoverColor); + } + + public void onDragExit(DragObject d) { + super.onDragExit(d); + + mIcon.reverseTransition(sTransitionDuration); + setTextColor(mDefaultTextColor); + } + + 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(); + } + } + } +} -- cgit v1.2.3