diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java index 0189d6c358..ca02e1e9ee 100644 --- a/src/com/android/launcher2/AppsCustomizePagedView.java +++ b/src/com/android/launcher2/AppsCustomizePagedView.java @@ -393,15 +393,17 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen mWidgetSpacingLayout.measure(widthSpec, heightSpec); mContentWidth = mWidgetSpacingLayout.getContentWidth(); + AppsCustomizeTabHost host = (AppsCustomizeTabHost) getTabHost(); + final boolean hostIsTransitioning = host.isTransitioning(); + // Restore the page int page = getPageForComponent(mSaveInstanceStateItemIndex); - invalidatePageData(Math.max(0, page)); + invalidatePageData(Math.max(0, page), hostIsTransitioning); // Show All Apps cling if we are finished transitioning, otherwise, we will try again when // the transition completes in AppsCustomizeTabHost (otherwise the wrong offsets will be // returned while animating) - AppsCustomizeTabHost host = (AppsCustomizeTabHost) getTabHost(); - if (!host.isTransitioning()) { + if (!hostIsTransitioning) { post(new Runnable() { @Override public void run() { @@ -662,6 +664,18 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen cancelAllTasks(); } + public void clearAllWidgetPages() { + cancelAllTasks(); + int count = getChildCount(); + for (int i = 0; i < count; i++) { + View v = getPageAt(i); + if (v instanceof PagedViewGridLayout) { + ((PagedViewGridLayout) v).removeAllViewsOnPage(); + mDirtyPageContent.set(i, true); + } + } + } + private void cancelAllTasks() { // Clean up all the async tasks Iterator iter = mRunningTasks.iterator(); diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java index 778d6bc752..2963240fa7 100644 --- a/src/com/android/launcher2/AppsCustomizeTabHost.java +++ b/src/com/android/launcher2/AppsCustomizeTabHost.java @@ -366,6 +366,11 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona } mContent.setVisibility(VISIBLE); + if (!toWorkspace) { + // Make sure the current page is loaded (we start loading the side pages after the + // transition to prevent slowing down the animation) + mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage(), true); + } if (animated && !delayLauncherTransitionUntilLayout) { enableAndBuildHardwareLayer(); } @@ -391,6 +396,9 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona // Dismiss the workspace cling and show the all apps cling (if not already shown) l.dismissWorkspaceCling(null); mAppsCustomizePane.showAllAppsCling(); + // Make sure adjacent pages are loaded (we wait until after the transition to + // prevent slowing down the animation) + mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage()); if (!LauncherApplication.isScreenLarge()) { mAppsCustomizePane.hideScrollingIndicator(false); @@ -398,6 +406,23 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona } } + public void onResume() { + if (getVisibility() == VISIBLE) { + mContent.setVisibility(VISIBLE); + // We unload the widget previews when the UI is hidden, so need to reload pages + // Load the current page synchronously, and the neighboring pages asynchronously + mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage(), true); + mAppsCustomizePane.loadAssociatedPages(mAppsCustomizePane.getCurrentPage()); + } + } + + public void onTrimMemory() { + mContent.setVisibility(GONE); + // Clear the widget pages of all their subviews - this will trigger the widget previews + // to delete their bitmaps + mAppsCustomizePane.clearAllWidgetPages(); + } + boolean isTransitioning() { return mInTransition; } diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java index 6ea14db417..c917aec1ad 100644 --- a/src/com/android/launcher2/Launcher.java +++ b/src/com/android/launcher2/Launcher.java @@ -36,6 +36,7 @@ import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ClipData; import android.content.ClipDescription; +import android.content.ComponentCallbacks2; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; @@ -563,6 +564,7 @@ public final class Launcher extends Activity // When we resume Launcher, a different Activity might be responsible for the app // market intent, so refresh the icon updateAppMarketIcon(); + mAppsCustomizeTabHost.onResume(); if (!mWorkspaceLoading) { final ViewTreeObserver observer = mWorkspace.getViewTreeObserver(); final Workspace workspace = mWorkspace; @@ -2397,6 +2399,14 @@ public final class Launcher extends Activity } } + @Override + public void onTrimMemory(int level) { + super.onTrimMemory(level); + if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { + mAppsCustomizeTabHost.onTrimMemory(); + } + } + void showWorkspace(boolean animated) { Resources res = getResources(); int stagger = res.getInteger(R.integer.config_appsCustomizeWorkspaceAnimationStagger); diff --git a/src/com/android/launcher2/PagedView.java b/src/com/android/launcher2/PagedView.java index ba303a137d..3f5652e1d8 100644 --- a/src/com/android/launcher2/PagedView.java +++ b/src/com/android/launcher2/PagedView.java @@ -143,7 +143,7 @@ public abstract class PagedView extends ViewGroup { private PageSwitchListener mPageSwitchListener; - private ArrayList mDirtyPageContent; + protected ArrayList mDirtyPageContent; // choice modes protected static final int CHOICE_MODE_NONE = 0; diff --git a/src/com/android/launcher2/PagedViewGridLayout.java b/src/com/android/launcher2/PagedViewGridLayout.java index 5c32e09346..b1b6215988 100644 --- a/src/com/android/launcher2/PagedViewGridLayout.java +++ b/src/com/android/launcher2/PagedViewGridLayout.java @@ -68,6 +68,12 @@ public class PagedViewGridLayout extends GridLayout implements Page { heightMeasureSpec); } + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mOnLayoutListener = null; + } + public void setOnLayoutListener(Runnable r) { mOnLayoutListener = r; }