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

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

Merge changes I842f0484,I70b356eb into main

* changes:
  [flexiglass] Parameterize SensitiveContentCoordinatorTest
  Kosmosify SensitiveContentCoordinatorTest
parents f944dbe1 8772f2f5
Loading
Loading
Loading
Loading
+61 −73
Original line number Original line Diff line number Diff line
@@ -14,6 +14,8 @@
 * limitations under the License.
 * limitations under the License.
 */
 */


@file:OptIn(ExperimentalCoroutinesApi::class)

package com.android.systemui.statusbar.notification.collection.coordinator
package com.android.systemui.statusbar.notification.collection.coordinator


import android.app.Notification
import android.app.Notification
@@ -22,83 +24,92 @@ import android.app.NotificationManager
import android.os.UserHandle
import android.os.UserHandle
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.FlagsParameterization
import android.service.notification.StatusBarNotification
import android.service.notification.StatusBarNotification
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.filters.SmallTest
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.KeyguardUpdateMonitor
import com.android.keyguard.keyguardUpdateMonitor
import com.android.server.notification.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING
import com.android.server.notification.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING
import com.android.systemui.SysuiTestCase
import com.android.systemui.SysuiTestCase
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.flags.andSceneContainer
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor
import com.android.systemui.plugins.statusbar.fakeStatusBarStateController
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.plugins.statusbar.statusBarStateController
import com.android.systemui.plugins.statusbar.StatusBarStateController
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.domain.interactor.SceneInteractor
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.NotificationLockscreenUserManager
import com.android.systemui.statusbar.RankingBuilder
import com.android.systemui.statusbar.RankingBuilder
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.notification.DynamicPrivacyController
import com.android.systemui.statusbar.notification.DynamicPrivacyController
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.ListEntry
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotifPipeline
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorScope
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeRenderListListener
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Invalidator
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable
import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.Pluggable
import com.android.systemui.statusbar.notification.collection.notifPipeline
import com.android.systemui.statusbar.notification.dynamicPrivacyController
import com.android.systemui.statusbar.notification.mockDynamicPrivacyController
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.statusbar.notificationLockscreenUserManager
import com.android.systemui.statusbar.policy.SensitiveNotificationProtectionController
import com.android.systemui.statusbar.policy.SensitiveNotificationProtectionController
import com.android.systemui.statusbar.policy.mockSensitiveNotificationProtectionController
import com.android.systemui.statusbar.policy.sensitiveNotificationProtectionController
import com.android.systemui.testKosmos
import com.android.systemui.testKosmos
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.withArgCaptor
import com.android.systemui.util.mockito.withArgCaptor
import dagger.BindsInstance
import kotlinx.coroutines.ExperimentalCoroutinesApi
import dagger.Component
import kotlinx.coroutines.CoroutineScope
import org.junit.Assert.assertFalse
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runner.RunWith
import org.mockito.Mockito.never
import org.mockito.kotlin.any
import org.mockito.Mockito.verify
import org.mockito.kotlin.eq
import org.mockito.Mockito.`when` as whenever
import org.mockito.kotlin.mock
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
import platform.test.runner.parameterized.ParameterizedAndroidJunit4
import platform.test.runner.parameterized.Parameters


@SmallTest
@SmallTest
@RunWith(AndroidJUnit4::class)
@RunWith(ParameterizedAndroidJunit4::class)
class SensitiveContentCoordinatorTest : SysuiTestCase() {
class SensitiveContentCoordinatorTest(flags: FlagsParameterization) : SysuiTestCase() {


    val kosmos = testKosmos()
    val kosmos =

        testKosmos().apply {
    val dynamicPrivacyController: DynamicPrivacyController = mock()
            // Override some Kosmos objects with mocks or fakes for easier testability
    val lockscreenUserManager: NotificationLockscreenUserManager = mock()
            dynamicPrivacyController = mockDynamicPrivacyController
    val pipeline: NotifPipeline = mock()
            sensitiveNotificationProtectionController =
    val keyguardUpdateMonitor: KeyguardUpdateMonitor = mock()
                mockSensitiveNotificationProtectionController
    val statusBarStateController: StatusBarStateController = mock()
            statusBarStateController = fakeStatusBarStateController
    val keyguardStateController: KeyguardStateController = mock()
        }
    val mSelectedUserInteractor: SelectedUserInteractor = mock()

