Merge branch 'froyo' into froyo-release
diff --git a/res/values/config.xml b/res/values/config.xml
index 9d3f688..15ec05b 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -1,4 +1,6 @@
 <resources>
     <integer name="config_allAppsFadeInTime">700</integer>
     <integer name="config_allAppsFadeOutTime">700</integer>
+    <integer name="config_allAppsBatchLoadDelay">0</integer>
+    <integer name="config_allAppsBatchSize">0</integer>
 </resources>
diff --git a/src/com/android/launcher2/AllApps2D.java b/src/com/android/launcher2/AllApps2D.java
index eb7cd83..90c87fb 100644
--- a/src/com/android/launcher2/AllApps2D.java
+++ b/src/com/android/launcher2/AllApps2D.java
@@ -50,8 +50,6 @@
 
     private static final String TAG = "Launcher.AllApps2D";
 
-    private static final int BATCH_SIZE = 6; // give us a few apps at a time
-
     private Launcher mLauncher;
     private DragController mDragController;
 
@@ -302,10 +300,6 @@
         return -1;
     }
 
-    public int getAppBatchSize() {
-        return BATCH_SIZE;
-    }
-
     public void dumpState() {
         ApplicationInfo.dumpApplicationInfoList(TAG, "mAllAppsList", mAllAppsList);
     }
diff --git a/src/com/android/launcher2/AllApps3D.java b/src/com/android/launcher2/AllApps3D.java
index 2b27c7c..9c3b3e4 100644
--- a/src/com/android/launcher2/AllApps3D.java
+++ b/src/com/android/launcher2/AllApps3D.java
@@ -73,8 +73,6 @@
     private static final int SELECTION_ICONS = 1;
     private static final int SELECTION_HOME = 2;
 
-    private static final int BATCH_SIZE = 0; // give us all the apps at once
-
     private Launcher mLauncher;
     private DragController mDragController;
 
@@ -91,6 +89,10 @@
     private static RenderScriptGL sRS;
     private static RolloRS sRollo;
 
+    private static boolean sZoomDirty = false;
+    private static boolean sAnimateNextZoom;
+    private static float sNextZoom;
+
     /**
      * True when we are using arrow keys or trackball to drive navigation
      */
@@ -120,9 +122,6 @@
     private boolean mShouldGainFocus;
 
     private boolean mHaveSurface = false;
-    private boolean mZoomDirty = false;
-    private boolean mAnimateNextZoom;
-    private float mNextZoom;
     private float mZoom;
     private float mVelocity;
     private AAMessage mMessageProc;
@@ -241,7 +240,7 @@
         }
         // We may lose any callbacks that are pending, so make sure that we re-sync that
         // on the next surfaceChanged.
-        mZoomDirty = true;
+        sZoomDirty = true;
         mHaveSurface = false;
     }
 
@@ -801,12 +800,12 @@
      */
     public void zoom(float zoom, boolean animate) {
         cancelLongPress();
-        mNextZoom = zoom;
-        mAnimateNextZoom = animate;
+        sNextZoom = zoom;
+        sAnimateNextZoom = animate;
         // if we do setZoom while we don't have a surface, we won't
         // get the callbacks that actually set mZoom.
         if (sRollo == null || !mHaveSurface) {
-            mZoomDirty = true;
+            sZoomDirty = true;
             mZoom = zoom;
         } else {
             sRollo.setZoom(zoom, animate);
@@ -963,7 +962,7 @@
             sRollo.mScrollPos = ((float)mData[0]) / (1 << 16);
             mVelocity = ((float)mData[1]) / (1 << 16);
             mZoom = ((float)mData[2]) / (1 << 16);
-            mZoomDirty = false;
+            sZoomDirty = false;
         }
     }
 
@@ -1309,8 +1308,8 @@
         }
 
         void dirtyCheck() {
-            if (mAllApps.mZoomDirty) {
-                setZoom(mAllApps.mNextZoom, mAllApps.mAnimateNextZoom);
+            if (sZoomDirty) {
+                setZoom(mAllApps.sNextZoom, mAllApps.sAnimateNextZoom);
             }
         }
 
@@ -1599,10 +1598,6 @@
         }
     }
 
