diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b9945c5b600..9f55fe28d0a 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -492,6 +492,7 @@ android:name=".bluetooth.DockEventReceiver"> + diff --git a/src/com/android/settings/bluetooth/DockEventReceiver.java b/src/com/android/settings/bluetooth/DockEventReceiver.java index 73f90e554b5..3324be4e42e 100644 --- a/src/com/android/settings/bluetooth/DockEventReceiver.java +++ b/src/com/android/settings/bluetooth/DockEventReceiver.java @@ -27,7 +27,7 @@ import android.util.Log; public class DockEventReceiver extends BroadcastReceiver { - private static final boolean DEBUG = false; + private static final boolean DEBUG = DockService.DEBUG; private static final String TAG = "DockEventReceiver"; @@ -74,6 +74,13 @@ public class DockEventReceiver extends BroadcastReceiver { if (DEBUG) Log.e(TAG, "Unknown state"); break; } + } else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) { + int btState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); + if (btState == BluetoothAdapter.STATE_ON) { + Intent i = new Intent(intent); + i.setClass(context, DockService.class); + beginStartingService(context, i); + } } } diff --git a/src/com/android/settings/bluetooth/DockService.java b/src/com/android/settings/bluetooth/DockService.java index 4545b4e29d1..1365b526b98 100644 --- a/src/com/android/settings/bluetooth/DockService.java +++ b/src/com/android/settings/bluetooth/DockService.java @@ -19,9 +19,10 @@ package com.android.settings.bluetooth; import android.app.AlertDialog; import android.app.Notification; import android.app.Service; +import android.bluetooth.BluetoothA2dp; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; -import android.content.BroadcastReceiver; +import android.bluetooth.BluetoothHeadset; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -41,13 +42,15 @@ import android.widget.CompoundButton; import com.android.settings.R; import com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile; +import java.util.List; + public class DockService extends Service implements AlertDialog.OnMultiChoiceClickListener, DialogInterface.OnClickListener, DialogInterface.OnDismissListener, CompoundButton.OnCheckedChangeListener { private static final String TAG = "DockService"; - private static final boolean DEBUG = false; + static final boolean DEBUG = false; // Time allowed for the device to be undocked and redocked without severing // the bluetooth connection @@ -87,7 +90,6 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli private BluetoothDevice mPendingDevice; private int mPendingStartId; - private boolean mRegistered; private Object mBtSynchroObject = new Object(); @Override @@ -111,10 +113,6 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli mDialog.dismiss(); mDialog = null; } - if (mRegistered) { - unregisterReceiver(mReceiver); - mRegistered = false; - } mServiceLooper.quit(); } @@ -138,6 +136,12 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli return START_NOT_STICKY; } + if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction())) { + handleBtStateChange(intent); + DockEventReceiver.finishStartingService(this, startId); + return START_NOT_STICKY; + } + Message msg = parseIntent(intent); if (msg == null) { // Bad intent @@ -407,12 +411,11 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli return items; } - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); - if (state == BluetoothAdapter.STATE_ON && mPendingDevice != null) { - synchronized (mBtSynchroObject) { + public void handleBtStateChange(Intent intent) { + int btState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); + if (btState == BluetoothAdapter.STATE_ON) { + synchronized (mBtSynchroObject) { + if (mPendingDevice != null) { if (mPendingDevice.equals(mDevice)) { if(DEBUG) Log.d(TAG, "applying settings"); applyBtSettings(mPendingDevice, mPendingStartId); @@ -423,10 +426,46 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli mPendingDevice = null; DockEventReceiver.finishStartingService(mContext, mPendingStartId); + } else { + // Reconnect if docked and bluetooth was enabled by user. + Intent i = registerReceiver(null, new IntentFilter(Intent.ACTION_DOCK_EVENT)); + if (i != null) { + int state = i.getIntExtra(Intent.EXTRA_DOCK_STATE, + Intent.EXTRA_DOCK_STATE_UNDOCKED); + if (state != Intent.EXTRA_DOCK_STATE_UNDOCKED) { + BluetoothDevice device = i + .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + if (device != null) { + connectIfEnabled(device); + } + } + } } } } - }; + } + + private synchronized void connectIfEnabled(BluetoothDevice device) { + CachedBluetoothDevice cachedDevice = getCachedBluetoothDevice(mContext, mBtManager, device); + List profiles = cachedDevice.getConnectableProfiles(); + for (int i = 0; i < profiles.size(); i++) { + LocalBluetoothProfileManager profileManager = LocalBluetoothProfileManager + .getProfileManager(mBtManager, profiles.get(i)); + int auto; + if (Profile.A2DP == profiles.get(i)) { + auto = BluetoothA2dp.PRIORITY_AUTO_CONNECT; + } else if (Profile.HEADSET == profiles.get(i)) { + auto = BluetoothHeadset.PRIORITY_AUTO_CONNECT; + } else { + continue; + } + + if (profileManager.getPreferred(device) == auto) { + cachedDevice.connect(); + break; + } + } + } private synchronized void applyBtSettings(final BluetoothDevice device, int startId) { if (device == null || mProfiles == null || mCheckedItems == null) @@ -444,12 +483,8 @@ public class DockService extends Service implements AlertDialog.OnMultiChoiceCli if (mPendingDevice != null && mPendingDevice.equals(mDevice)) { return; } - if (!mRegistered) { - registerReceiver(mReceiver, new IntentFilter( - BluetoothAdapter.ACTION_STATE_CHANGED)); - } + mPendingDevice = device; - mRegistered = true; mPendingStartId = startId; if (btState != BluetoothAdapter.STATE_TURNING_ON) { // BT is off. Enable it diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java index 24ba04572d2..f3aaade26dc 100644 --- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java +++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java @@ -136,6 +136,8 @@ public abstract class LocalBluetoothProfileManager { public abstract boolean isPreferred(BluetoothDevice device); + public abstract int getPreferred(BluetoothDevice device); + public abstract void setPreferred(BluetoothDevice device, boolean preferred); public boolean isConnected(BluetoothDevice device) { @@ -212,6 +214,11 @@ public abstract class LocalBluetoothProfileManager { return mService.getSinkPriority(device) > BluetoothA2dp.PRIORITY_OFF; } + @Override + public int getPreferred(BluetoothDevice device) { + return mService.getSinkPriority(device); + } + @Override public void setPreferred(BluetoothDevice device, boolean preferred) { if (preferred) { @@ -331,6 +338,11 @@ public abstract class LocalBluetoothProfileManager { return mService.getPriority(device) > BluetoothHeadset.PRIORITY_OFF; } + @Override + public int getPreferred(BluetoothDevice device) { + return mService.getPriority(device); + } + @Override public void setPreferred(BluetoothDevice device, boolean preferred) { if (preferred) { @@ -402,6 +414,11 @@ public abstract class LocalBluetoothProfileManager { return false; } + @Override + public int getPreferred(BluetoothDevice device) { + return -1; + } + @Override public void setPreferred(BluetoothDevice device, boolean preferred) { }