Fix error recovery when a drag can't be started

Also make sure to properly dispose *both* ends of the drag input
channel when we're done.  That was being tidied up after, but was
also making the system work harder and was provoking a bit of
debug logging.

Change-Id: I1ff3100bc4c441f1609c57242864d5744ff1aaa2
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 7258729..9bc24d2 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -552,6 +552,7 @@
                 mInputManager.unregisterInputChannel(mServerChannel);
                 InputQueue.unregisterInputChannel(mClientChannel);
                 mClientChannel.dispose();
+                mServerChannel.dispose();
                 mClientChannel = null;
                 mServerChannel = null;
             }
@@ -624,7 +625,7 @@
                     }
                 }
                 if (DEBUG_DRAG) {
-                    Slog.d(TAG, "sending DRAG_STARTED to new window " + newWin);
+                    Slog.d(TAG, "need to send DRAG_STARTED to new window " + newWin);
                 }
                 sendDragStartedLw(newWin, mCurrentX, mCurrentY, mDataDescription);
             }
@@ -6242,8 +6243,14 @@
 
                 mDragState.register();
                 mInputMonitor.updateInputWindowsLw();
-                mInputManager.transferTouchFocus(callingWin.mInputChannel,
-                        mDragState.mServerChannel);
+                if (!mInputManager.transferTouchFocus(callingWin.mInputChannel,
+                        mDragState.mServerChannel)) {
+                    Slog.e(TAG, "Unable to transfer touch focus");
+                    mDragState.unregister();
+                    mDragState = null;
+                    mInputMonitor.updateInputWindowsLw();
+                    return false;
+                }
 
                 mDragState.mData = data;
                 mDragState.mCurrentX = touchX;