package com.android.launcher2; import java.util.ArrayList; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import com.android.launcher.R; /** * Folder which contains applications or shortcuts chosen by the user. * */ public class UserFolder extends Folder implements DropTarget { private static final String TAG = "Launcher.UserFolder"; protected CellLayout mContent; private final LayoutInflater mInflater; private final IconCache mIconCache; public UserFolder(Context context, AttributeSet attrs) { super(context, attrs); mInflater = LayoutInflater.from(context); mIconCache = ((LauncherApplication)context.getApplicationContext()).getIconCache(); } @Override protected void onFinishInflate() { super.onFinishInflate(); mContent = (CellLayout) findViewById(R.id.folder_content); } /** * Creates a new UserFolder, inflated from R.layout.user_folder. * * @param context The application's context. * * @return A new UserFolder. */ static UserFolder fromXml(Context context) { return (UserFolder) LayoutInflater.from(context).inflate(R.layout.user_folder, null); } @Override void notifyDataSetChanged() { // recreate all the children if the data set changes under us. We may want to do this more // intelligently (ie just removing the views that should no longer exist) mContent.removeAllViewsInLayout(); bind(mInfo); } public void onClick(View v) { Object tag = v.getTag(); if (tag instanceof ShortcutInfo) { // refactor this code from Folder ShortcutInfo item = (ShortcutInfo) tag; int[] pos = new int[2]; v.getLocationOnScreen(pos); item.intent.setSourceBounds(new Rect(pos[0], pos[1], pos[0] + v.getWidth(), pos[1] + v.getHeight())); mLauncher.startActivitySafely(item.intent, item); } else { super.onClick(v); } } public boolean onLongClick(View v) { Object tag = v.getTag(); if (tag instanceof ShortcutInfo) { // refactor this code from Folder ShortcutInfo item = (ShortcutInfo) tag; if (!v.isInTouchMode()) { return false; } mLauncher.getWorkspace().onDragStartedWithItem(v); mDragController.startDrag(v, this, item, DragController.DRAG_ACTION_COPY); mLauncher.closeFolder(this); mDragItem = item; return true; } else { return super.onLongClick(v); } } public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { final ItemInfo item = (ItemInfo) dragInfo; final int itemType = item.itemType; return (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION || itemType == LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT) && item.container != mInfo.id; } public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { ShortcutInfo item; if (dragInfo instanceof ApplicationInfo) { // Came from all apps -- make a copy item = ((ApplicationInfo)dragInfo).makeShortcut(); item.spanX = 1; item.spanY = 1; } else { item = (ShortcutInfo)dragInfo; } findAndSetEmptyCells(item); ((UserFolderInfo)mInfo).add(item); createAndAddShortcut(item); LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, item.cellX, item.cellY); } protected boolean findAndSetEmptyCells(ShortcutInfo item) { int[] emptyCell = new int[2]; if (mContent.findCellForSpan(emptyCell, item.spanX, item.spanY)) { item.cellX = emptyCell[0]; item.cellY = emptyCell[1]; LauncherModel.addOrMoveItemInDatabase( mLauncher, item, mInfo.id, 0, item.cellX, item.cellY); return true; } else { return false; } } protected void createAndAddShortcut(ShortcutInfo item) { final TextView textView = (TextView) mInflater.inflate(R.layout.application_boxed, this, false); textView.setCompoundDrawablesWithIntrinsicBounds(null, new FastBitmapDrawable(item.getIcon(mIconCache)), null, null); textView.setText(item.title); textView.setTag(item); textView.setOnClickListener(this); textView.setOnLongClickListener(this); CellLayout.LayoutParams lp = new CellLayout.LayoutParams(item.cellX, item.cellY, item.spanX, item.spanY); boolean insert = false; mContent.addViewToCellLayout(textView, insert ? 0 : -1, (int)item.id, lp, true); } public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { } public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { } public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { } @Override public void onDropCompleted(View target, Object dragInfo, boolean success) { if (success) { ((UserFolderInfo)mInfo).remove(mDragItem); } } public boolean isDropEnabled() { return true; } void bind(FolderInfo info) { super.bind(info); ArrayList children = ((UserFolderInfo)info).contents; for (int i = 0; i < children.size(); i++) { ShortcutInfo child = (ShortcutInfo) children.get(i); if ((child.cellX == -1 && child.cellY == -1) || mContent.isOccupied(child.cellX, child.cellY)) { findAndSetEmptyCells(child); } createAndAddShortcut((ShortcutInfo) children.get(i)); } } @Override void onOpen() { super.onOpen(); // When the folder opens, we need to refresh the GridView's selection by // forcing a layout // TODO: find out if this is still necessary mContent.requestLayout(); requestFocus(); } @Override public DropTarget getDropTargetDelegate(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { return null; } }