Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideNotifsForOtherUsersCoordinator.java 0 → 100644 +69 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.statusbar.notification.collection.coordinator; import android.content.pm.UserInfo; import android.util.SparseArray; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager.UserChangedListener; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import javax.inject.Inject; /** * A coordinator that filters out notifications for other users * * The NotifCollection contains the notifs for ALL users, so we need to remove any notifications * that have been posted specifically to other users. Note that some system notifications are not * posted to any particular user, and so must be shown to everyone. * * TODO: The NotificationLockscreenUserManager currently maintains the list of active user profiles. * We should spin that off into a standalone section at some point. */ public class HideNotifsForOtherUsersCoordinator implements Coordinator { private final NotificationLockscreenUserManager mLockscreenUserManager; @Inject public HideNotifsForOtherUsersCoordinator( NotificationLockscreenUserManager lockscreenUserManager) { mLockscreenUserManager = lockscreenUserManager; } @Override public void attach(NotifPipeline pipeline) { pipeline.addPreGroupFilter(mFilter); mLockscreenUserManager.addUserChangedListener(mUserChangedListener); } private final NotifFilter mFilter = new NotifFilter("NotCurrentUserFilter") { @Override public boolean shouldFilterOut(NotificationEntry entry, long now) { return !mLockscreenUserManager .isCurrentProfile(entry.getSbn().getUser().getIdentifier()); } }; private final UserChangedListener mUserChangedListener = new UserChangedListener() { @Override public void onCurrentProfilesChanged(SparseArray<UserInfo> currentProfiles) { mFilter.invalidateList(); } }; } packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java +0 −5 Original line number Diff line number Diff line Loading @@ -95,11 +95,6 @@ public class KeyguardCoordinator implements Coordinator { public boolean shouldFilterOut(NotificationEntry entry, long now) { final StatusBarNotification sbn = entry.getSbn(); // FILTER OUT the notification when the notification isn't for the current profile if (!mLockscreenUserManager.isCurrentProfile(sbn.getUserId())) { return true; } // FILTER OUT the notification when the keyguard is showing and... if (mKeyguardStateController.isShowing()) { // ... user settings or the device policy manager doesn't allow lockscreen Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java +3 −1 Original line number Diff line number Diff line Loading @@ -49,15 +49,17 @@ public class NotifCoordinators implements Dumpable { public NotifCoordinators( DumpManager dumpManager, FeatureFlags featureFlags, HeadsUpCoordinator headsUpCoordinator, HideNotifsForOtherUsersCoordinator hideNotifsForOtherUsersCoordinator, KeyguardCoordinator keyguardCoordinator, RankingCoordinator rankingCoordinator, ForegroundCoordinator foregroundCoordinator, DeviceProvisionedCoordinator deviceProvisionedCoordinator, BubbleCoordinator bubbleCoordinator, HeadsUpCoordinator headsUpCoordinator, PreparationCoordinator preparationCoordinator) { dumpManager.registerDumpable(TAG, this); mCoordinators.add(new HideLocallyDismissedNotifsCoordinator()); mCoordinators.add(hideNotifsForOtherUsersCoordinator); mCoordinators.add(keyguardCoordinator); mCoordinators.add(rankingCoordinator); mCoordinators.add(foregroundCoordinator); Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HideNotifsForOtherUsersCoordinatorTest.java 0 → 100644 +106 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.statusbar.notification.collection.coordinator; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.testing.AndroidTestingRunner; import android.util.SparseArray; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager.UserChangedListener; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable.PluggableListener; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidTestingRunner.class) public class HideNotifsForOtherUsersCoordinatorTest extends SysuiTestCase { @Mock private NotificationLockscreenUserManager mLockscreenUserManager; @Mock private NotifPipeline mNotifPipeline; @Mock private PluggableListener<NotifFilter> mInvalidationListener; @Captor private ArgumentCaptor<UserChangedListener> mUserChangedListenerCaptor; @Captor private ArgumentCaptor<NotifFilter> mNotifFilterCaptor; private UserChangedListener mCapturedUserChangeListener; private NotifFilter mCapturedNotifFilter; private NotificationEntry mEntry = new NotificationEntryBuilder().build(); @Before public void setUp() { MockitoAnnotations.initMocks(this); HideNotifsForOtherUsersCoordinator coordinator = new HideNotifsForOtherUsersCoordinator(mLockscreenUserManager); coordinator.attach(mNotifPipeline); verify(mLockscreenUserManager).addUserChangedListener(mUserChangedListenerCaptor.capture()); verify(mNotifPipeline).addPreGroupFilter(mNotifFilterCaptor.capture()); mCapturedUserChangeListener = mUserChangedListenerCaptor.getValue(); mCapturedNotifFilter = mNotifFilterCaptor.getValue(); mCapturedNotifFilter.setInvalidationListener(mInvalidationListener); } @Test public void testFilterOutNotifsFromOtherProfiles() { // GIVEN that all notifs are NOT for the current user when(mLockscreenUserManager.isCurrentProfile(anyInt())).thenReturn(false); // THEN they should all be filtered out assertTrue(mCapturedNotifFilter.shouldFilterOut(mEntry, 0)); } @Test public void testPreserveNotifsFromThisProfile() { // GIVEN that all notifs ARE for the current user when(mLockscreenUserManager.isCurrentProfile(anyInt())).thenReturn(true); // THEN none should be filtered out assertFalse(mCapturedNotifFilter.shouldFilterOut(mEntry, 0)); } @Test public void testFilterIsInvalidatedWhenProfilesChange() { // WHEN the current user profiles change mCapturedUserChangeListener.onCurrentProfilesChanged(new SparseArray<>()); // THEN the filter is invalidated verify(mInvalidationListener).onPluggableInvalidated(mCapturedNotifFilter); } } packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.java +0 −13 Original line number Diff line number Diff line Loading @@ -101,16 +101,6 @@ public class KeyguardCoordinatorTest extends SysuiTestCase { assertFalse(mKeyguardFilter.shouldFilterOut(mEntry, 0)); } @Test public void notificationNotForCurrentProfile() { // GIVEN the notification isn't for the given user setupUnfilteredState(mEntry); when(mLockscreenUserManager.isCurrentProfile(NOTIF_USER_ID)).thenReturn(false); // THEN filter out the entry assertTrue(mKeyguardFilter.shouldFilterOut(mEntry, 0)); } @Test public void keyguardNotShowing() { // GIVEN the lockscreen isn't showing Loading Loading @@ -229,9 +219,6 @@ public class KeyguardCoordinatorTest extends SysuiTestCase { * KeyguardNotificationCoordinator when the keyguard is showing. */ private void setupUnfilteredState(NotificationEntry entry) { // notification is for current profile when(mLockscreenUserManager.isCurrentProfile(NOTIF_USER_ID)).thenReturn(true); // keyguard is showing when(mKeyguardStateController.isShowing()).thenReturn(true); Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HideNotifsForOtherUsersCoordinator.java 0 → 100644 +69 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.statusbar.notification.collection.coordinator; import android.content.pm.UserInfo; import android.util.SparseArray; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager.UserChangedListener; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import javax.inject.Inject; /** * A coordinator that filters out notifications for other users * * The NotifCollection contains the notifs for ALL users, so we need to remove any notifications * that have been posted specifically to other users. Note that some system notifications are not * posted to any particular user, and so must be shown to everyone. * * TODO: The NotificationLockscreenUserManager currently maintains the list of active user profiles. * We should spin that off into a standalone section at some point. */ public class HideNotifsForOtherUsersCoordinator implements Coordinator { private final NotificationLockscreenUserManager mLockscreenUserManager; @Inject public HideNotifsForOtherUsersCoordinator( NotificationLockscreenUserManager lockscreenUserManager) { mLockscreenUserManager = lockscreenUserManager; } @Override public void attach(NotifPipeline pipeline) { pipeline.addPreGroupFilter(mFilter); mLockscreenUserManager.addUserChangedListener(mUserChangedListener); } private final NotifFilter mFilter = new NotifFilter("NotCurrentUserFilter") { @Override public boolean shouldFilterOut(NotificationEntry entry, long now) { return !mLockscreenUserManager .isCurrentProfile(entry.getSbn().getUser().getIdentifier()); } }; private final UserChangedListener mUserChangedListener = new UserChangedListener() { @Override public void onCurrentProfilesChanged(SparseArray<UserInfo> currentProfiles) { mFilter.invalidateList(); } }; }
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.java +0 −5 Original line number Diff line number Diff line Loading @@ -95,11 +95,6 @@ public class KeyguardCoordinator implements Coordinator { public boolean shouldFilterOut(NotificationEntry entry, long now) { final StatusBarNotification sbn = entry.getSbn(); // FILTER OUT the notification when the notification isn't for the current profile if (!mLockscreenUserManager.isCurrentProfile(sbn.getUserId())) { return true; } // FILTER OUT the notification when the keyguard is showing and... if (mKeyguardStateController.isShowing()) { // ... user settings or the device policy manager doesn't allow lockscreen Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/NotifCoordinators.java +3 −1 Original line number Diff line number Diff line Loading @@ -49,15 +49,17 @@ public class NotifCoordinators implements Dumpable { public NotifCoordinators( DumpManager dumpManager, FeatureFlags featureFlags, HeadsUpCoordinator headsUpCoordinator, HideNotifsForOtherUsersCoordinator hideNotifsForOtherUsersCoordinator, KeyguardCoordinator keyguardCoordinator, RankingCoordinator rankingCoordinator, ForegroundCoordinator foregroundCoordinator, DeviceProvisionedCoordinator deviceProvisionedCoordinator, BubbleCoordinator bubbleCoordinator, HeadsUpCoordinator headsUpCoordinator, PreparationCoordinator preparationCoordinator) { dumpManager.registerDumpable(TAG, this); mCoordinators.add(new HideLocallyDismissedNotifsCoordinator()); mCoordinators.add(hideNotifsForOtherUsersCoordinator); mCoordinators.add(keyguardCoordinator); mCoordinators.add(rankingCoordinator); mCoordinators.add(foregroundCoordinator); Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/HideNotifsForOtherUsersCoordinatorTest.java 0 → 100644 +106 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui.statusbar.notification.collection.coordinator; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.testing.AndroidTestingRunner; import android.util.SparseArray; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationLockscreenUserManager.UserChangedListener; import com.android.systemui.statusbar.notification.collection.NotifPipeline; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable.PluggableListener; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @SmallTest @RunWith(AndroidTestingRunner.class) public class HideNotifsForOtherUsersCoordinatorTest extends SysuiTestCase { @Mock private NotificationLockscreenUserManager mLockscreenUserManager; @Mock private NotifPipeline mNotifPipeline; @Mock private PluggableListener<NotifFilter> mInvalidationListener; @Captor private ArgumentCaptor<UserChangedListener> mUserChangedListenerCaptor; @Captor private ArgumentCaptor<NotifFilter> mNotifFilterCaptor; private UserChangedListener mCapturedUserChangeListener; private NotifFilter mCapturedNotifFilter; private NotificationEntry mEntry = new NotificationEntryBuilder().build(); @Before public void setUp() { MockitoAnnotations.initMocks(this); HideNotifsForOtherUsersCoordinator coordinator = new HideNotifsForOtherUsersCoordinator(mLockscreenUserManager); coordinator.attach(mNotifPipeline); verify(mLockscreenUserManager).addUserChangedListener(mUserChangedListenerCaptor.capture()); verify(mNotifPipeline).addPreGroupFilter(mNotifFilterCaptor.capture()); mCapturedUserChangeListener = mUserChangedListenerCaptor.getValue(); mCapturedNotifFilter = mNotifFilterCaptor.getValue(); mCapturedNotifFilter.setInvalidationListener(mInvalidationListener); } @Test public void testFilterOutNotifsFromOtherProfiles() { // GIVEN that all notifs are NOT for the current user when(mLockscreenUserManager.isCurrentProfile(anyInt())).thenReturn(false); // THEN they should all be filtered out assertTrue(mCapturedNotifFilter.shouldFilterOut(mEntry, 0)); } @Test public void testPreserveNotifsFromThisProfile() { // GIVEN that all notifs ARE for the current user when(mLockscreenUserManager.isCurrentProfile(anyInt())).thenReturn(true); // THEN none should be filtered out assertFalse(mCapturedNotifFilter.shouldFilterOut(mEntry, 0)); } @Test public void testFilterIsInvalidatedWhenProfilesChange() { // WHEN the current user profiles change mCapturedUserChangeListener.onCurrentProfilesChanged(new SparseArray<>()); // THEN the filter is invalidated verify(mInvalidationListener).onPluggableInvalidated(mCapturedNotifFilter); } }
packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.java +0 −13 Original line number Diff line number Diff line Loading @@ -101,16 +101,6 @@ public class KeyguardCoordinatorTest extends SysuiTestCase { assertFalse(mKeyguardFilter.shouldFilterOut(mEntry, 0)); } @Test public void notificationNotForCurrentProfile() { // GIVEN the notification isn't for the given user setupUnfilteredState(mEntry); when(mLockscreenUserManager.isCurrentProfile(NOTIF_USER_ID)).thenReturn(false); // THEN filter out the entry assertTrue(mKeyguardFilter.shouldFilterOut(mEntry, 0)); } @Test public void keyguardNotShowing() { // GIVEN the lockscreen isn't showing Loading Loading @@ -229,9 +219,6 @@ public class KeyguardCoordinatorTest extends SysuiTestCase { * KeyguardNotificationCoordinator when the keyguard is showing. */ private void setupUnfilteredState(NotificationEntry entry) { // notification is for current profile when(mLockscreenUserManager.isCurrentProfile(NOTIF_USER_ID)).thenReturn(true); // keyguard is showing when(mKeyguardStateController.isShowing()).thenReturn(true); Loading