From c402cd9992d431b6beacdf3c75e31cf103e230cb Mon Sep 17 00:00:00 2001 From: Michael Jurka Date: Mon, 20 May 2013 15:49:32 +0200 Subject: Fixing slow binding when returning to Launcher Bug: 8978842 Bug: 8660324 Change-Id: Idfa37c05ed299faa465ea66de4b43d30da77ecbc --- src/com/android/launcher2/Launcher.java | 66 ++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 21 deletions(-) (limited to 'src/com/android/launcher2/Launcher.java') diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 473a3d158..94a0bca26 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -126,7 +126,7 @@ public final class Launcher extends Activity static final boolean PROFILE_STARTUP = false; static final boolean DEBUG_WIDGETS = false; static final boolean DEBUG_STRICT_MODE = false; - static final boolean DEBUG_RESUME_TIME = true; + static final boolean DEBUG_RESUME_TIME = false; private static final int MENU_GROUP_WALLPAPER = 1; private static final int MENU_WALLPAPER_SETTINGS = Menu.FIRST + 1; @@ -392,7 +392,8 @@ public final class Launcher extends Activity // Update customization drawer _after_ restoring the states if (mAppsCustomizeContent != null) { - mAppsCustomizeContent.onPackagesUpdated(); + mAppsCustomizeContent.onPackagesUpdated( + LauncherModel.getSortedWidgetsAndShortcuts(this)); } if (PROFILE_STARTUP) { @@ -759,19 +760,28 @@ public final class Launcher extends Activity mRestoring = false; mOnResumeNeedsLoad = false; } - // We might have postponed some bind calls until onResume (see waitUntilResume) -- - // execute them here - long startTimeCallbacks = 0; - if (DEBUG_RESUME_TIME) { - startTimeCallbacks = System.currentTimeMillis(); - } - for (int i = 0; i < mOnResumeCallbacks.size(); i++) { - mOnResumeCallbacks.get(i).run(); - } - mOnResumeCallbacks.clear(); - if (DEBUG_RESUME_TIME) { - Log.d(TAG, "Time spent processing callbacks in onResume: " + - (System.currentTimeMillis() - startTimeCallbacks)); + if (mOnResumeCallbacks.size() > 0) { + // We might have postponed some bind calls until onResume (see waitUntilResume) -- + // execute them here + long startTimeCallbacks = 0; + if (DEBUG_RESUME_TIME) { + startTimeCallbacks = System.currentTimeMillis(); + } + + if (mAppsCustomizeContent != null) { + mAppsCustomizeContent.setBulkBind(true); + } + for (int i = 0; i < mOnResumeCallbacks.size(); i++) { + mOnResumeCallbacks.get(i).run(); + } + if (mAppsCustomizeContent != null) { + mAppsCustomizeContent.setBulkBind(false); + } + mOnResumeCallbacks.clear(); + if (DEBUG_RESUME_TIME) { + Log.d(TAG, "Time spent processing callbacks in onResume: " + + (System.currentTimeMillis() - startTimeCallbacks)); + } } // Reset the pressed state of icons that were locked in the press state while activities @@ -3308,9 +3318,13 @@ public final class Launcher extends Activity * @return true if we are currently paused. The caller might be able to * skip some work in that case since we will come back again. */ - private boolean waitUntilResume(Runnable run) { + private boolean waitUntilResume(Runnable run, boolean deletePreviousRunnables) { if (mPaused) { Log.i(TAG, "Deferring update until onResume"); + if (deletePreviousRunnables) { + while (mOnResumeCallbacks.remove(run)) { + } + } mOnResumeCallbacks.add(run); return true; } else { @@ -3318,6 +3332,10 @@ public final class Launcher extends Activity } } + private boolean waitUntilResume(Runnable run) { + return waitUntilResume(run, false); + } + /** * If the activity is currently paused, signal that we need to re-run the loader * in onResume. @@ -3761,17 +3779,23 @@ public final class Launcher extends Activity /** * A number of packages were updated. */ - public void bindPackagesUpdated() { - if (waitUntilResume(new Runnable() { + + private ArrayList mWidgetsAndShortcuts; + private Runnable mBindPackagesUpdatedRunnable = new Runnable() { public void run() { - bindPackagesUpdated(); + bindPackagesUpdated(mWidgetsAndShortcuts); + mWidgetsAndShortcuts = null; } - })) { + }; + + public void bindPackagesUpdated(final ArrayList widgetsAndShortcuts) { + if (waitUntilResume(mBindPackagesUpdatedRunnable, true)) { + mWidgetsAndShortcuts = widgetsAndShortcuts; return; } if (mAppsCustomizeContent != null) { - mAppsCustomizeContent.onPackagesUpdated(); + mAppsCustomizeContent.onPackagesUpdated(widgetsAndShortcuts); } } -- cgit v1.2.3