Loading android/app/src/com/android/bluetooth/a2dp/A2dpService.java +16 −10 Original line number Diff line number Diff line Loading @@ -355,18 +355,24 @@ public class A2dpService extends ProfileService { return false; } // Check priority and accept or reject the connection. // Note: Logic can be simplified, but keeping it this way for readability int priority = getPriority(device); int bondState = mAdapterService.getBondState(device); // Allow this connection only if the device is bonded. Any attempt to connect while // bonding would potentially lead to an unauthorized connection. if (bondState != BluetoothDevice.BOND_BONDED) { Log.w(TAG, "okToConnect: return false, bondState=" + bondState); return false; } else if (priority != BluetoothProfile.PRIORITY_UNDEFINED && priority != BluetoothProfile.PRIORITY_ON && priority != BluetoothProfile.PRIORITY_AUTO_CONNECT) { // Otherwise, reject the connection if priority is not valid. Log.w(TAG, "okToConnect: return false, priority=" + priority); // If priority is undefined, it is likely that service discovery has not completed and peer // initiated the connection. Allow this connection only if the device is bonded or bonding boolean serviceDiscoveryPending = (priority == BluetoothProfile.PRIORITY_UNDEFINED) && (bondState == BluetoothDevice.BOND_BONDING || bondState == BluetoothDevice.BOND_BONDED); // Also allow connection when device is bonded/bonding and priority is ON/AUTO_CONNECT. boolean isEnabled = (priority == BluetoothProfile.PRIORITY_ON || priority == BluetoothProfile.PRIORITY_AUTO_CONNECT) && (bondState == BluetoothDevice.BOND_BONDED || bondState == BluetoothDevice.BOND_BONDING); if (!serviceDiscoveryPending && !isEnabled) { // Otherwise, reject the connection if no service discovery is pending and priority is // neither PRIORITY_ON nor PRIORITY_AUTO_CONNECT Log.w(TAG, "okToConnect: return false, priority=" + priority + ", bondState=" + bondState); return false; } return true; Loading android/app/src/com/android/bluetooth/btservice/AdapterProperties.java +0 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,6 @@ import android.os.ParcelUuid; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings.Secure; import android.support.annotation.VisibleForTesting; import android.util.Log; import android.util.Pair; import android.util.StatsLog; Loading Loading @@ -463,7 +462,6 @@ class AdapterProperties { // This function shall be invoked from BondStateMachine whenever the bond // state changes. @VisibleForTesting void onBondStateChanged(BluetoothDevice device, int state) { if (device == null) { Log.w(TAG, "onBondStateChanged, device is null"); Loading android/app/src/com/android/bluetooth/btservice/AdapterService.java +0 −12 Original line number Diff line number Diff line Loading @@ -1817,18 +1817,6 @@ public class AdapterService extends Service { } } /** * Update device UUID changed to {@link BondStateMachine} * * @param device remote device of interest */ public void deviceUuidUpdated(BluetoothDevice device) { // Notify BondStateMachine for SDP complete / UUID changed. Message msg = mBondStateMachine.obtainMessage(BondStateMachine.UUID_UPDATE); msg.obj = device; mBondStateMachine.sendMessage(msg); } boolean cancelBondProcess(BluetoothDevice device) { enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH ADMIN permission"); byte[] addr = Utils.getBytesFromAddress(device.getAddress()); Loading android/app/src/com/android/bluetooth/btservice/BondStateMachine.java +2 −47 Original line number Diff line number Diff line Loading @@ -34,13 +34,10 @@ import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.hfpclient.HeadsetClientService; import com.android.bluetooth.hid.HidHostService; import com.android.bluetooth.pbapclient.PbapClientService; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; /** * This state machine handles Bluetooth Adapter State. Loading @@ -60,7 +57,6 @@ final class BondStateMachine extends StateMachine { static final int BONDING_STATE_CHANGE = 4; static final int SSP_REQUEST = 5; static final int PIN_REQUEST = 6; static final int UUID_UPDATE = 10; static final int BOND_STATE_NONE = 0; static final int BOND_STATE_BONDING = 1; static final int BOND_STATE_BONDED = 2; Loading @@ -75,8 +71,6 @@ final class BondStateMachine extends StateMachine { public static final String OOBDATA = "oobdata"; @VisibleForTesting Set<BluetoothDevice> mPendingBondedDevices = new HashSet<>(); private BondStateMachine(AdapterService service, AdapterProperties prop, RemoteDevices remoteDevices) { super("BondStateMachine:"); Loading Loading @@ -150,11 +144,7 @@ final class BondStateMachine extends StateMachine { + state2str(newState)); } break; case UUID_UPDATE: if (mPendingBondedDevices.contains(dev)) { sendIntent(dev, BluetoothDevice.BOND_BONDED, 0); } break; case CANCEL_BOND: default: Log.e(TAG, "Received unhandled state: " + msg.what); Loading Loading @@ -340,52 +330,17 @@ final class BondStateMachine extends StateMachine { mAdapterService.sendOrderedBroadcast(intent, mAdapterService.BLUETOOTH_ADMIN_PERM); } @VisibleForTesting void sendIntent(BluetoothDevice device, int newState, int reason) { private void sendIntent(BluetoothDevice device, int newState, int reason) { DeviceProperties devProp = mRemoteDevices.getDeviceProperties(device); int oldState = BluetoothDevice.BOND_NONE; if (newState != BluetoothDevice.BOND_NONE && newState != BluetoothDevice.BOND_BONDING && newState != BluetoothDevice.BOND_BONDED) { infoLog("Invalid bond state " + newState); return; } if (devProp != null) { oldState = devProp.getBondState(); } if (mPendingBondedDevices.contains(device)) { mPendingBondedDevices.remove(device); if (oldState == BluetoothDevice.BOND_BONDED) { if (newState == BluetoothDevice.BOND_BONDING) { mAdapterProperties.onBondStateChanged(device, newState); } oldState = BluetoothDevice.BOND_BONDING; } else { // Should not enter here. throw new IllegalArgumentException("Invalid old state " + oldState); } } if (oldState == newState) { return; } mAdapterProperties.onBondStateChanged(device, newState); if ((devProp.getDeviceType() == BluetoothDevice.DEVICE_TYPE_CLASSIC || devProp.getDeviceType() == BluetoothDevice.DEVICE_TYPE_DUAL) && newState == BluetoothDevice.BOND_BONDED && devProp.getUuids() == null) { infoLog(device + " is bonded, wait for SDP complete to broadcast bonded intent"); if (!mPendingBondedDevices.contains(device)) { mPendingBondedDevices.add(device); } if (oldState == BluetoothDevice.BOND_NONE) { // Broadcast NONE->BONDING for NONE->BONDED case. newState = BluetoothDevice.BOND_BONDING; } else { return; } } Intent intent = new Intent(BluetoothDevice.ACTION_BOND_STATE_CHANGED); intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device); intent.putExtra(BluetoothDevice.EXTRA_BOND_STATE, newState); Loading android/app/src/com/android/bluetooth/btservice/RemoteDevices.java +4 −5 Original line number Diff line number Diff line Loading @@ -177,7 +177,6 @@ final class RemoteDevices { return prop.getDevice(); } @VisibleForTesting DeviceProperties addDeviceProperties(byte[] address) { synchronized (mDevices) { DeviceProperties prop = new DeviceProperties(); Loading Loading @@ -208,13 +207,13 @@ final class RemoteDevices { private byte[] mAddress; private int mBluetoothClass = BluetoothClass.Device.Major.UNCATEGORIZED; private short mRssi; private ParcelUuid[] mUuids; private int mDeviceType; private String mAlias; private int mBondState; private BluetoothDevice mDevice; private boolean mIsBondingInitiatedLocally; private int mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN; @VisibleForTesting int mBondState; @VisibleForTesting int mDeviceType; @VisibleForTesting ParcelUuid[] mUuids; DeviceProperties() { mBondState = BluetoothDevice.BOND_NONE; Loading Loading @@ -273,6 +272,7 @@ final class RemoteDevices { return mRssi; } } /** * @return mDeviceType */ Loading Loading @@ -545,7 +545,6 @@ final class RemoteDevices { } device.mUuids = newUuids; if (sAdapterService.getState() == BluetoothAdapter.STATE_ON) { sAdapterService.deviceUuidUpdated(bdDevice); sendUuidIntent(bdDevice); } break; Loading Loading
android/app/src/com/android/bluetooth/a2dp/A2dpService.java +16 −10 Original line number Diff line number Diff line Loading @@ -355,18 +355,24 @@ public class A2dpService extends ProfileService { return false; } // Check priority and accept or reject the connection. // Note: Logic can be simplified, but keeping it this way for readability int priority = getPriority(device); int bondState = mAdapterService.getBondState(device); // Allow this connection only if the device is bonded. Any attempt to connect while // bonding would potentially lead to an unauthorized connection. if (bondState != BluetoothDevice.BOND_BONDED) { Log.w(TAG, "okToConnect: return false, bondState=" + bondState); return false; } else if (priority != BluetoothProfile.PRIORITY_UNDEFINED && priority != BluetoothProfile.PRIORITY_ON && priority != BluetoothProfile.PRIORITY_AUTO_CONNECT) { // Otherwise, reject the connection if priority is not valid. Log.w(TAG, "okToConnect: return false, priority=" + priority); // If priority is undefined, it is likely that service discovery has not completed and peer // initiated the connection. Allow this connection only if the device is bonded or bonding boolean serviceDiscoveryPending = (priority == BluetoothProfile.PRIORITY_UNDEFINED) && (bondState == BluetoothDevice.BOND_BONDING || bondState == BluetoothDevice.BOND_BONDED); // Also allow connection when device is bonded/bonding and priority is ON/AUTO_CONNECT. boolean isEnabled = (priority == BluetoothProfile.PRIORITY_ON || priority == BluetoothProfile.PRIORITY_AUTO_CONNECT) && (bondState == BluetoothDevice.BOND_BONDED || bondState == BluetoothDevice.BOND_BONDING); if (!serviceDiscoveryPending && !isEnabled) { // Otherwise, reject the connection if no service discovery is pending and priority is // neither PRIORITY_ON nor PRIORITY_AUTO_CONNECT Log.w(TAG, "okToConnect: return false, priority=" + priority + ", bondState=" + bondState); return false; } return true; Loading
android/app/src/com/android/bluetooth/btservice/AdapterProperties.java +0 −2 Original line number Diff line number Diff line Loading @@ -41,7 +41,6 @@ import android.os.ParcelUuid; import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings.Secure; import android.support.annotation.VisibleForTesting; import android.util.Log; import android.util.Pair; import android.util.StatsLog; Loading Loading @@ -463,7 +462,6 @@ class AdapterProperties { // This function shall be invoked from BondStateMachine whenever the bond // state changes. @VisibleForTesting void onBondStateChanged(BluetoothDevice device, int state) { if (device == null) { Log.w(TAG, "onBondStateChanged, device is null"); Loading
android/app/src/com/android/bluetooth/btservice/AdapterService.java +0 −12 Original line number Diff line number Diff line Loading @@ -1817,18 +1817,6 @@ public class AdapterService extends Service { } } /** * Update device UUID changed to {@link BondStateMachine} * * @param device remote device of interest */ public void deviceUuidUpdated(BluetoothDevice device) { // Notify BondStateMachine for SDP complete / UUID changed. Message msg = mBondStateMachine.obtainMessage(BondStateMachine.UUID_UPDATE); msg.obj = device; mBondStateMachine.sendMessage(msg); } boolean cancelBondProcess(BluetoothDevice device) { enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH ADMIN permission"); byte[] addr = Utils.getBytesFromAddress(device.getAddress()); Loading
android/app/src/com/android/bluetooth/btservice/BondStateMachine.java +2 −47 Original line number Diff line number Diff line Loading @@ -34,13 +34,10 @@ import com.android.bluetooth.hfp.HeadsetService; import com.android.bluetooth.hfpclient.HeadsetClientService; import com.android.bluetooth.hid.HidHostService; import com.android.bluetooth.pbapclient.PbapClientService; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; /** * This state machine handles Bluetooth Adapter State. Loading @@ -60,7 +57,6 @@ final class BondStateMachine extends StateMachine { static final int BONDING_STATE_CHANGE = 4; static final int SSP_REQUEST = 5; static final int PIN_REQUEST = 6; static final int UUID_UPDATE = 10; static final int BOND_STATE_NONE = 0; static final int BOND_STATE_BONDING = 1; static final int BOND_STATE_BONDED = 2; Loading @@ -75,8 +71,6 @@ final class BondStateMachine extends StateMachine { public static final String OOBDATA = "oobdata"; @VisibleForTesting Set<BluetoothDevice> mPendingBondedDevices = new HashSet<>(); private BondStateMachine(AdapterService service, AdapterProperties prop, RemoteDevices remoteDevices) { super("BondStateMachine:"); Loading Loading @@ -150,11 +144,7 @@ final class BondStateMachine extends StateMachine { + state2str(newState)); } break; case UUID_UPDATE: if (mPendingBondedDevices.contains(dev)) { sendIntent(dev, BluetoothDevice.BOND_BONDED, 0); } break; case CANCEL_BOND: default: Log.e(TAG, "Received unhandled state: " + msg.what); Loading Loading @@ -340,52 +330,17 @@ final class BondStateMachine extends StateMachine { mAdapterService.sendOrderedBroadcast(intent, mAdapterService.BLUETOOTH_ADMIN_PERM); } @VisibleForTesting void sendIntent(BluetoothDevice device, int newState, int reason) { private void sendIntent(BluetoothDevice device, int newState, int reason) { DeviceProperties devProp = mRemoteDevices.getDeviceProperties(device); int oldState = BluetoothDevice.BOND_NONE; if (newState != BluetoothDevice.BOND_NONE && newState != BluetoothDevice.BOND_BONDING && newState != BluetoothDevice.BOND_BONDED) { infoLog("Invalid bond state " + newState); return; } if (devProp != null) { oldState = devProp.getBondState(); } if (mPendingBondedDevices.contains(device)) { mPendingBondedDevices.remove(device); if (oldState == BluetoothDevice.BOND_BONDED) { if (newState == BluetoothDevice.BOND_BONDING) { mAdapterProperties.onBondStateChanged(device, newState); } oldState = BluetoothDevice.BOND_BONDING; } else { // Should not enter here. throw new IllegalArgumentException("Invalid old state " + oldState); } } if (oldState == newState) { return; } mAdapterProperties.onBondStateChanged(device, newState); if ((devProp.getDeviceType() == BluetoothDevice.DEVICE_TYPE_CLASSIC || devProp.getDeviceType() == BluetoothDevice.DEVICE_TYPE_DUAL) && newState == BluetoothDevice.BOND_BONDED && devProp.getUuids() == null) { infoLog(device + " is bonded, wait for SDP complete to broadcast bonded intent"); if (!mPendingBondedDevices.contains(device)) { mPendingBondedDevices.add(device); } if (oldState == BluetoothDevice.BOND_NONE) { // Broadcast NONE->BONDING for NONE->BONDED case. newState = BluetoothDevice.BOND_BONDING; } else { return; } } Intent intent = new Intent(BluetoothDevice.ACTION_BOND_STATE_CHANGED); intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device); intent.putExtra(BluetoothDevice.EXTRA_BOND_STATE, newState); Loading
android/app/src/com/android/bluetooth/btservice/RemoteDevices.java +4 −5 Original line number Diff line number Diff line Loading @@ -177,7 +177,6 @@ final class RemoteDevices { return prop.getDevice(); } @VisibleForTesting DeviceProperties addDeviceProperties(byte[] address) { synchronized (mDevices) { DeviceProperties prop = new DeviceProperties(); Loading Loading @@ -208,13 +207,13 @@ final class RemoteDevices { private byte[] mAddress; private int mBluetoothClass = BluetoothClass.Device.Major.UNCATEGORIZED; private short mRssi; private ParcelUuid[] mUuids; private int mDeviceType; private String mAlias; private int mBondState; private BluetoothDevice mDevice; private boolean mIsBondingInitiatedLocally; private int mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN; @VisibleForTesting int mBondState; @VisibleForTesting int mDeviceType; @VisibleForTesting ParcelUuid[] mUuids; DeviceProperties() { mBondState = BluetoothDevice.BOND_NONE; Loading Loading @@ -273,6 +272,7 @@ final class RemoteDevices { return mRssi; } } /** * @return mDeviceType */ Loading Loading @@ -545,7 +545,6 @@ final class RemoteDevices { } device.mUuids = newUuids; if (sAdapterService.getState() == BluetoothAdapter.STATE_ON) { sAdapterService.deviceUuidUpdated(bdDevice); sendUuidIntent(bdDevice); } break; Loading