-    public int getAppBatchSize() {
-        return BATCH_SIZE;
-    }
-
     public void dumpState() {
         Log.d(TAG, "sRS=" + sRS);
         Log.d(TAG, "sRollo=" + sRollo);
@@ -1616,8 +1611,8 @@
         Log.d(TAG, "mVelocityTracker=" + mVelocityTracker);
         Log.d(TAG, "mTouchTracking=" + mTouchTracking);
         Log.d(TAG, "mShouldGainFocus=" + mShouldGainFocus);
-        Log.d(TAG, "mZoomDirty=" + mZoomDirty);
-        Log.d(TAG, "mAnimateNextZoom=" + mAnimateNextZoom);
+        Log.d(TAG, "sZoomDirty=" + sZoomDirty);
+        Log.d(TAG, "sAnimateNextZoom=" + sAnimateNextZoom);
         Log.d(TAG, "mZoom=" + mZoom);
         Log.d(TAG, "mScrollPos=" + sRollo.mScrollPos);
         Log.d(TAG, "mVelocity=" + mVelocity);
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 8888737..877c075 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -41,8 +41,6 @@
 
     public void updateApps(ArrayList<ApplicationInfo> list);
     
-    public int  getAppBatchSize();
-
     public void dumpState();
 
     public void surrender();
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index b82e0cf..3522199 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -1750,6 +1750,10 @@
      *          - Go back with back key  TODO: make this not go to workspace
      *          - From all apps
      *          - From workspace
+     *   - Enter and exit car mode (becuase it causes an extra configuration changed)
+     *          - From all apps
+     *          - From the center workspace
+     *          - From another workspace
      */
     void closeAllApps(boolean animated) {
         if (mAllAppsGrid.isVisible()) {
@@ -2091,7 +2095,7 @@
      * Implementation of the method from LauncherModel.Callbacks.
      */
     public int getAppBatchSize() {
-        return mAllAppsGrid.getAppBatchSize();
+        return getResources().getInteger(R.integer.config_allAppsBatchSize);
     }
 
     /**
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 9766831..7a56bcd 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -62,7 +62,7 @@
     static final boolean DEBUG_LOADERS = false;
     static final String TAG = "Launcher.Model";
 
-    final int ALL_APPS_LOAD_DELAY = 150; // ms
+    private int mAllAppsLoadDelay; // milliseconds between batches
 
     private final LauncherApplication mApp;
     private final Object mLock = new Object();
@@ -98,6 +98,8 @@
 
         mDefaultIcon = Utilities.createIconBitmap(
                 app.getPackageManager().getDefaultActivityIcon(), app);
+
+        mAllAppsLoadDelay = app.getResources().getInteger(R.integer.config_allAppsBatchLoadDelay);
     }
 
     public Bitmap getFallbackIcon() {
@@ -581,7 +583,7 @@
                 // Whew! Hard work done.
                 synchronized (mLock) {
                     if (mIsLaunching) {
-                        android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_DEFAULT);
+                        android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                     }
                 }
 
@@ -1055,9 +1057,6 @@
                             mAllAppsList.add(new ApplicationInfo(apps.get(i), mIconCache));
                             i++;
                         }
-                        // re-sort before binding this batch to the grid
-                        Collections.sort(mAllAppsList.data, APP_NAME_COMPARATOR);
-                        Collections.sort(mAllAppsList.added, APP_NAME_COMPARATOR);
                         if (DEBUG_LOADERS) {
                             Log.d(TAG, "batch of " + batchSize + " icons processed in "
                                     + (SystemClock.uptimeMillis()-t2) + "ms");
@@ -1066,16 +1065,17 @@
 
                     mHandler.post(bindAllAppsTask);
 
-                    if (ALL_APPS_LOAD_DELAY > 0) {
+                    if (mAllAppsLoadDelay > 0 && i < N) {
                         try {
-                            Thread.sleep(ALL_APPS_LOAD_DELAY);
+                            Thread.sleep(mAllAppsLoadDelay);
                         } catch (InterruptedException exc) { }
                     }
                 }
 
                 if (DEBUG_LOADERS) {
                     Log.d(TAG, "cached all " + N + " apps in "
-                            + (SystemClock.uptimeMillis()-t) + "ms");
+                            + (SystemClock.uptimeMillis()-t) + "ms"
+                            + (mAllAppsLoadDelay > 0 ? " (including delay)" : ""));
                 }
             }
 
diff --git a/src/com/android/launcher2/Workspace.java b/src/com/android/launcher2/Workspace.java
index 8f5bd29..b85b12c 100644
--- a/src/com/android/launcher2/Workspace.java
+++ b/src/com/android/launcher2/Workspace.java
@@ -16,22 +16,25 @@
 
 package com.android.launcher2;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+
 import android.app.WallpaperManager;
 import android.appwidget.AppWidgetManager;
 import android.appwidget.AppWidgetProviderInfo;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
-import android.content.ComponentName;
+import android.content.pm.PackageManager;
 import android.content.pm.ProviderInfo;
 import android.content.res.TypedArray;
-import android.content.pm.PackageManager;
 import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.IBinder;
-import android.os.Parcelable;
 import android.os.Parcel;
+import android.os.Parcelable;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.VelocityTracker;
@@ -39,12 +42,10 @@
 import android.view.ViewConfiguration;
 import android.view.ViewGroup;
 import android.view.ViewParent;
+import android.view.animation.OvershootInterpolator;
 import android.widget.Scroller;
 import android.widget.TextView;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-
 import com.android.launcher.R;
 
 /**
@@ -153,7 +154,7 @@
      */
     private void initWorkspace() {
         Context context = getContext();
-        mScroller = new Scroller(context);
+        mScroller = new Scroller(context, new OvershootInterpolator());
         mCurrentScreen = mDefaultScreen;
         Launcher.setScreen(mCurrentScreen);
         LauncherApplication app = (LauncherApplication)context.getApplicationContext();
@@ -390,7 +391,8 @@
         IBinder token = getWindowToken();
         if (token != null) {
             mWallpaperManager.setWallpaperOffsetSteps(1.0f / (getChildCount() - 1), 0 );
-            mWallpaperManager.setWallpaperOffsets(getWindowToken(), mScrollX/(float)scrollRange, 0);
+            mWallpaperManager.setWallpaperOffsets(getWindowToken(),
+                    Math.max(0.f, Math.min(mScrollX/(float)scrollRange, 1.f)), 0);
         }
     }
     
@@ -1316,7 +1318,7 @@
                             final ProviderInfo providerInfo = manager.resolveContentProvider(
                                     uri.getAuthority(), 0);
 
-                            if (providerInfo == null) {
+                            if (providerInfo != null) {
                                 for (String packageName: packageNames) {
                                     if (packageName.equals(providerInfo.packageName)) {
                                         // TODO: This should probably be done on a worker thread