Home | History | Annotate | Download | only in launcher2
      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 
    105     ItemInfo() {
    106     }
    107 
    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. */
    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      */
    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 
    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 
    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 
    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      */
    185     void unbind() {
    186     }
    187 
    188     @Override
    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