From 76828c87ddb50ee3b423ef26f36387a2f03fd562 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 19 Aug 2013 15:43:29 -0700 Subject: [PATCH] Ensuring that we don't clobber workspace screens map when new apps are added. - Using Log warnings instead of debugs - Ensuring we don't save negative screen id's Change-Id: I13276d007193c120ee0830abcdc6eb203f22a9da --- src/com/android/launcher3/Launcher.java | 2 +- src/com/android/launcher3/LauncherModel.java | 114 +++++++++++-------- src/com/android/launcher3/Workspace.java | 16 +-- 3 files changed, 75 insertions(+), 57 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 890c632f8b..876b2f66da 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3562,7 +3562,7 @@ public class Launcher extends Activity public void bindAddScreens(ArrayList orderedScreenIds) { int count = orderedScreenIds.size(); for (int i = 0; i < count; i++) { - Log.d(TAG, "10249126 - bindAddScreens(" + orderedScreenIds.get(i) + ")"); + Log.w(TAG, "10249126 - bindAddScreens(" + orderedScreenIds.get(i) + ")"); mWorkspace.insertNewWorkspaceScreenBeforeEmptyScreen(orderedScreenIds.get(i), false); } } diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 9ec6c35623..2ac9b1b6ce 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -238,7 +238,8 @@ public class LauncherModel extends BroadcastReceiver { } static Pair findNextAvailableIconSpace(Context context, String name, Intent launchIntent, - int firstScreenIndex) { + int firstScreenIndex, + ArrayList workspaceScreens) { // Lock on the app so that we don't try and get the items while apps are being added LauncherAppState app = LauncherAppState.getInstance(); LauncherModel model = app.getModel(); @@ -254,14 +255,14 @@ public class LauncherModel extends BroadcastReceiver { // Try adding to the workspace screens incrementally, starting at the default or center // screen and alternating between +1, -1, +2, -2, etc. (using ~ ceil(i/2f)*(-1)^(i-1)) - firstScreenIndex = Math.min(firstScreenIndex, sBgWorkspaceScreens.size()); - int count = sBgWorkspaceScreens.size(); + firstScreenIndex = Math.min(firstScreenIndex, workspaceScreens.size()); + int count = workspaceScreens.size(); for (int screen = firstScreenIndex; screen < count && !found; screen++) { int[] tmpCoordinates = new int[2]; if (findNextAvailableIconSpaceInScreen(items, tmpCoordinates, - sBgWorkspaceScreens.get(screen))) { + workspaceScreens.get(screen))) { // Update the Launcher db - return new Pair(sBgWorkspaceScreens.get(screen), tmpCoordinates); + return new Pair(workspaceScreens.get(screen), tmpCoordinates); } } } @@ -283,6 +284,16 @@ public class LauncherModel extends BroadcastReceiver { final ArrayList addedShortcutsFinal = new ArrayList(); final ArrayList addedWorkspaceScreensFinal = new ArrayList(); + // Get the list of workspace screens. We need to append to this list and + // can not use sBgWorkspaceScreens because loadWorkspace() may not have been + // called. + ArrayList workspaceScreens = new ArrayList(); + TreeMap orderedScreens = loadWorkspaceScreensDb(context); + for (Integer i : orderedScreens.keySet()) { + long screenId = orderedScreens.get(i); + workspaceScreens.add(screenId); + } + synchronized(sBgLock) { Iterator iter = added.iterator(); while (iter.hasNext()) { @@ -298,7 +309,7 @@ public class LauncherModel extends BroadcastReceiver { // Add this icon to the db, creating a new page if necessary int startSearchPageIndex = 1; Pair coords = LauncherModel.findNextAvailableIconSpace(context, - name, launchIntent, startSearchPageIndex); + name, launchIntent, startSearchPageIndex, workspaceScreens); if (coords == null) { LauncherAppState appState = LauncherAppState.getInstance(); LauncherProvider lp = appState.getLauncherProvider(); @@ -308,20 +319,19 @@ public class LauncherModel extends BroadcastReceiver { // page is added. Create as many screens as necessary to satisfy // the startSearchPageIndex. int numPagesToAdd = Math.max(1, startSearchPageIndex + 1 - - sBgWorkspaceScreens.size()); + workspaceScreens.size()); while (numPagesToAdd > 0) { long screenId = lp.generateNewScreenId(); - Log.d(TAG, "10249126 - addAndBindAddedApps(" + screenId + ")"); - // Update the model - sBgWorkspaceScreens.add(screenId); - updateWorkspaceScreenOrder(context, sBgWorkspaceScreens); + Log.w(TAG, "10249126 - addAndBindAddedApps(" + screenId + ")"); // Save the screen id for binding in the workspace + workspaceScreens.add(screenId); addedWorkspaceScreensFinal.add(screenId); numPagesToAdd--; } + // Find the coordinate again coords = LauncherModel.findNextAvailableIconSpace(context, - name, launchIntent, startSearchPageIndex); + name, launchIntent, startSearchPageIndex, workspaceScreens); } if (coords == null) { throw new RuntimeException("Coordinates should not be null"); @@ -344,6 +354,9 @@ public class LauncherModel extends BroadcastReceiver { } } + // Update the workspace screens + updateWorkspaceScreenOrder(context, workspaceScreens); + if (!addedShortcutsFinal.isEmpty()) { runOnMainThread(new Runnable() { public void run() { @@ -1002,14 +1015,14 @@ public class LauncherModel extends BroadcastReceiver { public void run() { // Clear the table cr.delete(uri, null, null); - int count = screens.size(); + int count = screensCopy.size(); ContentValues[] values = new ContentValues[count]; for (int i = 0; i < count; i++) { ContentValues v = new ContentValues(); - long screenId = screens.get(i); + long screenId = screensCopy.get(i); v.put(LauncherSettings.WorkspaceScreens._ID, screenId); v.put(LauncherSettings.WorkspaceScreens.SCREEN_RANK, i); - Log.d(TAG, "10249126 - updateWorkspaceScreenOrder(" + screenId + ", " + i + ")"); + Log.w(TAG, "10249126 - updateWorkspaceScreenOrder(" + screenId + ", " + i + ")"); values[i] = v; } cr.bulkInsert(uri, values); @@ -1238,6 +1251,36 @@ public class LauncherModel extends BroadcastReceiver { } } + /** Loads the workspace screens db into a map of Rank -> ScreenId */ + private static TreeMap loadWorkspaceScreensDb(Context context) { + final ContentResolver contentResolver = context.getContentResolver(); + final Uri screensUri = LauncherSettings.WorkspaceScreens.CONTENT_URI; + final Cursor sc = contentResolver.query(screensUri, null, null, null, null); + TreeMap orderedScreens = new TreeMap(); + + 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); + + Log.w(TAG, "10249126 - loadWorkspaceScreensDb(" + screenId + ", " + rank + ")"); + + orderedScreens.put(rank, screenId); + } catch (Exception e) { + Log.w(TAG, "Desktop items loading interrupted - invalid screens: ", e); + } + } + } finally { + sc.close(); + } + return orderedScreens; + } + public boolean isAllAppsLoaded() { return mAllAppsLoaded; } @@ -1434,7 +1477,7 @@ public class LauncherModel extends BroadcastReceiver { // Ensure that all the applications that are in the system are represented on the home // screen. - Log.d(TAG, "10249126 - verifyApplications(" + isUpgrade + ")"); + Log.w(TAG, "10249126 - verifyApplications(" + isUpgrade + ")"); if (!isUpgrade) { verifyApplications(); } @@ -1498,7 +1541,7 @@ public class LauncherModel extends BroadcastReceiver { synchronized (sBgLock) { for (ApplicationInfo app : mBgAllAppsList.data) { tmpInfos = getItemInfoForComponentName(app.componentName); - Log.d(TAG, "10249126 - \t" + app.componentName.getPackageName() + ", " + tmpInfos.isEmpty()); + Log.w(TAG, "10249126 - \t" + app.componentName.getPackageName() + ", " + tmpInfos.isEmpty()); if (tmpInfos.isEmpty()) { // We are missing an application icon, so add this to the workspace added.add(app); @@ -1589,7 +1632,7 @@ public class LauncherModel extends BroadcastReceiver { sBgItemsIdMap.clear(); sBgDbIconCache.clear(); sBgWorkspaceScreens.clear(); - Log.d(TAG, "10249126 - loadWorkspace()"); + Log.w(TAG, "10249126 - loadWorkspace()"); final ArrayList itemsToRemove = new ArrayList(); final Uri contentUri = LauncherSettings.Favorites.CONTENT_URI; @@ -1835,7 +1878,7 @@ public class LauncherModel extends BroadcastReceiver { long screenId = item.screenId; if (item.container == LauncherSettings.Favorites.CONTAINER_DESKTOP && !sBgWorkspaceScreens.contains(screenId)) { - Log.d(TAG, "10249126 - loadWorkspace-loadedOldDb(" + screenId + ")"); + Log.w(TAG, "10249126 - loadWorkspace-loadedOldDb(" + screenId + ")"); sBgWorkspaceScreens.add(screenId); if (screenId > maxScreenId) { maxScreenId = screenId; @@ -1855,34 +1898,9 @@ public class LauncherModel extends BroadcastReceiver { LauncherAppState app = LauncherAppState.getInstance(); app.getLauncherProvider().updateMaxItemId(maxItemId); } else { - Uri screensUri = LauncherSettings.WorkspaceScreens.CONTENT_URI; - final Cursor sc = contentResolver.query(screensUri, null, null, null, null); - TreeMap orderedScreens = new TreeMap(); - - 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); - - Log.d(TAG, "10249126 - loadWorkspace-!loadedOldDb(" + screenId + ", " + rank + ")"); - - orderedScreens.put(rank, screenId); - } catch (Exception e) { - Log.w(TAG, "Desktop items loading interrupted - invalid screens: ", e); - } - } - } finally { - sc.close(); - } - - Iterator iter = orderedScreens.keySet().iterator(); - while (iter.hasNext()) { - sBgWorkspaceScreens.add(orderedScreens.get(iter.next())); + TreeMap orderedScreens = loadWorkspaceScreensDb(mContext); + for (Integer i : orderedScreens.keySet()) { + sBgWorkspaceScreens.add(orderedScreens.get(i)); } // Remove any empty screens @@ -2051,7 +2069,7 @@ public class LauncherModel extends BroadcastReceiver { private void bindWorkspaceScreens(final Callbacks oldCallbacks, final ArrayList orderedScreens) { - Log.d(TAG, "10249126 - bindWorkspaceScreens()"); + Log.w(TAG, "10249126 - bindWorkspaceScreens()"); final Runnable r = new Runnable() { @Override public void run() { diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 07b27bed8e..44eeae41e2 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -518,7 +518,7 @@ public class Workspace extends SmoothPagedView } public long insertNewWorkspaceScreen(long screenId, int insertIndex, boolean updateDb) { - Log.d(TAG, "10249126 - insertNewWorkspaceScreen(" + screenId + ", " + insertIndex + ", " + updateDb + ")"); + Log.w(TAG, "10249126 - insertNewWorkspaceScreen(" + screenId + ", " + insertIndex + ", " + updateDb + ")"); CellLayout newScreen = (CellLayout) mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null); @@ -535,7 +535,7 @@ public class Workspace extends SmoothPagedView } public void createCustomContentPage() { - Log.d(TAG, "10249126 - createCustomContentPage()"); + Log.w(TAG, "10249126 - createCustomContentPage()"); CellLayout customScreen = (CellLayout) mLauncher.getLayoutInflater().inflate(R.layout.workspace_screen, null); @@ -570,7 +570,7 @@ public class Workspace extends SmoothPagedView } public long commitExtraEmptyScreen() { - Log.d(TAG, "10249126 - commitExtraEmptyScreen()"); + Log.w(TAG, "10249126 - commitExtraEmptyScreen()"); CellLayout cl = mWorkspaceScreens.get(EXTRA_EMPTY_SCREEN_ID); mWorkspaceScreens.remove(EXTRA_EMPTY_SCREEN_ID); mScreenOrder.remove(EXTRA_EMPTY_SCREEN_ID); @@ -592,13 +592,13 @@ public class Workspace extends SmoothPagedView } public CellLayout getScreenWithId(long screenId) { - Log.d(TAG, "10249126 - getScreenWithId(" + screenId + ")"); + Log.w(TAG, "10249126 - getScreenWithId(" + screenId + ")"); CellLayout layout = mWorkspaceScreens.get(screenId); return layout; } public long getIdForScreen(CellLayout layout) { - Log.d(TAG, "10249126 - getIdForScreen()"); + Log.w(TAG, "10249126 - getIdForScreen()"); Iterator iter = mWorkspaceScreens.keySet().iterator(); while (iter.hasNext()) { long id = iter.next(); @@ -610,7 +610,7 @@ public class Workspace extends SmoothPagedView } public int getPageIndexForScreenId(long screenId) { - Log.d(TAG, "10249126 - getPageIndexForScreenId(" + screenId + ")"); + Log.w(TAG, "10249126 - getPageIndexForScreenId(" + screenId + ")"); return indexOfChild(mWorkspaceScreens.get(screenId)); } @@ -628,7 +628,7 @@ public class Workspace extends SmoothPagedView return; } - Log.d(TAG, "10249126 - stripEmptyScreens()"); + Log.w(TAG, "10249126 - stripEmptyScreens()"); int currentPage = getNextPage(); ArrayList removeScreens = new ArrayList(); @@ -641,7 +641,7 @@ public class Workspace extends SmoothPagedView int pageShift = 0; for (Long id: removeScreens) { - Log.d(TAG, "10249126 - \tremove(" + id + ")"); + Log.w(TAG, "10249126 - \tremove(" + id + ")"); CellLayout cl = mWorkspaceScreens.get(id); mWorkspaceScreens.remove(id); mScreenOrder.remove(id);