Merge "Remove Profile Auto connection specific logic" into jb-mr1-dev
This commit is contained in:
@@ -56,13 +56,11 @@ final class A2dpProfile implements LocalBluetoothProfile {
|
|||||||
public void onServiceConnected(int profile, BluetoothProfile proxy) {
|
public void onServiceConnected(int profile, BluetoothProfile proxy) {
|
||||||
if (V) Log.d(TAG,"Bluetooth service connected");
|
if (V) Log.d(TAG,"Bluetooth service connected");
|
||||||
mService = (BluetoothA2dp) proxy;
|
mService = (BluetoothA2dp) proxy;
|
||||||
mProfileManager.setA2dpServiceUp(true);
|
|
||||||
mIsProfileReady=true;
|
mIsProfileReady=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onServiceDisconnected(int profile) {
|
public void onServiceDisconnected(int profile) {
|
||||||
if (V) Log.d(TAG,"Bluetooth service disconnected");
|
if (V) Log.d(TAG,"Bluetooth service disconnected");
|
||||||
mProfileManager.setA2dpServiceUp(false);
|
|
||||||
mIsProfileReady=false;
|
mIsProfileReady=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -106,21 +104,11 @@ final class A2dpProfile implements LocalBluetoothProfile {
|
|||||||
|
|
||||||
public boolean disconnect(BluetoothDevice device) {
|
public boolean disconnect(BluetoothDevice device) {
|
||||||
if (mService == null) return false;
|
if (mService == null) return false;
|
||||||
return mService.disconnect(device);
|
// Downgrade priority as user is disconnecting the headset.
|
||||||
}
|
if (mService.getPriority(device) > BluetoothProfile.PRIORITY_ON){
|
||||||
|
mService.setPriority(device, BluetoothProfile.PRIORITY_ON);
|
||||||
// This function is added as the AUTO CONNECT priority could not be set by using setPreferred(),
|
|
||||||
// as setPreferred() takes only boolean input but getPreferred() supports interger output.
|
|
||||||
// Also this need not implemented by all profiles so this has been added here.
|
|
||||||
public void enableAutoConnect(BluetoothDevice device, boolean enable) {
|
|
||||||
if (mService == null) return;
|
|
||||||
if (enable) {
|
|
||||||
mService.setPriority(device, BluetoothProfile.PRIORITY_AUTO_CONNECT);
|
|
||||||
} else {
|
|
||||||
if (mService.getPriority(device) > BluetoothProfile.PRIORITY_ON) {
|
|
||||||
mService.setPriority(device, BluetoothProfile.PRIORITY_ON);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
return mService.disconnect(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getConnectionStatus(BluetoothDevice device) {
|
public int getConnectionStatus(BluetoothDevice device) {
|
||||||
@@ -150,13 +138,6 @@ final class A2dpProfile implements LocalBluetoothProfile {
|
|||||||
mService.setPriority(device, BluetoothProfile.PRIORITY_OFF);
|
mService.setPriority(device, BluetoothProfile.PRIORITY_OFF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUnbonded(BluetoothDevice device)
|
|
||||||
{
|
|
||||||
if (mService == null) return;
|
|
||||||
mService.setPriority(device, BluetoothProfile.PRIORITY_UNDEFINED);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isA2dpPlaying() {
|
boolean isA2dpPlaying() {
|
||||||
if (mService == null) return false;
|
if (mService == null) return false;
|
||||||
List<BluetoothDevice> sinks = mService.getConnectedDevices();
|
List<BluetoothDevice> sinks = mService.getConnectedDevices();
|
||||||
|
@@ -101,9 +101,6 @@ final class BluetoothEventManager {
|
|||||||
// Dock event broadcasts
|
// Dock event broadcasts
|
||||||
addHandler(Intent.ACTION_DOCK_EVENT, new DockEventHandler());
|
addHandler(Intent.ACTION_DOCK_EVENT, new DockEventHandler());
|
||||||
|
|
||||||
// Connect other profiles broadcast
|
|
||||||
addHandler(BluetoothProfile.ACTION_CONNECT_OTHER_PROFILES, new ConnectOtherProfilesHandler());
|
|
||||||
|
|
||||||
mContext.registerReceiver(mBroadcastReceiver, mAdapterIntentFilter);
|
mContext.registerReceiver(mBroadcastReceiver, mAdapterIntentFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,13 +369,6 @@ final class BluetoothEventManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ConnectOtherProfilesHandler implements Handler {
|
|
||||||
public void onReceive(Context context, Intent intent, BluetoothDevice device) {
|
|
||||||
mProfileManager.handleConnectOtherProfiles(device);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean readPairedDevices() {
|
boolean readPairedDevices() {
|
||||||
Set<BluetoothDevice> bondedDevices = mLocalAdapter.getBondedDevices();
|
Set<BluetoothDevice> bondedDevices = mLocalAdapter.getBondedDevices();
|
||||||
if (bondedDevices == null) {
|
if (bondedDevices == null) {
|
||||||
|
@@ -119,30 +119,6 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
|
|||||||
Log.d(TAG, "onProfileStateChanged: profile " + profile +
|
Log.d(TAG, "onProfileStateChanged: profile " + profile +
|
||||||
" newProfileState " + newProfileState);
|
" newProfileState " + newProfileState);
|
||||||
}
|
}
|
||||||
if (profile instanceof HeadsetProfile) {
|
|
||||||
if (newProfileState == BluetoothProfile.STATE_CONNECTED) {
|
|
||||||
if (BluetoothProfile.PRIORITY_AUTO_CONNECT != profile.getPreferred(mDevice))
|
|
||||||
mProfileManager.enableAutoConnectForHf(mDevice, true);
|
|
||||||
} else if (newProfileState == BluetoothProfile.STATE_DISCONNECTED) {
|
|
||||||
// dont reset auto connect priority when bluetooth turned off
|
|
||||||
if ((BluetoothAdapter.STATE_ON == mLocalAdapter.getBluetoothState())
|
|
||||||
|| (BluetoothAdapter.STATE_TURNING_ON == mLocalAdapter.getBluetoothState())) {
|
|
||||||
mProfileManager.enableAutoConnectForHf(mDevice, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (profile instanceof A2dpProfile ) {
|
|
||||||
if (newProfileState == BluetoothProfile.STATE_CONNECTED) {
|
|
||||||
if (BluetoothProfile.PRIORITY_AUTO_CONNECT != profile.getPreferred(mDevice))
|
|
||||||
mProfileManager.enableAutoConnectForA2dp(mDevice,true);
|
|
||||||
} else if (newProfileState == BluetoothProfile.STATE_DISCONNECTED) {
|
|
||||||
// dont reset auto connect priority when bluetooth turned off
|
|
||||||
if ((BluetoothAdapter.STATE_ON == mLocalAdapter.getBluetoothState())
|
|
||||||
|| (BluetoothAdapter.STATE_TURNING_ON == mLocalAdapter.getBluetoothState())) {
|
|
||||||
mProfileManager.enableAutoConnectForA2dp(mDevice, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mProfileConnectionState.put(profile, newProfileState);
|
mProfileConnectionState.put(profile, newProfileState);
|
||||||
if (newProfileState == BluetoothProfile.STATE_CONNECTED) {
|
if (newProfileState == BluetoothProfile.STATE_CONNECTED) {
|
||||||
if (!mProfiles.contains(profile)) {
|
if (!mProfiles.contains(profile)) {
|
||||||
@@ -180,6 +156,14 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
|
|||||||
for (LocalBluetoothProfile profile : mProfiles) {
|
for (LocalBluetoothProfile profile : mProfiles) {
|
||||||
disconnect(profile);
|
disconnect(profile);
|
||||||
}
|
}
|
||||||
|
// Disconnect PBAP server in case its connected
|
||||||
|
// This is to ensure all the profiles are disconnected as some CK/Hs do not
|
||||||
|
// disconnect PBAP connection when HF connection is brought down
|
||||||
|
PbapServerProfile PbapProfile = mProfileManager.getPbapProfile();
|
||||||
|
if (PbapProfile.getConnectionStatus(mDevice) == BluetoothProfile.STATE_CONNECTED)
|
||||||
|
{
|
||||||
|
PbapProfile.disconnect(mDevice);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void disconnect(LocalBluetoothProfile profile) {
|
void disconnect(LocalBluetoothProfile profile) {
|
||||||
@@ -507,23 +491,11 @@ final class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> {
|
|||||||
.elapsedRealtime()) {
|
.elapsedRealtime()) {
|
||||||
connectWithoutResettingTimer(false);
|
connectWithoutResettingTimer(false);
|
||||||
}
|
}
|
||||||
// On an incoming pairing, set all the available profiles as preferred.
|
|
||||||
for (LocalBluetoothProfile profile : mProfiles) {
|
|
||||||
profile.setPreferred(mDevice, true);
|
|
||||||
}
|
|
||||||
dispatchAttributesChanged();
|
dispatchAttributesChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear service priority of Hid, A2DP and Headset profiles on unbond
|
|
||||||
private void clearProfilePriorities() {
|
|
||||||
for (LocalBluetoothProfile profile : mProfiles) {
|
|
||||||
profile.setUnbonded(mDevice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void onBondingStateChanged(int bondState) {
|
void onBondingStateChanged(int bondState) {
|
||||||
if (bondState == BluetoothDevice.BOND_NONE) {
|
if (bondState == BluetoothDevice.BOND_NONE) {
|
||||||
clearProfilePriorities();
|
|
||||||
mProfiles.clear();
|
mProfiles.clear();
|
||||||
mConnectAfterPairing = false; // cancel auto-connect
|
mConnectAfterPairing = false; // cancel auto-connect
|
||||||
setPhonebookPermissionChoice(PHONEBOOK_ACCESS_UNKNOWN);
|
setPhonebookPermissionChoice(PHONEBOOK_ACCESS_UNKNOWN);
|
||||||
|
@@ -78,14 +78,12 @@ final class HeadsetProfile implements LocalBluetoothProfile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
mProfileManager.callServiceConnectedListeners();
|
mProfileManager.callServiceConnectedListeners();
|
||||||
mProfileManager.setHfServiceUp(true);
|
|
||||||
mIsProfileReady=true;
|
mIsProfileReady=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onServiceDisconnected(int profile) {
|
public void onServiceDisconnected(int profile) {
|
||||||
if (V) Log.d(TAG,"Bluetooth service disconnected");
|
if (V) Log.d(TAG,"Bluetooth service disconnected");
|
||||||
mProfileManager.callServiceDisconnectedListeners();
|
mProfileManager.callServiceDisconnectedListeners();
|
||||||
mProfileManager.setHfServiceUp(false);
|
|
||||||
mIsProfileReady=false;
|
mIsProfileReady=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -167,12 +165,6 @@ final class HeadsetProfile implements LocalBluetoothProfile {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUnbonded(BluetoothDevice device)
|
|
||||||
{
|
|
||||||
if (mService == null) return;
|
|
||||||
mService.setPriority(device, BluetoothProfile.PRIORITY_UNDEFINED);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<BluetoothDevice> getConnectedDevices() {
|
public List<BluetoothDevice> getConnectedDevices() {
|
||||||
if (mService == null) return new ArrayList<BluetoothDevice>(0);
|
if (mService == null) return new ArrayList<BluetoothDevice>(0);
|
||||||
return mService.getDevicesMatchingConnectionStates(
|
return mService.getDevicesMatchingConnectionStates(
|
||||||
@@ -181,21 +173,6 @@ final class HeadsetProfile implements LocalBluetoothProfile {
|
|||||||
BluetoothProfile.STATE_DISCONNECTING});
|
BluetoothProfile.STATE_DISCONNECTING});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// This function is added as the AUTO CONNECT priority could not be set by using setPreferred(),
|
|
||||||
// as setPreferred() takes only boolean input but getPreferred() supports interger output.
|
|
||||||
// Also this need not implemented by all profiles so this has been added here.
|
|
||||||
public void enableAutoConnect(BluetoothDevice device, boolean enable) {
|
|
||||||
if (mService == null) return;
|
|
||||||
if (enable) {
|
|
||||||
mService.setPriority(device, BluetoothProfile.PRIORITY_AUTO_CONNECT);
|
|
||||||
} else {
|
|
||||||
if (mService.getPriority(device) > BluetoothProfile.PRIORITY_ON) {
|
|
||||||
mService.setPriority(device, BluetoothProfile.PRIORITY_ON);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
6
src/com/android/settings/bluetooth/HidProfile.java
Normal file → Executable file
6
src/com/android/settings/bluetooth/HidProfile.java
Normal file → Executable file
@@ -118,12 +118,6 @@ final class HidProfile implements LocalBluetoothProfile {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUnbonded(BluetoothDevice device)
|
|
||||||
{
|
|
||||||
if (mService == null) return;
|
|
||||||
mService.setPriority(device, BluetoothProfile.PRIORITY_UNDEFINED);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
2
src/com/android/settings/bluetooth/LocalBluetoothProfile.java
Normal file → Executable file
2
src/com/android/settings/bluetooth/LocalBluetoothProfile.java
Normal file → Executable file
@@ -47,8 +47,6 @@ interface LocalBluetoothProfile {
|
|||||||
|
|
||||||
void setPreferred(BluetoothDevice device, boolean preferred);
|
void setPreferred(BluetoothDevice device, boolean preferred);
|
||||||
|
|
||||||
void setUnbonded(BluetoothDevice device);
|
|
||||||
|
|
||||||
boolean isProfileReady();
|
boolean isProfileReady();
|
||||||
|
|
||||||
/** Display order for device profile settings. */
|
/** Display order for device profile settings. */
|
||||||
|
@@ -21,6 +21,7 @@ import android.bluetooth.BluetoothDevice;
|
|||||||
import android.bluetooth.BluetoothHeadset;
|
import android.bluetooth.BluetoothHeadset;
|
||||||
import android.bluetooth.BluetoothInputDevice;
|
import android.bluetooth.BluetoothInputDevice;
|
||||||
import android.bluetooth.BluetoothPan;
|
import android.bluetooth.BluetoothPan;
|
||||||
|
import android.bluetooth.BluetoothPbap;
|
||||||
import android.bluetooth.BluetoothProfile;
|
import android.bluetooth.BluetoothProfile;
|
||||||
import android.bluetooth.BluetoothUuid;
|
import android.bluetooth.BluetoothUuid;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -43,13 +44,6 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
final class LocalBluetoothProfileManager {
|
final class LocalBluetoothProfileManager {
|
||||||
private static final String TAG = "LocalBluetoothProfileManager";
|
private static final String TAG = "LocalBluetoothProfileManager";
|
||||||
private static final int CONNECT_HF_OR_A2DP = 1;
|
|
||||||
private static final int CONNECT_OTHER_PROFILES = 2;
|
|
||||||
// If either a2dp or hf is connected and if the other profile conneciton is not
|
|
||||||
// happening with the timeout , the other profile(a2dp or hf) will be inititate connection.
|
|
||||||
// Give reasonable timeout for the device to initiate the other profile connection.
|
|
||||||
private static final int CONNECT_HF_OR_A2DP_TIMEOUT = 6000;
|
|
||||||
|
|
||||||
|
|
||||||
/** Singleton instance. */
|
/** Singleton instance. */
|
||||||
private static LocalBluetoothProfileManager sInstance;
|
private static LocalBluetoothProfileManager sInstance;
|
||||||
@@ -88,47 +82,7 @@ final class LocalBluetoothProfileManager {
|
|||||||
private final HidProfile mHidProfile;
|
private final HidProfile mHidProfile;
|
||||||
private OppProfile mOppProfile;
|
private OppProfile mOppProfile;
|
||||||
private final PanProfile mPanProfile;
|
private final PanProfile mPanProfile;
|
||||||
private boolean isHfServiceUp;
|
private final PbapServerProfile mPbapProfile;
|
||||||
private boolean isA2dpServiceUp;
|
|
||||||
private boolean isHfA2dpConnectMessagePosted;
|
|
||||||
private final Handler hfA2dpConnectHandler = new Handler() {
|
|
||||||
@Override
|
|
||||||
public void handleMessage(Message msg) {
|
|
||||||
|
|
||||||
synchronized (this) {
|
|
||||||
if (isA2dpConnectRequired((BluetoothDevice)msg.obj)) {
|
|
||||||
mA2dpProfile.connect((BluetoothDevice)msg.obj);
|
|
||||||
} else if (isHfConnectRequired((BluetoothDevice)msg.obj)) {
|
|
||||||
mHeadsetProfile.connect((BluetoothDevice)msg.obj);
|
|
||||||
}
|
|
||||||
isHfA2dpConnectMessagePosted =false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private final Handler connectOtherProfilesHandler = new Handler() {
|
|
||||||
@Override
|
|
||||||
public void handleMessage(Message msg) {
|
|
||||||
synchronized (this) {
|
|
||||||
// Connect all the profiles which are enabled
|
|
||||||
// Right now hf/a2dp profiles connect is handled here
|
|
||||||
List<BluetoothDevice> hfConnDevList= mHeadsetProfile.getConnectedDevices();
|
|
||||||
|
|
||||||
if (hfConnDevList.isEmpty() && mHeadsetProfile.isPreferred((BluetoothDevice)msg.obj))
|
|
||||||
mHeadsetProfile.connect((BluetoothDevice)msg.obj);
|
|
||||||
else
|
|
||||||
Log.d(TAG,"Hf device is not preferred or already Hf connected device exist");
|
|
||||||
|
|
||||||
List<BluetoothDevice> a2dpConnDevList= mA2dpProfile.getConnectedDevices();
|
|
||||||
|
|
||||||
if (a2dpConnDevList.isEmpty() && mA2dpProfile.isPreferred((BluetoothDevice)msg.obj))
|
|
||||||
mA2dpProfile.connect((BluetoothDevice)msg.obj);
|
|
||||||
else
|
|
||||||
Log.d(TAG,"A2dp device is not preferred or already a2dp connected device exist");
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mapping from profile name, e.g. "HEADSET" to profile object.
|
* Mapping from profile name, e.g. "HEADSET" to profile object.
|
||||||
@@ -165,6 +119,10 @@ final class LocalBluetoothProfileManager {
|
|||||||
addPanProfile(mPanProfile, PanProfile.NAME,
|
addPanProfile(mPanProfile, PanProfile.NAME,
|
||||||
BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);
|
BluetoothPan.ACTION_CONNECTION_STATE_CHANGED);
|
||||||
|
|
||||||
|
//Create PBAP server profile, but do not add it to list of profiles
|
||||||
|
// as we do not need to monitor the profile as part of profile list
|
||||||
|
mPbapProfile = new PbapServerProfile(context);
|
||||||
|
|
||||||
Log.d(TAG, "LocalBluetoothProfileManager construction complete");
|
Log.d(TAG, "LocalBluetoothProfileManager construction complete");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,21 +231,6 @@ final class LocalBluetoothProfileManager {
|
|||||||
|
|
||||||
cachedDevice.onProfileStateChanged(mProfile, newState);
|
cachedDevice.onProfileStateChanged(mProfile, newState);
|
||||||
cachedDevice.refresh();
|
cachedDevice.refresh();
|
||||||
|
|
||||||
if ((mProfile instanceof HeadsetProfile)||(mProfile instanceof A2dpProfile)) {
|
|
||||||
if ((BluetoothProfile.STATE_CONNECTED == newState)&&
|
|
||||||
(!isHfA2dpConnectMessagePosted)) {
|
|
||||||
Message mes = hfA2dpConnectHandler.obtainMessage(CONNECT_HF_OR_A2DP);
|
|
||||||
mes.obj = device;
|
|
||||||
hfA2dpConnectHandler.sendMessageDelayed(mes,CONNECT_HF_OR_A2DP_TIMEOUT);
|
|
||||||
Log.i(TAG,"Message posted for hf/a2dp connection");
|
|
||||||
isHfA2dpConnectMessagePosted = true;
|
|
||||||
} else if (isHfA2dpConnectMessagePosted) {
|
|
||||||
hfA2dpConnectHandler.removeMessages(CONNECT_HF_OR_A2DP);
|
|
||||||
Log.i(TAG,"Message removed for hf/a2dp connection");
|
|
||||||
isHfA2dpConnectMessagePosted =false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -331,66 +274,6 @@ final class LocalBluetoothProfileManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized void setHfServiceUp(boolean isUp) {
|
|
||||||
isHfServiceUp = isUp;
|
|
||||||
if (isHfServiceUp && isA2dpServiceUp) {
|
|
||||||
// connect hf and then a2dp
|
|
||||||
// this order is maintained as per the white paper
|
|
||||||
handleAutoConnect(mHeadsetProfile);
|
|
||||||
handleAutoConnect(mA2dpProfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
synchronized void setA2dpServiceUp(boolean isUp) {
|
|
||||||
isA2dpServiceUp= isUp;
|
|
||||||
if (isHfServiceUp && isA2dpServiceUp) {
|
|
||||||
// connect hf and then a2dp
|
|
||||||
// this order is maintained as per the white paper
|
|
||||||
handleAutoConnect(mHeadsetProfile);
|
|
||||||
handleAutoConnect(mA2dpProfile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void handleAutoConnect(LocalBluetoothProfile profile) {
|
|
||||||
Set<BluetoothDevice> bondedDevices = mLocalAdapter.getBondedDevices();
|
|
||||||
for (BluetoothDevice device : bondedDevices) {
|
|
||||||
if (profile.getPreferred(device) ==
|
|
||||||
BluetoothProfile.PRIORITY_AUTO_CONNECT) {
|
|
||||||
Log.d(TAG,"handleAutoConnect for device");
|
|
||||||
CachedBluetoothDevice cacheDevice = mDeviceManager.findDevice(device);
|
|
||||||
if (null == cacheDevice)
|
|
||||||
{
|
|
||||||
Log.w(TAG,"Dev not found in cached dev list. Adding the dev to cached list");
|
|
||||||
cacheDevice = mDeviceManager.addDevice(mLocalAdapter,
|
|
||||||
LocalBluetoothProfileManager.this, device);
|
|
||||||
}
|
|
||||||
cacheDevice.connectInt(profile);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void enableAutoConnectForHf(BluetoothDevice device,boolean enable) {
|
|
||||||
mHeadsetProfile.enableAutoConnect(device,enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void enableAutoConnectForA2dp(BluetoothDevice device,boolean enable) {
|
|
||||||
mA2dpProfile.enableAutoConnect(device,enable);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void handleConnectOtherProfiles(BluetoothDevice device) {
|
|
||||||
if (device != null){
|
|
||||||
// Remove previous messages if any
|
|
||||||
connectOtherProfilesHandler.removeMessages(CONNECT_OTHER_PROFILES);
|
|
||||||
Message mes = connectOtherProfilesHandler.obtainMessage(CONNECT_OTHER_PROFILES);
|
|
||||||
mes.obj = device;
|
|
||||||
connectOtherProfilesHandler.sendMessageDelayed(mes,CONNECT_HF_OR_A2DP_TIMEOUT);
|
|
||||||
Log.i(TAG,"Message posted for connection other Profiles ");
|
|
||||||
} else {
|
|
||||||
Log.e(TAG,"Device = Null received in handleConnectOtherProfiles ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is called by DockService, so check Headset and A2DP.
|
// This is called by DockService, so check Headset and A2DP.
|
||||||
public synchronized boolean isManagerReady() {
|
public synchronized boolean isManagerReady() {
|
||||||
// Getting just the headset profile is fine for now. Will need to deal with A2DP
|
// Getting just the headset profile is fine for now. Will need to deal with A2DP
|
||||||
@@ -414,6 +297,11 @@ final class LocalBluetoothProfileManager {
|
|||||||
return mHeadsetProfile;
|
return mHeadsetProfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PbapServerProfile getPbapProfile(){
|
||||||
|
return mPbapProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fill in a list of LocalBluetoothProfile objects that are supported by
|
* Fill in a list of LocalBluetoothProfile objects that are supported by
|
||||||
* the local device and the remote device.
|
* the local device and the remote device.
|
||||||
@@ -473,34 +361,4 @@ final class LocalBluetoothProfileManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isHfConnectRequired(BluetoothDevice device) {
|
|
||||||
List<BluetoothDevice> a2dpConnDevList= mA2dpProfile.getConnectedDevices();
|
|
||||||
List<BluetoothDevice> hfConnDevList= mHeadsetProfile.getConnectedDevices();
|
|
||||||
|
|
||||||
// If both hf and a2dp is connected hf connection is not required
|
|
||||||
// Hf connection is required only when a2dp is connected but
|
|
||||||
// hf connect did no happen untill CONNECT_HF_OR_A2DP_TIMEOUT
|
|
||||||
if (!a2dpConnDevList.isEmpty() && !hfConnDevList.isEmpty())
|
|
||||||
return false;
|
|
||||||
if (hfConnDevList.isEmpty() && mHeadsetProfile.isPreferred(device))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isA2dpConnectRequired(BluetoothDevice device) {
|
|
||||||
List<BluetoothDevice> a2dpConnDevList= mA2dpProfile.getConnectedDevices();
|
|
||||||
List<BluetoothDevice> hfConnDevList= mHeadsetProfile.getConnectedDevices();
|
|
||||||
|
|
||||||
// If both hf and a2dp is connected a2dp connection is not required
|
|
||||||
// A2dp connection is required only when hf is connected but
|
|
||||||
// a2dp connect did no happen until CONNECT_HF_OR_A2DP_TIMEOUT
|
|
||||||
if (!a2dpConnDevList.isEmpty() && !hfConnDevList.isEmpty())
|
|
||||||
return false;
|
|
||||||
if (a2dpConnDevList.isEmpty() && mA2dpProfile.isPreferred(device))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
4
src/com/android/settings/bluetooth/OppProfile.java
Normal file → Executable file
4
src/com/android/settings/bluetooth/OppProfile.java
Normal file → Executable file
@@ -63,10 +63,6 @@ final class OppProfile implements LocalBluetoothProfile {
|
|||||||
public void setPreferred(BluetoothDevice device, boolean preferred) {
|
public void setPreferred(BluetoothDevice device, boolean preferred) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUnbonded(BluetoothDevice device) {
|
|
||||||
// Settings app doesn't handle OPP
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isProfileReady() {
|
public boolean isProfileReady() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
142
src/com/android/settings/bluetooth/PBAPServerProfile.java
Executable file
142
src/com/android/settings/bluetooth/PBAPServerProfile.java
Executable file
@@ -0,0 +1,142 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2011 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.bluetooth;
|
||||||
|
|
||||||
|
import android.bluetooth.BluetoothAdapter;
|
||||||
|
import android.bluetooth.BluetoothClass;
|
||||||
|
import android.bluetooth.BluetoothDevice;
|
||||||
|
import android.bluetooth.BluetoothPbap;
|
||||||
|
import android.bluetooth.BluetoothProfile;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*PBAPServer Profile
|
||||||
|
*/
|
||||||
|
final class PbapServerProfile implements LocalBluetoothProfile {
|
||||||
|
private static final String TAG = "PbapServerProfile";
|
||||||
|
private static boolean V = true;
|
||||||
|
|
||||||
|
private BluetoothPbap mService;
|
||||||
|
private boolean mIsProfileReady;
|
||||||
|
|
||||||
|
static final String NAME = "PBAP Server";
|
||||||
|
|
||||||
|
// Order of this profile in device profiles list
|
||||||
|
private static final int ORDINAL = 6;
|
||||||
|
|
||||||
|
// These callbacks run on the main thread.
|
||||||
|
private final class PbapServiceListener
|
||||||
|
implements BluetoothPbap.ServiceListener {
|
||||||
|
|
||||||
|
public void onServiceConnected(BluetoothPbap proxy) {
|
||||||
|
if (V) Log.d(TAG,"Bluetooth service connected");
|
||||||
|
mService = (BluetoothPbap) proxy;
|
||||||
|
mIsProfileReady=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onServiceDisconnected() {
|
||||||
|
if (V) Log.d(TAG,"Bluetooth service disconnected");
|
||||||
|
mIsProfileReady=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isProfileReady() {
|
||||||
|
return mIsProfileReady;
|
||||||
|
}
|
||||||
|
|
||||||
|
PbapServerProfile(Context context) {
|
||||||
|
BluetoothPbap pbap = new BluetoothPbap(context, new PbapServiceListener());
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isConnectable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAutoConnectable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean connect(BluetoothDevice device) {
|
||||||
|
/*Can't connect from server */
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean disconnect(BluetoothDevice device) {
|
||||||
|
if (mService == null) return false;
|
||||||
|
return mService.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getConnectionStatus(BluetoothDevice device) {
|
||||||
|
if (mService == null) {
|
||||||
|
return BluetoothProfile.STATE_DISCONNECTED;
|
||||||
|
}
|
||||||
|
if (mService.isConnected(device))
|
||||||
|
return BluetoothProfile.STATE_CONNECTED;
|
||||||
|
else
|
||||||
|
return BluetoothProfile.STATE_DISCONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPreferred(BluetoothDevice device) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPreferred(BluetoothDevice device) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPreferred(BluetoothDevice device, boolean preferred) {
|
||||||
|
// ignore: isPreferred is always true for PBAP
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getOrdinal() {
|
||||||
|
return ORDINAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNameResource(BluetoothDevice device) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSummaryResourceForDevice(BluetoothDevice device) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDrawableResource(BluetoothClass btClass) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
protected void finalize() {
|
||||||
|
if (V) Log.d(TAG, "finalize()");
|
||||||
|
if (mService != null) {
|
||||||
|
try {
|
||||||
|
mService.close();
|
||||||
|
mService = null;
|
||||||
|
}catch (Throwable t) {
|
||||||
|
Log.w(TAG, "Error cleaning up PBAP proxy", t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
5
src/com/android/settings/bluetooth/PanProfile.java
Normal file → Executable file
5
src/com/android/settings/bluetooth/PanProfile.java
Normal file → Executable file
@@ -117,11 +117,6 @@ final class PanProfile implements LocalBluetoothProfile {
|
|||||||
// ignore: isPreferred is always true for PAN
|
// ignore: isPreferred is always true for PAN
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUnbonded(BluetoothDevice device)
|
|
||||||
{
|
|
||||||
// ignore: PAN profile cannot be disabled
|
|
||||||
}
|
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user