• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.launcher2;
18 
19 import android.content.ContentValues;
20 import android.content.Intent;
21 import android.graphics.Bitmap;
22 import android.util.Log;
23 
24 import java.io.ByteArrayOutputStream;
25 import java.io.IOException;
26 
27 /**
28  * Represents an item in the launcher.
29  */
30 class ItemInfo {
31 
32     static final int NO_ID = -1;
33 
34     /**
35      * The id in the settings database for this item
36      */
37     long id = NO_ID;
38 
39     /**
40      * One of {@link LauncherSettings.Favorites#ITEM_TYPE_APPLICATION},
41      * {@link LauncherSettings.Favorites#ITEM_TYPE_SHORTCUT},
42      * {@link LauncherSettings.Favorites#ITEM_TYPE_FOLDER}, or
43      * {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET}.
44      */
45     int itemType;
46 
47     /**
48      * The id of the container that holds this item. For the desktop, this will be
49      * {@link LauncherSettings.Favorites#CONTAINER_DESKTOP}. For the all applications folder it
50      * will be {@link #NO_ID} (since it is not stored in the settings DB). For user folders
51      * it will be the id of the folder.
52      */
53     long container = NO_ID;
54 
55     /**
56      * Iindicates the screen in which the shortcut appears.
57      */
58     int screen = -1;
59 
60     /**
61      * Indicates the X position of the associated cell.
62      */
63     int cellX = -1;
64 
65     /**
66      * Indicates the Y position of the associated cell.
67      */
68     int cellY = -1;
69 
70     /**
71      * Indicates the X cell span.
72      */
73     int spanX = 1;
74 
75     /**
76      * Indicates the Y cell span.
77      */
78     int spanY = 1;
79 
80     /**
81      * Indicates the minimum X cell span.
82      */
83     int minSpanX = 1;
84 
85     /**
86      * Indicates the minimum Y cell span.
87      */
88     int minSpanY = 1;
89 
90     /**
91      * Indicates that this item needs to be updated in the db
92      */
93     boolean requiresDbUpdate = false;
94 
95     /**
96      * Title of the item
97      */
98     CharSequence title;
99 
100     /**
101      * The position of the item in a drag-and-drop operation.
102      */
103     int[] dropPos = null;
104 
ItemInfo()105     ItemInfo() {
106     }
107 
ItemInfo(ItemInfo info)108     ItemInfo(ItemInfo info) {
109         id = info.id;
110         cellX = info.cellX;
111         cellY = info.cellY;
112         spanX = info.spanX;
113         spanY = info.spanY;
114         screen = info.screen;
115         itemType = info.itemType;
116         container = info.container;
117         // tempdebug:
118         LauncherModel.checkItemInfo(this);
119     }
120 
121     /** Returns the package name that the intent will resolve to, or an empty string if
122      *  none exists. */
getPackageName(Intent intent)123     static String getPackageName(Intent intent) {
124         if (intent != null) {
125             String packageName = intent.getPackage();
126             if (packageName == null && intent.getComponent() != null) {
127                 packageName = intent.getComponent().getPackageName();
128             }
129             if (packageName != null) {
130                 return packageName;
131             }
132         }
133         return "";
134     }
135 
136     /**
137      * Write the fields of this item to the DB
138      *
139      * @param values
140      */
onAddToDatabase(ContentValues values)141     void onAddToDatabase(ContentValues values) {
142         values.put(LauncherSettings.BaseLauncherColumns.ITEM_TYPE, itemType);
143         values.put(LauncherSettings.Favorites.CONTAINER, container);
144         values.put(LauncherSettings.Favorites.SCREEN, screen);
145         values.put(LauncherSettings.Favorites.CELLX, cellX);
146         values.put(LauncherSettings.Favorites.CELLY, cellY);
147         values.put(LauncherSettings.Favorites.SPANX, spanX);
148         values.put(LauncherSettings.Favorites.SPANY, spanY);
149     }
150 
updateValuesWithCoordinates(ContentValues values, int cellX, int cellY)151     void updateValuesWithCoordinates(ContentValues values, int cellX, int cellY) {
152         values.put(LauncherSettings.Favorites.CELLX, cellX);
153         values.put(LauncherSettings.Favorites.CELLY, cellY);
154     }
155 
flattenBitmap(Bitmap bitmap)156     static byte[] flattenBitmap(Bitmap bitmap) {
157         // Try go guesstimate how much space the icon will take when serialized
158         // to avoid unnecessary allocations/copies during the write.
159         int size = bitmap.getWidth() * bitmap.getHeight() * 4;
160         ByteArrayOutputStream out = new ByteArrayOutputStream(size);
161         try {
162             bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
163             out.flush();
164             out.close();
165             return out.toByteArray();
166         } catch (IOException e) {
167             Log.w("Favorite", "Could not write icon");
168             return null;
169         }
170     }
171 
writeBitmap(ContentValues values, Bitmap bitmap)172     static void writeBitmap(ContentValues values, Bitmap bitmap) {
173         if (bitmap != null) {
174             byte[] data = flattenBitmap(bitmap);
175             values.put(LauncherSettings.Favorites.ICON, data);
176         }
177     }
178 
179     /**
180      * It is very important that sub-classes implement this if they contain any references
181      * to the activity (anything in the view hierarchy etc.). If not, leaks can result since
182      * ItemInfo objects persist across rotation and can hence leak by holding stale references
183      * to the old view hierarchy / activity.
184      */
unbind()185     void unbind() {
186     }
187 
188     @Override
toString()189     public String toString() {
190         return "Item(id=" + this.id + " type=" + this.itemType + " container=" + this.container
191             + " screen=" + screen + " cellX=" + cellX + " cellY=" + cellY + " spanX=" + spanX
192             + " spanY=" + spanY + " dropPos=" + dropPos + ")";
193     }
194 }
195