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

Commit 435a7559 authored by Ioana Alexandru's avatar Ioana Alexandru
Browse files

Try to get policy from intent extras

This may help avoid a binder call.

Bug: 347707024
Test: ZenModeRepositoryTest
Flag: com.android.settingslib.flags.volume_panel_broadcast_fix
Change-Id: I95ed4168e58d7ba0271541ad8db4e65dd04b3512
parent f946b572
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() {