summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Cohen <adamcohen@google.com>2011-05-02 18:11:28 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-05-02 18:11:28 -0700
commit6c1d402a641d585aa27898788d5205f2d536935a (patch)
tree170b75a9e405a276f3e48bbfd688a2bdba67d87b /src
parentfc79c8067e21e55fce3802a63e15ee4c6f11d595 (diff)
parenta9cf38f533d1e86269868f1e6a806ccffd4a78fc (diff)
downloadandroid_packages_apps_Trebuchet-6c1d402a641d585aa27898788d5205f2d536935a.tar.gz
android_packages_apps_Trebuchet-6c1d402a641d585aa27898788d5205f2d536935a.tar.bz2
android_packages_apps_Trebuchet-6c1d402a641d585aa27898788d5205f2d536935a.zip
Merge "Adding folder icon visualization"
Diffstat (limited to 'src')
-rw-r--r--src/com/android/launcher2/Folder.java29
-rw-r--r--src/com/android/launcher2/FolderIcon.java82
-rw-r--r--src/com/android/launcher2/FolderInfo.java23
-rw-r--r--src/com/android/launcher2/Launcher.java48
-rw-r--r--src/com/android/launcher2/Workspace.java9
5 files changed, 152 insertions, 39 deletions
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<ShortcutInfo> contents = new ArrayList<ShortcutInfo>();
+ ArrayList<FolderListener> listeners = new ArrayList<FolderListener>();
+
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 2d15ffa18..8a2009cb7 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;