summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/bluetooth
diff options
context:
space:
mode:
authorMichael Chan <mchan@android.com>2010-01-04 12:15:11 -0800
committerMichael Chan <mchan@android.com>2010-01-08 17:17:08 -0800
commit537bdb0bb87ea702545f6ebe38b913756525079a (patch)
treec676d225172a34b4172facca3fa5938bc161cca1 /src/com/android/settings/bluetooth
parenta718832e28095219a897c6e95e903c1a3fe57c12 (diff)
downloadpackages_apps_settings-537bdb0bb87ea702545f6ebe38b913756525079a.zip
packages_apps_settings-537bdb0bb87ea702545f6ebe38b913756525079a.tar.gz
packages_apps_settings-537bdb0bb87ea702545f6ebe38b913756525079a.tar.bz2
b/2335780 Fixed race conditions which causes BT to not be in the correct state in respect to the dock state.
Change-Id: I4428708e02e7dcbb26795b0982cfe4389df60a46
Diffstat (limited to 'src/com/android/settings/bluetooth')
-rw-r--r--src/com/android/settings/bluetooth/DockEventReceiver.java15
-rw-r--r--src/com/android/settings/bluetooth/DockService.java35
2 files changed, 15 insertions, 35 deletions
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 @@ public class DockEventReceiver extends BroadcastReceiver {
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 @@ public class DockEventReceiver extends BroadcastReceiver {
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 @@ public class DockEventReceiver extends BroadcastReceiver {
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.view.WindowManager;
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 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
}
// 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 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
}
};
- 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 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
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 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
}
}
- 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 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli
}
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;
- }
}