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