diff --git a/android/app/src/com/android/bluetooth/vc/VolumeControlService.java b/android/app/src/com/android/bluetooth/vc/VolumeControlService.java index ff44f7d842a0c2359aef1287eb0ce0143d576cd7..1ee66b495833a7f03e07f1561fb1caeedcf40228 100644 --- a/android/app/src/com/android/bluetooth/vc/VolumeControlService.java +++ b/android/app/src/com/android/bluetooth/vc/VolumeControlService.java @@ -25,7 +25,6 @@ import android.annotation.RequiresPermission; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothUuid; -import android.bluetooth.BluetoothVolumeControl; import android.bluetooth.IBluetoothCsipSetCoordinator; import android.bluetooth.IBluetoothLeAudio; import android.bluetooth.IBluetoothVolumeControl; @@ -36,7 +35,9 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; +import android.os.Handler; import android.os.HandlerThread; +import android.os.Looper; import android.os.ParcelUuid; import android.os.RemoteCallbackList; import android.os.RemoteException; @@ -77,6 +78,7 @@ public class VolumeControlService extends ProfileService { private DatabaseManager mDatabaseManager; private HandlerThread mStateMachinesThread; private BluetoothDevice mPreviousAudioDevice; + private Handler mHandler = null; @VisibleForTesting RemoteCallbackList<IBluetoothVolumeControlCallback> mCallbacks; @@ -193,7 +195,6 @@ public class VolumeControlService extends ProfileService { private final Map<Integer, Boolean> mGroupMuteCache = new HashMap<>(); private BroadcastReceiver mBondStateChangedReceiver; - private BroadcastReceiver mConnectionStateChangedReceiver; @VisibleForTesting ServiceFactory mFactory = new ServiceFactory(); @@ -237,6 +238,7 @@ public class VolumeControlService extends ProfileService { "AudioManager cannot be null when VolumeControlService starts"); // Start handler thread for state machines + mHandler = new Handler(Looper.getMainLooper()); mStateMachines.clear(); mStateMachinesThread = new HandlerThread("VolumeControlService.StateMachines"); mStateMachinesThread.start(); @@ -247,11 +249,6 @@ public class VolumeControlService extends ProfileService { filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); mBondStateChangedReceiver = new BondStateChangedReceiver(); registerReceiver(mBondStateChangedReceiver, filter); - filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction(BluetoothVolumeControl.ACTION_CONNECTION_STATE_CHANGED); - mConnectionStateChangedReceiver = new ConnectionStateChangedReceiver(); - registerReceiver(mConnectionStateChangedReceiver, filter); mAudioOffsets.clear(); mGroupVolumeCache.clear(); @@ -283,8 +280,6 @@ public class VolumeControlService extends ProfileService { // Unregister broadcast receivers unregisterReceiver(mBondStateChangedReceiver); mBondStateChangedReceiver = null; - unregisterReceiver(mConnectionStateChangedReceiver); - mConnectionStateChangedReceiver = null; // Destroy state machines and stop handler thread synchronized (mStateMachines) { @@ -1076,6 +1071,10 @@ public class VolumeControlService extends ProfileService { } } + void handleConnectionStateChanged(BluetoothDevice device, int fromState, int toState) { + mHandler.post(() -> connectionStateChanged(device, fromState, toState)); + } + @VisibleForTesting synchronized void connectionStateChanged(BluetoothDevice device, int fromState, int toState) { @@ -1115,19 +1114,6 @@ public class VolumeControlService extends ProfileService { } } - private class ConnectionStateChangedReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - if (!BluetoothVolumeControl.ACTION_CONNECTION_STATE_CHANGED.equals(intent.getAction())) { - return; - } - BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - int toState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1); - int fromState = intent.getIntExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, -1); - connectionStateChanged(device, fromState, toState); - } - } - /** * Binder object: must be a static class or memory leak may occur */ diff --git a/android/app/src/com/android/bluetooth/vc/VolumeControlStateMachine.java b/android/app/src/com/android/bluetooth/vc/VolumeControlStateMachine.java index bc0c9907232586d049739f75dfffe55b2a7d812b..10ddb8a1e37502077a34e655cc17b80e75e31851 100644 --- a/android/app/src/com/android/bluetooth/vc/VolumeControlStateMachine.java +++ b/android/app/src/com/android/bluetooth/vc/VolumeControlStateMachine.java @@ -506,6 +506,7 @@ public class VolumeControlStateMachine extends StateMachine { log("Connection state " + mDevice + ": " + profileStateToString(prevState) + "->" + profileStateToString(newState)); + mService.handleConnectionStateChanged(mDevice, prevState, newState); Intent intent = new Intent(BluetoothVolumeControl.ACTION_CONNECTION_STATE_CHANGED); intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, prevState); intent.putExtra(BluetoothProfile.EXTRA_STATE, newState);