am d301c904: Merge change I305c181c into eclair

Merge commit 'd301c90446644f63cda9b9263f83332676065bb4' into eclair-mr2

* commit 'd301c90446644f63cda9b9263f83332676065bb4':
  Delay 500ms between each registering each SDP record using sdptool.
diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java
index f0bd249..0db29a4 100644
--- a/core/java/android/server/BluetoothService.java
+++ b/core/java/android/server/BluetoothService.java
@@ -208,6 +208,7 @@
             return false;
         }
         setBluetoothState(BluetoothAdapter.STATE_TURNING_OFF);
+        mHandler.removeMessages(MESSAGE_REGISTER_SDP_RECORDS);
 
         // Allow 3 seconds for profiles to gracefully disconnect
         // TODO: Introduce a callback mechanism so that each profile can notify
@@ -327,12 +328,39 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
             case MESSAGE_REGISTER_SDP_RECORDS:
-                //TODO: Don't assume HSP/HFP is running, don't use sdptool,
-                if (isEnabled()) {
+                if (!isEnabled()) {
+                    return;
+                }
+                // SystemService.start() forks sdptool to register service
+                // records. It can fail to register some records if it is
+                // forked multiple times in a row, probably because there is
+                // some race in sdptool or bluez when operated in parallel.
+                // As a workaround, delay 500ms between each fork of sdptool.
+                // TODO: Don't fork sdptool in order to regsiter service
+                // records, use a DBUS call instead.
+                switch (msg.arg1) {
+                case 1:
+                    Log.d(TAG, "Registering hsag record");
                     SystemService.start("hsag");
+                    mHandler.sendMessageDelayed(
+                            mHandler.obtainMessage(MESSAGE_REGISTER_SDP_RECORDS, 2, -1), 500);
+                    break;
+                case 2:
+                    Log.d(TAG, "Registering hfag record");
                     SystemService.start("hfag");
+                    mHandler.sendMessageDelayed(
+                            mHandler.obtainMessage(MESSAGE_REGISTER_SDP_RECORDS, 3, -1), 500);
+                    break;
+                case 3:
+                    Log.d(TAG, "Registering opush record");
                     SystemService.start("opush");
+                    mHandler.sendMessageDelayed(
+                            mHandler.obtainMessage(MESSAGE_REGISTER_SDP_RECORDS, 4, -1), 500);
+                    break;
+                case 4:
+                    Log.d(TAG, "Registering pbap record");
                     SystemService.start("pbap");
+                    break;
                 }
                 break;
             case MESSAGE_FINISH_DISABLE:
@@ -402,8 +430,8 @@
                 }
                 mIsDiscovering = false;
                 mBondState.loadBondState();
-                mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_REGISTER_SDP_RECORDS),
-                                            3000);
+                mHandler.sendMessageDelayed(
+                        mHandler.obtainMessage(MESSAGE_REGISTER_SDP_RECORDS, 1, -1), 3000);
 
                 // Log bluetooth on to battery stats.
                 long ident = Binder.clearCallingIdentity();