Loading packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt +9 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } } } } Loading Loading @@ -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) { Loading @@ -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) Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt +27 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading Loading @@ -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() { Loading Loading
packages/SettingsLib/src/com/android/settingslib/notification/data/repository/ZenModeRepository.kt +9 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) } } } } Loading Loading @@ -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) { Loading @@ -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) Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/notification/data/repository/ZenModeRepositoryTest.kt +27 −2 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { Loading Loading @@ -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() { Loading