Merge "Handling service number convert while roaming." into lmp-dev
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index 362afba..cb5a31c 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -387,10 +387,26 @@
         }
     }
 
-    static void checkParcel(Parcel parcel, String msg) {
+    static void checkParcel(IBinder obj, int code, Parcel parcel, String msg) {
         if (parcel.dataSize() >= 800*1024) {
             // Trying to send > 800k, this is way too much
-            Slog.wtfStack(TAG, msg + parcel.dataSize());
+            StringBuilder sb = new StringBuilder();
+            sb.append(msg);
+            sb.append(": on ");
+            sb.append(obj);
+            sb.append(" calling ");
+            sb.append(code);
+            sb.append(" size ");
+            sb.append(parcel.dataSize());
+            sb.append(" (data: ");
+            parcel.setDataPosition(0);
+            sb.append(parcel.readInt());
+            sb.append(", ");
+            sb.append(parcel.readInt());
+            sb.append(", ");
+            sb.append(parcel.readInt());
+            sb.append(")");
+            Slog.wtfStack(TAG, sb.toString());
         }
     }
 
@@ -432,7 +448,7 @@
             reply.writeException(re);
             res = true;
         }
-        checkParcel(reply, "Unreasonably large binder reply buffer: ");
+        checkParcel(this, code, reply, "Unreasonably large binder reply buffer");
         reply.recycle();
         data.recycle();
         return res;
@@ -448,7 +464,7 @@
     }
 
     public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
-        Binder.checkParcel(data, "Unreasonably large binder buffer: ");
+        Binder.checkParcel(this, code, data, "Unreasonably large binder buffer");
         return transactNative(code, data, reply, flags);
     }
 
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index 8b97329..a8980849 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -208,7 +208,13 @@
         final TypedArray a = context.obtainStyledAttributes(
                 attrs, com.android.internal.R.styleable.Switch, defStyleAttr, defStyleRes);
         mThumbDrawable = a.getDrawable(com.android.internal.R.styleable.Switch_thumb);
+        if (mThumbDrawable != null) {
+            mThumbDrawable.setCallback(this);
+        }
         mTrackDrawable = a.getDrawable(com.android.internal.R.styleable.Switch_track);
+        if (mTrackDrawable != null) {
+            mTrackDrawable.setCallback(this);
+        }
         mTextOn = a.getText(com.android.internal.R.styleable.Switch_textOn);
         mTextOff = a.getText(com.android.internal.R.styleable.Switch_textOff);
         mShowText = a.getBoolean(com.android.internal.R.styleable.Switch_showText, true);
@@ -433,7 +439,13 @@
      * @attr ref android.R.styleable#Switch_track
      */
     public void setTrackDrawable(Drawable track) {
+        if (mTrackDrawable != null) {
+            mTrackDrawable.setCallback(null);
+        }
         mTrackDrawable = track;
+        if (track != null) {
+            track.setCallback(this);
+        }
         requestLayout();
     }
 
@@ -468,7 +480,13 @@
      * @attr ref android.R.styleable#Switch_thumb
      */
     public void setThumbDrawable(Drawable thumb) {
+        if (mThumbDrawable != null) {
+            mThumbDrawable.setCallback(null);
+        }
         mThumbDrawable = thumb;
+        if (thumb != null) {
+            thumb.setCallback(this);
+        }
         requestLayout();
     }
 
diff --git a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
index f7584d8..d78138bc 100644
--- a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
@@ -91,7 +91,8 @@
             if (visible) {
                 mTransition.start();
             } else {
-                mTransition.stop();
+                // Ensure we're showing the correct state when visible.
+                jumpToCurrentState();
             }
         }
 
@@ -140,7 +141,11 @@
     protected boolean onStateChange(int[] stateSet) {
         final int keyframeIndex = mState.indexOfKeyframe(stateSet);
         if (keyframeIndex == getCurrentIndex()) {
-            // No transition needed.
+            // Propagate state change to current keyframe.
+            final Drawable current = getCurrent();
+            if (current != null) {
+                return current.setState(stateSet);
+            }
             return false;
         }