    val dynamicPrivacyController: DynamicPrivacyController = kosmos.mockDynamicPrivacyController
    val lockscreenUserManager: NotificationLockscreenUserManager =
        kosmos.notificationLockscreenUserManager
    val pipeline: NotifPipeline = kosmos.notifPipeline
    val keyguardUpdateMonitor: KeyguardUpdateMonitor = kosmos.keyguardUpdateMonitor
    val statusBarStateController: SysuiStatusBarStateController =
        kosmos.fakeStatusBarStateController
    val sensitiveNotificationProtectionController: SensitiveNotificationProtectionController =
    val sensitiveNotificationProtectionController: SensitiveNotificationProtectionController =
        mock()
        kosmos.mockSensitiveNotificationProtectionController
    val deviceEntryInteractor: DeviceEntryInteractor = mock()
    val sceneInteractor: SceneInteractor = kosmos.sceneInteractor
    val sceneInteractor: SceneInteractor = mock()


    val coordinator: SensitiveContentCoordinator by lazy { kosmos.sensitiveContentCoordinator }
    val coordinator: SensitiveContentCoordinator =

        DaggerTestSensitiveContentCoordinatorComponent.factory()
    companion object {
            .create(
        @JvmStatic
                dynamicPrivacyController,
        @Parameters(name = "{0}")
                lockscreenUserManager,
        fun getParams(): List<FlagsParameterization> {
                keyguardUpdateMonitor,
            return FlagsParameterization.allCombinationsOf().andSceneContainer()
                statusBarStateController,
        }
                keyguardStateController,
    }
                mSelectedUserInteractor,

                sensitiveNotificationProtectionController,
    init {
                deviceEntryInteractor,
        mSetFlagsRule.setFlagsParameterization(flags)
                sceneInteractor,
    }
                kosmos.applicationCoroutineScope,
            )
            .coordinator


    @Test
    @Test
    fun onDynamicPrivacyChanged_invokeInvalidationListener() {
    fun onDynamicPrivacyChanged_invokeInvalidationListener() {
@@ -143,7 +154,7 @@ class SensitiveContentCoordinatorTest : SysuiTestCase() {
    fun screenshareSecretFilter_flagDisabled_filterNoAdded() {
    fun screenshareSecretFilter_flagDisabled_filterNoAdded() {
        coordinator.attach(pipeline)
        coordinator.attach(pipeline)


        verify(pipeline, never()).addFinalizeFilter(any(NotifFilter::class.java))
        verify(pipeline, never()).addFinalizeFilter(any())
    }
    }


    @Test
    @Test
@@ -675,13 +686,13 @@ class SensitiveContentCoordinatorTest : SysuiTestCase() {
        whenever(lockscreenUserManager.isLockscreenPublicMode(1)).thenReturn(true)
        whenever(lockscreenUserManager.isLockscreenPublicMode(1)).thenReturn(true)
        whenever(lockscreenUserManager.userAllowsPrivateNotificationsInPublic(1)).thenReturn(false)
        whenever(lockscreenUserManager.userAllowsPrivateNotificationsInPublic(1)).thenReturn(false)
        whenever(dynamicPrivacyController.isDynamicallyUnlocked).thenReturn(true)
        whenever(dynamicPrivacyController.isDynamicallyUnlocked).thenReturn(true)
        whenever(statusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD)
        whenever(keyguardUpdateMonitor.getUserUnlockedWithBiometricAndIsBypassing(any()))
        whenever(keyguardUpdateMonitor.getUserUnlockedWithBiometricAndIsBypassing(any()))
            .thenReturn(true)
            .thenReturn(true)
        val entry = fakeNotification(2, true)
        val entry = fakeNotification(2, true)
        whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
        whenever(sensitiveNotificationProtectionController.isSensitiveStateActive).thenReturn(true)
        whenever(sensitiveNotificationProtectionController.shouldProtectNotification(any()))
        whenever(sensitiveNotificationProtectionController.shouldProtectNotification(any()))
            .thenReturn(true)
            .thenReturn(true)
        statusBarStateController.state = StatusBarState.KEYGUARD


        onBeforeRenderListListener.onBeforeRenderList(listOf(entry))
        onBeforeRenderListListener.onBeforeRenderList(listOf(entry))


@@ -733,26 +744,3 @@ class SensitiveContentCoordinatorTest : SysuiTestCase() {
        return notificationEntry
        return notificationEntry
    }
    }
}
}

@CoordinatorScope
@Component(modules = [SensitiveContentCoordinatorModule::class])
interface TestSensitiveContentCoordinatorComponent {
    val coordinator: SensitiveContentCoordinator

    @Component.Factory
    interface Factory {
        fun create(
            @BindsInstance dynamicPrivacyController: DynamicPrivacyController,
            @BindsInstance lockscreenUserManager: NotificationLockscreenUserManager,
            @BindsInstance keyguardUpdateMonitor: KeyguardUpdateMonitor,
            @BindsInstance statusBarStateController: StatusBarStateController,
            @BindsInstance keyguardStateController: KeyguardStateController,
            @BindsInstance selectedUserInteractor: SelectedUserInteractor,
            @BindsInstance
            sensitiveNotificationProtectionController: SensitiveNotificationProtectionController,
            @BindsInstance deviceEntryInteractor: DeviceEntryInteractor,
            @BindsInstance sceneInteractor: SceneInteractor,
            @BindsInstance @Application scope: CoroutineScope,
        ): TestSensitiveContentCoordinatorComponent
    }
}
+4 −0
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@ import com.android.systemui.scene.domain.interactor.sceneBackInteractor
import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor
import com.android.systemui.scene.domain.interactor.sceneContainerOcclusionInteractor
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.statusbar.FakeStatusBarStateController
import com.android.systemui.statusbar.StatusBarStateControllerImpl
import com.android.systemui.statusbar.StatusBarStateControllerImpl
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.mock
@@ -49,3 +50,6 @@ var Kosmos.statusBarStateController: SysuiStatusBarStateController by
            { alternateBouncerInteractor },
            { alternateBouncerInteractor },
        )
        )
    }
    }

