summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/launcher2/AppWidgetResizeFrame.java24
-rw-r--r--src/com/android/launcher2/AppsCustomizePagedView.java30
-rw-r--r--src/com/android/launcher2/AppsCustomizeTabHost.java20
-rw-r--r--src/com/android/launcher2/CellLayout.java8
-rw-r--r--src/com/android/launcher2/Launcher.java70
-rw-r--r--src/com/android/launcher2/LauncherModel.java22
-rw-r--r--src/com/android/launcher2/PagedViewWidget.java27
-rw-r--r--src/com/android/launcher2/PagedViewWithDraggableItems.java2
-rw-r--r--src/com/android/launcher2/Workspace.java30
9 files changed, 160 insertions, 73 deletions
diff --git a/src/com/android/launcher2/AppWidgetResizeFrame.java b/src/com/android/launcher2/AppWidgetResizeFrame.java
index 882468624..f94ad019f 100644
--- a/src/com/android/launcher2/AppWidgetResizeFrame.java
+++ b/src/com/android/launcher2/AppWidgetResizeFrame.java
@@ -53,6 +53,9 @@ public class AppWidgetResizeFrame extends FrameLayout {
private int mBackgroundPadding;
private int mTouchTargetWidth;
+ private int mTopTouchRegionAdjustment = 0;
+ private int mBottomTouchRegionAdjustment = 0;
+
int[] mDirectionVector = new int[2];
final int SNAP_DURATION = 150;
@@ -139,10 +142,12 @@ public class AppWidgetResizeFrame extends FrameLayout {
public boolean beginResizeIfPointInRegion(int x, int y) {
boolean horizontalActive = (mResizeMode & AppWidgetProviderInfo.RESIZE_HORIZONTAL) != 0;
boolean verticalActive = (mResizeMode & AppWidgetProviderInfo.RESIZE_VERTICAL) != 0;
+
mLeftBorderActive = (x < mTouchTargetWidth) && horizontalActive;
mRightBorderActive = (x > getWidth() - mTouchTargetWidth) && horizontalActive;
- mTopBorderActive = (y < mTouchTargetWidth) && verticalActive;
- mBottomBorderActive = (y > getHeight() - mTouchTargetWidth) && verticalActive;
+ mTopBorderActive = (y < mTouchTargetWidth + mTopTouchRegionAdjustment) && verticalActive;
+ mBottomBorderActive = (y > getHeight() - mTouchTargetWidth + mBottomTouchRegionAdjustment)
+ && verticalActive;
boolean anyBordersActive = mLeftBorderActive || mRightBorderActive
|| mTopBorderActive || mBottomBorderActive;
@@ -378,13 +383,20 @@ public class AppWidgetResizeFrame extends FrameLayout {
int newX = mWidgetView.getLeft() - mBackgroundPadding + xOffset + mWidgetPaddingLeft;
int newY = mWidgetView.getTop() - mBackgroundPadding + yOffset + mWidgetPaddingTop;
- // We need to make sure the frame stays within the bounds of the CellLayout
+ // We need to make sure the frame's touchable regions lie fully within the bounds of the
+ // DragLayer. We allow the actual handles to be clipped, but we shift the touch regions
+ // down accordingly to provide a proper touch target.
if (newY < 0) {
- newHeight -= -newY;
- newY = 0;
+ // In this case we shift the touch region down to start at the top of the DragLayer
+ mTopTouchRegionAdjustment = -newY;
+ } else {
+ mTopTouchRegionAdjustment = 0;
}
if (newY + newHeight > mDragLayer.getHeight()) {
- newHeight -= newY + newHeight - mDragLayer.getHeight();
+ // In this case we shift the touch region up to end at the bottom of the DragLayer
+ mBottomTouchRegionAdjustment = -(newY + newHeight - mDragLayer.getHeight());
+ } else {
+ mBottomTouchRegionAdjustment = 0;
}
if (!animate) {
diff --git a/src/com/android/launcher2/AppsCustomizePagedView.java b/src/com/android/launcher2/AppsCustomizePagedView.java
index a50836168..8cb169e17 100644
--- a/src/com/android/launcher2/AppsCustomizePagedView.java
+++ b/src/com/android/launcher2/AppsCustomizePagedView.java
@@ -528,18 +528,22 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
- public void onPackagesUpdated() {
- // TODO: this isn't ideal, but we actually need to delay here. This call is triggered
- // by a broadcast receiver, and in order for it to work correctly, we need to know that
- // the AppWidgetService has already received and processed the same broadcast. Since there
- // is no guarantee about ordering of broadcast receipt, we just delay here. This is a
- // workaround until we add a callback from AppWidgetService to AppWidgetHost when widget
- // packages are added, updated or removed.
- postDelayed(new Runnable() {
- public void run() {
- updatePackages();
- }
- }, 1500);
+ public void onPackagesUpdated(boolean immediate) {
+ if (immediate) {
+ updatePackages();
+ } else {
+ // TODO: this isn't ideal, but we actually need to delay here. This call is triggered
+ // by a broadcast receiver, and in order for it to work correctly, we need to know that
+ // the AppWidgetService has already received and processed the same broadcast. Since there
+ // is no guarantee about ordering of broadcast receipt, we just delay here. This is a
+ // workaround until we add a callback from AppWidgetService to AppWidgetHost when widget
+ // packages are added, updated or removed.
+ postDelayed(new Runnable() {
+ public void run() {
+ updatePackages();
+ }
+ }, 1500);
+ }
}
public void updatePackages() {
@@ -578,7 +582,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
@Override
public void onClick(View v) {
// When we have exited all apps or are in transition, disregard clicks
- if (!mLauncher.isAllAppsCustomizeOpen() ||
+ if (!mLauncher.isAllAppsVisible() ||
mLauncher.getWorkspace().isSwitchingState()) return;
if (v instanceof PagedViewIcon) {
diff --git a/src/com/android/launcher2/AppsCustomizeTabHost.java b/src/com/android/launcher2/AppsCustomizeTabHost.java
index 9fa2f3237..144aad98f 100644
--- a/src/com/android/launcher2/AppsCustomizeTabHost.java
+++ b/src/com/android/launcher2/AppsCustomizeTabHost.java
@@ -49,7 +49,6 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona
private ViewGroup mTabs;
private ViewGroup mTabsContainer;
private AppsCustomizePagedView mAppsCustomizePane;
- private boolean mSuppressContentCallback = false;
private FrameLayout mAnimationBuffer;
private LinearLayout mContent;
@@ -81,17 +80,18 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona
* reflects the new content (but doesn't do the animation and logic associated with changing
* tabs manually).
*/
- private void setContentTypeImmediate(AppsCustomizePagedView.ContentType type) {
+ void setContentTypeImmediate(AppsCustomizePagedView.ContentType type) {
+ setOnTabChangedListener(null);
onTabChangedStart();
onTabChangedEnd(type);
+ setCurrentTabByTag(getTabTagForContentType(type));
+ setOnTabChangedListener(this);
}
void selectAppsTab() {
setContentTypeImmediate(AppsCustomizePagedView.ContentType.Applications);
- setCurrentTabByTag(APPS_TAB_TAG);
}
void selectWidgetsTab() {
setContentTypeImmediate(AppsCustomizePagedView.ContentType.Widgets);
- setCurrentTabByTag(WIDGETS_TAB_TAG);
}
/**
@@ -158,10 +158,11 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona
if (contentWidth > 0 && mTabs.getLayoutParams().width != contentWidth) {
// Set the width and show the tab bar
mTabs.getLayoutParams().width = contentWidth;
- post(mRelayoutAndMakeVisible);
+ mRelayoutAndMakeVisible.run();
}
+
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public boolean onInterceptTouchEvent(MotionEvent ev) {
@@ -207,10 +208,6 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona
@Override
public void onTabChanged(String tabId) {
final AppsCustomizePagedView.ContentType type = getContentTypeForTabTag(tabId);
- if (mSuppressContentCallback) {
- mSuppressContentCallback = false;
- return;
- }
// Animate the changing of the tab content by fading pages in and out
final Resources res = getResources();
@@ -301,8 +298,9 @@ public class AppsCustomizeTabHost extends TabHost implements LauncherTransitiona
}
public void setCurrentTabFromContent(AppsCustomizePagedView.ContentType type) {
- mSuppressContentCallback = true;
+ setOnTabChangedListener(null);
setCurrentTabByTag(getTabTagForContentType(type));
+ setOnTabChangedListener(this);
}
/**
diff --git a/src/com/android/launcher2/CellLayout.java b/src/com/android/launcher2/CellLayout.java
index c028ff1dc..97d9bc1b5 100644
--- a/src/com/android/launcher2/CellLayout.java
+++ b/src/com/android/launcher2/CellLayout.java
@@ -17,9 +17,9 @@
package com.android.launcher2;
import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-import android.animation.AnimatorListenerAdapter;
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
@@ -37,8 +37,10 @@ import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
+import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
+import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewDebug;
@@ -532,6 +534,10 @@ public class CellLayout extends ViewGroup {
return false;
}
+ public void restoreInstanceState(SparseArray<Parcelable> states) {
+ dispatchRestoreInstanceState(states);
+ }
+
@Override
public void cancelLongPress() {
super.cancelLongPress();
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 70c641b92..38085e029 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -278,6 +278,8 @@ public final class Launcher extends Activity
private static Drawable.ConstantState[] sVoiceSearchIcon = new Drawable.ConstantState[2];
private static Drawable.ConstantState[] sAppMarketIcon = new Drawable.ConstantState[2];
+ private final ArrayList<Integer> mSynchronouslyBoundPages = new ArrayList<Integer>();
+
static final ArrayList<String> sDumpLogs = new ArrayList<String>();
// We only want to get the SharedPreferences once since it does an FS stat each time we get
@@ -369,7 +371,7 @@ public final class Launcher extends Activity
// Update customization drawer _after_ restoring the states
if (mAppsCustomizeContent != null) {
- mAppsCustomizeContent.onPackagesUpdated();
+ mAppsCustomizeContent.onPackagesUpdated(true);
}
if (PROFILE_STARTUP) {
@@ -888,10 +890,8 @@ public final class Launcher extends Activity
if (mAppsCustomizeTabHost != null) {
String curTab = savedState.getString("apps_customize_currentTab");
if (curTab != null) {
- // We set this directly so that there is no delay before the tab is set
- mAppsCustomizeContent.setContentType(
+ mAppsCustomizeTabHost.setContentTypeImmediate(
mAppsCustomizeTabHost.getContentTypeForTabTag(curTab));
- mAppsCustomizeTabHost.setCurrentTabByTag(curTab);
mAppsCustomizeContent.loadAssociatedPages(
mAppsCustomizeContent.getCurrentPage());
}
@@ -1413,14 +1413,16 @@ public final class Launcher extends Activity
}
@Override
- protected void onRestoreInstanceState(Bundle savedInstanceState) {
- // Do not call super here
- mSavedInstanceState = savedInstanceState;
+ public void onRestoreInstanceState(Bundle state) {
+ super.onRestoreInstanceState(state);
+ for (int page: mSynchronouslyBoundPages) {
+ mWorkspace.restoreInstanceStateForChild(page);
+ }
}
@Override
protected void onSaveInstanceState(Bundle outState) {
- outState.putInt(RUNTIME_STATE_CURRENT_SCREEN, mWorkspace.getCurrentPage());
+ outState.putInt(RUNTIME_STATE_CURRENT_SCREEN, mWorkspace.getNextPage());
super.onSaveInstanceState(outState);
outState.putInt(RUNTIME_STATE, mState.ordinal());
@@ -1804,7 +1806,7 @@ public final class Launcher extends Activity
@Override
public void onBackPressed() {
- if (mState == State.APPS_CUSTOMIZE) {
+ if (isAllAppsVisible()) {
showWorkspace(true);
} else if (mWorkspace.getOpenFolder() != null) {
Folder openFolder = mWorkspace.getOpenFolder();
@@ -1877,7 +1879,7 @@ public final class Launcher extends Activity
handleFolderClick(fi);
}
} else if (v == mAllAppsButton) {
- if (mState == State.APPS_CUSTOMIZE) {
+ if (isAllAppsVisible()) {
showWorkspace(true);
} else {
onClickAllAppsButton(v);
@@ -2281,7 +2283,7 @@ public final class Launcher extends Activity
// Now a part of LauncherModel.Callbacks. Used to reorder loading steps.
public boolean isAllAppsVisible() {
- return (mState == State.APPS_CUSTOMIZE);
+ return (mState == State.APPS_CUSTOMIZE) || (mOnResumeState == State.APPS_CUSTOMIZE);
}
public boolean isAllAppsButtonRank(int rank) {
@@ -2308,7 +2310,7 @@ public final class Launcher extends Activity
void disableWallpaperIfInAllApps() {
// Only disable it if we are in all apps
- if (mState == State.APPS_CUSTOMIZE) {
+ if (isAllAppsVisible()) {
if (mAppsCustomizeTabHost != null &&
!mAppsCustomizeTabHost.isTransitioning()) {
updateWallpaperVisibility(false);
@@ -2749,7 +2751,7 @@ public final class Launcher extends Activity
}
void enterSpringLoadedDragMode() {
- if (mState == State.APPS_CUSTOMIZE) {
+ if (isAllAppsVisible()) {
hideAppsCustomizeHelper(State.APPS_CUSTOMIZE_SPRING_LOADED, true, true, null);
hideDockDivider();
mState = State.APPS_CUSTOMIZE_SPRING_LOADED;
@@ -2823,10 +2825,6 @@ public final class Launcher extends Activity
// TODO
}
- public boolean isAllAppsCustomizeOpen() {
- return mState == State.APPS_CUSTOMIZE;
- }
-
/**
* Shows the hotseat area.
*/
@@ -3314,6 +3312,10 @@ public final class Launcher extends Activity
}
}
+ public void onPageBoundSynchronously(int page) {
+ mSynchronouslyBoundPages.add(page);
+ }
+
/**
* Callback saying that there aren't any more items to bind.
*
@@ -3329,10 +3331,7 @@ public final class Launcher extends Activity
mSavedState = null;
}
- if (mSavedInstanceState != null) {
- super.onRestoreInstanceState(mSavedInstanceState);
- mSavedInstanceState = null;
- }
+ mWorkspace.restoreInstanceStateForRemainingPages();
// If we received the result of any pending adds while the loader was running (e.g. the
// widget configuration forced an orientation change), process them now.
@@ -3455,23 +3454,30 @@ public final class Launcher extends Activity
* Implementation of the method from LauncherModel.Callbacks.
*/
public void bindAllApplications(final ArrayList<ApplicationInfo> apps) {
+ Runnable setAllAppsRunnable = new Runnable() {
+ public void run() {
+ if (mAppsCustomizeContent != null) {
+ mAppsCustomizeContent.setApps(apps);
+ }
+ }
+ };
+
// Remove the progress bar entirely; we could also make it GONE
// but better to remove it since we know it's not going to be used
View progressBar = mAppsCustomizeTabHost.
findViewById(R.id.apps_customize_progress_bar);
if (progressBar != null) {
((ViewGroup)progressBar.getParent()).removeView(progressBar);
+
+ // We just post the call to setApps so the user sees the progress bar
+ // disappear-- otherwise, it just looks like the progress bar froze
+ // which doesn't look great
+ mAppsCustomizeTabHost.post(setAllAppsRunnable);
+ } else {
+ // If we did not initialize the spinner in onCreate, then we can directly set the
+ // list of applications without waiting for any progress bars views to be hidden.
+ setAllAppsRunnable.run();
}
- // We just post the call to setApps so the user sees the progress bar
- // disappear-- otherwise, it just looks like the progress bar froze
- // which doesn't look great
- mAppsCustomizeTabHost.post(new Runnable() {
- public void run() {
- if (mAppsCustomizeContent != null) {
- mAppsCustomizeContent.setApps(apps);
- }
- }
- });
}
/**
@@ -3526,7 +3532,7 @@ public final class Launcher extends Activity
*/
public void bindPackagesUpdated() {
if (mAppsCustomizeContent != null) {
- mAppsCustomizeContent.onPackagesUpdated();
+ mAppsCustomizeContent.onPackagesUpdated(false);
}
}
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index ab29fc688..92be7e4df 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -156,6 +156,7 @@ public class LauncherModel extends BroadcastReceiver {
public boolean isAllAppsVisible();
public boolean isAllAppsButtonRank(int rank);
public void bindSearchablesChanged();
+ public void onPageBoundSynchronously(int page);
}
LauncherModel(LauncherApplication app, IconCache iconCache) {
@@ -1614,6 +1615,17 @@ public class LauncherModel extends BroadcastReceiver {
// Load items on the current page
bindWorkspaceItems(oldCallbacks, currentWorkspaceItems, currentAppWidgets,
currentFolders, null);
+ if (isLoadingSynchronously) {
+ r = new Runnable() {
+ public void run() {
+ Callbacks callbacks = tryGetCallbacks(oldCallbacks);
+ if (callbacks != null) {
+ callbacks.onPageBoundSynchronously(currentScreen);
+ }
+ }
+ };
+ runOnMainThread(r);
+ }
// Load all the remaining pages (if we are loading synchronously, we want to defer this
// work until after the first render)
@@ -1674,7 +1686,7 @@ public class LauncherModel extends BroadcastReceiver {
@SuppressWarnings("unchecked")
final ArrayList<ApplicationInfo> list
= (ArrayList<ApplicationInfo>) mAllAppsList.data.clone();
- mHandler.post(new Runnable() {
+ Runnable r = new Runnable() {
public void run() {
final long t = SystemClock.uptimeMillis();
final Callbacks callbacks = tryGetCallbacks(oldCallbacks);
@@ -1686,7 +1698,13 @@ public class LauncherModel extends BroadcastReceiver {
+ (SystemClock.uptimeMillis()-t) + "ms");
}
}
- });
+ };
+ boolean isRunningOnMainThread = !(sWorkerThread.getThreadId() == Process.myTid());
+ if (oldCallbacks.isAllAppsVisible() && isRunningOnMainThread) {
+ r.run();
+ } else {
+ mHandler.post(r);
+ }
}
private void loadAllAppsByBatch() {
diff --git a/src/com/android/launcher2/PagedViewWidget.java b/src/com/android/launcher2/PagedViewWidget.java
index 66b7080d4..b804ab0a2 100644
--- a/src/com/android/launcher2/PagedViewWidget.java
+++ b/src/com/android/launcher2/PagedViewWidget.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
+import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
@@ -44,6 +45,7 @@ public class PagedViewWidget extends LinearLayout {
boolean mShortPressTriggered = false;
static PagedViewWidget sShortpressTarget = null;
boolean mIsAppWidget;
+ private final Rect mOriginalImagePadding = new Rect();
public PagedViewWidget(Context context) {
this(context, null);
@@ -63,6 +65,17 @@ public class PagedViewWidget extends LinearLayout {
setClipToPadding(false);
}
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+
+ final ImageView image = (ImageView) findViewById(R.id.widget_preview);
+ mOriginalImagePadding.left = image.getPaddingLeft();
+ mOriginalImagePadding.top = image.getPaddingTop();
+ mOriginalImagePadding.right = image.getPaddingRight();
+ mOriginalImagePadding.bottom = image.getPaddingBottom();
+ }
+
public static void setDeletePreviewsWhenDetachedFromWindow(boolean value) {
sDeletePreviewsWhenDetachedFromWindow = value;
}
@@ -79,7 +92,7 @@ public class PagedViewWidget extends LinearLayout {
preview.getBitmap().recycle();
}
image.setImageDrawable(null);
- }
+ }
}
}
@@ -117,8 +130,8 @@ public class PagedViewWidget extends LinearLayout {
public int[] getPreviewSize() {
final ImageView i = (ImageView) findViewById(R.id.widget_preview);
int[] maxSize = new int[2];
- maxSize[0] = i.getWidth() - i.getPaddingLeft() - i.getPaddingRight();
- maxSize[1] = i.getHeight() - i.getPaddingTop();
+ maxSize[0] = i.getWidth() - mOriginalImagePadding.left - mOriginalImagePadding.right;
+ maxSize[1] = i.getHeight() - mOriginalImagePadding.top;
return maxSize;
}
@@ -132,10 +145,10 @@ public class PagedViewWidget extends LinearLayout {
// center horizontally
int[] imageSize = getPreviewSize();
int centerAmount = (imageSize[0] - preview.getIntrinsicWidth()) / 2;
- image.setPadding(image.getPaddingLeft() + centerAmount,
- image.getPaddingTop(),
- image.getPaddingRight(),
- image.getPaddingBottom());
+ image.setPadding(mOriginalImagePadding.left + centerAmount,
+ mOriginalImagePadding.top,
+ mOriginalImagePadding.right,
+ mOriginalImagePadding.bottom);
}
image.setAlpha(1f);
image.mAllowRequestLayout = true;
diff --git a/src/com/android/launcher2/PagedViewWithDraggableItems.java b/src/com/android/launcher2/PagedViewWithDraggableItems.java
index 22fd82b69..9cdd74f24 100644
--- a/src/com/android/launcher2/PagedViewWithDraggableItems.java
+++ b/src/com/android/launcher2/PagedViewWithDraggableItems.java
@@ -105,7 +105,7 @@ public abstract class PagedViewWithDraggableItems extends PagedView
// Return early if we are still animating the pages
if (mNextPage != INVALID_PAGE) return false;
// When we have exited all apps or are in transition, disregard long clicks
- if (!mLauncher.isAllAppsCustomizeOpen() ||
+ if (!mLauncher.isAllAppsVisible() ||
mLauncher.getWorkspace().isSwitchingState()) return false;
// Return if global dragging is not enabled
if (!mLauncher.isDraggingEnabled()) return false;
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 331e86f33..44b9f68da 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -47,6 +47,7 @@ import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
+import android.util.SparseArray;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
@@ -232,6 +233,9 @@ public class Workspace extends SmoothPagedView
private int mLastReorderX = -1;
private int mLastReorderY = -1;
+ private SparseArray<Parcelable> mSavedStates;
+ private final ArrayList<Integer> mRestoredPages = new ArrayList<Integer>();
+
// These variables are used for storing the initial and final values during workspace animations
private int mSavedScrollX;
private float mSavedRotationY;
@@ -3411,6 +3415,32 @@ public class Workspace extends SmoothPagedView
}
@Override
+ protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
+ // We don't dispatch restoreInstanceState to our children using this code path.
+ // Some pages will be restored immediately as their items are bound immediately, and
+ // others we will need to wait until after their items are bound.
+ mSavedStates = container;
+ }
+
+ public void restoreInstanceStateForChild(int child) {
+ if (mSavedStates != null) {
+ mRestoredPages.add(child);
+ CellLayout cl = (CellLayout) getChildAt(child);
+ cl.restoreInstanceState(mSavedStates);
+ }
+ }
+
+ public void restoreInstanceStateForRemainingPages() {
+ int count = getChildCount();
+ for (int i = 0; i < count; i++) {
+ if (!mRestoredPages.contains(i)) {
+ restoreInstanceStateForChild(i);
+ }
+ }
+ mRestoredPages.clear();
+ }
+
+ @Override
public void scrollLeft() {
if (!isSmall() && !mIsSwitchingState) {
super.scrollLeft();