Merge "Add Bluetooth SCO test app"
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index b8c4e22..2a79caa 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -1023,7 +1023,8 @@
                 break;
             case NUMBER:
                 // inputType needs to be overwritten because of the different class.
-                inputType = InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL;
+                inputType = InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL
+                        | InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_NUMBER_FLAG_DECIMAL;
                 // Number and telephone do not have both a Tab key and an
                 // action, so set the action to NEXT
                 imeOptions |= EditorInfo.IME_ACTION_NEXT;
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
index 14efdd0..36f1659 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsHorizontalScrollView.java
@@ -165,6 +165,13 @@
     @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
         super.onSizeChanged(w, h, oldw, oldh);
+
+        // Skip this work if a transition is running; it sets the scroll values independently
+        // and should not have those animated values clobbered by this logic
+        LayoutTransition transition = mLinearLayout.getLayoutTransition();
+        if (transition != null && transition.isRunning()) {
+            return;
+        }
         // Keep track of the last visible item in the list so we can restore it
         // to the bottom when the orientation changes.
         mLastScrollPosition = scrollPositionOfMostRecent();
@@ -172,7 +179,12 @@
         // This has to happen post-layout, so run it "in the future"
         post(new Runnable() {
             public void run() {
-                scrollTo(mLastScrollPosition, 0);
+                // Make sure we're still not clobbering the transition-set values, since this
+                // runnable launches asynchronously
+                LayoutTransition transition = mLinearLayout.getLayoutTransition();
+                if (transition == null || !transition.isRunning()) {
+                    scrollTo(mLastScrollPosition, 0);
+                }
             }
         });
     }
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
index 1bcc413..89900a1 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
@@ -166,6 +166,13 @@
     @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
         super.onSizeChanged(w, h, oldw, oldh);
+
+        // Skip this work if a transition is running; it sets the scroll values independently
+        // and should not have those animated values clobbered by this logic
+        LayoutTransition transition = mLinearLayout.getLayoutTransition();
+        if (transition != null && transition.isRunning()) {
+            return;
+        }
         // Keep track of the last visible item in the list so we can restore it
         // to the bottom when the orientation changes.
         mLastScrollPosition = scrollPositionOfMostRecent();
@@ -173,7 +180,12 @@
         // This has to happen post-layout, so run it "in the future"
         post(new Runnable() {
             public void run() {
-                scrollTo(0, mLastScrollPosition);
+                // Make sure we're still not clobbering the transition-set values, since this
+                // runnable launches asynchronously
+                LayoutTransition transition = mLinearLayout.getLayoutTransition();
+                if (transition == null || !transition.isRunning()) {
+                    scrollTo(0, mLastScrollPosition);
+                }
             }
         });
     }
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 3ae7a3f..acfc7a4 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -1831,6 +1831,19 @@
         for (RouteInfo r :  routeDiff.added) {
             if (isLinkDefault || ! r.isDefaultRoute()) {
                 addRoute(newLp, r);
+            } else {
+                // many radios add a default route even when we don't want one.
+                // remove the default route unless somebody else has asked for it
+                String ifaceName = newLp.getInterfaceName();
+                if (TextUtils.isEmpty(ifaceName) == false && mAddedRoutes.contains(r) == false) {
+                    if (DBG) log("Removing " + r + " for interface " + ifaceName);
+                    try {
+                        mNetd.removeRoute(ifaceName, r);
+                    } catch (Exception e) {
+                        // never crash - catch them all
+                        loge("Exception trying to remove a route: " + e);
+                    }
+                }
             }
         }