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

Commit 22684dbe authored by András Kurucz's avatar András Kurucz Committed by Android (Google) Code Review
Browse files

Merge "Move binder calls in NotificationSettingsController to a bg thread" into main

parents 4a4bbbfb 50feda74
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -130,8 +130,10 @@ public class NotificationSettingsController implements Dumpable {
            }
            mListeners.put(uri, currentListeners);
            if (currentListeners.size() == 1) {
                mBackgroundHandler.post(() -> {
                    mSecureSettings.registerContentObserverForUser(
                            uri, false, mContentObserver, mUserTracker.getUserId());
                });
            }
        }
        mBackgroundHandler.post(() -> {
@@ -156,7 +158,9 @@ public class NotificationSettingsController implements Dumpable {
            }

            if (mListeners.size() == 0) {
                mBackgroundHandler.post(() -> {
                    mSecureSettings.unregisterContentObserver(mContentObserver);
                });
            }
        }
        Trace.traceEnd(Trace.TRACE_TAG_APP);
+114 −81
Original line number Diff line number Diff line
@@ -40,15 +40,17 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.ArgumentMatchers.anyString
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.anyBoolean
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.Mockito.verifyZeroInteractions
import org.mockito.MockitoAnnotations

@SmallTest
@@ -61,20 +63,15 @@ class NotificationSettingsControllerTest : SysuiTestCase() {
    val settingUri1: Uri = Secure.getUriFor(setting1)
    val settingUri2: Uri = Secure.getUriFor(setting2)

    @Mock
    private lateinit var userTracker: UserTracker
    @Mock private lateinit var userTracker: UserTracker
    private lateinit var mainHandler: Handler
    private lateinit var backgroundHandler: Handler
    private lateinit var testableLooper: TestableLooper
    @Mock
    private lateinit var secureSettings: SecureSettings
    @Mock
    private lateinit var dumpManager: DumpManager
    @Mock private lateinit var secureSettings: SecureSettings
    @Mock private lateinit var dumpManager: DumpManager

    @Captor
    private lateinit var userTrackerCallbackCaptor: ArgumentCaptor<UserTracker.Callback>
    @Captor
    private lateinit var settingsObserverCaptor: ArgumentCaptor<ContentObserver>
    @Captor private lateinit var userTrackerCallbackCaptor: ArgumentCaptor<UserTracker.Callback>
    @Captor private lateinit var settingsObserverCaptor: ArgumentCaptor<ContentObserver>

    private lateinit var controller: NotificationSettingsController

@@ -116,14 +113,13 @@ class NotificationSettingsControllerTest : SysuiTestCase() {

        // Validate: Nothing to do, since we aren't monitoring settings
        verify(secureSettings, never()).unregisterContentObserver(any())
        verify(secureSettings, never()).registerContentObserverForUser(
                any(Uri::class.java), anyBoolean(), any(), anyInt())
        verify(secureSettings, never())
            .registerContentObserverForUser(any(Uri::class.java), anyBoolean(), any(), anyInt())
    }
    @Test
    fun updateContentObserverRegistration_onUserChange_withSettingsListeners() {
        // When: someone is listening to a setting
        controller.addCallback(settingUri1,
                Mockito.mock(Listener::class.java))
        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))

        verify(userTracker).addCallback(capture(userTrackerCallbackCaptor), any())
        val userCallback = userTrackerCallbackCaptor.value
@@ -134,36 +130,52 @@ class NotificationSettingsControllerTest : SysuiTestCase() {

        // Validate: The tracker is unregistered and re-registered with the new user
        verify(secureSettings).unregisterContentObserver(any())
        verify(secureSettings).registerContentObserverForUser(
                eq(settingUri1), eq(false), any(), eq(userId))
        verify(secureSettings)
            .registerContentObserverForUser(eq(settingUri1), eq(false), any(), eq(userId))
    }

    @Test
    fun addCallback_onlyFirstForUriRegistersObserver() {
        controller.addCallback(settingUri1,
                Mockito.mock(Listener::class.java))
        verify(secureSettings).registerContentObserverForUser(
                eq(settingUri1), eq(false), any(), eq(ActivityManager.getCurrentUser()))

        controller.addCallback(settingUri1,
                Mockito.mock(Listener::class.java))
        verify(secureSettings).registerContentObserverForUser(
                any(Uri::class.java), anyBoolean(), any(), anyInt())
        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
        verifyZeroInteractions(secureSettings)
        testableLooper.processAllMessages()
        verify(secureSettings)
            .registerContentObserverForUser(
                eq(settingUri1),
                eq(false),
                any(),
                eq(ActivityManager.getCurrentUser())
            )

        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
        verify(secureSettings)
            .registerContentObserverForUser(any(Uri::class.java), anyBoolean(), any(), anyInt())
    }

    @Test
    fun addCallback_secondUriRegistersObserver() {
        controller.addCallback(settingUri1,
                Mockito.mock(Listener::class.java))
        verify(secureSettings).registerContentObserverForUser(
                eq(settingUri1), eq(false), any(), eq(ActivityManager.getCurrentUser()))

        controller.addCallback(settingUri2,
                Mockito.mock(Listener::class.java))
        verify(secureSettings).registerContentObserverForUser(
                eq(settingUri2), eq(false), any(), eq(ActivityManager.getCurrentUser()))
        verify(secureSettings).registerContentObserverForUser(
                eq(settingUri1), anyBoolean(), any(), anyInt())
        controller.addCallback(settingUri1, Mockito.mock(Listener::class.java))
        verifyZeroInteractions(secureSettings)
        testableLooper.processAllMessages()
        verify(secureSettings)
            .registerContentObserverForUser(
                eq(settingUri1),
                eq(false),
                any(),
                eq(ActivityManager.getCurrentUser())
            )
        clearInvocations(secureSettings)

        controller.addCallback(settingUri2, Mockito.mock(Listener::class.java))
        verifyNoMoreInteractions(secureSettings)
        testableLooper.processAllMessages()
        verify(secureSettings)
            .registerContentObserverForUser(
                eq(settingUri2),
                eq(false),
                any(),
                eq(ActivityManager.getCurrentUser())
            )
    }

    @Test
@@ -171,26 +183,41 @@ class NotificationSettingsControllerTest : SysuiTestCase() {
        val listenerSetting1: Listener = mock()
        val listenerSetting2: Listener = mock()
        controller.addCallback(settingUri1, listenerSetting1)
        verify(secureSettings).registerContentObserverForUser(
                eq(settingUri1), eq(false), any(), eq(ActivityManager.getCurrentUser()))
        verifyZeroInteractions(secureSettings)
        testableLooper.processAllMessages()
        verify(secureSettings)
            .registerContentObserverForUser(
                eq(settingUri1),
                eq(false),
                any(),
                eq(ActivityManager.getCurrentUser())
            )
        clearInvocations(secureSettings)

        controller.addCallback(settingUri2, listenerSetting2)
        verify(secureSettings).registerContentObserverForUser(
                eq(settingUri2), anyBoolean(), any(), anyInt())
        verifyNoMoreInteractions(secureSettings)
        testableLooper.processAllMessages()
        verify(secureSettings)
            .registerContentObserverForUser(eq(settingUri2), anyBoolean(), any(), anyInt())
        clearInvocations(secureSettings)

        controller.removeCallback(settingUri2, listenerSetting2)
        testableLooper.processAllMessages()
        verify(secureSettings, never()).unregisterContentObserver(any())
        clearInvocations(secureSettings)

        controller.removeCallback(settingUri1, listenerSetting1)
        verifyNoMoreInteractions(secureSettings)
        testableLooper.processAllMessages()
        verify(secureSettings).unregisterContentObserver(any())
    }

    @Test
    fun addCallback_updatesCurrentValue() {
        whenever(secureSettings.getStringForUser(
                setting1, ActivityManager.getCurrentUser())).thenReturn("9")
        whenever(secureSettings.getStringForUser(
                setting2, ActivityManager.getCurrentUser())).thenReturn("5")
        whenever(secureSettings.getStringForUser(setting1, ActivityManager.getCurrentUser()))
            .thenReturn("9")
        whenever(secureSettings.getStringForUser(setting2, ActivityManager.getCurrentUser()))
            .thenReturn("5")

        val listenerSetting1a: Listener = mock()
        val listenerSetting1b: Listener = mock()
@@ -200,20 +227,21 @@ class NotificationSettingsControllerTest : SysuiTestCase() {
        controller.addCallback(settingUri1, listenerSetting1b)
        controller.addCallback(settingUri2, listenerSetting2)

        verifyZeroInteractions(secureSettings)
        testableLooper.processAllMessages()

        verify(listenerSetting1a).onSettingChanged(
                settingUri1, ActivityManager.getCurrentUser(), "9")
        verify(listenerSetting1b).onSettingChanged(
                settingUri1, ActivityManager.getCurrentUser(), "9")
        verify(listenerSetting2).onSettingChanged(
                settingUri2, ActivityManager.getCurrentUser(), "5")
        verify(listenerSetting1a)
            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
        verify(listenerSetting1b)
            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
        verify(listenerSetting2)
            .onSettingChanged(settingUri2, ActivityManager.getCurrentUser(), "5")
    }

    @Test
    fun removeCallback_noMoreUpdates() {
        whenever(secureSettings.getStringForUser(
                setting1, ActivityManager.getCurrentUser())).thenReturn("9")
        whenever(secureSettings.getStringForUser(setting1, ActivityManager.getCurrentUser()))
            .thenReturn("9")

        val listenerSetting1a: Listener = mock()
        val listenerSetting1b: Listener = mock()
@@ -221,16 +249,22 @@ class NotificationSettingsControllerTest : SysuiTestCase() {
        // First, register
        controller.addCallback(settingUri1, listenerSetting1a)
        controller.addCallback(settingUri1, listenerSetting1b)
        verifyZeroInteractions(secureSettings)
        testableLooper.processAllMessages()

        verify(secureSettings).registerContentObserverForUser(
                any(Uri::class.java), anyBoolean(), capture(settingsObserverCaptor), anyInt())
        verify(listenerSetting1a).onSettingChanged(
                settingUri1, ActivityManager.getCurrentUser(), "9")
        verify(listenerSetting1b).onSettingChanged(
                settingUri1, ActivityManager.getCurrentUser(), "9")
        Mockito.clearInvocations(listenerSetting1b)
        Mockito.clearInvocations(listenerSetting1a)
        verify(secureSettings)
            .registerContentObserverForUser(
                any(Uri::class.java),
                anyBoolean(),
                capture(settingsObserverCaptor),
                anyInt()
            )
        verify(listenerSetting1a)
            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
        verify(listenerSetting1b)
            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
        clearInvocations(listenerSetting1b)
        clearInvocations(listenerSetting1a)

        // Remove one of them
        controller.removeCallback(settingUri1, listenerSetting1a)
@@ -239,10 +273,9 @@ class NotificationSettingsControllerTest : SysuiTestCase() {
        settingsObserverCaptor.value.onChange(false, settingUri1)
        testableLooper.processAllMessages()

        verify(listenerSetting1a, never()).onSettingChanged(
                settingUri1, ActivityManager.getCurrentUser(), "9")
        verify(listenerSetting1b).onSettingChanged(
                settingUri1, ActivityManager.getCurrentUser(), "9")
        verify(listenerSetting1a, never())
            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
        verify(listenerSetting1b)
            .onSettingChanged(settingUri1, ActivityManager.getCurrentUser(), "9")
    }

}