var Kosmos.fakeStatusBarStateController: SysuiStatusBarStateController by
    Kosmos.Fixture { FakeStatusBarStateController() }
+34 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2024 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

import com.android.systemui.kosmos.Kosmos
import com.android.systemui.plugins.statusbar.statusBarStateController
import com.android.systemui.statusbar.notificationLockscreenUserManager
import com.android.systemui.statusbar.policy.keyguardStateController
import org.mockito.kotlin.mock

var Kosmos.dynamicPrivacyController: DynamicPrivacyController by
    Kosmos.Fixture {
        DynamicPrivacyController(
            notificationLockscreenUserManager,
            keyguardStateController,
            statusBarStateController,
        )
    }

var Kosmos.mockDynamicPrivacyController: DynamicPrivacyController by Kosmos.Fixture { mock() }
+47 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2024 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 com.android.keyguard.keyguardUpdateMonitor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.statusbar.statusBarStateController
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.statusbar.notification.dynamicPrivacyController
import com.android.systemui.statusbar.notificationLockscreenUserManager
import com.android.systemui.statusbar.policy.keyguardStateController
import com.android.systemui.statusbar.policy.sensitiveNotificationProtectionController
import com.android.systemui.user.domain.interactor.selectedUserInteractor
import kotlinx.coroutines.ExperimentalCoroutinesApi

@OptIn(ExperimentalCoroutinesApi::class)
var Kosmos.sensitiveContentCoordinator: SensitiveContentCoordinator by
    Kosmos.Fixture {
        SensitiveContentCoordinatorImpl(
            dynamicPrivacyController,
            notificationLockscreenUserManager,
            keyguardUpdateMonitor,
            statusBarStateController,
            keyguardStateController,
            selectedUserInteractor,
            sensitiveNotificationProtectionController,
            deviceEntryInteractor,
            sceneInteractor,
            testScope,
        )
    }
+26 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2024 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.policy

import com.android.systemui.kosmos.Kosmos
import org.mockito.kotlin.mock

var Kosmos.sensitiveNotificationProtectionController: SensitiveNotificationProtectionController by
    Kosmos.Fixture { mockSensitiveNotificationProtectionController }
val Kosmos.mockSensitiveNotificationProtectionController:
    SensitiveNotificationProtectionController by
    Kosmos.Fixture { mock<SensitiveNotificationProtectionController>() }