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

Commit 84ef95b0 authored by Ned Burns's avatar Ned Burns Committed by Automerger Merge Worker
Browse files

Merge "Move inactive user filtering to its own filter" into rvc-dev am:...

Merge "Move inactive user filtering to its own filter" into rvc-dev am: dc3919ab am: 5da7d04f am: 13b4c04c am: d072071a

Change-Id: I2feed03e1871bd3d99a7899205966e176540fde5
parents a55c8886 d072071a
Loading
Loading
Loading
Loading
+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();
        }
    };
}
+0 −5
Original line number Diff line number Diff line
@@ -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
+3 −1
Original line number Diff line number Diff line
@@ -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);
+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);
    }
}
+0 −13
Original line number Diff line number Diff line
@@ -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
@@ -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);