Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e01eb960 authored by Ioana Alexandru's avatar Ioana Alexandru Committed by Android (Google) Code Review
Browse files

Merge "Try to get policy from intent extras" into main

parents 2f85e4b3 435a7559
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -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)

+27 −2
Original line number Diff line number Diff line
@@ -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() {