| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.launcher3; |
| |
| import android.content.ContentValues; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.graphics.Bitmap; |
| import android.util.Log; |
| |
| import com.android.launcher3.compat.UserHandleCompat; |
| import com.android.launcher3.compat.UserManagerCompat; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.util.Arrays; |
| |
| /** |
| * Represents an item in the launcher. |
| */ |
| public class ItemInfo { |
| |
| /** |
| * Intent extra to store the profile. Format: UserHandle |
| */ |
| static final String EXTRA_PROFILE = "profile"; |
| |
| static final int NO_ID = -1; |
| |
| /** |
| * The id in the settings database for this item |
| */ |
| public long id = NO_ID; |
| |
| /** |
| * One of {@link LauncherSettings.Favorites#ITEM_TYPE_APPLICATION}, |
| * {@link LauncherSettings.Favorites#ITEM_TYPE_SHORTCUT}, |
| * {@link LauncherSettings.Favorites#ITEM_TYPE_FOLDER}, or |
| * {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET}. |
| */ |
| public int itemType; |
| |
| /** |
| * The id of the container that holds this item. For the desktop, this will be |
| * {@link LauncherSettings.Favorites#CONTAINER_DESKTOP}. For the all applications folder it |
| * will be {@link #NO_ID} (since it is not stored in the settings DB). For user folders |
| * it will be the id of the folder. |
| */ |
| public long container = NO_ID; |
| |
| /** |
| * Iindicates the screen in which the shortcut appears. |
| */ |
| public long screenId = -1; |
| |
| /** |
| * Indicates the X position of the associated cell. |
| */ |
| public int cellX = -1; |
| |
| /** |
| * Indicates the Y position of the associated cell. |
| */ |
| public int cellY = -1; |
| |
| /** |
| * Indicates the X cell span. |
| */ |
| public int spanX = 1; |
| |
| /** |
| * Indicates the Y cell span. |
| */ |
| int spanY = 1; |
| |
| /** |
| * Indicates the minimum X cell span. |
| */ |
| public int minSpanX = 1; |
| |
| /** |
| * Indicates the minimum Y cell span. |
| */ |
| public int minSpanY = 1; |
| |
| /** |
| * Indicates the position in an ordered list. |
| */ |
| public int rank = 0; |
| |
| /** |
| * Indicates that this item needs to be updated in the db |
| */ |
| public boolean requiresDbUpdate = false; |
| |
| /** |
| * Title of the item |
| */ |
| CharSequence title; |
| |
| /** |
| * Content description of the item. |
| */ |
| CharSequence contentDescription; |
| |
| /** |
| * The position of the item in a drag-and-drop operation. |
| */ |
| int[] dropPos = null; |
| |
| UserHandleCompat user; |
| |
| ItemInfo() { |
| user = UserHandleCompat.myUserHandle(); |
| } |
| |
| ItemInfo(ItemInfo info) { |
| copyFrom(info); |
| // tempdebug: |
| LauncherModel.checkItemInfo(this); |
| } |
| |
| public void copyFrom(ItemInfo info) { |
| id = info.id; |
| cellX = info.cellX; |
| cellY = info.cellY; |
| spanX = info.spanX; |
| spanY = info.spanY; |
| rank = info.rank; |
| screenId = info.screenId; |
| itemType = info.itemType; |
| container = info.container; |
| user = info.user; |
| contentDescription = info.contentDescription; |
| } |
| |
| public Intent getIntent() { |
| throw new RuntimeException("Unexpected Intent"); |
| } |
| |
| /** |
| * Write the fields of this item to the DB |
| * |
| * @param context A context object to use for getting UserManagerCompat |
| * @param values |
| */ |
| |
| void onAddToDatabase(Context context, ContentValues values) { |
| values.put(LauncherSettings.BaseLauncherColumns.ITEM_TYPE, itemType); |
| values.put(LauncherSettings.Favorites.CONTAINER, container); |
| values.put(LauncherSettings.Favorites.SCREEN, screenId); |
| values.put(LauncherSettings.Favorites.CELLX, cellX); |
| values.put(LauncherSettings.Favorites.CELLY, cellY); |
| values.put(LauncherSettings.Favorites.SPANX, spanX); |
| values.put(LauncherSettings.Favorites.SPANY, spanY); |
| values.put(LauncherSettings.Favorites.RANK, rank); |
| long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user); |
| values.put(LauncherSettings.Favorites.PROFILE_ID, serialNumber); |
| |
| if (screenId == Workspace.EXTRA_EMPTY_SCREEN_ID) { |
| // We should never persist an item on the extra empty screen. |
| throw new RuntimeException("Screen id should not be EXTRA_EMPTY_SCREEN_ID"); |
| } |
| } |
| |
| static byte[] flattenBitmap(Bitmap bitmap) { |
| // Try go guesstimate how much space the icon will take when serialized |
| // to avoid unnecessary allocations/copies during the write. |
| int size = bitmap.getWidth() * bitmap.getHeight() * 4; |
| ByteArrayOutputStream out = new ByteArrayOutputStream(size); |
| try { |
| bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); |
| out.flush(); |
| out.close(); |
| return out.toByteArray(); |
| } catch (IOException e) { |
| Log.w("Favorite", "Could not write icon"); |
| return null; |
| } |
| } |
| |
| static void writeBitmap(ContentValues values, Bitmap bitmap) { |
| if (bitmap != null) { |
| byte[] data = flattenBitmap(bitmap); |
| values.put(LauncherSettings.Favorites.ICON, data); |
| } |
| } |
| |
| /** |
| * It is very important that sub-classes implement this if they contain any references |
| * to the activity (anything in the view hierarchy etc.). If not, leaks can result since |
| * ItemInfo objects persist across rotation and can hence leak by holding stale references |
| * to the old view hierarchy / activity. |
| */ |
| void unbind() { |
| } |
| |
| @Override |
| public String toString() { |
| return "Item(id=" + this.id + " type=" + this.itemType + " container=" + this.container |
| + " screen=" + screenId + " cellX=" + cellX + " cellY=" + cellY + " spanX=" + spanX |
| + " spanY=" + spanY + " dropPos=" + Arrays.toString(dropPos) |
| + " user=" + user + ")"; |
| } |
| } |