diff options
2 files changed, 36 insertions, 8 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt index ef9452648a70..26b5741d8299 100644 --- a/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt +++ b/packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt @@ -17,6 +17,7 @@ package com.android.settingslib.notification.data.repository import android.app.NotificationManager +import android.app.NotificationManager.EXTRA_NOTIFICATION_POLICY import android.content.BroadcastReceiver import android.content.ContentResolver import android.content.Context @@ -74,7 +75,7 @@ class ZenModeRepositoryImpl( val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { - intent?.action?.let { action -> launch { send(action) } } + intent?.let { launch { send(it) } } } } @@ -112,7 +113,9 @@ class ZenModeRepositoryImpl( override val consolidatedNotificationPolicy: StateFlow<NotificationManager.Policy?> by lazy { if (Flags.volumePanelBroadcastFix() && android.app.Flags.modesApi()) flowFromBroadcast(NotificationManager.ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED) { - notificationManager.consolidatedNotificationPolicy + // If available, get the value from extras to avoid a potential binder call. + it?.extras?.getParcelable(EXTRA_NOTIFICATION_POLICY) + ?: notificationManager.consolidatedNotificationPolicy } else flowFromBroadcast(NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED) { @@ -126,11 +129,11 @@ class ZenModeRepositoryImpl( } } - private fun <T> flowFromBroadcast(intentAction: String, mapper: () -> T) = + private fun <T> flowFromBroadcast(intentAction: String, mapper: (Intent?) -> T) = notificationBroadcasts - .filter { intentAction == it } - .map { mapper() } - .onStart { emit(mapper()) } + .filter { intentAction == it.action } + .map { mapper(it) } + .onStart { emit(mapper(null)) } .flowOn(backgroundCoroutineContext) .stateIn(scope, SharingStarted.WhileSubscribed(), null) diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt index 6e11e1f612ef..4bd5cc45439a 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt @@ -22,6 +22,7 @@ import android.content.ContentResolver import android.content.Context import android.content.Intent import android.database.ContentObserver +import android.os.Parcelable import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.provider.Settings.Global @@ -126,6 +127,26 @@ class ZenModeRepositoryTest { } } + @EnableFlags(android.app.Flags.FLAG_MODES_API, Flags.FLAG_VOLUME_PANEL_BROADCAST_FIX) + @Test + fun consolidatedPolicyChanges_repositoryEmitsFromExtras() { + testScope.runTest { + val values = mutableListOf<NotificationManager.Policy?>() + `when`(notificationManager.consolidatedNotificationPolicy).thenReturn(testPolicy1) + underTest.consolidatedNotificationPolicy + .onEach { values.add(it) } + .launchIn(backgroundScope) + runCurrent() + + triggerIntent( + NotificationManager.ACTION_CONSOLIDATED_NOTIFICATION_POLICY_CHANGED, + extras = mapOf(NotificationManager.EXTRA_NOTIFICATION_POLICY to testPolicy2)) + runCurrent() + + assertThat(values).containsExactly(null, testPolicy1, testPolicy2).inOrder() + } + } + @Test fun zenModeChanges_repositoryEmits() { testScope.runTest { @@ -174,9 +195,13 @@ class ZenModeRepositoryTest { } } - private fun triggerIntent(action: String) { + private fun triggerIntent(action: String, extras: Map<String, Parcelable>? = null) { verify(context).registerReceiver(receiverCaptor.capture(), any(), any(), any()) - receiverCaptor.value.onReceive(context, Intent(action)) + val intent = Intent(action) + if (extras?.isNotEmpty() == true) { + extras.forEach { (key, value) -> intent.putExtra(key, value) } + } + receiverCaptor.value.onReceive(context, intent) } private fun triggerZenModeSettingUpdate() { |