FolderIcon.java revision a9cf38f533d1e86269868f1e6a806ccffd4a78fc
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/* 231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License. 631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at 731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * 1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and 1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License. 1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.launcher2; 1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context; 2031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.res.Resources; 21a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohenimport android.graphics.Canvas; 2231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.graphics.drawable.Drawable; 2331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.AttributeSet; 2431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.LayoutInflater; 2531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.ViewGroup; 26a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohenimport android.widget.FrameLayout; 27a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohenimport android.widget.TextView; 2831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 29edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guyimport com.android.launcher.R; 30a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohenimport com.android.launcher2.FolderInfo.FolderListener; 31edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy 3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/** 3331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * An icon that can appear on in the workspace representing an {@link UserFolder}. 3431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 35a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohenpublic class FolderIcon extends FrameLayout implements DropTarget, FolderListener { 3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private Launcher mLauncher; 37a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen Folder mFolder; 38a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen FolderInfo mInfo; 39a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 40a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen private static final int NUM_ITEMS_IN_PREVIEW = 4; 41a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen private static final float ICON_ANGLE = 15f; 4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public FolderIcon(Context context, AttributeSet attrs) { 4431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super(context, attrs); 4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public FolderIcon(Context context) { 4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super(context); 4931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 5031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 510280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka public boolean isDropEnabled() { 527a1d16555d80135e61b90158ff3c1e3f963bd8b8Winson Chung final ViewGroup cellLayoutChildren = (ViewGroup) getParent(); 537a1d16555d80135e61b90158ff3c1e3f963bd8b8Winson Chung final ViewGroup cellLayout = (ViewGroup) cellLayoutChildren.getParent(); 547a1d16555d80135e61b90158ff3c1e3f963bd8b8Winson Chung final Workspace workspace = (Workspace) cellLayout.getParent(); 557a1d16555d80135e61b90158ff3c1e3f963bd8b8Winson Chung return !workspace.isSmall(); 560280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka } 570280c3be4d9f8fc6fdf015b7ecd276eb26f76f2dMichael Jurka 5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project static FolderIcon fromXml(int resId, Launcher launcher, ViewGroup group, 59df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen FolderInfo folderInfo, IconCache iconCache) { 6031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project FolderIcon icon = (FolderIcon) LayoutInflater.from(launcher).inflate(resId, group, false); 6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 6331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final Resources resources = launcher.getResources(); 64a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen Drawable d = iconCache.getFullResIcon(resources, R.drawable.folder_bg); 65a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen icon.setBackgroundDrawable(d); 6631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project icon.setTag(folderInfo); 6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project icon.setOnClickListener(launcher); 6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project icon.mInfo = folderInfo; 6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project icon.mLauncher = launcher; 70a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 71a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen Folder folder = Folder.fromXml(launcher); 72a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen folder.setDragController(launcher.getDragController()); 73a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen folder.setLauncher(launcher); 74a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen folder.bind(folderInfo); 75a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen icon.mFolder = folder; 76a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 77a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen folderInfo.addListener(icon); 78a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 7931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return icon; 8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 8131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 8231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, 8300acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato DragView dragView, Object dragInfo) { 8431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final ItemInfo item = (ItemInfo) dragInfo; 8531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project final int itemType = item.itemType; 8631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || 8731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) 8831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project && item.container != mInfo.id; 8931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 9031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 91df0353815c629fc678824b07a234b89a1ff94208Adam Cohen public void addItem(ShortcutInfo item) { 92df0353815c629fc678824b07a234b89a1ff94208Adam Cohen mInfo.add(item); 93a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, item.cellX, item.cellY); 94df0353815c629fc678824b07a234b89a1ff94208Adam Cohen } 95df0353815c629fc678824b07a234b89a1ff94208Adam Cohen 9600acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, 9700acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato DragView dragView, Object dragInfo) { 980589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato ShortcutInfo item; 990589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato if (dragInfo instanceof ApplicationInfo) { 1000589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato // Came from all apps -- make a copy 1010589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato item = ((ApplicationInfo)dragInfo).makeShortcut(); 1020589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } else { 1030589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato item = (ShortcutInfo)dragInfo; 1040589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 10566d72178af91d455700875635473be942bc90e54Michael Jurka item.cellX = -1; 10666d72178af91d455700875635473be942bc90e54Michael Jurka item.cellY = -1; 107df0353815c629fc678824b07a234b89a1ff94208Adam Cohen addItem(item); 10831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 10931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 11031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, 11100acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato DragView dragView, Object dragInfo) { 11231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 11331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 11431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, 11500acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato DragView dragView, Object dragInfo) { 11631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 11731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, 11900acb123c5100f06b8e89e8ec8978ebafc6f6d26Joe Onorato DragView dragView, Object dragInfo) { 12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 121440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy 122440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy @Override 123440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy public DropTarget getDropTargetDelegate(DragSource source, int x, int y, int xOffset, int yOffset, 124440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy DragView dragView, Object dragInfo) { 125440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy return null; 126440c360bc395c43683fa9ca226e59f9e35f9e926Patrick Dubroy } 127a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 128a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen @Override 129a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen protected void onDraw(Canvas canvas) { 130a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen if (mFolder == null) return; 131a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen if (mFolder.getItemCount() == 0) return; 132a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 133a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen canvas.save(); 134a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen TextView v = (TextView) mFolder.getItemAt(0); 135a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen Drawable d = v.getCompoundDrawables()[1]; 136a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 137a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen canvas.translate( (getMeasuredWidth() - d.getIntrinsicWidth()) / 2, 138a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen (getMeasuredHeight() - d.getIntrinsicHeight()) / 2); 139a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 140a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2); 141a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen canvas.rotate(ICON_ANGLE); 142a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 143a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2); 144a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 145a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen for (int i = Math.max(0, mFolder.getItemCount() - NUM_ITEMS_IN_PREVIEW); 146a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen i < mFolder.getItemCount(); i++) { 147a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen v = (TextView) mFolder.getItemAt(i); 148a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen d = v.getCompoundDrawables()[1]; 149a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 150a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen if (d != null) { 151a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 152a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen d.draw(canvas); 153a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 154a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 155a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2); 156a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen canvas.rotate(-ICON_ANGLE); 157a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2); 158a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 159a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 160a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen canvas.restore(); 161a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 162a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 163a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen public void onAdd(ShortcutInfo item) { 164a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen invalidate(); 165a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen requestLayout(); 166a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 167a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen 168a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen public void onRemove(ShortcutInfo item) { 169a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen invalidate(); 170a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen requestLayout(); 171a9cf38f533d1e86269868f1e6a806ccffd4a78fcAdam Cohen } 17231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project} 173