Merge change I4958d608 into eclair-mr2

* changes:
  add dpad control of text selection for sholes
diff --git a/core/res/res/layout/media_controller.xml b/core/res/res/layout/media_controller.xml
index c49835d..32db60a 100644
--- a/core/res/res/layout/media_controller.xml
+++ b/core/res/res/layout/media_controller.xml
@@ -59,7 +59,7 @@
             style="?android:attr/progressBarStyleHorizontal"
             android:layout_width="0dip"
             android:layout_weight="1"
-            android:layout_height="30px"
+            android:layout_height="30dip"
             android:layout_alignParentLeft="true"
             android:layout_alignParentRight="true" />
 
diff --git a/services/java/com/android/server/InputDevice.java b/services/java/com/android/server/InputDevice.java
index eaad3b7..6eb6242 100644
--- a/services/java/com/android/server/InputDevice.java
+++ b/services/java/com/android/server/InputDevice.java
@@ -65,6 +65,7 @@
         
         // This is the last generated pointer data, ordered to match
         // mPointerIds.
+        boolean mSkipLastPointers;
         int mLastNumPointers = 0;
         final int[] mLastData = new int[MotionEvent.NUM_SAMPLE_DATA * MAX_POINTERS];
         
@@ -511,6 +512,11 @@
                 long curTimeNano, Display display, int orientation,
                 int metaState) {
             
+            if (mSkipLastPointers) {
+                mSkipLastPointers = false;
+                mLastNumPointers = 0;
+            }
+            
             if (mNextNumPointers <= 0 && mLastNumPointers <= 0) {
                 return null;
             }
diff --git a/services/java/com/android/server/KeyInputQueue.java b/services/java/com/android/server/KeyInputQueue.java
index 5d65c71..d68ccfa 100644
--- a/services/java/com/android/server/KeyInputQueue.java
+++ b/services/java/com/android/server/KeyInputQueue.java
@@ -689,7 +689,8 @@
                                             ev, curTime, curTimeNano);
                                     
                                     if (doMotion && ms.mNextNumPointers > 0
-                                            && ms.mLastNumPointers == 0) {
+                                            && (ms.mLastNumPointers == 0
+                                                    || ms.mSkipLastPointers)) {
                                         doMotion = !generateVirtualKeyDown(di,
                                                 ev, curTime, curTimeNano);
                                     }
@@ -703,7 +704,7 @@
                                             me = ms.generateAbsMotion(di, curTime,
                                                     curTimeNano, mDisplay,
                                                     mOrientation, mGlobalMetaState);
-                                            if (false) Log.v(TAG, "Absolute: x="
+                                            if (DEBUG_POINTERS) Log.v(TAG, "Absolute: x="
                                                     + di.mAbs.mNextData[MotionEvent.SAMPLE_X]
                                                     + " y="
                                                     + di.mAbs.mNextData[MotionEvent.SAMPLE_Y]
@@ -729,6 +730,7 @@
                                                 ms.mLastData, 0,
                                                 num * MotionEvent.NUM_SAMPLE_DATA);
                                         ms.mLastNumPointers = num;
+                                        ms.mSkipLastPointers = true;
                                     }
                                     
                                     ms.finish();
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 20b01d2..9caa386 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -430,8 +430,8 @@
     // to another, and this is the higher one in Z-order.
     WindowState mUpperWallpaperTarget = null;
     int mWallpaperAnimLayerAdjustment;
-    float mLastWallpaperX;
-    float mLastWallpaperY;
+    float mLastWallpaperX = -1;
+    float mLastWallpaperY = -1;
     // Lock for waiting for the wallpaper.
     final Object mWaitingOnWallpaperLock = new Object();
     // This is set when we are waiting for a wallpaper to tell us it is done
@@ -1464,8 +1464,12 @@
         }
         
         if (visible) {
-            mLastWallpaperX = mWallpaperTarget.mWallpaperX;
-            mLastWallpaperY = mWallpaperTarget.mWallpaperY;
+            if (mWallpaperTarget.mWallpaperX >= 0) {
+                mLastWallpaperX = mWallpaperTarget.mWallpaperX;
+            }
+            if (mWallpaperTarget.mWallpaperY >= 0) {
+                mLastWallpaperY = mWallpaperTarget.mWallpaperY;
+            }
         }
         
         // Start stepping backwards from here, ensuring that our wallpaper windows
