From 39e5d176e6e375e7ae46d42ed14412d54cb223c9 Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Mon, 12 Mar 2012 18:36:12 -0700 Subject: Fix more cases where blips show up in All Apps - defer any updates to the widget previews if we're mid-transition - call System.gc() before a transition to avoid gc mid-transition Change-Id: If8b4699b142af20b2f14e9a8653f893139adf90e --- .../android/launcher2/AppsCustomizePagedView.java | 114 ++++++++++++++------- .../android/launcher2/AppsCustomizeTabHost.java | 7 ++ 2 files changed, 83 insertions(+), 38 deletions(-) (limited to 'src/com/android/launcher2') diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index 3fcff726f..a44765acd 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -32,7 +32,6 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; -import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.MaskFilter; import android.graphics.Matrix; @@ -170,7 +169,8 @@ class AppsCustomizeAsyncTask extends AsyncTask mDeferredSyncWidgetPageItems = + new ArrayList(); + public AppsCustomizePagedView(Context context, AttributeSet attrs) { super(context, attrs); mLayoutInflater = LayoutInflater.from(context); @@ -731,6 +736,32 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen mLauncher.unlockScreenOrientationOnLargeUI(); } + @Override + public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) { + mInTransition = true; + if (toWorkspace) { + cancelAllTasks(); + } + } + + @Override + public View getContent() { + return null; + } + + @Override + public void onLauncherTransitionStep(Launcher l, float t) { + } + + @Override + public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) { + mInTransition = false; + for (AsyncTaskPageData d : mDeferredSyncWidgetPageItems) { + onSyncWidgetPageItems(d); + } + mDeferredSyncWidgetPageItems.clear(); + } + @Override public void onDropCompleted(View target, DragObject d, boolean success) { endDragging(target, success); @@ -785,6 +816,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next(); task.cancel(false); iter.remove(); + mDirtyPageContent.set(task.page, true); } } @@ -804,7 +836,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen Iterator iter = mRunningTasks.iterator(); while (iter.hasNext()) { AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next(); - int pageIndex = task.page + mNumAppsPages; + int pageIndex = task.page; if ((mNextPage > mCurrentPage && pageIndex >= mCurrentPage) || (mNextPage < mCurrentPage && pageIndex <= mCurrentPage)) { task.setThreadPriority(getThreadPriorityForPage(pageIndex)); @@ -906,7 +938,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen int minPageDiff = Integer.MAX_VALUE; while (iter.hasNext()) { AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next(); - minPageDiff = Math.abs(task.page + mNumAppsPages - toPage); + minPageDiff = Math.abs(task.page - toPage); } int rawPageDiff = Math.abs(page - toPage); @@ -941,7 +973,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen Iterator iter = mRunningTasks.iterator(); while (iter.hasNext()) { AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next(); - int taskPage = task.page + mNumAppsPages; + int taskPage = task.page; if (taskPage < getAssociatedLowerPageBound(mCurrentPage) || taskPage > getAssociatedUpperPageBound(mCurrentPage)) { task.cancel(false); @@ -952,7 +984,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen } // We introduce a slight delay to order the loading of side pages so that we don't thrash - final int sleepMs = getSleepForPage(page + mNumAppsPages); + final int sleepMs = getSleepForPage(page); AsyncTaskPageData pageData = new AsyncTaskPageData(page, widgets, cellWidth, cellHeight, new AsyncTaskCallback() { @Override @@ -972,20 +1004,17 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen new AsyncTaskCallback() { @Override public void run(AppsCustomizeAsyncTask task, AsyncTaskPageData data) { - try { - mRunningTasks.remove(task); - if (task.isCancelled()) return; - onSyncWidgetPageItems(data); - } finally { - data.cleanup(task.isCancelled()); - } + mRunningTasks.remove(task); + if (task.isCancelled()) return; + // do cleanup inside onSyncWidgetPageItems + onSyncWidgetPageItems(data); } }); // Ensure that the task is appropriately prioritized and runs in parallel AppsCustomizeAsyncTask t = new AppsCustomizeAsyncTask(page, AsyncTaskPageData.Type.LoadWidgetPreviewData); - t.setThreadPriority(getThreadPriorityForPage(page + mNumAppsPages)); + t.setThreadPriority(getThreadPriorityForPage(page)); t.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, pageData); mRunningTasks.add(t); } @@ -1128,13 +1157,13 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen - ((mWidgetCountY - 1) * mWidgetHeightGap)) / mWidgetCountY); // Prepare the set of widgets to load previews for in the background - int offset = page * numItemsPerPage; + int offset = (page - mNumAppsPages) * numItemsPerPage; for (int i = offset; i < Math.min(offset + numItemsPerPage, mWidgets.size()); ++i) { items.add(mWidgets.get(i)); } // Prepopulate the pages with the other widget info, and fill in the previews later - final PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page + mNumAppsPages); + final PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page); layout.setColumnCount(layout.getCellCountX()); for (int i = 0; i < items.size(); ++i) { Object rawInfo = items.get(i); @@ -1245,29 +1274,38 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen } } } - private void onSyncWidgetPageItems(AsyncTaskPageData data) { - int page = data.page; - PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page + mNumAppsPages); - ArrayList items = data.items; - int count = items.size(); - for (int i = 0; i < count; ++i) { - PagedViewWidget widget = (PagedViewWidget) layout.getChildAt(i); - if (widget != null) { - Bitmap preview = data.generatedImages.get(i); - widget.applyPreview(new FastBitmapDrawable(preview), i); - } + private void onSyncWidgetPageItems(AsyncTaskPageData data) { + if (mInTransition) { + mDeferredSyncWidgetPageItems.add(data); + return; } + try { + int page = data.page; + PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(page); + + ArrayList items = data.items; + int count = items.size(); + for (int i = 0; i < count; ++i) { + PagedViewWidget widget = (PagedViewWidget) layout.getChildAt(i); + if (widget != null) { + Bitmap preview = data.generatedImages.get(i); + widget.applyPreview(new FastBitmapDrawable(preview), i); + } + } - layout.createHardwareLayer(); - invalidate(); + layout.createHardwareLayer(); + invalidate(); - // Update all thread priorities - Iterator iter = mRunningTasks.iterator(); - while (iter.hasNext()) { - AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next(); - int pageIndex = task.page + mNumAppsPages; - task.setThreadPriority(getThreadPriorityForPage(pageIndex)); + // Update all thread priorities + Iterator iter = mRunningTasks.iterator(); + while (iter.hasNext()) { + AppsCustomizeAsyncTask task = (AppsCustomizeAsyncTask) iter.next(); + int pageIndex = task.page; + task.setThreadPriority(getThreadPriorityForPage(pageIndex)); + } + } finally { + data.cleanup(false); } } @@ -1281,7 +1319,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen PagedViewGridLayout layout = new PagedViewGridLayout(context, mWidgetCountX, mWidgetCountY); setupPage(layout); - addView(layout, new PagedViewGridLayout.LayoutParams(LayoutParams.MATCH_PARENT, + addView(layout, new PagedView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); } @@ -1297,14 +1335,14 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen if (page < mNumAppsPages) { syncAppsPageItems(page, immediate); } else { - syncWidgetPageItems(page - mNumAppsPages, immediate); + syncWidgetPageItems(page, immediate); } } // We want our pages to be z-ordered such that the further a page is to the left, the higher // it is in the z-order. This is important to insure touch events are handled correctly. View getPageAt(int index) { - return getChildAt(getChildCount() - index - 1); + return getChildAt(indexToPage(index)); } @Override diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java index 7108c9f53..af0f205d5 100644 --- a/src/com/android/launcher2/AppsCustomizeTabHost.java +++ b/src/com/android/launcher2/AppsCustomizeTabHost.java @@ -355,6 +355,11 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona // force building the layer, so you don't get a blip early in an animation // when the layer is created layer buildLayer(); + + // Let the GC system know that now is a good time to do any garbage + // collection; makes it less likely we'll get a GC during the all apps + // to workspace animation + System.gc(); } } @@ -366,6 +371,7 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona /* LauncherTransitionable overrides */ @Override public void onLauncherTransitionStart(Launcher l, boolean animated, boolean toWorkspace) { + mAppsCustomizePane.onLauncherTransitionStart(l, animated, toWorkspace); mInTransition = true; mTransitioningToWorkspace = toWorkspace; @@ -405,6 +411,7 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona @Override public void onLauncherTransitionEnd(Launcher l, boolean animated, boolean toWorkspace) { + mAppsCustomizePane.onLauncherTransitionEnd(l, animated, toWorkspace); mInTransition = false; if (animated) { setLayerType(LAYER_TYPE_NONE, null); -- cgit v1.2.3