diff options
author | Michael Chan <mchan@android.com> | 2010-01-04 12:15:11 -0800 |
---|---|---|
committer | Michael Chan <mchan@android.com> | 2010-01-08 17:17:08 -0800 |
commit | 537bdb0bb87ea702545f6ebe38b913756525079a (patch) | |
tree | c676d225172a34b4172facca3fa5938bc161cca1 /src/com/android/settings/bluetooth | |
parent | a718832e28095219a897c6e95e903c1a3fe57c12 (diff) | |
download | packages_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.java | 15 | ||||
-rw-r--r-- | src/com/android/settings/bluetooth/DockService.java | 35 |
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; - } } |