LauncherModel.java revision ec9788e6819a24ef5dc8fe4edf44f280e4a703fe
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 19cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamathimport android.app.SearchManager; 20629de3ef739883c0962423cc0c3a26299f162d3dRomain Guyimport android.appwidget.AppWidgetManager; 21629de3ef739883c0962423cc0c3a26299f162d3dRomain Guyimport android.appwidget.AppWidgetProviderInfo; 22f99f8c1ad265cf7bea7e30476911d730b7d0eaaeJoe Onoratoimport android.content.BroadcastReceiver; 2331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.ComponentName; 245c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guyimport android.content.ContentProviderClient; 2531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.ContentResolver; 2631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.ContentValues; 27aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungimport android.content.Context; 2831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Intent; 290589f0f66ce498512c6ee47482c649d88294c9d0Joe Onoratoimport android.content.Intent.ShortcutIconResource; 3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.pm.ActivityInfo; 3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.pm.PackageManager; 3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.pm.ResolveInfo; 3331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.res.Resources; 3431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.database.Cursor; 3531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.graphics.Bitmap; 3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.graphics.BitmapFactory; 3731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.net.Uri; 3817a8922e2ab2ad599df3750d398a095473ccd1b4Joe Onoratoimport android.os.Environment; 393611578579b4bfb25616085dafdb1a45207394f9Joe Onoratoimport android.os.Handler; 403611578579b4bfb25616085dafdb1a45207394f9Joe Onoratoimport android.os.HandlerThread; 410589f0f66ce498512c6ee47482c649d88294c9d0Joe Onoratoimport android.os.Parcelable; 4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.os.Process; 43aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungimport android.os.RemoteException; 449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onoratoimport android.os.SystemClock; 45aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chungimport android.util.Log; 4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport com.android.launcher.R; 4868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chungimport com.android.launcher2.InstallWidgetReceiver.WidgetMimeTypeHandlerData; 49edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy 50c2f801e770b4f80354b3edb722ec04222251990cMichael Jurkaimport java.lang.ref.WeakReference; 51c2f801e770b4f80354b3edb722ec04222251990cMichael Jurkaimport java.net.URISyntaxException; 52c2f801e770b4f80354b3edb722ec04222251990cMichael Jurkaimport java.text.Collator; 53c2f801e770b4f80354b3edb722ec04222251990cMichael Jurkaimport java.util.ArrayList; 54c2f801e770b4f80354b3edb722ec04222251990cMichael Jurkaimport java.util.Collections; 55c2f801e770b4f80354b3edb722ec04222251990cMichael Jurkaimport java.util.Comparator; 56c2f801e770b4f80354b3edb722ec04222251990cMichael Jurkaimport java.util.HashMap; 57c2f801e770b4f80354b3edb722ec04222251990cMichael Jurkaimport java.util.List; 58c2f801e770b4f80354b3edb722ec04222251990cMichael Jurkaimport java.util.Locale; 59c2f801e770b4f80354b3edb722ec04222251990cMichael Jurka 6031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/** 6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Maintains in-memory state of the Launcher. It is expected that there should be only one 6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * LauncherModel object held in a static. Also provide APIs for updating the database state 63bc219c3c127cb74cf4fe578f05022b745da921b8The Android Open Source Project * for the Launcher. 6431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 65f99f8c1ad265cf7bea7e30476911d730b7d0eaaeJoe Onoratopublic class LauncherModel extends BroadcastReceiver { 66a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato static final boolean DEBUG_LOADERS = false; 679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato static final String TAG = "Launcher.Model"; 689c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 693611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private static final int ITEMS_CHUNK = 6; // batch size for the workspace icons 7017a8922e2ab2ad599df3750d398a095473ccd1b4Joe Onorato private final boolean mAppsCanBeOnExternalStorage; 71d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato private int mBatchSize; // 0 is all apps at once 722ff10b3b0137d258569ce5471808842e88696133Daniel Sandler private int mAllAppsLoadDelay; // milliseconds between batches 73dca661236c73ecd819cfea964c6f8170e5cc40aeDaniel Sandler 74f99f8c1ad265cf7bea7e30476911d730b7d0eaaeJoe Onorato private final LauncherApplication mApp; 759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private final Object mLock = new Object(); 769c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private DeferredHandler mHandler = new DeferredHandler(); 773611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private LoaderTask mLoaderTask; 789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 79700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick private static final HandlerThread sWorkerThread = new HandlerThread("launcher-loader"); 80700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick static { 81700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick sWorkerThread.start(); 82700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick } 83700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick private static final Handler sWorker = new Handler(sWorkerThread.getLooper()); 84700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick 85cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato // We start off with everything not loaded. After that, we assume that 86cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato // our monitoring of the package manager provides all updates and we never 87cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato // need to do a requery. These are only ever touched from the loader thread. 88cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato private boolean mWorkspaceLoaded; 89cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato private boolean mAllAppsLoaded; 90cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato 919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private WeakReference<Callbacks> mCallbacks; 929c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 93a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // < only access in worker thread > 94a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka private AllAppsList mAllAppsList; 95a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka 96a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // sItemsIdMap maps *all* the ItemInfos (shortcuts, folders, and widgets) created by 97a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // LauncherModel to their ids 98a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka static final HashMap<Long, ItemInfo> sItemsIdMap = new HashMap<Long, ItemInfo>(); 99a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka 100a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // sItems is passed to bindItems, which expects a list of all folders and shortcuts created by 101a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // LauncherModel that are directly on the home screen (however, no widgets or shortcuts 102a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // within folders). 1034eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen static final ArrayList<ItemInfo> sWorkspaceItems = new ArrayList<ItemInfo>(); 1040589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 105a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // sAppWidgets is all LauncherAppWidgetInfo created by LauncherModel. Passed to bindAppWidget() 106a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka static final ArrayList<LauncherAppWidgetInfo> sAppWidgets = 107a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka new ArrayList<LauncherAppWidgetInfo>(); 108a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka 109a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // sFolders is all FolderInfos created by LauncherModel. Passed to bindFolders() 110a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka static final HashMap<Long, FolderInfo> sFolders = new HashMap<Long, FolderInfo>(); 111b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung 112b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung // sDbIconCache is the set of ItemInfos that need to have their icons updated in the database 113b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung static final HashMap<Object, byte[]> sDbIconCache = new HashMap<Object, byte[]>(); 114b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung 115a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // </ only access in worker thread > 116a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka 117a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka private IconCache mIconCache; 1180589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato private Bitmap mDefaultIcon; 1199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 120d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen private static int mCellCountX; 121d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen private static int mCellCountY; 122aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 1239c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public interface Callbacks { 124ef2efcff5e70e5900f4f10f9e46c3fa17c03b0ecJoe Onorato public boolean setLoadOnResume(); 1259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public int getCurrentWorkspaceScreen(); 1269c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void startBinding(); 1279c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void bindItems(ArrayList<ItemInfo> shortcuts, int start, int end); 128ad72e1705c32da463a552f2283ae467dc15a4a34Joe Onorato public void bindFolders(HashMap<Long,FolderInfo> folders); 1299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void finishBindingItems(); 1309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void bindAppWidget(LauncherAppWidgetInfo info); 1319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void bindAllApplications(ArrayList<ApplicationInfo> apps); 13264e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato public void bindAppsAdded(ArrayList<ApplicationInfo> apps); 13364e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato public void bindAppsUpdated(ArrayList<ApplicationInfo> apps); 1343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void bindAppsRemoved(ArrayList<ApplicationInfo> apps, boolean permanent); 13580baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public void bindPackagesUpdated(); 136843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler public boolean isAllAppsVisible(); 137cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath public void bindSearchablesChanged(); 1389c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 13931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1400589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato LauncherModel(LauncherApplication app, IconCache iconCache) { 14117a8922e2ab2ad599df3750d398a095473ccd1b4Joe Onorato mAppsCanBeOnExternalStorage = !Environment.isExternalStorageEmulated(); 142f99f8c1ad265cf7bea7e30476911d730b7d0eaaeJoe Onorato mApp = app; 1430589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mAllAppsList = new AllAppsList(iconCache); 1440589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mIconCache = iconCache; 1450589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 1460589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato mDefaultIcon = Utilities.createIconBitmap( 147c9a961952d1a057029874f8426b90181f6876034Michael Jurka mIconCache.getFullResDefaultActivityIcon(), app); 1482ff10b3b0137d258569ce5471808842e88696133Daniel Sandler 1492ff10b3b0137d258569ce5471808842e88696133Daniel Sandler mAllAppsLoadDelay = app.getResources().getInteger(R.integer.config_allAppsBatchLoadDelay); 150d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato 151d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato mBatchSize = app.getResources().getInteger(R.integer.config_allAppsBatchSize); 1520589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 1530589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 15456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato public Bitmap getFallbackIcon() { 1550589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato return Bitmap.createBitmap(mDefaultIcon); 156f99f8c1ad265cf7bea7e30476911d730b7d0eaaeJoe Onorato } 15731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1584eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen public static void unbindWorkspaceItems() { 1594eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen for (ItemInfo item: sWorkspaceItems) { 1604eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen item.unbind(); 1614eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen } 1624eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen } 1634eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen 1649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 1659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Adds an item to the DB if it was not created previously, or move it to a new 1669c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * <container, screen, cellX, cellY> 1679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 1689c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato static void addOrMoveItemInDatabase(Context context, ItemInfo item, long container, 1699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato int screen, int cellX, int cellY) { 1709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (item.container == ItemInfo.NO_ID) { 1719c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // From all apps 1729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato addItemToDatabase(context, item, container, screen, cellX, cellY, false); 1739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } else { 1749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // From somewhere else 1759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato moveItemInDatabase(context, item, container, screen, cellX, cellY); 1769c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 1779c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 17831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1799c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 1809c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Move an item in the DB to a new <container, screen, cellX, cellY> 1819c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 182a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka static void moveItemInDatabase(Context context, final ItemInfo item, final long container, 183a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka final int screen, final int cellX, final int cellY) { 1849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.container = container; 1859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.cellX = cellX; 1869c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.cellY = cellY; 1873d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // We store hotseat items in canonical form which is this orientation invariant position 1883d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // in the hotseat 1893d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (context instanceof Launcher && screen < 0 && 1903d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 1913d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung item.screen = ((Launcher) context).getHotseat().getOrderInHotseat(cellX, cellY); 1923d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } else { 1933d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung item.screen = screen; 1943d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 19531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 196ade2f8122f6b1a9b64d2d4a81348db619db4d5b2Brad Fitzpatrick final Uri uri = LauncherSettings.Favorites.getContentUri(item.id, false); 1979c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentValues values = new ContentValues(); 1989c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentResolver cr = context.getContentResolver(); 199bc219c3c127cb74cf4fe578f05022b745da921b8The Android Open Source Project 2009c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato values.put(LauncherSettings.Favorites.CONTAINER, item.container); 2013d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung values.put(LauncherSettings.Favorites.CELLX, item.cellX); 2023d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung values.put(LauncherSettings.Favorites.CELLY, item.cellY); 2039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato values.put(LauncherSettings.Favorites.SCREEN, item.screen); 204ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project 205700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick sWorker.post(new Runnable() { 206700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick public void run() { 207700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick cr.update(uri, values, null, null); 208a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka ItemInfo modelItem = sItemsIdMap.get(item.id); 209a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka if (item != modelItem) { 210a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // the modelItem needs to match up perfectly with item if our model is to be 211a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // consistent with the database-- for now, just require modelItem == item 212c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung String msg = "item: " + ((item != null) ? item.toString() : "null") + 213c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung "modelItem: " + ((modelItem != null) ? modelItem.toString() : "null") + 214c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung "Error: ItemInfo passed to moveItemInDatabase doesn't match original"; 215c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung throw new RuntimeException(msg); 216a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 217a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka 218a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // Items are added/removed from the corresponding FolderInfo elsewhere, such 219a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // as in Workspace.onDrop. Here, we just add/remove them from the list of items 220a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // that are on the desktop, as appropriate 2213d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (modelItem.container == LauncherSettings.Favorites.CONTAINER_DESKTOP || 2223d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung modelItem.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 2234eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen if (!sWorkspaceItems.contains(modelItem)) { 2244eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen sWorkspaceItems.add(modelItem); 225a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 226a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } else { 2274eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen sWorkspaceItems.remove(modelItem); 228a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 229700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick } 230700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick }); 23131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 23231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 23331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 2341b607ed454ed22c2fd855cb3e428376520fb2388Adam Cohen * Resize an item in the DB to a new <spanX, spanY, cellX, cellY> 235d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen */ 236a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka static void resizeItemInDatabase(Context context, final ItemInfo item, final int cellX, 237a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka final int cellY, final int spanX, final int spanY) { 238d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen item.spanX = spanX; 239d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen item.spanY = spanY; 240d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen item.cellX = cellX; 241d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen item.cellY = cellY; 242d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 243d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen final Uri uri = LauncherSettings.Favorites.getContentUri(item.id, false); 244d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen final ContentValues values = new ContentValues(); 245d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen final ContentResolver cr = context.getContentResolver(); 246d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 247d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen values.put(LauncherSettings.Favorites.CONTAINER, item.container); 248d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen values.put(LauncherSettings.Favorites.SPANX, spanX); 249d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen values.put(LauncherSettings.Favorites.SPANY, spanY); 250d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen values.put(LauncherSettings.Favorites.CELLX, cellX); 251d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen values.put(LauncherSettings.Favorites.CELLY, cellY); 252d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 253d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen sWorker.post(new Runnable() { 254d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen public void run() { 255d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen cr.update(uri, values, null, null); 256a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka ItemInfo modelItem = sItemsIdMap.get(item.id); 257a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka if (item != modelItem) { 258a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // the modelItem needs to match up perfectly with item if our model is to be 259a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // consistent with the database-- for now, just require modelItem == item 260c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung String msg = "item: " + ((item != null) ? item.toString() : "null") + 261c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung "modelItem: " + ((modelItem != null) ? modelItem.toString() : "null") + 262c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung "Error: ItemInfo passed to resizeItemInDatabase doesn't match original"; 263c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung throw new RuntimeException(msg); 264a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 265d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 266d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen }); 267d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen } 268d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 269d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen /** 2709c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Returns true if the shortcuts already exists in the database. 2719c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * we identify a shortcut by its title and intent. 272bc219c3c127cb74cf4fe578f05022b745da921b8The Android Open Source Project */ 2739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato static boolean shortcutExists(Context context, String title, Intent intent) { 2749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentResolver cr = context.getContentResolver(); 2759c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI, 2769c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato new String[] { "title", "intent" }, "title=? and intent=?", 2779c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato new String[] { title, intent.toUri(0) }, null); 2789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato boolean result = false; 2799c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato try { 2809c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato result = c.moveToFirst(); 2819c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } finally { 2829c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato c.close(); 2839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 2849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return result; 285bc219c3c127cb74cf4fe578f05022b745da921b8The Android Open Source Project } 286bc219c3c127cb74cf4fe578f05022b745da921b8The Android Open Source Project 287bc219c3c127cb74cf4fe578f05022b745da921b8The Android Open Source Project /** 288aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung * Returns an ItemInfo array containing all the items in the LauncherModel. 289aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung * The ItemInfo.id is not set through this function. 290aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung */ 291aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung static ArrayList<ItemInfo> getItemsInLocalCoordinates(Context context) { 292aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung ArrayList<ItemInfo> items = new ArrayList<ItemInfo>(); 293aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung final ContentResolver cr = context.getContentResolver(); 294aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI, new String[] { 295aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung LauncherSettings.Favorites.ITEM_TYPE, LauncherSettings.Favorites.CONTAINER, 296aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung LauncherSettings.Favorites.SCREEN, LauncherSettings.Favorites.CELLX, LauncherSettings.Favorites.CELLY, 297aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung LauncherSettings.Favorites.SPANX, LauncherSettings.Favorites.SPANY }, null, null, null); 298aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 299aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung final int itemTypeIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ITEM_TYPE); 300aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung final int containerIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CONTAINER); 301aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung final int screenIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SCREEN); 302aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung final int cellXIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLX); 303aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung final int cellYIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLY); 304aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung final int spanXIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANX); 305aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung final int spanYIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SPANY); 306aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 307aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung try { 308aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung while (c.moveToNext()) { 309aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung ItemInfo item = new ItemInfo(); 310aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung item.cellX = c.getInt(cellXIndex); 311aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung item.cellY = c.getInt(cellYIndex); 312aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung item.spanX = c.getInt(spanXIndex); 313aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung item.spanY = c.getInt(spanYIndex); 314aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung item.container = c.getInt(containerIndex); 315aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung item.itemType = c.getInt(itemTypeIndex); 316aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung item.screen = c.getInt(screenIndex); 317aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 318aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung items.add(item); 319aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 320aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } catch (Exception e) { 321aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung items.clear(); 322aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } finally { 323aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung c.close(); 324aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 325aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 326aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung return items; 327aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 328aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 329aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung /** 3309c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Find a folder in the db, creating the FolderInfo if necessary, and adding it to folderList. 33131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 3329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato FolderInfo getFolderById(Context context, HashMap<Long,FolderInfo> folderList, long id) { 3339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentResolver cr = context.getContentResolver(); 3349c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI, null, 3359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato "_id=? and (itemType=? or itemType=?)", 3369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato new String[] { String.valueOf(id), 337df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen String.valueOf(LauncherSettings.Favorites.ITEM_TYPE_FOLDER)}, null); 338f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 3399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato try { 3409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (c.moveToFirst()) { 3419c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final int itemTypeIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ITEM_TYPE); 3429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final int titleIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.TITLE); 3439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final int containerIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CONTAINER); 3449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final int screenIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.SCREEN); 3459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final int cellXIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLX); 3469c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final int cellYIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.CELLY); 347f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 3489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato FolderInfo folderInfo = null; 3499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato switch (c.getInt(itemTypeIndex)) { 350df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: 351df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen folderInfo = findOrMakeFolder(folderList, id); 3529c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato break; 3539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 35431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato folderInfo.title = c.getString(titleIndex); 3569c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato folderInfo.id = id; 3579c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato folderInfo.container = c.getInt(containerIndex); 3589c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato folderInfo.screen = c.getInt(screenIndex); 359d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen folderInfo.cellX = c.getInt(cellXIndex); 360d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen folderInfo.cellY = c.getInt(cellYIndex); 361ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project 3629c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return folderInfo; 3639c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 3649c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } finally { 3659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato c.close(); 3662fcbd686d1c2a9a9e520116a541c9caae0c2dc60Romain Guy } 367ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project 3689c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return null; 3699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 37031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 3719c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 3729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Add an item to the database in a specified container. Sets the container, screen, cellX and 3739c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * cellY fields of the item. Also assigns an ID to the item. 3749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 3753d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung static void addItemToDatabase(Context context, final ItemInfo item, final long container, 3763d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung final int screen, final int cellX, final int cellY, final boolean notify) { 3779c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.container = container; 3789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.cellX = cellX; 3799c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.cellY = cellY; 3803d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // We store hotseat items in canonical form which is this orientation invariant position 3813d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // in the hotseat 3823d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (context instanceof Launcher && screen < 0 && 3833d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 3843d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung item.screen = ((Launcher) context).getHotseat().getOrderInHotseat(cellX, cellY); 3853d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } else { 3863d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung item.screen = screen; 3873d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung } 388ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project 3899c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentValues values = new ContentValues(); 3909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentResolver cr = context.getContentResolver(); 3919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.onAddToDatabase(values); 392ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project 3937578ec6fa9a747210aba484d226b5f97773752e3Michael Jurka LauncherApplication app = (LauncherApplication) context.getApplicationContext(); 394a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka item.id = app.getLauncherProvider().generateNewId(); 395a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka values.put(LauncherSettings.Favorites._ID, item.id); 3963d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung item.updateValuesWithCoordinates(values, item.cellX, item.cellY); 397aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 398a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sWorker.post(new Runnable() { 399a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka public void run() { 400a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka cr.insert(notify ? LauncherSettings.Favorites.CONTENT_URI : 401a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka LauncherSettings.Favorites.CONTENT_URI_NO_NOTIFICATION, values); 402ca9475f0403d9c0e843d5c189575068a386b2eb6The Android Open Source Project 403b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung if (sItemsIdMap.containsKey(item.id)) { 404b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung // we should not be adding new items in the db with the same id 405b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung throw new RuntimeException("Error: ItemInfo id (" + item.id + ") passed to " + 406b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung "addItemToDatabase already exists." + item.toString()); 407b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung } 408a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sItemsIdMap.put(item.id, item); 409a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka switch (item.itemType) { 410a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: 411a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sFolders.put(item.id, (FolderInfo) item); 4123d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung // Fall through 413a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: 414a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: 4153d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP || 4163d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 4174eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen sWorkspaceItems.add(item); 418a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 419a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka break; 420a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: 421a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sAppWidgets.add((LauncherAppWidgetInfo) item); 422a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka break; 423a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 424a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 425a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka }); 42631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 42731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 429aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung * Creates a new unique child id, for a given cell span across all layouts. 430aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung */ 431845ba3b17b83a2b11d79c6fb076cf96ab4a737dfMichael Jurka static int getCellLayoutChildId( 4323d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung long container, int screen, int localCellX, int localCellY, int spanX, int spanY) { 4333d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung return (((int) container & 0xFF) << 24) 434845ba3b17b83a2b11d79c6fb076cf96ab4a737dfMichael Jurka | (screen & 0xFF) << 16 | (localCellX & 0xFF) << 8 | (localCellY & 0xFF); 435aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 436aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 437d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen static int getCellCountX() { 438d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen return mCellCountX; 439aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 440aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 441d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen static int getCellCountY() { 442d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen return mCellCountY; 443aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 444aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 445aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung /** 446aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung * Updates the model orientation helper to take into account the current layout dimensions 447aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung * when performing local/canonical coordinate transformations. 448aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung */ 449aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung static void updateWorkspaceLayoutCells(int shortAxisCellCount, int longAxisCellCount) { 450d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen mCellCountX = shortAxisCellCount; 451d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen mCellCountY = longAxisCellCount; 452aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung } 453aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 454aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung /** 4559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Update an item to the database in a specified container. 4569c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 457a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka static void updateItemInDatabase(Context context, final ItemInfo item) { 4589c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentValues values = new ContentValues(); 4599c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentResolver cr = context.getContentResolver(); 460f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 4619c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato item.onAddToDatabase(values); 462d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen item.updateValuesWithCoordinates(values, item.cellX, item.cellY); 463aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 464a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sWorker.post(new Runnable() { 465a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka public void run() { 466a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka cr.update(LauncherSettings.Favorites.getContentUri(item.id, false), 467a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka values, null, null); 468a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka final ItemInfo modelItem = sItemsIdMap.get(item.id); 469a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka if (item != modelItem) { 470a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // the modelItem needs to match up perfectly with item if our model is to be 471a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka // consistent with the database-- for now, just require modelItem == item 472c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung String msg = "item: " + ((item != null) ? item.toString() : "null") + 473c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung "modelItem: " + ((modelItem != null) ? modelItem.toString() : "null") + 474c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung "Error: ItemInfo passed to updateItemInDatabase doesn't match original"; 475c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung throw new RuntimeException(msg); 476a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 477a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 478a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka }); 47931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 48031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 4819c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 4829c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Removes the specified item from the database 4839c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * @param context 4849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * @param item 4859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 486a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka static void deleteItemFromDatabase(Context context, final ItemInfo item) { 4879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentResolver cr = context.getContentResolver(); 48873013bf94f49ffbacba2b8300f6a2dd4eeebbd13Brad Fitzpatrick final Uri uriToDelete = LauncherSettings.Favorites.getContentUri(item.id, false); 489700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick sWorker.post(new Runnable() { 490700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick public void run() { 491700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick cr.delete(uriToDelete, null, null); 492a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka switch (item.itemType) { 493a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: 494a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sFolders.remove(item.id); 4954eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen sWorkspaceItems.remove(item); 496a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka break; 497a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: 498a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: 4994eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen sWorkspaceItems.remove(item); 500a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka break; 501a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: 502a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sAppWidgets.remove((LauncherAppWidgetInfo) item); 503a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka break; 504a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 505a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sItemsIdMap.remove(item.id); 506b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung sDbIconCache.remove(item); 507700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick } 508700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick }); 5099c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 510f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 5119c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 5129c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Remove the contents of the specified folder from the database 5139c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 514a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka static void deleteFolderContentsFromDatabase(Context context, final FolderInfo info) { 5159c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato final ContentResolver cr = context.getContentResolver(); 516f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 517a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sWorker.post(new Runnable() { 518afb01ee74243cede19088e694ca82cea5983c603Adam Cohen public void run() { 519afb01ee74243cede19088e694ca82cea5983c603Adam Cohen cr.delete(LauncherSettings.Favorites.getContentUri(info.id, false), null, null); 520a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sItemsIdMap.remove(info.id); 521a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sFolders.remove(info.id); 522c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung sDbIconCache.remove(info); 5234eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen sWorkspaceItems.remove(info); 524a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka 5259932a9b1e66fed4b5f38ce50f13d56331bbdcd7eAdam Cohen cr.delete(LauncherSettings.Favorites.CONTENT_URI_NO_NOTIFICATION, 526afb01ee74243cede19088e694ca82cea5983c603Adam Cohen LauncherSettings.Favorites.CONTAINER + "=" + info.id, null); 527a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka for (ItemInfo childInfo : info.contents) { 528a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sItemsIdMap.remove(childInfo.id); 529c22a54d4263086f8f8d5844a33550c77b09b38bdWinson Chung sDbIconCache.remove(childInfo); 530a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka } 531afb01ee74243cede19088e694ca82cea5983c603Adam Cohen } 532afb01ee74243cede19088e694ca82cea5983c603Adam Cohen }); 5339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 534f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 5359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 5369c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Set this as the current Launcher activity object for the loader. 5379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 5389c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void initialize(Callbacks callbacks) { 5399c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato synchronized (mLock) { 5409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mCallbacks = new WeakReference<Callbacks>(callbacks); 541f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 542f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 543f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 5441d8e7bbe09e130af5e9534cc26a65f623be7a424Joe Onorato /** 5459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * Call from the handler for ACTION_PACKAGE_ADDED, ACTION_PACKAGE_REMOVED and 5469c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * ACTION_PACKAGE_CHANGED. 5479c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 548cb1a4778686a46c46d8dc88b6c83674f6fac6592Narayan Kamath @Override 549f99f8c1ad265cf7bea7e30476911d730b7d0eaaeJoe Onorato public void onReceive(Context context, Intent intent) { 5503611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) Log.d(TAG, "onReceive intent=" + intent); 551aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 5523611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final String action = intent.getAction(); 5539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 5543611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (Intent.ACTION_PACKAGE_CHANGED.equals(action) 5553611578579b4bfb25616085dafdb1a45207394f9Joe Onorato || Intent.ACTION_PACKAGE_REMOVED.equals(action) 5563611578579b4bfb25616085dafdb1a45207394f9Joe Onorato || Intent.ACTION_PACKAGE_ADDED.equals(action)) { 5573611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final String packageName = intent.getData().getSchemeSpecificPart(); 5583611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); 559f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 5603611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int op = PackageUpdatedTask.OP_NONE; 56164e6be78dc72e1a89fe8fb95c502586f9260df28Joe Onorato 5623611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (packageName == null || packageName.length() == 0) { 5633611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // they sent us a bad intent 5643611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return; 5653611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 56656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato 5673611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (Intent.ACTION_PACKAGE_CHANGED.equals(action)) { 5683611578579b4bfb25616085dafdb1a45207394f9Joe Onorato op = PackageUpdatedTask.OP_UPDATE; 5693611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { 5703611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (!replacing) { 5713611578579b4bfb25616085dafdb1a45207394f9Joe Onorato op = PackageUpdatedTask.OP_REMOVE; 57256d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 5733611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // else, we are replacing the package, so a PACKAGE_ADDED will be sent 5743611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // later, we will update the package at this time 5753611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { 5763611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (!replacing) { 5773611578579b4bfb25616085dafdb1a45207394f9Joe Onorato op = PackageUpdatedTask.OP_ADD; 5783611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else { 5793611578579b4bfb25616085dafdb1a45207394f9Joe Onorato op = PackageUpdatedTask.OP_UPDATE; 58056d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 5813611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 58256d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato 5833611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (op != PackageUpdatedTask.OP_NONE) { 5843611578579b4bfb25616085dafdb1a45207394f9Joe Onorato enqueuePackageUpdated(new PackageUpdatedTask(op, new String[] { packageName })); 585f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 586f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 5873611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) { 588cec583352cd76bd4319d56beec03a4820a3e9d58Joe Onorato // First, schedule to add these apps back in. 589cec583352cd76bd4319d56beec03a4820a3e9d58Joe Onorato String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 590cec583352cd76bd4319d56beec03a4820a3e9d58Joe Onorato enqueuePackageUpdated(new PackageUpdatedTask(PackageUpdatedTask.OP_ADD, packages)); 591cec583352cd76bd4319d56beec03a4820a3e9d58Joe Onorato // Then, rebind everything. 592e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato startLoaderFromBackground(); 5933611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { 5943611578579b4bfb25616085dafdb1a45207394f9Joe Onorato String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 5953611578579b4bfb25616085dafdb1a45207394f9Joe Onorato enqueuePackageUpdated(new PackageUpdatedTask( 5963611578579b4bfb25616085dafdb1a45207394f9Joe Onorato PackageUpdatedTask.OP_UNAVAILABLE, packages)); 597e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato } else if (Intent.ACTION_LOCALE_CHANGED.equals(action)) { 598e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato // If we have changed locale we need to clear out the labels in all apps. 599e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato // Do this here because if the launcher activity is running it will be restarted. 600e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato // If it's not running startLoaderFromBackground will merely tell it that it needs 601e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato // to reload. Either way, mAllAppsLoaded will be cleared so it re-reads everything 602e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato // next time. 603e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato mAllAppsLoaded = false; 604288a36b563801a26d00084cb823435a3ba4cb76cMichael Jurka mWorkspaceLoaded = false; 605e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato startLoaderFromBackground(); 606cbf7c4d50ce2609518640c3f590f6df435edabaeWinson Chung } else if (SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED.equals(action) || 607cbf7c4d50ce2609518640c3f590f6df435edabaeWinson Chung SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED.equals(action)) { 608ec9788e6819a24ef5dc8fe4edf44f280e4a703feMichael Jurka if (mCallbacks != null) { 609ec9788e6819a24ef5dc8fe4edf44f280e4a703feMichael Jurka Callbacks callbacks = mCallbacks.get(); 610ec9788e6819a24ef5dc8fe4edf44f280e4a703feMichael Jurka if (callbacks != null) { 611ec9788e6819a24ef5dc8fe4edf44f280e4a703feMichael Jurka callbacks.bindSearchablesChanged(); 612ec9788e6819a24ef5dc8fe4edf44f280e4a703feMichael Jurka } 613cfdf7ee64db8820d91a1cd82bf7b961fb2083dceWinson Chung } 614e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato } 615e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato } 616e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato 617e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato /** 618e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato * When the launcher is in the background, it's possible for it to miss paired 619e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato * configuration changes. So whenever we trigger the loader from the background 620e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato * tell the launcher that it needs to re-run the loader when it comes back instead 621e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato * of doing it now. 622e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato */ 623e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato public void startLoaderFromBackground() { 624e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato boolean runLoader = false; 625e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato if (mCallbacks != null) { 626e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato Callbacks callbacks = mCallbacks.get(); 627e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato if (callbacks != null) { 628e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato // Only actually run the loader if they're not paused. 629e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato if (!callbacks.setLoadOnResume()) { 630e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato runLoader = true; 631e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato } 632e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato } 633e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato } 634e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato if (runLoader) { 635e9ad59eba6d8ffd2cbf28520c237ccefd291a33cJoe Onorato startLoader(mApp, false); 636f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 6373611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 638f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 6393611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void startLoader(Context context, boolean isLaunching) { 6403611578579b4bfb25616085dafdb1a45207394f9Joe Onorato synchronized (mLock) { 6413611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 6423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "startLoader isLaunching=" + isLaunching); 6433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 644843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler 6453611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Don't bother to start the thread if we know it's not going to do anything 6463611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mCallbacks != null && mCallbacks.get() != null) { 6473611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // If there is already one running, tell it to stop. 6483611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LoaderTask oldTask = mLoaderTask; 6493611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (oldTask != null) { 6503611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (oldTask.isLaunching()) { 6513611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // don't downgrade isLaunching if we're already running 6523611578579b4bfb25616085dafdb1a45207394f9Joe Onorato isLaunching = true; 6539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 6543611578579b4bfb25616085dafdb1a45207394f9Joe Onorato oldTask.stopLocked(); 6559c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 6563611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mLoaderTask = new LoaderTask(context, isLaunching); 657700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick sWorker.post(mLoaderTask); 658b132a97cb7ee976bc54370fd0d5899876eaaf33aRomain Guy } 659b132a97cb7ee976bc54370fd0d5899876eaaf33aRomain Guy } 6603611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 661b132a97cb7ee976bc54370fd0d5899876eaaf33aRomain Guy 6623611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void stopLoader() { 6633611578579b4bfb25616085dafdb1a45207394f9Joe Onorato synchronized (mLock) { 6643611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mLoaderTask != null) { 6653611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mLoaderTask.stopLocked(); 6669c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 667f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 6683611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 669b132a97cb7ee976bc54370fd0d5899876eaaf33aRomain Guy 670c57b7a8233d32c6dd8de5057c570afe3f50e3ef2Michael Jurka public boolean isAllAppsLoaded() { 671c57b7a8233d32c6dd8de5057c570afe3f50e3ef2Michael Jurka return mAllAppsLoaded; 672c57b7a8233d32c6dd8de5057c570afe3f50e3ef2Michael Jurka } 673c57b7a8233d32c6dd8de5057c570afe3f50e3ef2Michael Jurka 6743611578579b4bfb25616085dafdb1a45207394f9Joe Onorato /** 6753611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * Runnable for the thread that loads the contents of the launcher: 6763611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * - workspace icons 6773611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * - widgets 6783611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * - all apps icons 6793611578579b4bfb25616085dafdb1a45207394f9Joe Onorato */ 6803611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private class LoaderTask implements Runnable { 6813611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private Context mContext; 6823611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private Thread mWaitThread; 6833611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private boolean mIsLaunching; 6843611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private boolean mStopped; 6853611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private boolean mLoadAndBindStepFinished; 686c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung private HashMap<Object, CharSequence> mLabelCache; 6873611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 6883611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LoaderTask(Context context, boolean isLaunching) { 6893611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mContext = context; 6903611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mIsLaunching = isLaunching; 691c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung mLabelCache = new HashMap<Object, CharSequence>(); 6923611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 693f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 6943611578579b4bfb25616085dafdb1a45207394f9Joe Onorato boolean isLaunching() { 6953611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return mIsLaunching; 6963611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 697f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 6983611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private void loadAndBindWorkspace() { 6993611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Load the workspace 7003611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 7013611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "loadAndBindWorkspace mWorkspaceLoaded=" + mWorkspaceLoaded); 7023611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 703288a36b563801a26d00084cb823435a3ba4cb76cMichael Jurka 704a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka if (!mWorkspaceLoaded) { 7053611578579b4bfb25616085dafdb1a45207394f9Joe Onorato loadWorkspace(); 7063611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mStopped) { 7073611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return; 7089c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 7093611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mWorkspaceLoaded = true; 7103611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 711cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato 7123611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Bind the workspace 7133611578579b4bfb25616085dafdb1a45207394f9Joe Onorato bindWorkspace(); 7143611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 715f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 7163611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private void waitForIdle() { 7173611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Wait until the either we're stopped or the other threads are done. 7183611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // This way we don't start loading all apps until the workspace has settled 7193611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // down. 7203611578579b4bfb25616085dafdb1a45207394f9Joe Onorato synchronized (LoaderTask.this) { 7213611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final long workspaceWaitTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; 722843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler 7233611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.postIdle(new Runnable() { 7243611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 7253611578579b4bfb25616085dafdb1a45207394f9Joe Onorato synchronized (LoaderTask.this) { 7263611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mLoadAndBindStepFinished = true; 7273611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 7283611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "done with previous binding step"); 7299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 7303611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LoaderTask.this.notify(); 7319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 7329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 7333611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 7343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 7353611578579b4bfb25616085dafdb1a45207394f9Joe Onorato while (!mStopped && !mLoadAndBindStepFinished) { 7363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato try { 7373611578579b4bfb25616085dafdb1a45207394f9Joe Onorato this.wait(); 7383611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } catch (InterruptedException ex) { 7393611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Ignore 7409c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 7413611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 7423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 7433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "waited " 744aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung + (SystemClock.uptimeMillis()-workspaceWaitTime) 7453611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + "ms for previous step to finish binding"); 7469c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 747843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } 7483611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 749f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 7503611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 7513611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Optimize for end-user experience: if the Launcher is up and // running with the 7523611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // All Apps interface in the foreground, load All Apps first. Otherwise, load the 7533611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // workspace first (default). 7543611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Callbacks cbk = mCallbacks.get(); 7553611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final boolean loadWorkspaceFirst = cbk != null ? (!cbk.isAllAppsVisible()) : true; 756843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler 7573611578579b4bfb25616085dafdb1a45207394f9Joe Onorato keep_running: { 758843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler // Elevate priority when Home launches for the first time to avoid 759843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler // starving at boot time. Staring at a blank home is not cool. 760dca661236c73ecd819cfea964c6f8170e5cc40aeDaniel Sandler synchronized (mLock) { 761aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung if (DEBUG_LOADERS) Log.d(TAG, "Setting thread priority to " + 762aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung (mIsLaunching ? "DEFAULT" : "BACKGROUND")); 763843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler android.os.Process.setThreadPriority(mIsLaunching 764843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler ? Process.THREAD_PRIORITY_DEFAULT : Process.THREAD_PRIORITY_BACKGROUND); 765dca661236c73ecd819cfea964c6f8170e5cc40aeDaniel Sandler } 766843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (loadWorkspaceFirst) { 767843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (DEBUG_LOADERS) Log.d(TAG, "step 1: loading workspace"); 768843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler loadAndBindWorkspace(); 769843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } else { 770843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (DEBUG_LOADERS) Log.d(TAG, "step 1: special: loading all apps"); 771cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato loadAndBindAllApps(); 7729c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 773843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler 7743611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mStopped) { 7753611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break keep_running; 7763611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 7773611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 7783611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Whew! Hard work done. Slow us down, and wait until the UI thread has 7793611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // settled down. 7809c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato synchronized (mLock) { 781843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (mIsLaunching) { 782aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung if (DEBUG_LOADERS) Log.d(TAG, "Setting thread priority to BACKGROUND"); 783843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); 7849c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 7859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 7863611578579b4bfb25616085dafdb1a45207394f9Joe Onorato waitForIdle(); 787f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 788843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler // second step 789843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (loadWorkspaceFirst) { 790843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (DEBUG_LOADERS) Log.d(TAG, "step 2: loading all apps"); 791cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato loadAndBindAllApps(); 792843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } else { 793843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler if (DEBUG_LOADERS) Log.d(TAG, "step 2: special: loading workspace"); 794843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler loadAndBindWorkspace(); 795843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } 7963611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 797843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler 798aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung 799aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung // Update the saved icons if necessary 800aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung if (DEBUG_LOADERS) Log.d(TAG, "Comparing loaded icons to database icons"); 801b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung for (Object key : sDbIconCache.keySet()) { 802b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung updateSavedIcon(mContext, (ShortcutInfo) key, sDbIconCache.get(key)); 803aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung } 804b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung sDbIconCache.clear(); 805aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung 8063611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Clear out this reference, otherwise we end up holding it until all of the 8073611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // callback runnables are done. 8083611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mContext = null; 809f3d5ea926d4dd1a739b9d3816543728af723cc26Joe Onorato 8103611578579b4bfb25616085dafdb1a45207394f9Joe Onorato synchronized (mLock) { 8113611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // If we are still the last one to be scheduled, remove ourselves. 8123611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mLoaderTask == this) { 8133611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mLoaderTask = null; 814843e860e8ebab96ff70988f2829fac38afd9d937Daniel Sandler } 8153611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 8163611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 817f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 8183611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void stopLocked() { 8193611578579b4bfb25616085dafdb1a45207394f9Joe Onorato synchronized (LoaderTask.this) { 8203611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mStopped = true; 8213611578579b4bfb25616085dafdb1a45207394f9Joe Onorato this.notify(); 822f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 8233611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 824f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 8253611578579b4bfb25616085dafdb1a45207394f9Joe Onorato /** 8263611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * Gets the callbacks object. If we've been stopped, or if the launcher object 8273611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * has somehow been garbage collected, return null instead. Pass in the Callbacks 8283611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * object that was around when the deferred message was scheduled, and if there's 8293611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * a new Callbacks object around then also return null. This will save us from 8303611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * calling onto it with data that will be ignored. 8313611578579b4bfb25616085dafdb1a45207394f9Joe Onorato */ 8323611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Callbacks tryGetCallbacks(Callbacks oldCallbacks) { 8333611578579b4bfb25616085dafdb1a45207394f9Joe Onorato synchronized (mLock) { 8343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mStopped) { 8353611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return null; 8363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 837ac03330c9684f98b4dd067a87ca70d3e0be1cfedJoe Onorato 8383611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mCallbacks == null) { 8393611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return null; 8403611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 841f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 8423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Callbacks callbacks = mCallbacks.get(); 8433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (callbacks != oldCallbacks) { 8443611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return null; 8453611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 8463611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (callbacks == null) { 8473611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.w(TAG, "no mCallbacks"); 8483611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return null; 8499c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 8503611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 8513611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return callbacks; 852f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 8533611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 854f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 8553611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // check & update map of what's occupied; used to discard overlapping/invalid items 8563611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private boolean checkItemPlacement(ItemInfo occupied[][][], ItemInfo item) { 857f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung int containerIndex = item.screen; 858f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 859f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung // We use the last index to refer to the hotseat 860f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung containerIndex = Launcher.SCREEN_COUNT; 861f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung // Return early if we detect that an item is under the hotseat button 862f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung if (Hotseat.isAllAppsButtonRank(item.screen)) { 863f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung return false; 864f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung } 865f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung } else if (item.container != LauncherSettings.Favorites.CONTAINER_DESKTOP) { 866f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung // Skip further checking if it is not the hotseat or workspace container 8673611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return true; 8683611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 869f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung 8703611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int x = item.cellX; x < (item.cellX+item.spanX); x++) { 8713611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int y = item.cellY; y < (item.cellY+item.spanY); y++) { 872f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung if (occupied[containerIndex][x][y] != null) { 8733611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.e(TAG, "Error loading shortcut " + item 874f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung + " into cell (" + containerIndex + "-" + item.screen + ":" 8753611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + x + "," + y 876aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung + ") occupied by " 877f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung + occupied[containerIndex][x][y]); 8783611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return false; 8798802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler } 8808802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler } 8813611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 8823611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int x = item.cellX; x < (item.cellX+item.spanX); x++) { 8833611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int y = item.cellY; y < (item.cellY+item.spanY); y++) { 884f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung occupied[containerIndex][x][y] = item; 8858802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler } 8868802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler } 887f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung 8883611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return true; 8893611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 8908802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler 8913611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private void loadWorkspace() { 8923611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final long t = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; 893f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 8943611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Context context = mContext; 8953611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final ContentResolver contentResolver = context.getContentResolver(); 8963611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final PackageManager manager = context.getPackageManager(); 8973611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final AppWidgetManager widgets = AppWidgetManager.getInstance(context); 8983611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final boolean isSafeMode = manager.isSafeMode(); 899f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 9004eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen sWorkspaceItems.clear(); 901a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sAppWidgets.clear(); 902a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sFolders.clear(); 903a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sItemsIdMap.clear(); 904b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung sDbIconCache.clear(); 9053c2f7e105d8daab439bff2c362a727ad348d8a44Joe Onorato 9063611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final ArrayList<Long> itemsToRemove = new ArrayList<Long>(); 9075c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy 9083611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Cursor c = contentResolver.query( 9093611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.CONTENT_URI, null, null, null, null); 910f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 911f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung // +1 for the hotseat (it can be larger than the workspace) 912d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen final ItemInfo occupied[][][] = 913f30ad5f1bf33baceeca6b770464fb543b58af985Winson Chung new ItemInfo[Launcher.SCREEN_COUNT + 1][mCellCountX + 1][mCellCountY + 1]; 9148802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler 9153611578579b4bfb25616085dafdb1a45207394f9Joe Onorato try { 9163611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites._ID); 9173611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int intentIndex = c.getColumnIndexOrThrow 9183611578579b4bfb25616085dafdb1a45207394f9Joe Onorato (LauncherSettings.Favorites.INTENT); 9193611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int titleIndex = c.getColumnIndexOrThrow 9203611578579b4bfb25616085dafdb1a45207394f9Joe Onorato (LauncherSettings.Favorites.TITLE); 9213611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int iconTypeIndex = c.getColumnIndexOrThrow( 9223611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.ICON_TYPE); 9233611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int iconIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.ICON); 9243611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int iconPackageIndex = c.getColumnIndexOrThrow( 9253611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.ICON_PACKAGE); 9263611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int iconResourceIndex = c.getColumnIndexOrThrow( 9273611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.ICON_RESOURCE); 9283611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int containerIndex = c.getColumnIndexOrThrow( 9293611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.CONTAINER); 9303611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int itemTypeIndex = c.getColumnIndexOrThrow( 9313611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.ITEM_TYPE); 9323611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int appWidgetIdIndex = c.getColumnIndexOrThrow( 9333611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.APPWIDGET_ID); 9343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int screenIndex = c.getColumnIndexOrThrow( 9353611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.SCREEN); 9363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int cellXIndex = c.getColumnIndexOrThrow 9373611578579b4bfb25616085dafdb1a45207394f9Joe Onorato (LauncherSettings.Favorites.CELLX); 9383611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int cellYIndex = c.getColumnIndexOrThrow 9393611578579b4bfb25616085dafdb1a45207394f9Joe Onorato (LauncherSettings.Favorites.CELLY); 9403611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int spanXIndex = c.getColumnIndexOrThrow 9413611578579b4bfb25616085dafdb1a45207394f9Joe Onorato (LauncherSettings.Favorites.SPANX); 9423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int spanYIndex = c.getColumnIndexOrThrow( 9433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.SPANY); 9443611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int uriIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites.URI); 9453611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int displayModeIndex = c.getColumnIndexOrThrow( 9463611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.DISPLAY_MODE); 9473611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 9483611578579b4bfb25616085dafdb1a45207394f9Joe Onorato ShortcutInfo info; 9493611578579b4bfb25616085dafdb1a45207394f9Joe Onorato String intentDescription; 9503611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherAppWidgetInfo appWidgetInfo; 9513611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int container; 9523611578579b4bfb25616085dafdb1a45207394f9Joe Onorato long id; 9533611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Intent intent; 9543611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 9553611578579b4bfb25616085dafdb1a45207394f9Joe Onorato while (!mStopped && c.moveToNext()) { 9563611578579b4bfb25616085dafdb1a45207394f9Joe Onorato try { 9573611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int itemType = c.getInt(itemTypeIndex); 9583611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 9593611578579b4bfb25616085dafdb1a45207394f9Joe Onorato switch (itemType) { 9603611578579b4bfb25616085dafdb1a45207394f9Joe Onorato case LauncherSettings.Favorites.ITEM_TYPE_APPLICATION: 9613611578579b4bfb25616085dafdb1a45207394f9Joe Onorato case LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT: 9623611578579b4bfb25616085dafdb1a45207394f9Joe Onorato intentDescription = c.getString(intentIndex); 9633611578579b4bfb25616085dafdb1a45207394f9Joe Onorato try { 9643611578579b4bfb25616085dafdb1a45207394f9Joe Onorato intent = Intent.parseUri(intentDescription, 0); 9653611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } catch (URISyntaxException e) { 9663611578579b4bfb25616085dafdb1a45207394f9Joe Onorato continue; 9673611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 9683611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 9693611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { 9703611578579b4bfb25616085dafdb1a45207394f9Joe Onorato info = getShortcutInfo(manager, intent, context, c, iconIndex, 971c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung titleIndex, mLabelCache); 9723611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else { 9733611578579b4bfb25616085dafdb1a45207394f9Joe Onorato info = getShortcutInfo(c, context, iconTypeIndex, 9743611578579b4bfb25616085dafdb1a45207394f9Joe Onorato iconPackageIndex, iconResourceIndex, iconIndex, 9753611578579b4bfb25616085dafdb1a45207394f9Joe Onorato titleIndex); 9763611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 9773611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 9783611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (info != null) { 9793611578579b4bfb25616085dafdb1a45207394f9Joe Onorato info.intent = intent; 9803611578579b4bfb25616085dafdb1a45207394f9Joe Onorato info.id = c.getLong(idIndex); 9813611578579b4bfb25616085dafdb1a45207394f9Joe Onorato container = c.getInt(containerIndex); 9823611578579b4bfb25616085dafdb1a45207394f9Joe Onorato info.container = container; 9833611578579b4bfb25616085dafdb1a45207394f9Joe Onorato info.screen = c.getInt(screenIndex); 984d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen info.cellX = c.getInt(cellXIndex); 985d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen info.cellY = c.getInt(cellYIndex); 9863611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 9873611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // check & update map of what's occupied 9883611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (!checkItemPlacement(occupied, info)) { 9893611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 9909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 991f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 9923611578579b4bfb25616085dafdb1a45207394f9Joe Onorato switch (container) { 9933611578579b4bfb25616085dafdb1a45207394f9Joe Onorato case LauncherSettings.Favorites.CONTAINER_DESKTOP: 9943d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung case LauncherSettings.Favorites.CONTAINER_HOTSEAT: 9954eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen sWorkspaceItems.add(info); 9963611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 9973611578579b4bfb25616085dafdb1a45207394f9Joe Onorato default: 9983611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Item is in a user folder 999df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen FolderInfo folderInfo = 1000a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka findOrMakeFolder(sFolders, container); 10013611578579b4bfb25616085dafdb1a45207394f9Joe Onorato folderInfo.add(info); 10023611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 10039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 1004a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sItemsIdMap.put(info.id, info); 100517a8922e2ab2ad599df3750d398a095473ccd1b4Joe Onorato 100617a8922e2ab2ad599df3750d398a095473ccd1b4Joe Onorato // now that we've loaded everthing re-save it with the 100717a8922e2ab2ad599df3750d398a095473ccd1b4Joe Onorato // icon in case it disappears somehow. 1008b1094bd9630f659cc606853b8a244b6a6b6c6943Winson Chung queueIconToBeChecked(sDbIconCache, info, c, iconIndex); 10093611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else { 10103611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Failed to load the shortcut, probably because the 10113611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // activity manager couldn't resolve it (maybe the app 10123611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // was uninstalled), or the db row was somehow screwed up. 10133611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Delete it. 10143611578579b4bfb25616085dafdb1a45207394f9Joe Onorato id = c.getLong(idIndex); 10153611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.e(TAG, "Error loading shortcut " + id + ", removing it"); 10163611578579b4bfb25616085dafdb1a45207394f9Joe Onorato contentResolver.delete(LauncherSettings.Favorites.getContentUri( 10173611578579b4bfb25616085dafdb1a45207394f9Joe Onorato id, false), null, null); 10183611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 10193611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 1020f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project 1021df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen case LauncherSettings.Favorites.ITEM_TYPE_FOLDER: 10223611578579b4bfb25616085dafdb1a45207394f9Joe Onorato id = c.getLong(idIndex); 1023a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka FolderInfo folderInfo = findOrMakeFolder(sFolders, id); 10249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato 1025aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung folderInfo.title = c.getString(titleIndex); 10263611578579b4bfb25616085dafdb1a45207394f9Joe Onorato folderInfo.id = id; 10273611578579b4bfb25616085dafdb1a45207394f9Joe Onorato container = c.getInt(containerIndex); 10283611578579b4bfb25616085dafdb1a45207394f9Joe Onorato folderInfo.container = container; 10293611578579b4bfb25616085dafdb1a45207394f9Joe Onorato folderInfo.screen = c.getInt(screenIndex); 1030d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen folderInfo.cellX = c.getInt(cellXIndex); 1031d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen folderInfo.cellY = c.getInt(cellYIndex); 10328802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler 10333611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // check & update map of what's occupied 10343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (!checkItemPlacement(occupied, folderInfo)) { 10359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato break; 10363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 10373611578579b4bfb25616085dafdb1a45207394f9Joe Onorato switch (container) { 10383611578579b4bfb25616085dafdb1a45207394f9Joe Onorato case LauncherSettings.Favorites.CONTAINER_DESKTOP: 10393d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung case LauncherSettings.Favorites.CONTAINER_HOTSEAT: 10404eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen sWorkspaceItems.add(folderInfo); 10413611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 10423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 10433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 1044a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sItemsIdMap.put(folderInfo.id, folderInfo); 1045a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sFolders.put(folderInfo.id, folderInfo); 10463611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 10473611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 10483611578579b4bfb25616085dafdb1a45207394f9Joe Onorato case LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET: 10493611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Read all Launcher-specific widget details 10503611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int appWidgetId = c.getInt(appWidgetIdIndex); 10513611578579b4bfb25616085dafdb1a45207394f9Joe Onorato id = c.getLong(idIndex); 10523611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 10533611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final AppWidgetProviderInfo provider = 10543611578579b4bfb25616085dafdb1a45207394f9Joe Onorato widgets.getAppWidgetInfo(appWidgetId); 1055aafa03cbb925c74be1c13f8bb99d928be429e62fWinson Chung 10563611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (!isSafeMode && (provider == null || provider.provider == null || 10573611578579b4bfb25616085dafdb1a45207394f9Joe Onorato provider.provider.getPackageName() == null)) { 10583611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.e(TAG, "Deleting widget that isn't installed anymore: id=" 10593611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + id + " appWidgetId=" + appWidgetId); 10603611578579b4bfb25616085dafdb1a45207394f9Joe Onorato itemsToRemove.add(id); 10613611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else { 10623611578579b4bfb25616085dafdb1a45207394f9Joe Onorato appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId); 10633611578579b4bfb25616085dafdb1a45207394f9Joe Onorato appWidgetInfo.id = id; 10643611578579b4bfb25616085dafdb1a45207394f9Joe Onorato appWidgetInfo.screen = c.getInt(screenIndex); 1065d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen appWidgetInfo.cellX = c.getInt(cellXIndex); 1066d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen appWidgetInfo.cellY = c.getInt(cellYIndex); 1067d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen appWidgetInfo.spanX = c.getInt(spanXIndex); 1068d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen appWidgetInfo.spanY = c.getInt(spanYIndex); 1069ad72e1705c32da463a552f2283ae467dc15a4a34Joe Onorato 10703611578579b4bfb25616085dafdb1a45207394f9Joe Onorato container = c.getInt(containerIndex); 10713d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung if (container != LauncherSettings.Favorites.CONTAINER_DESKTOP && 10723d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung container != LauncherSettings.Favorites.CONTAINER_HOTSEAT) { 10733611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.e(TAG, "Widget found where container " 10743d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung + "!= CONTAINER_DESKTOP nor CONTAINER_HOTSEAT - ignoring!"); 10753611578579b4bfb25616085dafdb1a45207394f9Joe Onorato continue; 10769c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 10773611578579b4bfb25616085dafdb1a45207394f9Joe Onorato appWidgetInfo.container = c.getInt(containerIndex); 10788802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler 10793611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // check & update map of what's occupied 10803611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (!checkItemPlacement(occupied, appWidgetInfo)) { 10813611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 10829c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 1083a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sItemsIdMap.put(appWidgetInfo.id, appWidgetInfo); 1084a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka sAppWidgets.add(appWidgetInfo); 10859c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 10863611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 10879c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 10883611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } catch (Exception e) { 10893611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.w(TAG, "Desktop items loading interrupted:", e); 10909c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 10919c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 10923611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } finally { 10933611578579b4bfb25616085dafdb1a45207394f9Joe Onorato c.close(); 10943611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 10955c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy 10963611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (itemsToRemove.size() > 0) { 10973611578579b4bfb25616085dafdb1a45207394f9Joe Onorato ContentProviderClient client = contentResolver.acquireContentProviderClient( 10983611578579b4bfb25616085dafdb1a45207394f9Joe Onorato LauncherSettings.Favorites.CONTENT_URI); 10993611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Remove dead items 11003611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (long id : itemsToRemove) { 11013611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 11023611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "Removed id = " + id); 11033611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 11043611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Don't notify content observers 11053611578579b4bfb25616085dafdb1a45207394f9Joe Onorato try { 11063611578579b4bfb25616085dafdb1a45207394f9Joe Onorato client.delete(LauncherSettings.Favorites.getContentUri(id, false), 11073611578579b4bfb25616085dafdb1a45207394f9Joe Onorato null, null); 11083611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } catch (RemoteException e) { 11093611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.w(TAG, "Could not remove id = " + id); 11105c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy } 11115c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy } 11123611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 11135c16f3ecd6b47bff3abbe40deb3d39c66a3b0012Romain Guy 11143611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 11153611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "loaded workspace in " + (SystemClock.uptimeMillis()-t) + "ms"); 11163611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "workspace layout: "); 1117d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen for (int y = 0; y < mCellCountY; y++) { 11183611578579b4bfb25616085dafdb1a45207394f9Joe Onorato String line = ""; 11193611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int s = 0; s < Launcher.SCREEN_COUNT; s++) { 11203611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (s > 0) { 11213611578579b4bfb25616085dafdb1a45207394f9Joe Onorato line += " | "; 11223611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 1123d22015cd37ea6ef53762eca5be57daca123ff607Adam Cohen for (int x = 0; x < mCellCountX; x++) { 11243611578579b4bfb25616085dafdb1a45207394f9Joe Onorato line += ((occupied[s][x][y] != null) ? "#" : "."); 11258802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler } 11268802e960495e61803c18ea3dda2e30ef0a611d8fDaniel Sandler } 11273611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "[ " + line + " ]"); 1128a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato } 11299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 11303611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 113131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 11323611578579b4bfb25616085dafdb1a45207394f9Joe Onorato /** 11333611578579b4bfb25616085dafdb1a45207394f9Joe Onorato * Read everything out of our database. 11343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato */ 11353611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private void bindWorkspace() { 11363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final long t = SystemClock.uptimeMillis(); 11373611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 11383611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Don't use these two variables in any of the callback runnables. 11393611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Otherwise we hold a reference to them. 11403611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Callbacks oldCallbacks = mCallbacks.get(); 11413611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (oldCallbacks == null) { 11423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // This launcher has exited and nobody bothered to tell us. Just bail. 11433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.w(TAG, "LoaderTask running with no launcher"); 11443611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return; 11453611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 114631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 11473611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int N; 11483611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Tell the workspace that we're about to start firing items at it 11493611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 11503611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 11513611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Callbacks callbacks = tryGetCallbacks(oldCallbacks); 11523611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (callbacks != null) { 11533611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.startBinding(); 11543611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 11553611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 11563611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 11573611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Add the items to the workspace. 11584eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen N = sWorkspaceItems.size(); 11593611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int i=0; i<N; i+=ITEMS_CHUNK) { 11603611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int start = i; 11613611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int chunkSize = (i+ITEMS_CHUNK <= N) ? ITEMS_CHUNK : (N-i); 11629c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mHandler.post(new Runnable() { 11639c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void run() { 1164c131b74922e6323331c374856bda830010d761c8Joe Onorato Callbacks callbacks = tryGetCallbacks(oldCallbacks); 11659c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (callbacks != null) { 11664eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen callbacks.bindItems(sWorkspaceItems, start, start+chunkSize); 11679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 11689c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 11699c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato }); 11703611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 11713611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 11723611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 11733611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Callbacks callbacks = tryGetCallbacks(oldCallbacks); 11743611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (callbacks != null) { 1175a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka callbacks.bindFolders(sFolders); 11763611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 11773611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 11783611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 11793611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Wait until the queue goes empty. 11803611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 11813611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 11823611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 11833611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "Going to start binding widgets soon."); 11843611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 11853611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 11863611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 11873611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Bind the widgets, one at a time. 11883611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // WARNING: this is calling into the workspace from the background thread, 11893611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // but since getCurrentScreen() just returns the int, we should be okay. This 11903611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // is just a hint for the order, and if it's wrong, we'll be okay. 11913611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // TODO: instead, we should have that push the current screen into here. 11923611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int currentScreen = oldCallbacks.getCurrentWorkspaceScreen(); 1193a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka N = sAppWidgets.size(); 11943611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // once for the current screen 11953611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int i=0; i<N; i++) { 1196a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka final LauncherAppWidgetInfo widget = sAppWidgets.get(i); 11973611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (widget.screen == currentScreen) { 11989c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato mHandler.post(new Runnable() { 11999c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public void run() { 1200c131b74922e6323331c374856bda830010d761c8Joe Onorato Callbacks callbacks = tryGetCallbacks(oldCallbacks); 12019c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (callbacks != null) { 12023611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.bindAppWidget(widget); 12039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12049c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12059c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato }); 12069c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12073611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12083611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // once for the other screens 12093611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int i=0; i<N; i++) { 1210a8c760d395e1d2a78522427738302fbca3a72453Michael Jurka final LauncherAppWidgetInfo widget = sAppWidgets.get(i); 12113611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (widget.screen != currentScreen) { 12123611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 12133611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 12143611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Callbacks callbacks = tryGetCallbacks(oldCallbacks); 12153611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (callbacks != null) { 12163611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.bindAppWidget(widget); 12179c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12183611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12193611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 12203611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12213611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12223611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Tell the workspace that we're done. 12233611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 12243611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 12253611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Callbacks callbacks = tryGetCallbacks(oldCallbacks); 12263611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (callbacks != null) { 12273611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.finishBindingItems(); 12289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12303611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 12313611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // If we're profiling, this is the last thing in the queue. 12323611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 12333611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 12343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 12353611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "bound workspace in " 12363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + (SystemClock.uptimeMillis()-t) + "ms"); 12379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12389c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12393611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 12403611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12413611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 12423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private void loadAndBindAllApps() { 12433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 12443611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "loadAndBindAllApps mAllAppsLoaded=" + mAllAppsLoaded); 12453611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12463611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (!mAllAppsLoaded) { 12473611578579b4bfb25616085dafdb1a45207394f9Joe Onorato loadAllAppsByBatch(); 12483611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mStopped) { 12493611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return; 12503611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12513611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mAllAppsLoaded = true; 12523611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else { 12533611578579b4bfb25616085dafdb1a45207394f9Joe Onorato onlyBindAllApps(); 12543611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12553611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12563611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 12573611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private void onlyBindAllApps() { 12583611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Callbacks oldCallbacks = mCallbacks.get(); 12593611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (oldCallbacks == null) { 12603611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // This launcher has exited and nobody bothered to tell us. Just bail. 12613611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.w(TAG, "LoaderTask running with no launcher (onlyBindAllApps)"); 12623611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return; 12633611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12643611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 12653611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // shallow copy 12663611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final ArrayList<ApplicationInfo> list 12673611578579b4bfb25616085dafdb1a45207394f9Joe Onorato = (ArrayList<ApplicationInfo>)mAllAppsList.data.clone(); 12683611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 12693611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 12703611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final long t = SystemClock.uptimeMillis(); 12713611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Callbacks callbacks = tryGetCallbacks(oldCallbacks); 12723611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (callbacks != null) { 12733611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.bindAllApplications(list); 12749c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12753611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 12763611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "bound all " + list.size() + " apps from cache in " 1277a30ce8e6b25e41f392a41fd4d0d3e0a424a84dadJoe Onorato + (SystemClock.uptimeMillis()-t) + "ms"); 12789c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 12793611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12803611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 12813611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 12823611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 12833611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 12843611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private void loadAllAppsByBatch() { 12853611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final long t = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; 12863611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 12873611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Don't use these two variables in any of the callback runnables. 12883611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // Otherwise we hold a reference to them. 12893611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Callbacks oldCallbacks = mCallbacks.get(); 12903611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (oldCallbacks == null) { 12913611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // This launcher has exited and nobody bothered to tell us. Just bail. 12923611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.w(TAG, "LoaderTask running with no launcher (loadAllAppsByBatch)"); 12933611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return; 12949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 129531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 12963611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 12973611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 1298cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato 12993611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final PackageManager packageManager = mContext.getPackageManager(); 13003611578579b4bfb25616085dafdb1a45207394f9Joe Onorato List<ResolveInfo> apps = null; 13013611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 13023611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int N = Integer.MAX_VALUE; 13033611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 13043611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int startIndex; 13053611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int i=0; 13063611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int batchSize = -1; 13073611578579b4bfb25616085dafdb1a45207394f9Joe Onorato while (i < N && !mStopped) { 13083611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (i == 0) { 13093611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mAllAppsList.clear(); 13103611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; 13113611578579b4bfb25616085dafdb1a45207394f9Joe Onorato apps = packageManager.queryIntentActivities(mainIntent, 0); 13123611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 13133611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "queryIntentActivities took " 13143611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + (SystemClock.uptimeMillis()-qiaTime) + "ms"); 13153611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 13163611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (apps == null) { 1317cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato return; 1318cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato } 13193611578579b4bfb25616085dafdb1a45207394f9Joe Onorato N = apps.size(); 13203611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 13213611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "queryIntentActivities got " + N + " apps"); 13223611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 13233611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (N == 0) { 13243611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // There are no apps?!? 13253611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return; 13263611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 13273611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mBatchSize == 0) { 13283611578579b4bfb25616085dafdb1a45207394f9Joe Onorato batchSize = N; 13293611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else { 13303611578579b4bfb25616085dafdb1a45207394f9Joe Onorato batchSize = mBatchSize; 13313611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 13323611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 13333611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final long sortTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; 13343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Collections.sort(apps, 1335c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung new LauncherModel.ShortcutNameComparator(packageManager, mLabelCache)); 13363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 13373611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "sort took " 13383611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + (SystemClock.uptimeMillis()-sortTime) + "ms"); 13393611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 1340cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato } 1341cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato 13423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final long t2 = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0; 13433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 13443611578579b4bfb25616085dafdb1a45207394f9Joe Onorato startIndex = i; 13453611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int j=0; i<N && j<batchSize; j++) { 13463611578579b4bfb25616085dafdb1a45207394f9Joe Onorato // This builds the icon bitmaps. 1347c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung mAllAppsList.add(new ApplicationInfo(packageManager, apps.get(i), 1348c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung mIconCache, mLabelCache)); 13493611578579b4bfb25616085dafdb1a45207394f9Joe Onorato i++; 1350cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato } 1351cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato 13523611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final boolean first = i <= batchSize; 13533611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Callbacks callbacks = tryGetCallbacks(oldCallbacks); 13543611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final ArrayList<ApplicationInfo> added = mAllAppsList.added; 13553611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mAllAppsList.added = new ArrayList<ApplicationInfo>(); 13563611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 1357cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato mHandler.post(new Runnable() { 1358cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato public void run() { 1359cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato final long t = SystemClock.uptimeMillis(); 1360cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato if (callbacks != null) { 13613611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (first) { 13623611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.bindAllApplications(added); 13633611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else { 13643611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.bindAppsAdded(added); 13653611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 13663611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 13673611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "bound " + added.size() + " apps in " 13683611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + (SystemClock.uptimeMillis() - t) + "ms"); 13693611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 13703611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else { 13713611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.i(TAG, "not binding apps: no Launcher activity"); 1372cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato } 1373cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato } 1374cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato }); 1375cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato 13763611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 13773611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "batch of " + (i-startIndex) + " icons processed in " 13783611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + (SystemClock.uptimeMillis()-t2) + "ms"); 13793611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 13803611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 13813611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mAllAppsLoadDelay > 0 && i < N) { 13823611578579b4bfb25616085dafdb1a45207394f9Joe Onorato try { 13833611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 13843611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "sleeping for " + mAllAppsLoadDelay + "ms"); 13853611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 13863611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Thread.sleep(mAllAppsLoadDelay); 13873611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } catch (InterruptedException exc) { } 13883611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 1389cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato } 1390cc67f476c01ee6a7d593fa67f80392c6793432d7Joe Onorato 13913611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) { 13923611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "cached all " + N + " apps in " 13933611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + (SystemClock.uptimeMillis()-t) + "ms" 13943611578579b4bfb25616085dafdb1a45207394f9Joe Onorato + (mAllAppsLoadDelay > 0 ? " (including delay)" : "")); 13953611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 13963611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 1397dca661236c73ecd819cfea964c6f8170e5cc40aeDaniel Sandler 13983611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void dumpState() { 13993611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "mLoaderTask.mContext=" + mContext); 14003611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "mLoaderTask.mWaitThread=" + mWaitThread); 14013611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "mLoaderTask.mIsLaunching=" + mIsLaunching); 14023611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "mLoaderTask.mStopped=" + mStopped); 14033611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "mLoaderTask.mLoadAndBindStepFinished=" + mLoadAndBindStepFinished); 14044eac29a80b9a73465c8de54f1caec2a8098a73c6Adam Cohen Log.d(TAG, "mItems size=" + sWorkspaceItems.size()); 14053611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 14063611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 140731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 14083611578579b4bfb25616085dafdb1a45207394f9Joe Onorato void enqueuePackageUpdated(PackageUpdatedTask task) { 1409700889f504ef134ab307d95b6bfbbb426ea730e3Brad Fitzpatrick sWorker.post(task); 14103611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 1411d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato 14123611578579b4bfb25616085dafdb1a45207394f9Joe Onorato private class PackageUpdatedTask implements Runnable { 14133611578579b4bfb25616085dafdb1a45207394f9Joe Onorato int mOp; 14143611578579b4bfb25616085dafdb1a45207394f9Joe Onorato String[] mPackages; 1415d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato 14163611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public static final int OP_NONE = 0; 14173611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public static final int OP_ADD = 1; 14183611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public static final int OP_UPDATE = 2; 14193611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public static final int OP_REMOVE = 3; // uninstlled 14203611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public static final int OP_UNAVAILABLE = 4; // external media unmounted 142131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1422d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato 14233611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public PackageUpdatedTask(int op, String[] packages) { 14243611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mOp = op; 14253611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mPackages = packages; 14263611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 1427d65d08e709ec0916446100bae0a7276d0800382fJoe Onorato 14283611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 14293611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Context context = mApp; 1430dca661236c73ecd819cfea964c6f8170e5cc40aeDaniel Sandler 14313611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final String[] packages = mPackages; 14323611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final int N = packages.length; 14333611578579b4bfb25616085dafdb1a45207394f9Joe Onorato switch (mOp) { 14343611578579b4bfb25616085dafdb1a45207394f9Joe Onorato case OP_ADD: 14353611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int i=0; i<N; i++) { 14363611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.addPackage " + packages[i]); 14373611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mAllAppsList.addPackage(context, packages[i]); 1438dca661236c73ecd819cfea964c6f8170e5cc40aeDaniel Sandler } 14393611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 14403611578579b4bfb25616085dafdb1a45207394f9Joe Onorato case OP_UPDATE: 14413611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int i=0; i<N; i++) { 14423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.updatePackage " + packages[i]); 14433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mAllAppsList.updatePackage(context, packages[i]); 14443611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 14453611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 14463611578579b4bfb25616085dafdb1a45207394f9Joe Onorato case OP_REMOVE: 14473611578579b4bfb25616085dafdb1a45207394f9Joe Onorato case OP_UNAVAILABLE: 14483611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (int i=0; i<N; i++) { 14493611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.removePackage " + packages[i]); 14503611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mAllAppsList.removePackage(packages[i]); 14513611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 14523611578579b4bfb25616085dafdb1a45207394f9Joe Onorato break; 14533611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 1454dca661236c73ecd819cfea964c6f8170e5cc40aeDaniel Sandler 14553611578579b4bfb25616085dafdb1a45207394f9Joe Onorato ArrayList<ApplicationInfo> added = null; 14563611578579b4bfb25616085dafdb1a45207394f9Joe Onorato ArrayList<ApplicationInfo> removed = null; 14573611578579b4bfb25616085dafdb1a45207394f9Joe Onorato ArrayList<ApplicationInfo> modified = null; 14583611578579b4bfb25616085dafdb1a45207394f9Joe Onorato 14593611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mAllAppsList.added.size() > 0) { 14603611578579b4bfb25616085dafdb1a45207394f9Joe Onorato added = mAllAppsList.added; 14613611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mAllAppsList.added = new ArrayList<ApplicationInfo>(); 14623611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 14633611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mAllAppsList.removed.size() > 0) { 14643611578579b4bfb25616085dafdb1a45207394f9Joe Onorato removed = mAllAppsList.removed; 14653611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mAllAppsList.removed = new ArrayList<ApplicationInfo>(); 14663611578579b4bfb25616085dafdb1a45207394f9Joe Onorato for (ApplicationInfo info: removed) { 14673611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mIconCache.remove(info.intent.getComponent()); 146831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 146931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 14703611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mAllAppsList.modified.size() > 0) { 14713611578579b4bfb25616085dafdb1a45207394f9Joe Onorato modified = mAllAppsList.modified; 14723611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mAllAppsList.modified = new ArrayList<ApplicationInfo>(); 14733611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 147431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 14753611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null; 14763611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (callbacks == null) { 14773611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.w(TAG, "Nobody to tell about the new app. Launcher is probably loading."); 14783611578579b4bfb25616085dafdb1a45207394f9Joe Onorato return; 1479be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato } 1480be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato 14813611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (added != null) { 14823611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final ArrayList<ApplicationInfo> addedFinal = added; 14833611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 14843611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 1485cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; 1486cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung if (callbacks == cb && cb != null) { 14873611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.bindAppsAdded(addedFinal); 14883611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 14893611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 14903611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 14913611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 14923611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (modified != null) { 14933611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final ArrayList<ApplicationInfo> modifiedFinal = modified; 14943611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 14953611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 1496cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; 1497cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung if (callbacks == cb && cb != null) { 14983611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.bindAppsUpdated(modifiedFinal); 14993611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 15003611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 15013611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 15023611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 15033611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (removed != null) { 15043611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final boolean permanent = mOp != OP_UNAVAILABLE; 15053611578579b4bfb25616085dafdb1a45207394f9Joe Onorato final ArrayList<ApplicationInfo> removedFinal = removed; 15063611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mHandler.post(new Runnable() { 15073611578579b4bfb25616085dafdb1a45207394f9Joe Onorato public void run() { 1508cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; 1509cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung if (callbacks == cb && cb != null) { 15103611578579b4bfb25616085dafdb1a45207394f9Joe Onorato callbacks.bindAppsRemoved(removedFinal, permanent); 15113611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 15123611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 15133611578579b4bfb25616085dafdb1a45207394f9Joe Onorato }); 1514be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato } 151580baf5a6b3c62a62265f626d43d1167783c94131Winson Chung 151680baf5a6b3c62a62265f626d43d1167783c94131Winson Chung mHandler.post(new Runnable() { 151780baf5a6b3c62a62265f626d43d1167783c94131Winson Chung @Override 151880baf5a6b3c62a62265f626d43d1167783c94131Winson Chung public void run() { 1519cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung Callbacks cb = mCallbacks != null ? mCallbacks.get() : null; 1520cd2b01416febb5bf50ed5ede1544dea33fee3b0bWinson Chung if (callbacks == cb && cb != null) { 152180baf5a6b3c62a62265f626d43d1167783c94131Winson Chung callbacks.bindPackagesUpdated(); 152280baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 152380baf5a6b3c62a62265f626d43d1167783c94131Winson Chung } 152480baf5a6b3c62a62265f626d43d1167783c94131Winson Chung }); 152531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 152631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 152731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 15289c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 152956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato * This is called from the code that adds shortcuts from the intent receiver. This 153056d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato * doesn't have a Cursor, but 15319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 153256d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato public ShortcutInfo getShortcutInfo(PackageManager manager, Intent intent, Context context) { 1533c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung return getShortcutInfo(manager, intent, context, null, -1, -1, null); 153456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 153556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato 153656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato /** 153756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato * Make an ShortcutInfo object for a shortcut that is an application. 153856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato * 153956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato * If c is not null, then it will be used to fill in missing data like the title and icon. 154056d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato */ 154156d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato public ShortcutInfo getShortcutInfo(PackageManager manager, Intent intent, Context context, 1542c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung Cursor c, int iconIndex, int titleIndex, HashMap<Object, CharSequence> labelCache) { 154356d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato Bitmap icon = null; 154456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato final ShortcutInfo info = new ShortcutInfo(); 154531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 154656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato ComponentName componentName = intent.getComponent(); 154756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (componentName == null) { 15489c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return null; 154931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 155031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 15518ddc4fdba06cfa786950c306475b7a4e3f6846abJoe Onorato // TODO: See if the PackageManager knows about this case. If it doesn't 15528ddc4fdba06cfa786950c306475b7a4e3f6846abJoe Onorato // then return null & delete this. 15538ddc4fdba06cfa786950c306475b7a4e3f6846abJoe Onorato 155456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // the resource -- This may implicitly give us back the fallback icon, 155556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // but don't worry about that. All we're doing with usingFallbackIcon is 155656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // to avoid saving lots of copies of that in the database, and most apps 155756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // have icons anyway. 155856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato final ResolveInfo resolveInfo = manager.resolveActivity(intent, 0); 155956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (resolveInfo != null) { 1560aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung icon = mIconCache.getIcon(componentName, resolveInfo, labelCache); 156156d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 156256d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // the db 156356d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (icon == null) { 156456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (c != null) { 1565931dc9779dab5071efc21163647f5f004991bfb3Michael Jurka icon = getIconFromCursor(c, iconIndex, context); 156656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 15679c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 156856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // the fallback icon 156956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (icon == null) { 157056d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato icon = getFallbackIcon(); 157156d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.usingFallbackIcon = true; 157256d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 157356d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.setIcon(icon); 157456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato 157556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // from the resource 157656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (resolveInfo != null) { 15775308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung ComponentName key = LauncherModel.getComponentNameFromResolveInfo(resolveInfo); 15785308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung if (labelCache != null && labelCache.containsKey(key)) { 15795308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung info.title = labelCache.get(key); 1580c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } else { 1581c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung info.title = resolveInfo.activityInfo.loadLabel(manager); 1582c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung if (labelCache != null) { 15835308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung labelCache.put(key, info.title); 1584c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } 1585c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } 158656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 158756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // from the db 158856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (info.title == null) { 158956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (c != null) { 159056d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.title = c.getString(titleIndex); 159156d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 159256d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 159356d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // fall back to the class name of the activity 15949c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato if (info.title == null) { 159556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.title = componentName.getClassName(); 15969c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 15979c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato info.itemType = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION; 15989c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return info; 15999c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 160031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 16019c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato /** 16020589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato * Make an ShortcutInfo object for a shortcut that isn't an application. 16039c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato */ 16040589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato private ShortcutInfo getShortcutInfo(Cursor c, Context context, 160556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato int iconTypeIndex, int iconPackageIndex, int iconResourceIndex, int iconIndex, 160656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato int titleIndex) { 160731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 160856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato Bitmap icon = null; 16090589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato final ShortcutInfo info = new ShortcutInfo(); 16109c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato info.itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; 16117376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project 16128ddc4fdba06cfa786950c306475b7a4e3f6846abJoe Onorato // TODO: If there's an explicit component and we can't install that, delete it. 16138ddc4fdba06cfa786950c306475b7a4e3f6846abJoe Onorato 161456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.title = c.getString(titleIndex); 161556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato 16169c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato int iconType = c.getInt(iconTypeIndex); 16179c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato switch (iconType) { 16189c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato case LauncherSettings.Favorites.ICON_TYPE_RESOURCE: 16199c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato String packageName = c.getString(iconPackageIndex); 16209c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato String resourceName = c.getString(iconResourceIndex); 16219c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato PackageManager packageManager = context.getPackageManager(); 162256d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.customIcon = false; 162356d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // the resource 16249c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato try { 16259c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato Resources resources = packageManager.getResourcesForApplication(packageName); 162656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (resources != null) { 162756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato final int id = resources.getIdentifier(resourceName, null, null); 1628c9a961952d1a057029874f8426b90181f6876034Michael Jurka icon = Utilities.createIconBitmap( 1629c9a961952d1a057029874f8426b90181f6876034Michael Jurka mIconCache.getFullResIcon(resources, id), context); 163056d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 16319c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } catch (Exception e) { 163256d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // drop this. we have other places to look for icons 163356d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 163456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // the db 163556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (icon == null) { 1636931dc9779dab5071efc21163647f5f004991bfb3Michael Jurka icon = getIconFromCursor(c, iconIndex, context); 163756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 163856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // the fallback icon 163956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (icon == null) { 164056d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato icon = getFallbackIcon(); 164156d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.usingFallbackIcon = true; 16427376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project } 16439c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato break; 16449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato case LauncherSettings.Favorites.ICON_TYPE_BITMAP: 1645931dc9779dab5071efc21163647f5f004991bfb3Michael Jurka icon = getIconFromCursor(c, iconIndex, context); 164656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (icon == null) { 164756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato icon = getFallbackIcon(); 164856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.customIcon = false; 164956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.usingFallbackIcon = true; 165056d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } else { 165156d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.customIcon = true; 16529c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato } 16539c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato break; 16549c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato default: 1655d8d22da5ca3e8d3e8d2e3616305b038d37486f32Joe Onorato icon = getFallbackIcon(); 165656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato info.usingFallbackIcon = true; 16579c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato info.customIcon = false; 16589c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato break; 165931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1660d8d22da5ca3e8d3e8d2e3616305b038d37486f32Joe Onorato info.setIcon(icon); 16619c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato return info; 1662f96811cdf564469a7a654a0c876288c9fd14f35eThe Android Open Source Project } 166331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 1664931dc9779dab5071efc21163647f5f004991bfb3Michael Jurka Bitmap getIconFromCursor(Cursor c, int iconIndex, Context context) { 166556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato if (false) { 166656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato Log.d(TAG, "getIconFromCursor app=" 166756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato + c.getString(c.getColumnIndexOrThrow(LauncherSettings.Favorites.TITLE))); 166856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 166956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato byte[] data = c.getBlob(iconIndex); 167056d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato try { 1671931dc9779dab5071efc21163647f5f004991bfb3Michael Jurka return Utilities.createIconBitmap( 1672931dc9779dab5071efc21163647f5f004991bfb3Michael Jurka BitmapFactory.decodeByteArray(data, 0, data.length), context); 167356d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } catch (Exception e) { 167456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato return null; 167556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 167656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 167756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato 16783d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung ShortcutInfo addShortcut(Context context, Intent data, long container, int screen, 16793d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung int cellX, int cellY, boolean notify) { 1680a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung final ShortcutInfo info = infoFromShortcutIntent(context, data, null); 16813d503fbd9468fb2b9fa645f4f7b91e11229edbfaWinson Chung addItemToDatabase(context, info, container, screen, cellX, cellY, notify); 16820589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 16830589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato return info; 16840589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 16850589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 1686a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung /** 168755cef262f97749300c2f6e764da0b00cbcb78879Winson Chung * Attempts to find an AppWidgetProviderInfo that matches the given component. 168855cef262f97749300c2f6e764da0b00cbcb78879Winson Chung */ 168955cef262f97749300c2f6e764da0b00cbcb78879Winson Chung AppWidgetProviderInfo findAppWidgetProviderInfoWithComponent(Context context, 169055cef262f97749300c2f6e764da0b00cbcb78879Winson Chung ComponentName component) { 169155cef262f97749300c2f6e764da0b00cbcb78879Winson Chung List<AppWidgetProviderInfo> widgets = 169255cef262f97749300c2f6e764da0b00cbcb78879Winson Chung AppWidgetManager.getInstance(context).getInstalledProviders(); 169355cef262f97749300c2f6e764da0b00cbcb78879Winson Chung for (AppWidgetProviderInfo info : widgets) { 169455cef262f97749300c2f6e764da0b00cbcb78879Winson Chung if (info.provider.equals(component)) { 169555cef262f97749300c2f6e764da0b00cbcb78879Winson Chung return info; 169655cef262f97749300c2f6e764da0b00cbcb78879Winson Chung } 169755cef262f97749300c2f6e764da0b00cbcb78879Winson Chung } 169855cef262f97749300c2f6e764da0b00cbcb78879Winson Chung return null; 1699a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung } 1700a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung 170168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung /** 170268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung * Returns a list of all the widgets that can handle configuration with a particular mimeType. 170368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung */ 170468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung List<WidgetMimeTypeHandlerData> resolveWidgetsForMimeType(Context context, String mimeType) { 170568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final PackageManager packageManager = context.getPackageManager(); 170668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final List<WidgetMimeTypeHandlerData> supportedConfigurationActivities = 170768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung new ArrayList<WidgetMimeTypeHandlerData>(); 170868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 170968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final Intent supportsIntent = 171068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung new Intent(InstallWidgetReceiver.ACTION_SUPPORTS_CLIPDATA_MIMETYPE); 171168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung supportsIntent.setType(mimeType); 171268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 171368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung // Create a set of widget configuration components that we can test against 171468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final List<AppWidgetProviderInfo> widgets = 171568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung AppWidgetManager.getInstance(context).getInstalledProviders(); 171668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final HashMap<ComponentName, AppWidgetProviderInfo> configurationComponentToWidget = 171768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung new HashMap<ComponentName, AppWidgetProviderInfo>(); 171868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung for (AppWidgetProviderInfo info : widgets) { 171968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung configurationComponentToWidget.put(info.configure, info); 172068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 172168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 172268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung // Run through each of the intents that can handle this type of clip data, and cross 172368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung // reference them with the components that are actual configuration components 172468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final List<ResolveInfo> activities = packageManager.queryIntentActivities(supportsIntent, 172568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung PackageManager.MATCH_DEFAULT_ONLY); 172668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung for (ResolveInfo info : activities) { 172768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final ActivityInfo activityInfo = info.activityInfo; 172868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung final ComponentName infoComponent = new ComponentName(activityInfo.packageName, 172968846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung activityInfo.name); 173068846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung if (configurationComponentToWidget.containsKey(infoComponent)) { 173168846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung supportedConfigurationActivities.add( 173268846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung new InstallWidgetReceiver.WidgetMimeTypeHandlerData(info, 173368846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung configurationComponentToWidget.get(infoComponent))); 173468846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 173568846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 173668846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung return supportedConfigurationActivities; 173768846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung } 173868846fdce6c01bbe474bd0c8307e1ccaac161cbcWinson Chung 1739a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung ShortcutInfo infoFromShortcutIntent(Context context, Intent data, Bitmap fallbackIcon) { 17400589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato Intent intent = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_INTENT); 17410589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato String name = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME); 17420589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato Parcelable bitmap = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON); 17430589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 17440589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato Bitmap icon = null; 17450589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato boolean customIcon = false; 17460589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato ShortcutIconResource iconResource = null; 17470589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 17480589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato if (bitmap != null && bitmap instanceof Bitmap) { 17490589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato icon = Utilities.createIconBitmap(new FastBitmapDrawable((Bitmap)bitmap), context); 17500589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato customIcon = true; 17510589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } else { 17520589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato Parcelable extra = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE); 17530589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato if (extra != null && extra instanceof ShortcutIconResource) { 17540589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato try { 17550589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato iconResource = (ShortcutIconResource) extra; 17560589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato final PackageManager packageManager = context.getPackageManager(); 17570589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato Resources resources = packageManager.getResourcesForApplication( 17580589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato iconResource.packageName); 17590589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato final int id = resources.getIdentifier(iconResource.resourceName, null, null); 1760c9a961952d1a057029874f8426b90181f6876034Michael Jurka icon = Utilities.createIconBitmap( 1761c9a961952d1a057029874f8426b90181f6876034Michael Jurka mIconCache.getFullResIcon(resources, id), context); 17620589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } catch (Exception e) { 17630589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato Log.w(TAG, "Could not load shortcut icon: " + extra); 17640589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 17650589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 17660589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 17670589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 176856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato final ShortcutInfo info = new ShortcutInfo(); 176956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato 17700589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato if (icon == null) { 1771a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung if (fallbackIcon != null) { 1772a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung icon = fallbackIcon; 1773a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung } else { 1774a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung icon = getFallbackIcon(); 1775a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung info.usingFallbackIcon = true; 1776a9abd0e0bdedb5cbbd12b84cb83037a735e79a20Winson Chung } 17770589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 17780589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato info.setIcon(icon); 177956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato 17800589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato info.title = name; 17810589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato info.intent = intent; 17820589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato info.customIcon = customIcon; 17830589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato info.iconResource = iconResource; 17840589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 17850589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato return info; 17860589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato } 17870589f0f66ce498512c6ee47482c649d88294c9d0Joe Onorato 1788aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung boolean queueIconToBeChecked(HashMap<Object, byte[]> cache, ShortcutInfo info, Cursor c, 1789aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung int iconIndex) { 179017a8922e2ab2ad599df3750d398a095473ccd1b4Joe Onorato // If apps can't be on SD, don't even bother. 179117a8922e2ab2ad599df3750d398a095473ccd1b4Joe Onorato if (!mAppsCanBeOnExternalStorage) { 1792aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung return false; 179317a8922e2ab2ad599df3750d398a095473ccd1b4Joe Onorato } 179456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // If this icon doesn't have a custom icon, check to see 179556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // what's stored in the DB, and if it doesn't match what 179656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // we're going to show, store what we are going to show back 179756d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // into the DB. We do this so when we're loading, if the 179856d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // package manager can't find an icon (for example because 179956d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato // the app is on SD) then we can use that instead. 1800ddc9c1fb1ab426772add520d277ea9c2cd674094Joe Onorato if (!info.customIcon && !info.usingFallbackIcon) { 1801aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung cache.put(info, c.getBlob(iconIndex)); 1802aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung return true; 1803aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung } 1804aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung return false; 1805aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung } 1806aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung void updateSavedIcon(Context context, ShortcutInfo info, byte[] data) { 1807aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung boolean needSave = false; 1808aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung try { 1809aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung if (data != null) { 1810aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung Bitmap saved = BitmapFactory.decodeByteArray(data, 0, data.length); 1811aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung Bitmap loaded = info.getIcon(mIconCache); 1812aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung needSave = !saved.sameAs(loaded); 1813aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung } else { 181456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato needSave = true; 181556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 1816aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung } catch (Exception e) { 1817aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung needSave = true; 1818aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung } 1819aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung if (needSave) { 1820aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung Log.d(TAG, "going to save icon bitmap for info=" + info); 1821aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung // This is slower than is ideal, but this only happens once 1822aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung // or when the app is updated with a new icon. 1823aac01e1073f3deb3f543fd27cc63fd727101584eWinson Chung updateItemInDatabase(context, info); 182456d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 182556d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato } 182656d8291af6a28c6ba64113120efdf84a785e816cJoe Onorato 182731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project /** 1828df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen * Return an existing FolderInfo object if we have encountered this ID previously, 18299c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato * or make a new one. 183031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 1831df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen private static FolderInfo findOrMakeFolder(HashMap<Long, FolderInfo> folders, long id) { 18329c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // See if a placeholder was created for us already 18339c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato FolderInfo folderInfo = folders.get(id); 1834df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen if (folderInfo == null) { 18359c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato // No placeholder -- create a new instance 1836df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen folderInfo = new FolderInfo(); 18379c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato folders.put(id, folderInfo); 183831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 1839df2cc41acbfacd576f99483a4af1cda32ebd3d09Adam Cohen return folderInfo; 184031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 184131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 18429c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato private static final Collator sCollator = Collator.getInstance(); 1843b0c27f254a9929be208d5e04554f438076c833bcJoe Onorato public static final Comparator<ApplicationInfo> APP_NAME_COMPARATOR 18449c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato = new Comparator<ApplicationInfo>() { 18459c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato public final int compare(ApplicationInfo a, ApplicationInfo b) { 18465b1808da75ed3e3528cb31dee56a4e363812cc21Michael Jurka int result = sCollator.compare(a.title.toString(), b.title.toString()); 18475b1808da75ed3e3528cb31dee56a4e363812cc21Michael Jurka if (result == 0) { 18485b1808da75ed3e3528cb31dee56a4e363812cc21Michael Jurka result = a.componentName.compareTo(b.componentName); 18495b1808da75ed3e3528cb31dee56a4e363812cc21Michael Jurka } 18505b1808da75ed3e3528cb31dee56a4e363812cc21Michael Jurka return result; 185131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 18529c1289cb3bfb74f86e53ec7ac6dd76bb39666b2dJoe Onorato }; 185378403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung public static final Comparator<ApplicationInfo> APP_INSTALL_TIME_COMPARATOR 185478403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung = new Comparator<ApplicationInfo>() { 185578403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung public final int compare(ApplicationInfo a, ApplicationInfo b) { 185678403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung if (a.firstInstallTime < b.firstInstallTime) return 1; 185778403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung if (a.firstInstallTime > b.firstInstallTime) return -1; 185878403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung return 0; 185978403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung } 186078403feedcf6d61a527cf0c904cb55ca43c0f3cbWinson Chung }; 1861785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public static final Comparator<AppWidgetProviderInfo> WIDGET_NAME_COMPARATOR 1862785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung = new Comparator<AppWidgetProviderInfo>() { 1863785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public final int compare(AppWidgetProviderInfo a, AppWidgetProviderInfo b) { 1864785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung return sCollator.compare(a.label.toString(), b.label.toString()); 1865785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1866785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung }; 18675308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung static ComponentName getComponentNameFromResolveInfo(ResolveInfo info) { 18685308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung if (info.activityInfo != null) { 18695308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung return new ComponentName(info.activityInfo.packageName, info.activityInfo.name); 18705308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung } else { 18715308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung return new ComponentName(info.serviceInfo.packageName, info.serviceInfo.name); 18725308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung } 18735308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung } 1874785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public static class ShortcutNameComparator implements Comparator<ResolveInfo> { 1875785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung private PackageManager mPackageManager; 1876c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung private HashMap<Object, CharSequence> mLabelCache; 1877785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung ShortcutNameComparator(PackageManager pm) { 1878785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung mPackageManager = pm; 1879c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung mLabelCache = new HashMap<Object, CharSequence>(); 1880c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } 1881c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung ShortcutNameComparator(PackageManager pm, HashMap<Object, CharSequence> labelCache) { 1882c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung mPackageManager = pm; 1883c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung mLabelCache = labelCache; 1884785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1885785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung public final int compare(ResolveInfo a, ResolveInfo b) { 1886c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung CharSequence labelA, labelB; 18875308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung ComponentName keyA = LauncherModel.getComponentNameFromResolveInfo(a); 18885308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung ComponentName keyB = LauncherModel.getComponentNameFromResolveInfo(b); 18895308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung if (mLabelCache.containsKey(keyA)) { 18905308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung labelA = mLabelCache.get(keyA); 1891c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } else { 1892c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung labelA = a.loadLabel(mPackageManager).toString(); 1893c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung 18945308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung mLabelCache.put(keyA, labelA); 1895c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } 18965308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung if (mLabelCache.containsKey(keyB)) { 18975308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung labelB = mLabelCache.get(keyB); 1898c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } else { 1899c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung labelB = b.loadLabel(mPackageManager).toString(); 1900c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung 19015308f24d4b66b020202b88eff672f5a89096ebb6Winson Chung mLabelCache.put(keyB, labelB); 1902c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } 1903785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung return sCollator.compare(labelA, labelB); 1904785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung } 1905785d2eb2b8d7072c8124300dd9168ff51a91cf38Winson Chung }; 19061ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung public static class WidgetAndShortcutNameComparator implements Comparator<Object> { 19071ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung private PackageManager mPackageManager; 19081ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung private HashMap<Object, String> mLabelCache; 19091ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung WidgetAndShortcutNameComparator(PackageManager pm) { 19101ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung mPackageManager = pm; 19111ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung mLabelCache = new HashMap<Object, String>(); 19121ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung } 19131ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung public final int compare(Object a, Object b) { 19141ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung String labelA, labelB; 1915c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung if (mLabelCache.containsKey(a)) { 1916c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung labelA = mLabelCache.get(a); 1917c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } else { 1918c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung labelA = (a instanceof AppWidgetProviderInfo) ? 19191ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung ((AppWidgetProviderInfo) a).label : 19201ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung ((ResolveInfo) a).loadLabel(mPackageManager).toString(); 1921c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung mLabelCache.put(a, labelA); 1922c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } 1923c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung if (mLabelCache.containsKey(b)) { 1924c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung labelB = mLabelCache.get(b); 1925c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } else { 1926c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung labelB = (b instanceof AppWidgetProviderInfo) ? 19271ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung ((AppWidgetProviderInfo) b).label : 19281ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung ((ResolveInfo) b).loadLabel(mPackageManager).toString(); 1929c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung mLabelCache.put(b, labelB); 1930c3eecff9043759926df124483b45fe8f4436ae7cWinson Chung } 19311ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung return sCollator.compare(labelA, labelB); 19321ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung } 19331ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung }; 1934be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato 1935be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato public void dumpState() { 1936be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato Log.d(TAG, "mCallbacks=" + mCallbacks); 1937be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList.data", mAllAppsList.data); 1938be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList.added", mAllAppsList.added); 1939be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList.removed", mAllAppsList.removed); 1940be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList.modified", mAllAppsList.modified); 19413611578579b4bfb25616085dafdb1a45207394f9Joe Onorato if (mLoaderTask != null) { 19423611578579b4bfb25616085dafdb1a45207394f9Joe Onorato mLoaderTask.dumpState(); 19433611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } else { 19443611578579b4bfb25616085dafdb1a45207394f9Joe Onorato Log.d(TAG, "mLoaderTask=null"); 19453611578579b4bfb25616085dafdb1a45207394f9Joe Onorato } 1946be38609f875f9b9374ceaf723135c0a624637fcbJoe Onorato } 194731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project} 1948