From 0a03e9b82526529cada9db1595d04d831bd4b953 Mon Sep 17 00:00:00 2001 From: Aritra Sen <aritrasen@google.com> Date: Tue, 22 Aug 2023 00:51:03 +0000 Subject: [PATCH] Stop using HFP active device changed broadcast for SilenceDeviceManager. Bug: 296932947 Test: atest BluetoothInstrumentationTests Tag: #refactor Change-Id: I9eef4745d6a4fe24e6c7f04baa9d21dcef0e45f4 --- .../btservice/SilenceDeviceManager.java | 28 +++++++++---------- .../android/bluetooth/hfp/HeadsetService.java | 4 +++ .../HeadsetServiceAndStateMachineTest.java | 4 +++ .../bluetooth/hfp/HeadsetServiceTest.java | 3 ++ .../hfp/HeadsetStateMachineTest.java | 4 +++ 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java b/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java index 6c56f1e48a9..d4f98a48fe2 100644 --- a/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java +++ b/android/app/src/com/android/bluetooth/btservice/SilenceDeviceManager.java @@ -99,10 +99,6 @@ public class SilenceDeviceManager { mHandler.obtainMessage(MSG_HFP_CONNECTION_STATE_CHANGED, intent).sendToTarget(); break; - case BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED: - mHandler.obtainMessage(MSG_HFP_ACTIVE_DEVICE_CHANGED, - intent).sendToTarget(); - break; default: Log.e(TAG, "Received unexpected intent, action=" + action); break; @@ -119,6 +115,15 @@ public class SilenceDeviceManager { mHandler.obtainMessage(MSG_A2DP_ACTIVE_DEVICE_CHANGED, device).sendToTarget(); } + /** + * Called when HFP active device is changed by HeadsetService + * + * @param device The device currently activated. {@code null} if no HFP device activated + */ + public void hfpActiveDeviceChanged(BluetoothDevice device) { + mHandler.obtainMessage(MSG_HFP_ACTIVE_DEVICE_CHANGED, device).sendToTarget(); + } + class SilenceDeviceManagerHandler extends Handler { SilenceDeviceManagerHandler(Looper looper) { super(looper); @@ -193,21 +198,17 @@ public class SilenceDeviceManager { } break; - case MSG_HFP_ACTIVE_DEVICE_CHANGED: { - Intent intent = (Intent) msg.obj; - BluetoothDevice hfpActiveDevice = - intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + case MSG_HFP_ACTIVE_DEVICE_CHANGED: + BluetoothDevice hfpActiveDevice = (BluetoothDevice) msg.obj; if (getSilenceMode(hfpActiveDevice)) { // Resume the device from silence mode. setSilenceMode(hfpActiveDevice, false); } - } - break; + break; - default: { + default: Log.e(TAG, "Unknown message: " + msg.what); - } - break; + break; } } }; @@ -227,7 +228,6 @@ public class SilenceDeviceManager { filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED); - filter.addAction(BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED); mAdapterService.registerReceiver(mReceiver, filter); } diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetService.java b/android/app/src/com/android/bluetooth/hfp/HeadsetService.java index 6e11509defc..70cb05efcd2 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetService.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetService.java @@ -2133,10 +2133,14 @@ public class HeadsetService extends ProfileService { private void broadcastActiveDevice(BluetoothDevice device) { logD("broadcastActiveDevice: " + device); + mAdapterService.getActiveDeviceManager().hfpActiveStateChanged(device); + mAdapterService.getSilenceDeviceManager().hfpActiveDeviceChanged(device); + BluetoothStatsLog.write(BluetoothStatsLog.BLUETOOTH_ACTIVE_DEVICE_CHANGED, BluetoothProfile.HEADSET, mAdapterService.obfuscateAddress(device), mAdapterService.getMetricId(device)); + Intent intent = new Intent(BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED); intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceAndStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceAndStateMachineTest.java index 26649e96f06..9b7ce918f37 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceAndStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceAndStateMachineTest.java @@ -52,6 +52,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.bluetooth.TestUtils; import com.android.bluetooth.btservice.ActiveDeviceManager; import com.android.bluetooth.btservice.AdapterService; +import com.android.bluetooth.btservice.SilenceDeviceManager; import com.android.bluetooth.btservice.storage.DatabaseManager; import org.hamcrest.Matchers; @@ -152,6 +153,7 @@ public class HeadsetServiceAndStateMachineTest { @Spy private HeadsetObjectsFactory mObjectsFactory = HeadsetObjectsFactory.getInstance(); @Mock private AdapterService mAdapterService; @Mock private ActiveDeviceManager mActiveDeviceManager; + @Mock private SilenceDeviceManager mSilenceDeviceManager; @Mock private DatabaseManager mDatabaseManager; @Mock private HeadsetSystemInterface mSystemInterface; @Mock private AudioManager mAudioManager; @@ -187,6 +189,7 @@ public class HeadsetServiceAndStateMachineTest { doReturn(new BluetoothSinkAudioPolicy.Builder().build()).when(mAdapterService) .getRequestedAudioPolicyAsSink(any(BluetoothDevice.class)); doReturn(mActiveDeviceManager).when(mAdapterService).getActiveDeviceManager(); + doReturn(mSilenceDeviceManager).when(mAdapterService).getSilenceDeviceManager(); // Mock system interface doNothing().when(mSystemInterface).stop(); doReturn(mPhoneState).when(mSystemInterface).getHeadsetPhoneState(); @@ -471,6 +474,7 @@ public class HeadsetServiceAndStateMachineTest { Assert.assertTrue(mHeadsetService.setActiveDevice(activeDevice)); verify(mNativeInterface).setActiveDevice(activeDevice); verify(mActiveDeviceManager).hfpActiveStateChanged(activeDevice); + verify(mSilenceDeviceManager).hfpActiveDeviceChanged(activeDevice); Assert.assertEquals(activeDevice, mHeadsetService.getActiveDevice()); // Start virtual call Assert.assertTrue(mHeadsetService.startScoUsingVirtualVoiceCall()); diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceTest.java index 643fd3ebf56..d36f98e4b81 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetServiceTest.java @@ -53,6 +53,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.bluetooth.TestUtils; import com.android.bluetooth.btservice.ActiveDeviceManager; import com.android.bluetooth.btservice.AdapterService; +import com.android.bluetooth.btservice.SilenceDeviceManager; import com.android.bluetooth.btservice.storage.DatabaseManager; import org.hamcrest.Matchers; @@ -94,6 +95,7 @@ public class HeadsetServiceTest { @Spy private HeadsetObjectsFactory mObjectsFactory = HeadsetObjectsFactory.getInstance(); @Mock private AdapterService mAdapterService; @Mock private ActiveDeviceManager mActiveDeviceManager; + @Mock private SilenceDeviceManager mSilenceDeviceManager; @Mock private DatabaseManager mDatabaseManager; @Mock private HeadsetSystemInterface mSystemInterface; @Mock private HeadsetNativeInterface mNativeInterface; @@ -123,6 +125,7 @@ public class HeadsetServiceTest { doReturn(BluetoothDevice.BOND_BONDED).when(mAdapterService) .getBondState(any(BluetoothDevice.class)); doReturn(mActiveDeviceManager).when(mAdapterService).getActiveDeviceManager(); + doReturn(mSilenceDeviceManager).when(mAdapterService).getSilenceDeviceManager(); doReturn(mDatabaseManager).when(mAdapterService).getDatabase(); doReturn(true, false).when(mAdapterService).isStartedProfile(anyString()); doAnswer(invocation -> { diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java index ed6cda9bb99..aedb1b0ceb4 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java @@ -51,6 +51,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.bluetooth.TestUtils; import com.android.bluetooth.btservice.ActiveDeviceManager; import com.android.bluetooth.btservice.AdapterService; +import com.android.bluetooth.btservice.SilenceDeviceManager; import com.android.bluetooth.btservice.storage.DatabaseManager; import org.hamcrest.core.IsInstanceOf; @@ -87,6 +88,7 @@ public class HeadsetStateMachineTest { @Mock private AdapterService mAdapterService; @Mock private ActiveDeviceManager mActiveDeviceManager; + @Mock private SilenceDeviceManager mSilenceDeviceManager; @Mock private DatabaseManager mDatabaseManager; @Mock private HeadsetService mHeadsetService; @Mock private HeadsetSystemInterface mSystemInterface; @@ -114,6 +116,8 @@ public class HeadsetStateMachineTest { doReturn(true).when(mDatabaseManager).setAudioPolicyMetadata(anyObject(), anyObject()); // Get an active device manager doReturn(mActiveDeviceManager).when(mAdapterService).getActiveDeviceManager(); + // Get a silence device manager + doReturn(mSilenceDeviceManager).when(mAdapterService).getSilenceDeviceManager(); doReturn(true).when(mNativeInterface).connectHfp(mTestDevice); doReturn(true).when(mNativeInterface).disconnectHfp(mTestDevice); doReturn(true).when(mNativeInterface).connectAudio(mTestDevice); -- GitLab