@@ -1566,34 +1570,32 @@
             boolean sync) {
         boolean changed = false;
         boolean rawChanged = false;
-        if (mLastWallpaperX >= 0) {
-            int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
-            int offset = availw > 0 ? -(int)(availw*mLastWallpaperX+.5f) : 0;
-            changed = wallpaperWin.mXOffset != offset;
-            if (changed) {
-                if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
-                        + wallpaperWin + " x: " + offset);
-                wallpaperWin.mXOffset = offset;
-            }
-            if (wallpaperWin.mWallpaperX != mLastWallpaperX) {
-                wallpaperWin.mWallpaperX = mLastWallpaperX;
-                rawChanged = true;
-            }
+        float wpx = mLastWallpaperX >= 0 ? mLastWallpaperX : 0.5f;
+        int availw = wallpaperWin.mFrame.right-wallpaperWin.mFrame.left-dw;
+        int offset = availw > 0 ? -(int)(availw*wpx+.5f) : 0;
+        changed = wallpaperWin.mXOffset != offset;
+        if (changed) {
+            if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
+                    + wallpaperWin + " x: " + offset);
+            wallpaperWin.mXOffset = offset;
+        }
+        if (wallpaperWin.mWallpaperX != wpx) {
+            wallpaperWin.mWallpaperX = wpx;
+            rawChanged = true;
         }
         
-        if (mLastWallpaperY >= 0) {
-            int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
-            int offset = availh > 0 ? -(int)(availh*mLastWallpaperY+.5f) : 0;
-            if (wallpaperWin.mYOffset != offset) {
-                if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
-                        + wallpaperWin + " y: " + offset);
-                changed = true;
-                wallpaperWin.mYOffset = offset;
-            }
-            if (wallpaperWin.mWallpaperY != mLastWallpaperY) {
-                wallpaperWin.mWallpaperY = mLastWallpaperY;
-                rawChanged = true;
-            }
+        float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f;
+        int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
+        offset = availh > 0 ? -(int)(availh*wpy+.5f) : 0;
+        if (wallpaperWin.mYOffset != offset) {
+            if (DEBUG_WALLPAPER) Log.v(TAG, "Update wallpaper "
+                    + wallpaperWin + " y: " + offset);
+            changed = true;
+            wallpaperWin.mYOffset = offset;
+        }
+        if (wallpaperWin.mWallpaperY != wpy) {
+            wallpaperWin.mWallpaperY = wpy;
+            rawChanged = true;
         }
         
         if (rawChanged) {
@@ -1649,7 +1651,7 @@
         }
     }
     
-    boolean updateWallpaperOffsetLocked(boolean sync) {
+    boolean updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) {
         final int dw = mDisplay.getWidth();
         final int dh = mDisplay.getHeight();
         
@@ -1657,22 +1659,31 @@
         
         WindowState target = mWallpaperTarget;
         if (target != null) {
-            mLastWallpaperX = target.mWallpaperX;
-            mLastWallpaperY = target.mWallpaperY;
-            int curTokenIndex = mWallpaperTokens.size();
-            while (curTokenIndex > 0) {
-                curTokenIndex--;
-                WindowToken token = mWallpaperTokens.get(curTokenIndex);
-                int curWallpaperIndex = token.windows.size();
-                while (curWallpaperIndex > 0) {
-                    curWallpaperIndex--;
-                    WindowState wallpaper = token.windows.get(curWallpaperIndex);
-                    if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) {
-                        wallpaper.computeShownFrameLocked();
-                        changed = true;
-                        // We only want to be synchronous with one wallpaper.
-                        sync = false;
-                    }
+            if (target.mWallpaperX >= 0) {
+                mLastWallpaperX = target.mWallpaperX;
+            } else if (changingTarget.mWallpaperX >= 0) {
+                mLastWallpaperX = changingTarget.mWallpaperX;
+            }
+            if (target.mWallpaperY >= 0) {
+                mLastWallpaperY = target.mWallpaperY;
+            } else if (changingTarget.mWallpaperY >= 0) {
+                mLastWallpaperY = changingTarget.mWallpaperY;
+            }
+        }
+        
+        int curTokenIndex = mWallpaperTokens.size();
+        while (curTokenIndex > 0) {
+            curTokenIndex--;
+            WindowToken token = mWallpaperTokens.get(curTokenIndex);
+            int curWallpaperIndex = token.windows.size();
+            while (curWallpaperIndex > 0) {
+                curWallpaperIndex--;
+                WindowState wallpaper = token.windows.get(curWallpaperIndex);
+                if (updateWallpaperOffsetLocked(wallpaper, dw, dh, sync)) {
+                    wallpaper.computeShownFrameLocked();
+                    changed = true;
+                    // We only want to be synchronous with one wallpaper.
+                    sync = false;
                 }
             }
         }
@@ -2179,11 +2190,8 @@
         if (window.mWallpaperX != x || window.mWallpaperY != y)  {
             window.mWallpaperX = x;
             window.mWallpaperY = y;
-            
-            if (mWallpaperTarget == window) {
-                if (updateWallpaperOffsetLocked(true)) {
-                    performLayoutAndPlaceSurfacesLocked();
-                }
+            if (updateWallpaperOffsetLocked(window, true)) {
+                performLayoutAndPlaceSurfacesLocked();
             }
         }
     }