Merge "b/2335780 Fixed race conditions which causes BT to not be in the correct state in respect to the dock state."
diff --git a/src/com/android/settings/bluetooth/DockEventReceiver.java b/src/com/android/settings/bluetooth/DockEventReceiver.java
index 261ec1d..73f90e5 100644
--- a/src/com/android/settings/bluetooth/DockEventReceiver.java
+++ b/src/com/android/settings/bluetooth/DockEventReceiver.java
@@ -17,6 +17,7 @@
 package com.android.settings.bluetooth;
 
 import android.app.Service;
+import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -35,9 +36,11 @@
 
     private static final int EXTRA_INVALID = -1234;
 
-    static final Object mStartingServiceSync = new Object();
+    private static final Object mStartingServiceSync = new Object();
 
-    static PowerManager.WakeLock mStartingService;
+    private static final long WAKELOCK_TIMEOUT = 5000;
+
+    private static PowerManager.WakeLock mStartingService;
 
     @Override
     public void onReceive(Context context, Intent intent) {
@@ -84,14 +87,12 @@
                 PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
                 mStartingService = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
                         "StartingDockService");
-                mStartingService.setReferenceCounted(false);
             }
 
-            mStartingService.acquire();
+            mStartingService.acquire(WAKELOCK_TIMEOUT);
 
             if (context.startService(intent) == null) {
                 Log.e(TAG, "Can't start DockService");
-                mStartingService.release();
             }
         }
     }
@@ -104,9 +105,7 @@
         synchronized (mStartingServiceSync) {
             if (mStartingService != null) {
                 if (DEBUG) Log.d(TAG, "stopSelf id = "+ startId);
-                if (service.stopSelfResult(startId)) {
-                    mStartingService.release();
-                }
+                service.stopSelfResult(startId);
             }
         }
     }
diff --git a/src/com/android/settings/bluetooth/DockService.java b/src/com/android/settings/bluetooth/DockService.java
index 1ad2987..46e3d08 100644
--- a/src/com/android/settings/bluetooth/DockService.java
+++ b/src/com/android/settings/bluetooth/DockService.java
@@ -16,12 +16,8 @@
 
 package com.android.settings.bluetooth;
 
-import com.android.settings.R;
-import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
-
 import android.app.AlertDialog;
 import android.app.Notification;
-import android.app.PendingIntent;
 import android.app.Service;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
@@ -42,13 +38,15 @@
 import android.widget.CheckBox;
 import android.widget.CompoundButton;
 
+import com.android.settings.R;
+import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile;
+
 public class DockService extends Service implements AlertDialog.OnMultiChoiceClickListener,
         DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
         CompoundButton.OnCheckedChangeListener {
 
     private static final String TAG = "DockService";
 
-    // TODO clean up logs. Disable DEBUG flag for this file and receiver's too
     private static final boolean DEBUG = false;
 
     // Time allowed for the device to be undocked and redocked without severing
@@ -166,7 +164,7 @@
     }
 
     // This method gets messages from both onStartCommand and mServiceHandler/mServiceLooper
-    void processMessage(Message msg) {
+    private synchronized void processMessage(Message msg) {
         int msgType = msg.what;
         int state = msg.arg1;
         int startId = msg.arg2;
@@ -424,7 +422,7 @@
         }
     };
 
-    private void applyBtSettings(final BluetoothDevice device, int startId) {
+    private synchronized void applyBtSettings(final BluetoothDevice device, int startId) {
         if (device == null || mProfiles == null || mCheckedItems == null)
             return;
 
@@ -465,14 +463,13 @@
         for (int i = 0; i < mProfiles.length; i++) {
             LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager
                     .getProfileManager(mBtManager, mProfiles[i]);
-            boolean isConnected = profileManager.isConnected(device);
 
             if (DEBUG) Log.d(TAG, mProfiles[i].toString() + " = " + mCheckedItems[i]);
 
-            if (mCheckedItems[i] && !isConnected) {
+            if (mCheckedItems[i]) {
                 // Checked but not connected
                 callConnect = true;
-            } else if (!mCheckedItems[i] && isConnected) {
+            } else if (!mCheckedItems[i]) {
                 // Unchecked but connected
                 if (DEBUG) Log.d(TAG, "applyBtSettings - Disconnecting");
                 cachedDevice.disconnect(mProfiles[i]);
@@ -491,7 +488,7 @@
         }
     }
 
-    void handleUndocked(Context context, LocalBluetoothManager localManager,
+    private synchronized void handleUndocked(Context context, LocalBluetoothManager localManager,
             BluetoothDevice device) {
         if (mDialog != null) {
             mDialog.dismiss();
@@ -513,20 +510,4 @@
         }
         return cachedBluetoothDevice;
     }
-
-    // TODO Delete this method if not needed.
-    private Notification getNotification(Service service) {
-        CharSequence title = service.getString(R.string.dock_settings_title);
-
-        Notification n = new Notification(R.drawable.ic_bt_headphones_a2dp, title, System
-                .currentTimeMillis());
-
-        CharSequence contentText = service.getString(R.string.dock_settings_summary);
-        Intent notificationIntent = new Intent(service, DockEventReceiver.class);
-        notificationIntent.setAction(DockEventReceiver.ACTION_DOCK_SHOW_UI);
-        PendingIntent pendingIntent = PendingIntent.getActivity(service, 0, notificationIntent, 0);
-
-        n.setLatestEventInfo(service, title, contentText, pendingIntent);
-        return n;
-    }
 }