Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSettingsController.java +7 −3 Original line number Diff line number Diff line Loading @@ -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(() -> { Loading @@ -156,7 +158,9 @@ public class NotificationSettingsController implements Dumpable { } if (mListeners.size() == 0) { mBackgroundHandler.post(() -> { mSecureSettings.unregisterContentObserver(mContentObserver); }); } } Trace.traceEnd(Trace.TRACE_TAG_APP); Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt +114 −81 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading @@ -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 Loading @@ -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() Loading @@ -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() Loading @@ -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) Loading @@ -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") } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSettingsController.java +7 −3 Original line number Diff line number Diff line Loading @@ -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(() -> { Loading @@ -156,7 +158,9 @@ public class NotificationSettingsController implements Dumpable { } if (mListeners.size() == 0) { mBackgroundHandler.post(() -> { mSecureSettings.unregisterContentObserver(mContentObserver); }); } } Trace.traceEnd(Trace.TRACE_TAG_APP); Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt +114 −81 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading @@ -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 Loading @@ -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() Loading @@ -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() Loading @@ -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) Loading @@ -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") } }