Move L2capNetworkProvider#start() onto Handler thread
To prevent having to use locking or memory synchronization mechanisms
later on.
Test: TH
Change-Id: I7b966621012030ab78e7a7e21e49ddc5df37df75
diff --git a/service/src/com/android/server/L2capNetworkProvider.java b/service/src/com/android/server/L2capNetworkProvider.java
index 01590ff..7440c0a 100644
--- a/service/src/com/android/server/L2capNetworkProvider.java
+++ b/service/src/com/android/server/L2capNetworkProvider.java
@@ -242,11 +242,13 @@
* Called on CS Handler thread.
*/
public void start() {
- final PackageManager pm = mContext.getPackageManager();
- if (pm.hasSystemFeature(FEATURE_BLUETOOTH_LE)) {
- mContext.getSystemService(ConnectivityManager.class).registerNetworkProvider(mProvider);
- mProvider.registerNetworkOffer(BlanketReservationOffer.SCORE,
- BlanketReservationOffer.CAPABILITIES, mHandler::post, mBlanketOffer);
- }
+ mHandler.post(() -> {
+ final PackageManager pm = mContext.getPackageManager();
+ if (pm.hasSystemFeature(FEATURE_BLUETOOTH_LE)) {
+ mContext.getSystemService(ConnectivityManager.class).registerNetworkProvider(mProvider);
+ mProvider.registerNetworkOffer(BlanketReservationOffer.SCORE,
+ BlanketReservationOffer.CAPABILITIES, mHandler::post, mBlanketOffer);
+ }
+ });
}
}
diff --git a/tests/unit/java/com/android/server/L2capNetworkProviderTest.kt b/tests/unit/java/com/android/server/L2capNetworkProviderTest.kt
index 56bbd31..2fd3d4f 100644
--- a/tests/unit/java/com/android/server/L2capNetworkProviderTest.kt
+++ b/tests/unit/java/com/android/server/L2capNetworkProviderTest.kt
@@ -35,6 +35,7 @@
import android.os.HandlerThread
import com.android.testutils.DevSdkIgnoreRule
import com.android.testutils.DevSdkIgnoreRunner
+import com.android.testutils.waitForIdle
import kotlin.test.assertTrue
import org.junit.After
import org.junit.Before
@@ -53,6 +54,7 @@
import org.mockito.MockitoAnnotations
private const val TAG = "L2capNetworkProviderTest"
+private const val TIMEOUT_MS = 1000
private val RESERVATION_CAPS = NetworkCapabilities.Builder.withoutDefaultCapabilities()
.addTransportType(TRANSPORT_BLUETOOTH)
@@ -96,6 +98,7 @@
@Test
fun testNetworkProvider_registeredWhenSupported() {
L2capNetworkProvider(deps, context).start()
+ handlerThread.waitForIdle(TIMEOUT_MS)
verify(cm).registerNetworkProvider(eq(provider))
verify(provider).registerNetworkOffer(any(), any(), any(), any())
}
@@ -104,12 +107,14 @@
fun testNetworkProvider_notRegisteredWhenNotSupported() {
doReturn(false).`when`(pm).hasSystemFeature(FEATURE_BLUETOOTH_LE)
L2capNetworkProvider(deps, context).start()
+ handlerThread.waitForIdle(TIMEOUT_MS)
verify(cm, never()).registerNetworkProvider(eq(provider))
}
fun doTestBlanketOfferIgnoresRequest(request: NetworkRequest) {
clearInvocations(provider)
L2capNetworkProvider(deps, context).start()
+ handlerThread.waitForIdle(TIMEOUT_MS)
val blanketOfferCaptor = ArgumentCaptor.forClass(NetworkOfferCallback::class.java)
verify(provider).registerNetworkOffer(any(), any(), any(), blanketOfferCaptor.capture())
@@ -124,6 +129,7 @@
) {
clearInvocations(provider)
L2capNetworkProvider(deps, context).start()
+ handlerThread.waitForIdle(TIMEOUT_MS)
val blanketOfferCaptor = ArgumentCaptor.forClass(NetworkOfferCallback::class.java)
verify(provider).registerNetworkOffer(any(), any(), any(), blanketOfferCaptor.capture())