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