diff options
2 files changed, 20 insertions, 0 deletions
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BroadcastReceiverAsUserFlow.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BroadcastReceiverAsUserFlow.kt index 2c60db4e76c7..8c52d574b156 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BroadcastReceiverAsUserFlow.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BroadcastReceiverAsUserFlow.kt @@ -21,13 +21,17 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.UserHandle +import android.util.Log import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.flowOn +private const val TAG = "BroadcastReceiverAsUser" + /** * A [BroadcastReceiver] flow for the given [intentFilter]. */ @@ -50,4 +54,6 @@ fun Context.broadcastReceiverAsUserFlow( ) awaitClose { unregisterReceiver(broadcastReceiver) } +}.catch { e -> + Log.e(TAG, "Error while broadcastReceiverAsUserFlow", e) }.conflate().flowOn(Dispatchers.Default) diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/common/BroadcastReceiverAsUserFlowTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/common/BroadcastReceiverAsUserFlowTest.kt index dfb8e22c7b52..9cb33d2e9b2c 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/common/BroadcastReceiverAsUserFlowTest.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/framework/common/BroadcastReceiverAsUserFlowTest.kt @@ -32,9 +32,11 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.any import org.mockito.kotlin.doAnswer +import org.mockito.kotlin.doThrow import org.mockito.kotlin.eq import org.mockito.kotlin.isNull import org.mockito.kotlin.mock +import org.mockito.kotlin.stub @RunWith(AndroidJUnit4::class) class BroadcastReceiverAsUserFlowTest { @@ -83,6 +85,18 @@ class BroadcastReceiverAsUserFlowTest { assertThat(onReceiveIsCalled).isTrue() } + @Test + fun broadcastReceiverAsUserFlow_unregisterReceiverThrowException_noCrash() = runBlocking { + context.stub { + on { unregisterReceiver(any()) } doThrow IllegalArgumentException() + } + val flow = context.broadcastReceiverAsUserFlow(INTENT_FILTER, USER_HANDLE) + + flow.firstWithTimeoutOrNull() + + assertThat(registeredBroadcastReceiver).isNotNull() + } + private companion object { val USER_HANDLE: UserHandle = UserHandle.of(0) |