From a9cf38f533d1e86269868f1e6a806ccffd4a78fc Mon Sep 17 00:00:00 2001 From: Adam Cohen Date: Mon, 2 May 2011 15:36:58 -0700 Subject: Adding folder icon visualization -> Added new temp assets Change-Id: If1d7e8ce867b473920f40cd1cc02d189be62b8bf --- src/com/android/launcher2/Folder.java | 29 ++++++++++- src/com/android/launcher2/FolderIcon.java | 82 +++++++++++++++++++++++++------ src/com/android/launcher2/FolderInfo.java | 23 +++++++++ src/com/android/launcher2/Launcher.java | 48 ++++++++++-------- src/com/android/launcher2/Workspace.java | 9 +++- 5 files changed, 152 insertions(+), 39 deletions(-) (limited to 'src/com/android/launcher2') diff --git a/src/com/android/launcher2/Folder.java b/src/com/android/launcher2/Folder.java index 4c8d03a4a..5a4358d2f 100644 --- a/src/com/android/launcher2/Folder.java +++ b/src/com/android/launcher2/Folder.java @@ -39,12 +39,13 @@ import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import com.android.launcher.R; +import com.android.launcher2.FolderInfo.FolderListener; /** * Represents a set of icons chosen by the user or generated by the system. */ public class Folder extends LinearLayout implements DragSource, OnItemLongClickListener, - OnItemClickListener, OnClickListener, View.OnLongClickListener, DropTarget { + OnItemClickListener, OnClickListener, View.OnLongClickListener, DropTarget, FolderListener { protected DragController mDragController; @@ -71,6 +72,7 @@ public class Folder extends LinearLayout implements DragSource, OnItemLongClickL private final LayoutInflater mInflater; private final IconCache mIconCache; private int mState = STATE_NONE; + private int[] mDragItemPosition = new int[2]; /** * Used to inflate the Workspace from XML. @@ -131,7 +133,8 @@ public class Folder extends LinearLayout implements DragSource, OnItemLongClickL mLauncher.getWorkspace().onDragStartedWithItem(v); mDragController.startDrag(v, this, item, DragController.DRAG_ACTION_COPY); - + mDragItemPosition[0] = item.cellX; + mDragItemPosition[1] = item.cellY; mLauncher.closeFolder(this); mDragItem = item; } else { @@ -198,6 +201,7 @@ public class Folder extends LinearLayout implements DragSource, OnItemLongClickL } createAndAddShortcut((ShortcutInfo) children.get(i)); } + mInfo.addListener(this); } /** @@ -409,4 +413,25 @@ public class Folder extends LinearLayout implements DragSource, OnItemLongClickL DragView dragView, Object dragInfo) { return null; } + + public void onAdd(ShortcutInfo item) { + if ((item.cellX == -1 && item.cellY == -1) || + mContent.isOccupied(item.cellX, item.cellY)) { + findAndSetEmptyCells(item); + } + createAndAddShortcut(item); + } + + public int getItemCount() { + return mContent.getChildrenLayout().getChildCount(); + } + + public View getItemAt(int index) { + return mContent.getChildrenLayout().getChildAt(index); + } + + public void onRemove(ShortcutInfo item) { + View v = mContent.getChildAt(mDragItemPosition[0], mDragItemPosition[1]); + mContent.removeView(v); + } } diff --git a/src/com/android/launcher2/FolderIcon.java b/src/com/android/launcher2/FolderIcon.java index cf7e3cdbf..b770cd6d1 100644 --- a/src/com/android/launcher2/FolderIcon.java +++ b/src/com/android/launcher2/FolderIcon.java @@ -18,21 +18,27 @@ package com.android.launcher2; import android.content.Context; import android.content.res.Resources; +import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; import com.android.launcher.R; +import com.android.launcher2.FolderInfo.FolderListener; /** * An icon that can appear on in the workspace representing an {@link UserFolder}. */ -public class FolderIcon extends BubbleTextView implements DropTarget { - private FolderInfo mInfo; +public class FolderIcon extends FrameLayout implements DropTarget, FolderListener { private Launcher mLauncher; - private Drawable mCloseIcon; - private Drawable mOpenIcon; + Folder mFolder; + FolderInfo mInfo; + + private static final int NUM_ITEMS_IN_PREVIEW = 4; + private static final float ICON_ANGLE = 15f; public FolderIcon(Context context, AttributeSet attrs) { super(context, attrs); @@ -55,16 +61,21 @@ public class FolderIcon extends BubbleTextView implements DropTarget { FolderIcon icon = (FolderIcon) LayoutInflater.from(launcher).inflate(resId, group, false); final Resources resources = launcher.getResources(); - Drawable d = iconCache.getFullResIcon(resources, R.drawable.ic_launcher_folder); - icon.mCloseIcon = d; - icon.mOpenIcon = iconCache.getFullResIcon(resources, R.drawable.ic_launcher_folder_open); - icon.setCompoundDrawablesWithIntrinsicBounds(null, d, null, null); - icon.setText(folderInfo.title); + Drawable d = iconCache.getFullResIcon(resources, R.drawable.folder_bg); + icon.setBackgroundDrawable(d); icon.setTag(folderInfo); icon.setOnClickListener(launcher); icon.mInfo = folderInfo; icon.mLauncher = launcher; - + + Folder folder = Folder.fromXml(launcher); + folder.setDragController(launcher.getDragController()); + folder.setLauncher(launcher); + folder.bind(folderInfo); + icon.mFolder = folder; + + folderInfo.addListener(icon); + return icon; } @@ -79,7 +90,7 @@ public class FolderIcon extends BubbleTextView implements DropTarget { public void addItem(ShortcutInfo item) { mInfo.add(item); - LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, 0, 0); + LauncherModel.addOrMoveItemInDatabase(mLauncher, item, mInfo.id, 0, item.cellX, item.cellY); } public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, @@ -98,9 +109,6 @@ public class FolderIcon extends BubbleTextView implements DropTarget { public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { - if (acceptDrop(source, x, y, xOffset, yOffset, dragView, dragInfo)) { - setCompoundDrawablesWithIntrinsicBounds(null, mOpenIcon, null, null); - } } public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, @@ -109,7 +117,6 @@ public class FolderIcon extends BubbleTextView implements DropTarget { public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { - setCompoundDrawablesWithIntrinsicBounds(null, mCloseIcon, null, null); } @Override @@ -117,4 +124,49 @@ public class FolderIcon extends BubbleTextView implements DropTarget { DragView dragView, Object dragInfo) { return null; } + + @Override + protected void onDraw(Canvas canvas) { + if (mFolder == null) return; + if (mFolder.getItemCount() == 0) return; + + canvas.save(); + TextView v = (TextView) mFolder.getItemAt(0); + Drawable d = v.getCompoundDrawables()[1]; + + canvas.translate( (getMeasuredWidth() - d.getIntrinsicWidth()) / 2, + (getMeasuredHeight() - d.getIntrinsicHeight()) / 2); + + canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2); + canvas.rotate(ICON_ANGLE); + + canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2); + + for (int i = Math.max(0, mFolder.getItemCount() - NUM_ITEMS_IN_PREVIEW); + i < mFolder.getItemCount(); i++) { + v = (TextView) mFolder.getItemAt(i); + d = v.getCompoundDrawables()[1]; + + if (d != null) { + d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); + d.draw(canvas); + } + + canvas.translate(d.getIntrinsicWidth() / 2, d.getIntrinsicHeight() / 2); + canvas.rotate(-ICON_ANGLE); + canvas.translate(-d.getIntrinsicWidth() / 2, -d.getIntrinsicHeight() / 2); + } + + canvas.restore(); + } + + public void onAdd(ShortcutInfo item) { + invalidate(); + requestLayout(); + } + + public void onRemove(ShortcutInfo item) { + invalidate(); + requestLayout(); + } } diff --git a/src/com/android/launcher2/FolderInfo.java b/src/com/android/launcher2/FolderInfo.java index a82b6998a..12ed27c29 100644 --- a/src/com/android/launcher2/FolderInfo.java +++ b/src/com/android/launcher2/FolderInfo.java @@ -40,6 +40,8 @@ class FolderInfo extends ItemInfo { */ ArrayList contents = new ArrayList(); + ArrayList listeners = new ArrayList(); + FolderInfo() { itemType = LauncherSettings.Favorites.ITEM_TYPE_FOLDER; } @@ -51,6 +53,9 @@ class FolderInfo extends ItemInfo { */ public void add(ShortcutInfo item) { contents.add(item); + for (int i = 0; i < listeners.size(); i++) { + listeners.get(i).onAdd(item); + } } /** @@ -60,6 +65,9 @@ class FolderInfo extends ItemInfo { */ public void remove(ShortcutInfo item) { contents.remove(item); + for (int i = 0; i < listeners.size(); i++) { + listeners.get(i).onRemove(item); + } } @Override @@ -67,4 +75,19 @@ class FolderInfo extends ItemInfo { super.onAddToDatabase(values); values.put(LauncherSettings.Favorites.TITLE, title.toString()); } + + void addListener(FolderListener listener) { + listeners.add(listener); + } + + void removeListener(FolderListener listener) { + if (listeners.contains(listener)) { + listeners.remove(listener); + } + } + + interface FolderListener { + public void onAdd(ShortcutInfo item); + public void onRemove(ShortcutInfo item); + } } diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 701dc6664..b32237afe 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -1543,6 +1543,10 @@ public final class Launcher extends Activity ValueAnimator.clearAllAnimations(); } + public DragController getDragController() { + return mDragController; + } + @Override public void startActivityForResult(Intent intent, int requestCode) { if (requestCode >= 0) mWaitingForResult = true; @@ -1964,7 +1968,10 @@ public final class Launcher extends Activity mWaitingForResume.setStayPressed(true); } } else if (tag instanceof FolderInfo) { - handleFolderClick((FolderInfo) tag); + if (v instanceof FolderIcon) { + FolderIcon fi = (FolderIcon) v; + handleFolderClick(fi); + } } else if (v == mHandleView) { if (mState == State.ALL_APPS) { showWorkspace(true); @@ -2086,15 +2093,16 @@ public final class Launcher extends Activity } } - private void handleFolderClick(FolderInfo folderInfo) { - if (!folderInfo.opened) { + private void handleFolderClick(FolderIcon folderIcon) { + final FolderInfo info = folderIcon.mInfo; + if (!info.opened) { // Close any open folder closeFolder(); // Open the requested folder - openFolder(folderInfo); + openFolder(folderIcon); } else { // Find the open folder... - Folder openFolder = mWorkspace.getFolderForTag(folderInfo); + Folder openFolder = mWorkspace.getFolderForTag(info); int folderScreen; if (openFolder != null) { folderScreen = mWorkspace.getPageForView(openFolder); @@ -2104,7 +2112,7 @@ public final class Launcher extends Activity // Close any folder open on the current screen closeFolder(); // Pull the folder onto this screen - openFolder(folderInfo); + openFolder(folderIcon); } } } @@ -2117,19 +2125,15 @@ public final class Launcher extends Activity * * @param folderInfo The FolderInfo describing the folder to open. */ - public void openFolder(FolderInfo folderInfo) { - Folder openFolder = Folder.fromXml(this); - - openFolder.setDragController(mDragController); - openFolder.setLauncher(this); + public void openFolder(FolderIcon folderIcon) { + Folder folder = folderIcon.mFolder; + FolderInfo info = folder.mInfo; - openFolder.bind(folderInfo); - folderInfo.opened = true; + info.opened = true; - mWorkspace.addInFullScreen(openFolder, folderInfo.screen); - openFolder.animateOpen(); - - openFolder.onOpen(); + mWorkspace.addInFullScreen(folder, info.screen); + folder.animateOpen(); + folder.onOpen(); } public boolean onLongClick(View v) { @@ -2469,7 +2473,9 @@ public final class Launcher extends Activity final FolderIcon folderIcon = (FolderIcon) mWorkspace.getViewForTag(mFolderInfo); if (folderIcon != null) { - folderIcon.setText(name); + // TODO: At some point we'll probably want some version of setting + // the text for a folder icon. + //folderIcon.setText(name); getWorkspace().requestLayout(); } else { lockAllApps(); @@ -3461,8 +3467,10 @@ public final class Launcher extends Activity if (folders != null) { for (long folderId : folders) { final FolderInfo info = sFolders.get(folderId); - if (info != null) { - openFolder(info); + final FolderIcon folderIcon = (FolderIcon) + mWorkspace.getViewForTag(info); + if (folderIcon != null) { + openFolder(folderIcon); } } final Folder openFolder = mWorkspace.getOpenFolder(); diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java index dc22d847c..31ac11b64 100644 --- a/src/com/android/launcher2/Workspace.java +++ b/src/com/android/launcher2/Workspace.java @@ -2035,7 +2035,8 @@ public class Workspace extends SmoothPagedView v.getDrawingRect(clipRect); // For a TextView, adjust the clip rect so that we don't include the text label - if (v instanceof BubbleTextView) { + if (v instanceof FolderIcon) { + } else if (v instanceof BubbleTextView) { final BubbleTextView tv = (BubbleTextView) v; clipRect.bottom = tv.getExtendedPaddingTop() - (int) BubbleTextView.PADDING_V + tv.getLayout().getLineTop(0); @@ -2172,7 +2173,7 @@ public class Workspace extends SmoothPagedView final int screenY = (int) mTempXY[1] + (child.getHeight() - bmpHeight) / 2; Rect dragRect = null; - if (child instanceof BubbleTextView) { + if ((child instanceof BubbleTextView) && !(child instanceof FolderIcon)) { int iconSize = getResources().getDimensionPixelSize(R.dimen.app_icon_size); int top = child.getPaddingTop(); int left = (bmpWidth - iconSize) / 2; @@ -2363,6 +2364,10 @@ public class Workspace extends SmoothPagedView target.removeView(v); FolderIcon fi = mLauncher.addFolder(screen, mTargetCell[0], mTargetCell[1]); + destInfo.cellX = -1; + destInfo.cellY = -1; + sourceInfo.cellX = -1; + sourceInfo.cellY = -1; fi.addItem(destInfo); fi.addItem(sourceInfo); return true; -- cgit v1.2.3