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