Fix issue 2388215: Audio not routed to 3.5mm Headset after removal/insertion.

The problem occurs if the delay between the headset removal and insertion is less than one second.
In this case, as the headset disconnection intent is broadcast with a 1 second delay to allow music to pause
before updating the route, the connection intent is broadcast before and is ignored, leaving the system
in a state where the headset is considered disconnected.

The fix consists in inserting a delay before broadcasting the connection intent if a disconnection
intent is pending broadcast.
diff --git a/services/java/com/android/server/HeadsetObserver.java b/services/java/com/android/server/HeadsetObserver.java
index a935131..9d69564 100644
--- a/services/java/com/android/server/HeadsetObserver.java
+++ b/services/java/com/android/server/HeadsetObserver.java
@@ -103,6 +103,7 @@
         // Retain only relevant bits
         int headsetState = newState & SUPPORTED_HEADSETS;
         int newOrOld = headsetState | mHeadsetState;
+        int delay = 0;
         // reject all suspect transitions: only accept state changes from:
         // - a: 0 heaset to 1 headset
         // - b: 1 headset to 0 headset
@@ -117,21 +118,25 @@
         if (headsetState == 0) {
             Intent intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
             mContext.sendBroadcast(intent);
-
             // It can take hundreds of ms flush the audio pipeline after
             // apps pause audio playback, but audio route changes are
             // immediate, so delay the route change by 1000ms.
             // This could be improved once the audio sub-system provides an
             // interface to clear the audio pipeline.
-            mWakeLock.acquire();
-            mHandler.sendMessageDelayed(mHandler.obtainMessage(0,
-                                                               mHeadsetState,
-                                                               mPrevHeadsetState,
-                                                               mHeadsetName),
-                                        1000);
+            delay = 1000;
         } else {
-            sendIntents(mHeadsetState, mPrevHeadsetState, mHeadsetName);
+            // Insert the same delay for headset connection so that the connection event is not
+            // broadcast before the disconnection event in case of fast removal/insertion
+            if (mHandler.hasMessages(0)) {
+                delay = 1000;
+            }
         }
+        mWakeLock.acquire();
+        mHandler.sendMessageDelayed(mHandler.obtainMessage(0,
+                                                           mHeadsetState,
+                                                           mPrevHeadsetState,
+                                                           mHeadsetName),
+                                    delay);
     }
 
     private synchronized final void sendIntents(int headsetState, int prevHeadsetState, String headsetName) {