diff options
author | Winson Chung <winsonc@google.com> | 2011-06-28 14:25:17 -0700 |
---|---|---|
committer | Winson Chung <winsonc@google.com> | 2011-06-28 16:30:27 -0700 |
commit | 875de7e1605f4fc8f04c804b5ac4bb9386189630 (patch) | |
tree | f9398bd44f7530a41b2c18a472c68785a033c4e3 /src/com/android | |
parent | 518eb5dbf5480ac95a511715906f3d5af457f9ba (diff) | |
download | android_packages_apps_Trebuchet-875de7e1605f4fc8f04c804b5ac4bb9386189630.tar.gz android_packages_apps_Trebuchet-875de7e1605f4fc8f04c804b5ac4bb9386189630.tar.bz2 android_packages_apps_Trebuchet-875de7e1605f4fc8f04c804b5ac4bb9386189630.zip |
Fixing crash when adding/removing new packages while AppsCustomize is open.
Change-Id: I3bcf1ec811af6f8dddcace65d973ed368e95b4c7
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/launcher2/AppsCustomizePagedView.java | 59 |
1 files changed, 50 insertions, 9 deletions
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index e7933635e..5696b5029 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -67,6 +67,11 @@ interface AsyncTaskCallback { * The data needed to perform either of the custom AsyncTasks. */ class AsyncTaskPageData { + enum Type { + LoadWidgetPreviewData, + LoadHolographicIconsData + } + AsyncTaskPageData(int p, ArrayList<Object> l, ArrayList<Bitmap> si, AsyncTaskCallback bgR, AsyncTaskCallback postR) { page = p; @@ -103,10 +108,11 @@ class AsyncTaskPageData { * A generic template for an async task used in AppsCustomize. */ class AppsCustomizeAsyncTask extends AsyncTask<AsyncTaskPageData, Void, AsyncTaskPageData> { - AppsCustomizeAsyncTask(int p, AppsCustomizePagedView.ContentType t) { + AppsCustomizeAsyncTask(int p, AppsCustomizePagedView.ContentType t, AsyncTaskPageData.Type ty) { page = p; pageContentType = t; threadPriority = Process.THREAD_PRIORITY_DEFAULT; + dataType = ty; } @Override protected AsyncTaskPageData doInBackground(AsyncTaskPageData... params) { @@ -129,6 +135,7 @@ class AppsCustomizeAsyncTask extends AsyncTask<AsyncTaskPageData, Void, AsyncTas } // The page that this async task is associated with + AsyncTaskPageData.Type dataType; int page; AppsCustomizePagedView.ContentType pageContentType; int threadPriority; @@ -314,6 +321,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen public void onPackagesUpdated() { // Get the list of widgets and shortcuts + boolean wasEmpty = mWidgets.isEmpty() && mShortcuts.isEmpty(); mWidgets.clear(); mShortcuts.clear(); List<AppWidgetProviderInfo> widgets = @@ -327,9 +335,13 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen mWidgets.addAll(widgets); mShortcuts.addAll(shortcuts); - // The next layout pass will trigger data-ready if both widgets and apps are set, so request - // a layout to do this test and invalidate the page data when ready. - if (testDataReady()) requestLayout(); + if (wasEmpty) { + // The next layout pass will trigger data-ready if both widgets and apps are set, so request + // a layout to do this test and invalidate the page data when ready. + if (testDataReady()) requestLayout(); + } else { + invalidatePageData(); + } } @Override @@ -548,6 +560,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen int startIndex = page * numCells; int endIndex = Math.min(startIndex + numCells, mApps.size()); PagedViewCellLayout layout = (PagedViewCellLayout) getChildAt(page); + layout.removeAllViewsOnPage(); ArrayList<Object> items = new ArrayList<Object>(); ArrayList<Bitmap> images = new ArrayList<Bitmap>(); @@ -604,7 +617,8 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen while (iter.hasNext()) { AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next(); int taskPage = task.page; - if (taskPage < getAssociatedLowerPageBound(mCurrentPage) || + if ((taskPage == page) || + taskPage < getAssociatedLowerPageBound(mCurrentPage) || taskPage > getAssociatedUpperPageBound(mCurrentPage)) { task.cancel(false); iter.remove(); @@ -650,6 +664,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen @Override public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) { mRunningTasks.remove(task); + if (task.isCancelled()) return; if (task.page > getPageCount()) return; if (task.pageContentType != mContentType) return; onSyncWidgetPageItems(data); @@ -657,7 +672,8 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen }); // Ensure that the task is appropriately prioritized and runs in parallel - AppsCustomizeAsyncTask t = new AppsCustomizeAsyncTask(page, mContentType); + AppsCustomizeAsyncTask t = new AppsCustomizeAsyncTask(page, mContentType, + AsyncTaskPageData.Type.LoadWidgetPreviewData); t.setThreadPriority(getThreadPriorityForPage(page)); t.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, pageData); mRunningTasks.add(t); @@ -667,6 +683,18 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen */ private void prepareGenerateHoloOutlinesTask(int page, ArrayList<Object> items, ArrayList<Bitmap> images) { + // Prune old tasks for this page + Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator(); + while (iter.hasNext()) { + AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next(); + int taskPage = task.page; + if ((taskPage == page) && + (task.dataType == AsyncTaskPageData.Type.LoadHolographicIconsData)) { + task.cancel(false); + iter.remove(); + } + } + AsyncTaskPageData pageData = new AsyncTaskPageData(page, items, images, new AsyncTaskCallback() { @Override @@ -700,6 +728,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen @Override public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) { mRunningTasks.remove(task); + if (task.isCancelled()) return; if (task.page > getPageCount()) return; if (task.pageContentType != mContentType) return; onHolographicPageItemsLoaded(data); @@ -708,7 +737,8 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen // Ensure that the outline task always runs in the background, serially AppsCustomizeAsyncTask t = - new AppsCustomizeAsyncTask(page, mContentType); + new AppsCustomizeAsyncTask(page, mContentType, + AsyncTaskPageData.Type.LoadHolographicIconsData); t.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); t.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, pageData); mRunningTasks.add(t); @@ -939,12 +969,14 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen if (layout instanceof PagedViewCellLayout) { PagedViewCellLayout cl = (PagedViewCellLayout) layout; int count = cl.getPageChildCount(); + if (count != data.generatedImages.size()) return; for (int i = 0; i < count; ++i) { PagedViewIcon icon = (PagedViewIcon) cl.getChildOnPageAt(i); icon.setHolographicOutline(data.generatedImages.get(i)); } } else { int count = layout.getChildCount(); + if (count != data.generatedImages.size()) return; for (int i = 0; i < count; ++i) { View v = layout.getChildAt(i); ((PagedViewWidget) v).setHolographicOutline(data.generatedImages.get(i)); @@ -955,6 +987,15 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen @Override public void syncPages() { removeAllViews(); + + // Remove all background asyc tasks if we are loading content anew + Iterator<AppsCustomizeAsyncTask> iter = mRunningTasks.iterator(); + while (iter.hasNext()) { + AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next(); + task.cancel(false); + iter.remove(); + } + switch (mContentType) { case Applications: syncAppsPages(); @@ -1037,8 +1078,8 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen mApps = list; Collections.sort(mApps, LauncherModel.APP_NAME_COMPARATOR); - // The next layout pass will trigger data-ready if both widgets and apps are set, so request - // a layout to do this test and invalidate the page data when ready. + // The next layout pass will trigger data-ready if both widgets and apps are set, so + // request a layout to do this test and invalidate the page data when ready. if (testDataReady()) requestLayout(); } private void addAppsWithoutInvalidate(ArrayList<ApplicationInfo> list) { |