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
17325dc23624160689e59fbac708cf6f222b20d025Daniel Sandlerpackage com.android.launcher3;
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.ContentValues;
20ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport android.content.Context;
21be365165ed00205265c1876c4829fa9ac630da2aWinson Chungimport android.content.Intent;
2231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.graphics.Bitmap;
2331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
24ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.UserHandleCompat;
25ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport com.android.launcher3.compat.UserManagerCompat;
26ed13187a745866483139e2878037e1f8427ce567Kenny Guy
27be3e410b7a62fa64ffda825b824862eb9d0c98c5Sameer Padalaimport java.util.Arrays;
28be365165ed00205265c1876c4829fa9ac630da2aWinson Chung
2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/**
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Represents an item in the launcher.
3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
3272fbec17e09a1120971621587d5005f683baafd1Mathew Inwoodpublic class ItemInfo {
33ed13187a745866483139e2878037e1f8427ce567Kenny Guy
34ed13187a745866483139e2878037e1f8427ce567Kenny Guy    /**
35ed13187a745866483139e2878037e1f8427ce567Kenny Guy     * Intent extra to store the profile. Format: UserHandle
36ed13187a745866483139e2878037e1f8427ce567Kenny Guy     */
37ed13187a745866483139e2878037e1f8427ce567Kenny Guy    static final String EXTRA_PROFILE = "profile";
3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
393f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public static final int NO_ID = -1;
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * The id in the settings database for this item
4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
44e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public long id = NO_ID;
4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * One of {@link LauncherSettings.Favorites#ITEM_TYPE_APPLICATION},
4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * {@link LauncherSettings.Favorites#ITEM_TYPE_SHORTCUT},
49df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen     * {@link LauncherSettings.Favorites#ITEM_TYPE_FOLDER}, or
507376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project     * {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET}.
5131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
52e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public int itemType;
5331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
5531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * The id of the container that holds this item. For the desktop, this will be
5631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * {@link LauncherSettings.Favorites#CONTAINER_DESKTOP}. For the all applications folder it
5731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * will be {@link #NO_ID} (since it is not stored in the settings DB). For user folders
5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * it will be the id of the folder.
5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
60e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public long container = NO_ID;
6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
6331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Iindicates the screen in which the shortcut appears.
6431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
65e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public long screenId = -1;
6631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Indicates the X position of the associated cell.
6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
70e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public int cellX = -1;
7131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Indicates the Y position of the associated cell.
7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
75e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public int cellY = -1;
7631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
7831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Indicates the X cell span.
7931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
80e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public int spanX = 1;
8131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
8231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
8331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Indicates the Y cell span.
8431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
853f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public int spanY = 1;
8631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
8773b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy    /**
88d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen     * Indicates the minimum X cell span.
89d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen     */
90e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public int minSpanX = 1;
91d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen
92d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen    /**
93d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen     * Indicates the minimum Y cell span.
94d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen     */
95e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public int minSpanY = 1;
96487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen
97487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen    /**
9808f7261d11a53ae4b330ad4fa897b8519de3d750Sunny Goyal     * Indicates the position in an ordered list.
9908f7261d11a53ae4b330ad4fa897b8519de3d750Sunny Goyal     */
10008f7261d11a53ae4b330ad4fa897b8519de3d750Sunny Goyal    public int rank = 0;
10108f7261d11a53ae4b330ad4fa897b8519de3d750Sunny Goyal
10208f7261d11a53ae4b330ad4fa897b8519de3d750Sunny Goyal    /**
103487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen     * Indicates that this item needs to be updated in the db
104487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen     */
105e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public boolean requiresDbUpdate = false;
106487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen
107d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen    /**
108487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen     * Title of the item
10973b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy     */
1103f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public CharSequence title;
11173b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy
112bbaa75c8c432c46c00ee2eb836e438b3774d6709Patrick Dubroy    /**
113c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy     * Content description of the item.
114c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy     */
1153f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public CharSequence contentDescription;
116c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy
117c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy    /**
118bbaa75c8c432c46c00ee2eb836e438b3774d6709Patrick Dubroy     * The position of the item in a drag-and-drop operation.
119bbaa75c8c432c46c00ee2eb836e438b3774d6709Patrick Dubroy     */
1203f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public int[] dropPos = null;
121bbaa75c8c432c46c00ee2eb836e438b3774d6709Patrick Dubroy
1223f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public UserHandleCompat user;
123ed13187a745866483139e2878037e1f8427ce567Kenny Guy
1243f471440a8b6b71d4c15501a96befd3b715c9e8fHyunyoung Song    public ItemInfo() {
125c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy        user = UserHandleCompat.myUserHandle();
12631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
12731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
128c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka    ItemInfo(ItemInfo info) {
129ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal        copyFrom(info);
130ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal        // tempdebug:
131ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal        LauncherModel.checkItemInfo(this);
132ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal    }
133ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal
134ff572277112ec3d6a6a8c1be274d6fa1019e3648Sunny Goyal    public void copyFrom(ItemInfo info) {
13531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        id = info.id;
13631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        cellX = info.cellX;
13731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        cellY = info.cellY;
13831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        spanX = info.spanX;
13931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        spanY = info.spanY;
14008f7261d11a53ae4b330ad4fa897b8519de3d750Sunny Goyal        rank = info.rank;
141dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen        screenId = info.screenId;
14231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        itemType = info.itemType;
14331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        container = info.container;
144ed13187a745866483139e2878037e1f8427ce567Kenny Guy        user = info.user;
145c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy        contentDescription = info.contentDescription;
14631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
14731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
148e3e646e1f05caa2b500cc3deecc3a31457c83302Anjali Koppal    public Intent getIntent() {
149997a92348a6d6e061737399321393449c16cd4d8Winson Chung        throw new RuntimeException("Unexpected Intent");
150997a92348a6d6e061737399321393449c16cd4d8Winson Chung    }
151997a92348a6d6e061737399321393449c16cd4d8Winson Chung
15231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
15331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Write the fields of this item to the DB
15431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     *
155ed13187a745866483139e2878037e1f8427ce567Kenny Guy     * @param context A context object to use for getting UserManagerCompat
15631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param values
15731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
158ed13187a745866483139e2878037e1f8427ce567Kenny Guy
159ed13187a745866483139e2878037e1f8427ce567Kenny Guy    void onAddToDatabase(Context context, ContentValues values) {
16073b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy        values.put(LauncherSettings.BaseLauncherColumns.ITEM_TYPE, itemType);
161487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.CONTAINER, container);
162dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen        values.put(LauncherSettings.Favorites.SCREEN, screenId);
163487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.CELLX, cellX);
164487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.CELLY, cellY);
165487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.SPANX, spanX);
166487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.SPANY, spanY);
16708f7261d11a53ae4b330ad4fa897b8519de3d750Sunny Goyal        values.put(LauncherSettings.Favorites.RANK, rank);
168ed13187a745866483139e2878037e1f8427ce567Kenny Guy        long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user);
169ed13187a745866483139e2878037e1f8427ce567Kenny Guy        values.put(LauncherSettings.Favorites.PROFILE_ID, serialNumber);
1708f3f6830f2693647034e8df974d67f6b50d01602Adrian Roos
1718f3f6830f2693647034e8df974d67f6b50d01602Adrian Roos        if (screenId == Workspace.EXTRA_EMPTY_SCREEN_ID) {
1728f3f6830f2693647034e8df974d67f6b50d01602Adrian Roos            // We should never persist an item on the extra empty screen.
1738f3f6830f2693647034e8df974d67f6b50d01602Adrian Roos            throw new RuntimeException("Screen id should not be EXTRA_EMPTY_SCREEN_ID");
1748f3f6830f2693647034e8df974d67f6b50d01602Adrian Roos        }
17531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
17631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
17731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void writeBitmap(ContentValues values, Bitmap bitmap) {
17831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (bitmap != null) {
1795b0e669169ea2c951bf2f6f71faf793b24db3c23Sunny Goyal            byte[] data = Utilities.flattenBitmap(bitmap);
1800589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            values.put(LauncherSettings.Favorites.ICON, data);
18131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
18231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
1834eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen
1844eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen    /**
1854eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     * It is very important that sub-classes implement this if they contain any references
1864eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     * to the activity (anything in the view hierarchy etc.). If not, leaks can result since
1874eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     * ItemInfo objects persist across rotation and can hence leak by holding stale references
1884eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     * to the old view hierarchy / activity.
1894eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     */
1909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    void unbind() {
1919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
1928802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler
1938802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler    @Override
1948802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler    public String toString() {
195c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung        return "Item(id=" + this.id + " type=" + this.itemType + " container=" + this.container
196dcd297f05a866e07090d6e2af8fb4b15f28cb555Adam Cohen            + " screen=" + screenId + " cellX=" + cellX + " cellY=" + cellY + " spanX=" + spanX
197ed13187a745866483139e2878037e1f8427ce567Kenny Guy            + " spanY=" + spanY + " dropPos=" + Arrays.toString(dropPos)
198ed13187a745866483139e2878037e1f8427ce567Kenny Guy            + " user=" + user + ")";
1998802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler    }
20031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
201