diff options
Diffstat (limited to 'src/com/android/launcher3/LauncherModel.java')
-rw-r--r-- | src/com/android/launcher3/LauncherModel.java | 283 |
1 files changed, 212 insertions, 71 deletions
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 2e76a6506..041882fd9 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -48,14 +48,13 @@ import android.os.RemoteException; import android.os.SystemClock; import android.util.Log; -import com.android.launcher3.R; import com.android.launcher3.InstallWidgetReceiver.WidgetMimeTypeHandlerData; import java.lang.ref.WeakReference; import java.net.URISyntaxException; import java.text.Collator; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -63,6 +62,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.TreeMap; /** * Maintains in-memory state of the Launcher. It is expected that there should be only one @@ -138,6 +138,10 @@ public class LauncherModel extends BroadcastReceiver { // sBgDbIconCache is the set of ItemInfos that need to have their icons updated in the database static final HashMap<Object, byte[]> sBgDbIconCache = new HashMap<Object, byte[]>(); + + // sBgWorkspaceScreens is the ordered set of workspace screens. + static final ArrayList<Long> sBgWorkspaceScreens = new ArrayList<Long>(); + // </ only access in worker thread > private IconCache mIconCache; @@ -153,6 +157,7 @@ public class LauncherModel extends BroadcastReceiver { public int getCurrentWorkspaceScreen(); public void startBinding(); public void bindItems(ArrayList<ItemInfo> shortcuts, int start, int end); + public void bindScreens(ArrayList<Long> orderedScreenIds); public void bindFolders(HashMap<Long,FolderInfo> folders); public void finishBindingItems(boolean upgradePath); public void bindAppWidget(LauncherAppWidgetInfo info); @@ -257,13 +262,13 @@ public class LauncherModel extends BroadcastReceiver { * <container, screen, cellX, cellY> */ static void addOrMoveItemInDatabase(Context context, ItemInfo item, long container, - int screen, int cellX, int cellY) { + long screenId, int cellX, int cellY) { if (item.container == ItemInfo.NO_ID) { // From all apps - addItemToDatabase(context, item, container, screen, cellX, cellY, false); + addItemToDatabase(context, item, container, screenId, cellX, cellY, false); } else { // From somewhere else - moveItemInDatabase(context, item, container, screen, cellX, cellY); + moveItemInDatabase(context, item, container, screenId, cellX, cellY); } } @@ -280,7 +285,7 @@ public class LauncherModel extends BroadcastReceiver { modelShortcut.id == shortcut.id && modelShortcut.itemType == shortcut.itemType && modelShortcut.container == shortcut.container && - modelShortcut.screen == shortcut.screen && + modelShortcut.screenId == shortcut.screenId && modelShortcut.cellX == shortcut.cellX && modelShortcut.cellY == shortcut.cellY && modelShortcut.spanX == shortcut.spanX && @@ -444,10 +449,10 @@ public class LauncherModel extends BroadcastReceiver { * Move an item in the DB to a new <container, screen, cellX, cellY> */ static void moveItemInDatabase(Context context, final ItemInfo item, final long container, - final int screen, final int cellX, final int cellY) { + final long screenId, final int cellX, final int cellY) { String transaction = "DbDebug Modify item (" + item.title + ") in db, id: " + item.id + - " (" + item.container + ", " + item.screen + ", " + item.cellX + ", " + item.cellY + - ") --> " + "(" + container + ", " + screen + ", " + cellX + ", " + cellY + ")"; + " (" + item.container + ", " + item.screenId + ", " + item.cellX + ", " + item.cellY + + ") --> " + "(" + container + ", " + screenId + ", " + cellX + ", " + cellY + ")"; Launcher.sDumpLogs.add(transaction); Log.d(TAG, transaction); item.container = container; @@ -456,18 +461,18 @@ public class LauncherModel extends BroadcastReceiver { // We store hotseat items in canonical form which is this orientation invariant position // in the hotseat - if (context instanceof Launcher && screen < 0 && + if (context instanceof Launcher && screenId < 0 && container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - item.screen = ((Launcher) context).getHotseat().getOrderInHotseat(cellX, cellY); + item.screenId = ((Launcher) context).getHotseat().getOrderInHotseat(cellX, cellY); } else { - item.screen = screen; + item.screenId = screenId; } final ContentValues values = new ContentValues(); values.put(LauncherSettings.Favorites.CONTAINER, item.container); values.put(LauncherSettings.Favorites.CELLX, item.cellX); values.put(LauncherSettings.Favorites.CELLY, item.cellY); - values.put(LauncherSettings.Favorites.SCREEN, item.screen); + values.put(LauncherSettings.Favorites.SCREEN, item.screenId); updateItemInDatabaseHelper(context, values, item, "moveItemInDatabase"); } @@ -485,7 +490,7 @@ public class LauncherModel extends BroadcastReceiver { for (int i = 0; i < count; i++) { ItemInfo item = items.get(i); String transaction = "DbDebug Modify item (" + item.title + ") in db, id: " - + item.id + " (" + item.container + ", " + item.screen + ", " + item.cellX + + item.id + " (" + item.container + ", " + item.screenId + ", " + item.cellX + ", " + item.cellY + ") --> " + "(" + container + ", " + screen + ", " + item.cellX + ", " + item.cellY + ")"; Launcher.sDumpLogs.add(transaction); @@ -495,17 +500,17 @@ public class LauncherModel extends BroadcastReceiver { // in the hotseat if (context instanceof Launcher && screen < 0 && container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - item.screen = ((Launcher) context).getHotseat().getOrderInHotseat(item.cellX, + item.screenId = ((Launcher) context).getHotseat().getOrderInHotseat(item.cellX, item.cellY); } else { - item.screen = screen; + item.screenId = screen; } final ContentValues values = new ContentValues(); values.put(LauncherSettings.Favorites.CONTAINER, item.container); values.put(LauncherSettings.Favorites.CELLX, item.cellX); values.put(LauncherSettings.Favorites.CELLY, item.cellY); - values.put(LauncherSettings.Favorites.SCREEN, item.screen); + values.put(LauncherSettings.Favorites.SCREEN, item.screenId); contentValues.add(values); } @@ -516,10 +521,10 @@ public class LauncherModel extends BroadcastReceiver { * Move and/or resize item in the DB to a new <container, screen, cellX, cellY, spanX, spanY> */ static void modifyItemInDatabase(Context context, final ItemInfo item, final long container, - final int screen, final int cellX, final int cellY, final int spanX, final int spanY) { + final long screenId, final int cellX, final int cellY, final int spanX, final int spanY) { String transaction = "DbDebug Modify item (" + item.title + ") in db, id: " + item.id + - " (" + item.container + ", " + item.screen + ", " + item.cellX + ", " + item.cellY + - ") --> " + "(" + container + ", " + screen + ", " + cellX + ", " + cellY + ")"; + " (" + item.container + ", " + item.screenId + ", " + item.cellX + ", " + item.cellY + + ") --> " + "(" + container + ", " + screenId + ", " + cellX + ", " + cellY + ")"; Launcher.sDumpLogs.add(transaction); Log.d(TAG, transaction); item.cellX = cellX; @@ -529,11 +534,11 @@ public class LauncherModel extends BroadcastReceiver { // We store hotseat items in canonical form which is this orientation invariant position // in the hotseat - if (context instanceof Launcher && screen < 0 && + if (context instanceof Launcher && screenId < 0 && container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - item.screen = ((Launcher) context).getHotseat().getOrderInHotseat(cellX, cellY); + item.screenId = ((Launcher) context).getHotseat().getOrderInHotseat(cellX, cellY); } else { - item.screen = screen; + item.screenId = screenId; } final ContentValues values = new ContentValues(); @@ -542,7 +547,7 @@ public class LauncherModel extends BroadcastReceiver { values.put(LauncherSettings.Favorites.CELLY, item.cellY); values.put(LauncherSettings.Favorites.SPANX, item.spanX); values.put(LauncherSettings.Favorites.SPANY, item.spanY); - values.put(LauncherSettings.Favorites.SCREEN, item.screen); + values.put(LauncherSettings.Favorites.SCREEN, item.screenId); updateItemInDatabaseHelper(context, values, item, "modifyItemInDatabase"); } @@ -604,7 +609,7 @@ public class LauncherModel extends BroadcastReceiver { item.spanY = c.getInt(spanYIndex); item.container = c.getInt(containerIndex); item.itemType = c.getInt(itemTypeIndex); - item.screen = c.getInt(screenIndex); + item.screenId = c.getInt(screenIndex); items.add(item); } @@ -646,7 +651,7 @@ public class LauncherModel extends BroadcastReceiver { folderInfo.title = c.getString(titleIndex); folderInfo.id = id; folderInfo.container = c.getInt(containerIndex); - folderInfo.screen = c.getInt(screenIndex); + folderInfo.screenId = c.getInt(screenIndex); folderInfo.cellX = c.getInt(cellXIndex); folderInfo.cellY = c.getInt(cellYIndex); @@ -664,17 +669,17 @@ public class LauncherModel extends BroadcastReceiver { * cellY fields of the item. Also assigns an ID to the item. */ static void addItemToDatabase(Context context, final ItemInfo item, final long container, - final int screen, final int cellX, final int cellY, final boolean notify) { + final long screenId, final int cellX, final int cellY, final boolean notify) { item.container = container; item.cellX = cellX; item.cellY = cellY; // We store hotseat items in canonical form which is this orientation invariant position // in the hotseat - if (context instanceof Launcher && screen < 0 && + if (context instanceof Launcher && screenId < 0 && container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - item.screen = ((Launcher) context).getHotseat().getOrderInHotseat(cellX, cellY); + item.screenId = ((Launcher) context).getHotseat().getOrderInHotseat(cellX, cellY); } else { - item.screen = screen; + item.screenId = screenId; } final ContentValues values = new ContentValues(); @@ -682,14 +687,14 @@ public class LauncherModel extends BroadcastReceiver { item.onAddToDatabase(values); LauncherAppState app = LauncherAppState.getInstance(); - item.id = app.getLauncherProvider().generateNewId(); + item.id = app.getLauncherProvider().generateNewItemId(); values.put(LauncherSettings.Favorites._ID, item.id); item.updateValuesWithCoordinates(values, item.cellX, item.cellY); Runnable r = new Runnable() { public void run() { String transaction = "DbDebug Add item (" + item.title + ") to db, id: " - + item.id + " (" + container + ", " + screen + ", " + cellX + ", " + + item.id + " (" + container + ", " + screenId + ", " + cellX + ", " + cellY + ")"; Launcher.sDumpLogs.add(transaction); Log.d(TAG, transaction); @@ -734,9 +739,9 @@ public class LauncherModel extends BroadcastReceiver { * Creates a new unique child id, for a given cell span across all layouts. */ static int getCellLayoutChildId( - long container, int screen, int localCellX, int localCellY, int spanX, int spanY) { + long container, long screen, int localCellX, int localCellY, int spanX, int spanY) { return (((int) container & 0xFF) << 24) - | (screen & 0xFF) << 16 | (localCellX & 0xFF) << 8 | (localCellY & 0xFF); + | ((int) screen & 0xFF) << 16 | (localCellX & 0xFF) << 8 | (localCellY & 0xFF); } static int getCellCountX() { @@ -768,7 +773,7 @@ public class LauncherModel extends BroadcastReceiver { Runnable r = new Runnable() { public void run() { String transaction = "DbDebug Delete item (" + item.title + ") from db, id: " - + item.id + " (" + item.container + ", " + item.screen + ", " + item.cellX + + + item.id + " (" + item.container + ", " + item.screenId + ", " + item.cellX + ", " + item.cellY + ")"; Launcher.sDumpLogs.add(transaction); Log.d(TAG, transaction); @@ -809,6 +814,48 @@ public class LauncherModel extends BroadcastReceiver { } /** + * Update the order of the workspace screens in the database. The array list contains + * a list of screen ids in the order that they should appear. + */ + static void updateWorkspaceScreenOrder(Context context, final ArrayList<Long> screens) { + final ContentResolver cr = context.getContentResolver(); + final Uri uri = LauncherSettings.WorkspaceScreens.CONTENT_URI; + + // Remove any negative screen ids -- these aren't persisted + Iterator<Long> iter = screens.iterator(); + while (iter.hasNext()) { + long id = iter.next(); + if (id < 0) { + iter.remove(); + } + } + + Runnable r = new Runnable() { + @Override + public void run() { + final ArrayList<Long> screensCopy = new ArrayList<Long>(); + + // Clear the table + cr.delete(uri, null, null); + int count = screens.size(); + ContentValues[] values = new ContentValues[count]; + for (int i = 0; i < count; i++) { + ContentValues v = new ContentValues(); + long screenId = screens.get(i); + v.put(LauncherSettings.WorkspaceScreens._ID, screenId); + v.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i); + screensCopy.add(screenId); + values[i] = v; + } + cr.bulkInsert(uri, values); + sBgWorkspaceScreens.clear(); + sBgWorkspaceScreens.addAll(screensCopy); + } + }; + runOnWorkerThread(r); + } + + /** * Remove the contents of the specified folder from the database */ static void deleteFolderContentsFromDatabase(Context context, final FolderInfo info) { @@ -1219,7 +1266,6 @@ public class LauncherModel extends BroadcastReceiver { } } - // Update the saved icons if necessary if (DEBUG_LOADERS) Log.d(TAG, "Comparing loaded icons to database icons"); synchronized (sBgLock) { @@ -1280,23 +1326,23 @@ public class LauncherModel extends BroadcastReceiver { } // check & update map of what's occupied; used to discard overlapping/invalid items - private boolean checkItemPlacement(ItemInfo occupied[][][], ItemInfo item) { - int containerIndex = item.screen; + private boolean checkItemPlacement(HashMap<Long, ItemInfo[][]> occupied, ItemInfo item) { + long containerIndex = item.screenId; if (item.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) { - // Return early if we detect that an item is under the hotseat button - if (mCallbacks == null || mCallbacks.get().isAllAppsButtonRank(item.screen)) { - return false; - } - - // We use the last index to refer to the hotseat and the screen as the rank, so - // test and update the occupied state accordingly - if (occupied[Launcher.SCREEN_COUNT][item.screen][0] != null) { - Log.e(TAG, "Error loading shortcut into hotseat " + item - + " into position (" + item.screen + ":" + item.cellX + "," + item.cellY - + ") occupied by " + occupied[Launcher.SCREEN_COUNT][item.screen][0]); - return false; + if (occupied.containsKey(LauncherSettings.Favorites.CONTAINER_HOTSEAT)) { + if (occupied.get(LauncherSettings.Favorites.CONTAINER_HOTSEAT) + [(int) item.screenId][0] != null) { + Log.e(TAG, "Error loading shortcut into hotseat " + item + + " into position (" + item.screenId + ":" + item.cellX + "," + + item.cellY + ") occupied by " + + occupied.get(LauncherSettings.Favorites.CONTAINER_HOTSEAT) + [(int) item.screenId][0]); + return false; + } } else { - occupied[Launcher.SCREEN_COUNT][item.screen][0] = item; + ItemInfo[][] items = new ItemInfo[mCellCountX + 1][mCellCountY + 1]; + items[(int) item.screenId][0] = item; + occupied.put((long) LauncherSettings.Favorites.CONTAINER_HOTSEAT, items); return true; } } else if (item.container != LauncherSettings.Favorites.CONTAINER_DESKTOP) { @@ -1304,22 +1350,28 @@ public class LauncherModel extends BroadcastReceiver { return true; } + if (!occupied.containsKey(item.screenId)) { + ItemInfo[][] items = new ItemInfo[mCellCountX + 1][mCellCountY + 1]; + occupied.put(item.screenId, items); + } + + ItemInfo[][] screens = occupied.get(item.screenId); // Check if any workspace icons overlap with each other for (int x = item.cellX; x < (item.cellX+item.spanX); x++) { for (int y = item.cellY; y < (item.cellY+item.spanY); y++) { - if (occupied[containerIndex][x][y] != null) { + if (screens[x][y] != null) { Log.e(TAG, "Error loading shortcut " + item - + " into cell (" + containerIndex + "-" + item.screen + ":" + + " into cell (" + containerIndex + "-" + item.screenId + ":" + x + "," + y + ") occupied by " - + occupied[containerIndex][x][y]); + + screens[x][y]); return false; } } } for (int x = item.cellX; x < (item.cellX+item.spanX); x++) { for (int y = item.cellY; y < (item.cellY+item.spanY); y++) { - occupied[containerIndex][x][y] = item; + screens[x][y] = item; } } @@ -1348,6 +1400,7 @@ public class LauncherModel extends BroadcastReceiver { sBgFolders.clear(); sBgItemsIdMap.clear(); sBgDbIconCache.clear(); + sBgWorkspaceScreens.clear(); final ArrayList<Long> itemsToRemove = new ArrayList<Long>(); @@ -1356,8 +1409,7 @@ public class LauncherModel extends BroadcastReceiver { // +1 for the hotseat (it can be larger than the workspace) // Load workspace in reverse order to ensure that latest items are loaded first (and // before any earlier duplicates) - final ItemInfo occupied[][][] = - new ItemInfo[Launcher.SCREEN_COUNT + 1][mCellCountX + 1][mCellCountY + 1]; + final HashMap<Long, ItemInfo[][]> occupied = new HashMap<Long, ItemInfo[][]>(); try { final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites._ID); @@ -1439,7 +1491,7 @@ public class LauncherModel extends BroadcastReceiver { info.id = c.getLong(idIndex); container = c.getInt(containerIndex); info.container = container; - info.screen = c.getInt(screenIndex); + info.screenId = c.getInt(screenIndex); info.cellX = c.getInt(cellXIndex); info.cellY = c.getInt(cellYIndex); // check & update map of what's occupied @@ -1461,7 +1513,7 @@ public class LauncherModel extends BroadcastReceiver { } if (container != LauncherSettings.Favorites.CONTAINER_HOTSEAT && loadOldDb) { - info.screen = permuteScreens(info.screen); + info.screenId = permuteScreens(info.screenId); } sBgItemsIdMap.put(info.id, info); @@ -1488,7 +1540,7 @@ public class LauncherModel extends BroadcastReceiver { folderInfo.id = id; container = c.getInt(containerIndex); folderInfo.container = container; - folderInfo.screen = c.getInt(screenIndex); + folderInfo.screenId = c.getInt(screenIndex); folderInfo.cellX = c.getInt(cellXIndex); folderInfo.cellY = c.getInt(cellYIndex); @@ -1504,7 +1556,7 @@ public class LauncherModel extends BroadcastReceiver { } if (container != LauncherSettings.Favorites.CONTAINER_HOTSEAT && loadOldDb) { - folderInfo.screen = permuteScreens(folderInfo.screen); + folderInfo.screenId = permuteScreens(folderInfo.screenId); } sBgItemsIdMap.put(folderInfo.id, folderInfo); @@ -1530,7 +1582,7 @@ public class LauncherModel extends BroadcastReceiver { appWidgetInfo = new LauncherAppWidgetInfo(appWidgetId, provider.provider); appWidgetInfo.id = id; - appWidgetInfo.screen = c.getInt(screenIndex); + appWidgetInfo.screenId = c.getInt(screenIndex); appWidgetInfo.cellX = c.getInt(cellXIndex); appWidgetInfo.cellY = c.getInt(cellYIndex); appWidgetInfo.spanX = c.getInt(spanXIndex); @@ -1548,7 +1600,8 @@ public class LauncherModel extends BroadcastReceiver { } if (container != LauncherSettings.Favorites.CONTAINER_HOTSEAT && loadOldDb) { - appWidgetInfo.screen = permuteScreens(appWidgetInfo.screen); + appWidgetInfo.screenId = + permuteScreens(appWidgetInfo.screenId); } appWidgetInfo.container = c.getInt(containerIndex); @@ -1587,17 +1640,86 @@ public class LauncherModel extends BroadcastReceiver { } } + if (loadOldDb) { + long maxScreenId = 0; + // If we're importing we use the old screen order. + for (ItemInfo item: sBgItemsIdMap.values()) { + long screenId = item.screenId; + if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && + !sBgWorkspaceScreens.contains(screenId)) { + sBgWorkspaceScreens.add(screenId); + if (screenId > maxScreenId) { + maxScreenId = screenId; + } + } + } + Collections.sort(sBgWorkspaceScreens); + mApp.getLauncherProvider().updateMaxScreenId(maxScreenId); + updateWorkspaceScreenOrder(context, sBgWorkspaceScreens); + } else { + Uri screensUri = LauncherSettings.WorkspaceScreens.CONTENT_URI; + final Cursor sc = contentResolver.query(screensUri, null, null, null, null); + TreeMap<Integer, Long> orderedScreens = new TreeMap<Integer, Long>(); + + try { + final int idIndex = sc.getColumnIndexOrThrow( + LauncherSettings.WorkspaceScreens._ID); + final int rankIndex = sc.getColumnIndexOrThrow( + LauncherSettings.WorkspaceScreens.SCREEN_RANK); + while (sc.moveToNext()) { + try { + long screenId = sc.getLong(idIndex); + int rank = sc.getInt(rankIndex); + + orderedScreens.put(rank, screenId); + } catch (Exception e) { + Log.w(TAG, "Desktop items loading interrupted:", e); + } + } + } finally { + sc.close(); + } + + Iterator<Integer> iter = orderedScreens.keySet().iterator(); + while (iter.hasNext()) { + sBgWorkspaceScreens.add(orderedScreens.get(iter.next())); + } + + // Remove any empty screens + ArrayList<Long> unusedScreens = new ArrayList<Long>(); + unusedScreens.addAll(sBgWorkspaceScreens); + + for (ItemInfo item: sBgItemsIdMap.values()) { + long screenId = item.screenId; + + if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && + unusedScreens.contains(screenId)) { + unusedScreens.remove(screenId); + } + } + + // If there are any empty screens remove them, and update. + if (unusedScreens.size() != 0) { + sBgWorkspaceScreens.removeAll(unusedScreens); + updateWorkspaceScreenOrder(context, sBgWorkspaceScreens); + } + } + if (DEBUG_LOADERS) { Log.d(TAG, "loaded workspace in " + (SystemClock.uptimeMillis()-t) + "ms"); Log.d(TAG, "workspace layout: "); + Iterator<Long> iter = occupied.keySet().iterator(); + int nScreens = occupied.size(); for (int y = 0; y < mCellCountY; y++) { String line = ""; - for (int s = 0; s < Launcher.SCREEN_COUNT; s++) { + + for (int s = 0; s < nScreens; s++) { + long screenId = iter.next(); if (s > 0) { line += " | "; } for (int x = 0; x < mCellCountX; x++) { - line += ((occupied[s][x][y] != null) ? "#" : "."); + line += ((occupied.get(screenId)[x][y] != null) ? "#" : "."); } } Log.d(TAG, "[ " + line + " ]"); @@ -1608,7 +1730,7 @@ public class LauncherModel extends BroadcastReceiver { // We rearrange the screens from the old launcher // 12345 -> 34512 - private int permuteScreens(int screen) { + private long permuteScreens(long screen) { if (screen >= 2) { return screen - 2; } else { @@ -1649,7 +1771,7 @@ public class LauncherModel extends BroadcastReceiver { }); for (ItemInfo info : allWorkspaceItems) { if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP) { - if (info.screen == currentScreen) { + if (info.screenId == currentScreen) { currentScreenItems.add(info); itemsOnScreen.add(info.id); } else { @@ -1683,7 +1805,7 @@ public class LauncherModel extends BroadcastReceiver { for (LauncherAppWidgetInfo widget : appWidgets) { if (widget == null) continue; if (widget.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && - widget.screen == currentScreen) { + widget.screenId == currentScreen) { currentScreenWidgets.add(widget); } else { otherScreenWidgets.add(widget); @@ -1708,7 +1830,7 @@ public class LauncherModel extends BroadcastReceiver { FolderInfo folder = folders.get(id); if (info == null || folder == null) continue; if (info.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && - info.screen == currentScreen) { + info.screenId == currentScreen) { currentScreenFolders.put(id, folder); } else { otherScreenFolders.put(id, folder); @@ -1727,15 +1849,30 @@ public class LauncherModel extends BroadcastReceiver { int cellCountY = LauncherModel.getCellCountY(); int screenOffset = cellCountX * cellCountY; int containerOffset = screenOffset * (Launcher.SCREEN_COUNT + 1); // +1 hotseat - long lr = (lhs.container * containerOffset + lhs.screen * screenOffset + + long lr = (lhs.container * containerOffset + lhs.screenId * screenOffset + lhs.cellY * cellCountX + lhs.cellX); - long rr = (rhs.container * containerOffset + rhs.screen * screenOffset + + long rr = (rhs.container * containerOffset + rhs.screenId * screenOffset + rhs.cellY * cellCountX + rhs.cellX); return (int) (lr - rr); } }); } + private void bindWorkspaceScreens(final Callbacks oldCallbacks, + final ArrayList<Long> orderedScreens) { + + final Runnable r = new Runnable() { + @Override + public void run() { + Callbacks callbacks = tryGetCallbacks(oldCallbacks); + if (callbacks != null) { + callbacks.bindScreens(orderedScreens); + } + } + }; + runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE); + } + private void bindWorkspaceItems(final Callbacks oldCallbacks, final ArrayList<ItemInfo> workspaceItems, final ArrayList<LauncherAppWidgetInfo> appWidgets, @@ -1830,11 +1967,13 @@ public class LauncherModel extends BroadcastReceiver { new ArrayList<LauncherAppWidgetInfo>(); HashMap<Long, FolderInfo> folders = new HashMap<Long, FolderInfo>(); HashMap<Long, ItemInfo> itemsIdMap = new HashMap<Long, ItemInfo>(); + ArrayList<Long> orderedScreenIds = new ArrayList<Long>(); synchronized (sBgLock) { workspaceItems.addAll(sBgWorkspaceItems); appWidgets.addAll(sBgAppWidgets); folders.putAll(sBgFolders); itemsIdMap.putAll(sBgItemsIdMap); + orderedScreenIds.addAll(sBgWorkspaceScreens); } ArrayList<ItemInfo> currentWorkspaceItems = new ArrayList<ItemInfo>(); @@ -1867,6 +2006,8 @@ public class LauncherModel extends BroadcastReceiver { }; runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE); + bindWorkspaceScreens(oldCallbacks, orderedScreenIds); + // Load items on the current page bindWorkspaceItems(oldCallbacks, currentWorkspaceItems, currentAppWidgets, currentFolders, null); |