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.ContentValues;
20374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasaniimport android.content.Context;
21be365165ed00205265c1876c4829fa9ac630da2aWinson Chungimport android.content.Intent;
2231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.graphics.Bitmap;
23374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasaniimport android.os.UserHandle;
24374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasaniimport android.os.UserManager;
2531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.Log;
2631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
27be365165ed00205265c1876c4829fa9ac630da2aWinson Chungimport java.io.ByteArrayOutputStream;
28be365165ed00205265c1876c4829fa9ac630da2aWinson Chungimport java.io.IOException;
29be365165ed00205265c1876c4829fa9ac630da2aWinson Chung
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/**
3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Represents an item in the launcher.
3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
3331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectclass ItemInfo {
34374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani
35374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    /**
36374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     * Intent extra to store the profile. Format: UserHandle
37374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     */
38374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    static final String EXTRA_PROFILE = "profile";
39374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static final int NO_ID = -1;
41374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani
4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * The id in the settings database for this item
4431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    long id = NO_ID;
4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * One of {@link LauncherSettings.Favorites#ITEM_TYPE_APPLICATION},
4931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * {@link LauncherSettings.Favorites#ITEM_TYPE_SHORTCUT},
50df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen     * {@link LauncherSettings.Favorites#ITEM_TYPE_FOLDER}, or
517376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project     * {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET}.
5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
5331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    int itemType;
5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
5531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
5631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * The id of the container that holds this item. For the desktop, this will be
5731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * {@link LauncherSettings.Favorites#CONTAINER_DESKTOP}. For the all applications folder it
5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * will be {@link #NO_ID} (since it is not stored in the settings DB). For user folders
5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * it will be the id of the folder.
6031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    long container = NO_ID;
6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
64374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     * Indicates the screen in which the shortcut appears.
6531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
6631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    int screen = -1;
6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Indicates the X position of the associated cell.
7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
7131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    int cellX = -1;
7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Indicates the Y position of the associated cell.
7531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
7631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    int cellY = -1;
7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
7931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Indicates the X cell span.
8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
8131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    int spanX = 1;
8231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
8331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
8431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Indicates the Y cell span.
8531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
8631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    int spanY = 1;
8731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
8873b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy    /**
89d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen     * Indicates the minimum X cell span.
90d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen     */
91d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen    int minSpanX = 1;
92d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen
93d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen    /**
94d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen     * Indicates the minimum Y cell span.
95d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen     */
96d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen    int minSpanY = 1;
97487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen
98487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen    /**
99487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen     * Indicates that this item needs to be updated in the db
100487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen     */
101487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen    boolean requiresDbUpdate = false;
102487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen
103d41fbf5680750e34335bba6b38298186c144a4b7Adam Cohen    /**
104487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen     * Title of the item
10573b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy     */
106487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen    CharSequence title;
10773b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy
108bbaa75c8c432c46c00ee2eb836e438b3774d6709Patrick Dubroy    /**
1094d3aca0989c48084c0c387d6010bd5b601c25668Kenny Guy     * Content description for the item.
1104d3aca0989c48084c0c387d6010bd5b601c25668Kenny Guy     */
111315084f234b2b8bc7bc9732f71c91e4674b711cdKenny Guy    CharSequence contentDescription;
1124d3aca0989c48084c0c387d6010bd5b601c25668Kenny Guy
1134d3aca0989c48084c0c387d6010bd5b601c25668Kenny Guy    /**
114bbaa75c8c432c46c00ee2eb836e438b3774d6709Patrick Dubroy     * The position of the item in a drag-and-drop operation.
115bbaa75c8c432c46c00ee2eb836e438b3774d6709Patrick Dubroy     */
116bbaa75c8c432c46c00ee2eb836e438b3774d6709Patrick Dubroy    int[] dropPos = null;
117bbaa75c8c432c46c00ee2eb836e438b3774d6709Patrick Dubroy
118374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    UserHandle user;
119374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani
120c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka    ItemInfo() {
121374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        user = android.os.Process.myUserHandle();
12231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
12331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
124c9d95c5897fc5ebbf53903d4ab18ad13d196f643Michael Jurka    ItemInfo(ItemInfo info) {
12531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        id = info.id;
12631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        cellX = info.cellX;
12731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        cellY = info.cellY;
12831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        spanX = info.spanX;
12931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        spanY = info.spanY;
13031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        screen = info.screen;
13131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        itemType = info.itemType;
13231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        container = info.container;
133374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        user = info.user;
1344d3aca0989c48084c0c387d6010bd5b601c25668Kenny Guy        contentDescription = info.contentDescription;
13596610d53f1cb1fa4c2406f7b3fca0fcaf16f6b36Michael Jurka        // tempdebug:
13696610d53f1cb1fa4c2406f7b3fca0fcaf16f6b36Michael Jurka        LauncherModel.checkItemInfo(this);
13731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
13831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
139be365165ed00205265c1876c4829fa9ac630da2aWinson Chung    /** Returns the package name that the intent will resolve to, or an empty string if
140be365165ed00205265c1876c4829fa9ac630da2aWinson Chung     *  none exists. */
141be365165ed00205265c1876c4829fa9ac630da2aWinson Chung    static String getPackageName(Intent intent) {
142be365165ed00205265c1876c4829fa9ac630da2aWinson Chung        if (intent != null) {
143be365165ed00205265c1876c4829fa9ac630da2aWinson Chung            String packageName = intent.getPackage();
14433a0ad56c0970b5c60b6e4e207f24dcefd1fd3e8Winson Chung            if (packageName == null && intent.getComponent() != null) {
145be365165ed00205265c1876c4829fa9ac630da2aWinson Chung                packageName = intent.getComponent().getPackageName();
146be365165ed00205265c1876c4829fa9ac630da2aWinson Chung            }
147be365165ed00205265c1876c4829fa9ac630da2aWinson Chung            if (packageName != null) {
148be365165ed00205265c1876c4829fa9ac630da2aWinson Chung                return packageName;
149be365165ed00205265c1876c4829fa9ac630da2aWinson Chung            }
150be365165ed00205265c1876c4829fa9ac630da2aWinson Chung        }
151be365165ed00205265c1876c4829fa9ac630da2aWinson Chung        return "";
152be365165ed00205265c1876c4829fa9ac630da2aWinson Chung    }
153be365165ed00205265c1876c4829fa9ac630da2aWinson Chung
154374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    protected void updateUser(Intent intent) {
155374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        if (intent != null && intent.hasExtra(EXTRA_PROFILE)) {
156374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani            user = (UserHandle) intent.getParcelableExtra(EXTRA_PROFILE);
157374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        }
158374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    }
159374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani
16031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
16131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Write the fields of this item to the DB
16231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     *
163374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     * @param context A context object to use for getting a UserManager
164374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani     *            instance.
16531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param values
16631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
167374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani    void onAddToDatabase(Context context, ContentValues values) {
16873b979d8c141c7ceac82dad7c5b271a6a42afa67Romain Guy        values.put(LauncherSettings.BaseLauncherColumns.ITEM_TYPE, itemType);
169487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.CONTAINER, container);
170487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.SCREEN, screen);
171487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.CELLX, cellX);
172487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.CELLY, cellY);
173487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.SPANX, spanX);
174487f7dd3059621527eb439d7d51d34e00293f9b1Adam Cohen        values.put(LauncherSettings.Favorites.SPANY, spanY);
175374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        long serialNumber = ((UserManager) context.getSystemService(Context.USER_SERVICE))
176374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                .getSerialNumberForUser(user);
177374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani        values.put(LauncherSettings.Favorites.PROFILE_ID, serialNumber);
17831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
17931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
180aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung    void updateValuesWithCoordinates(ContentValues values, int cellX, int cellY) {
181aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung        values.put(LauncherSettings.Favorites.CELLX, cellX);
182aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung        values.put(LauncherSettings.Favorites.CELLY, cellY);
183aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung    }
184aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung
1850589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    static byte[] flattenBitmap(Bitmap bitmap) {
1860589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        // Try go guesstimate how much space the icon will take when serialized
1870589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        // to avoid unnecessary allocations/copies during the write.
1880589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        int size = bitmap.getWidth() * bitmap.getHeight() * 4;
1890589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        ByteArrayOutputStream out = new ByteArrayOutputStream(size);
1900589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        try {
1910589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
1920589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            out.flush();
1930589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            out.close();
1940589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            return out.toByteArray();
1950589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        } catch (IOException e) {
1960589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            Log.w("Favorite", "Could not write icon");
1970589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            return null;
1980589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato        }
1990589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato    }
2000589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato
20131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    static void writeBitmap(ContentValues values, Bitmap bitmap) {
20231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (bitmap != null) {
2030589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            byte[] data = flattenBitmap(bitmap);
2040589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato            values.put(LauncherSettings.Favorites.ICON, data);
20531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
20631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
2074eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen
2084eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen    /**
2094eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     * It is very important that sub-classes implement this if they contain any references
2104eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     * to the activity (anything in the view hierarchy etc.). If not, leaks can result since
2114eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     * ItemInfo objects persist across rotation and can hence leak by holding stale references
2124eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     * to the old view hierarchy / activity.
2134eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen     */
2149c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    void unbind() {
2159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato    }
2168802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler
2178802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler    @Override
2188802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler    public String toString() {
219c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung        return "Item(id=" + this.id + " type=" + this.itemType + " container=" + this.container
220c07918d0053fc7d2a19d7b013565a5d2e7d4af51Winson Chung            + " screen=" + screen + " cellX=" + cellX + " cellY=" + cellY + " spanX=" + spanX
221374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                + " spanY=" + spanY + " dropPos=" + dropPos + " user=" + user
222374753cabf05cde1ad669d07bde47e34fdcbe499Amith Yamasani                + ")";
2238802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler    }
22431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
225