• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.systemui.screenshot
2 
3 import android.graphics.drawable.Drawable
4 import android.os.UserHandle
5 import android.testing.AndroidTestingRunner
6 import android.view.View
7 import android.view.ViewGroup
8 import android.widget.FrameLayout
9 import androidx.constraintlayout.widget.ConstraintLayout
10 import androidx.constraintlayout.widget.Guideline
11 import androidx.test.filters.SmallTest
12 import com.android.systemui.SysuiTestCase
13 import com.android.systemui.flags.FakeFeatureFlags
14 import com.android.systemui.flags.Flags
15 import com.android.systemui.util.mockito.any
16 import com.android.systemui.util.mockito.eq
17 import com.android.systemui.util.mockito.whenever
18 import junit.framework.Assert.assertEquals
19 import org.junit.Before
20 import org.junit.Test
21 import org.junit.runner.RunWith
22 import org.mockito.Mock
23 import org.mockito.Mockito.never
24 import org.mockito.Mockito.verify
25 import org.mockito.MockitoAnnotations
26 
27 @SmallTest
28 @RunWith(AndroidTestingRunner::class)
29 class MessageContainerControllerTest : SysuiTestCase() {
30     lateinit var messageContainer: MessageContainerController
31 
32     @Mock lateinit var workProfileMessageController: WorkProfileMessageController
33 
34     @Mock lateinit var screenshotDetectionController: ScreenshotDetectionController
35 
36     @Mock lateinit var icon: Drawable
37 
38     lateinit var workProfileFirstRunView: ViewGroup
39     lateinit var detectionNoticeView: ViewGroup
40     lateinit var container: FrameLayout
41 
42     var featureFlags = FakeFeatureFlags()
43     lateinit var screenshotView: ViewGroup
44 
45     val userHandle = UserHandle.of(5)
46     val screenshotData = ScreenshotData.forTesting()
47 
48     val appName = "app name"
49     lateinit var workProfileData: WorkProfileMessageController.WorkProfileFirstRunData
50 
51     @Before
setupnull52     fun setup() {
53         MockitoAnnotations.initMocks(this)
54         messageContainer =
55             MessageContainerController(
56                 workProfileMessageController,
57                 screenshotDetectionController,
58                 featureFlags
59             )
60         screenshotView = ConstraintLayout(mContext)
61         workProfileData = WorkProfileMessageController.WorkProfileFirstRunData(appName, icon)
62 
63         val guideline = Guideline(mContext)
64         guideline.id = com.android.systemui.R.id.guideline
65         screenshotView.addView(guideline)
66 
67         container = FrameLayout(mContext)
68         container.id = com.android.systemui.R.id.screenshot_message_container
69         screenshotView.addView(container)
70 
71         workProfileFirstRunView = FrameLayout(mContext)
72         workProfileFirstRunView.id = com.android.systemui.R.id.work_profile_first_run
73         container.addView(workProfileFirstRunView)
74 
75         detectionNoticeView = FrameLayout(mContext)
76         detectionNoticeView.id = com.android.systemui.R.id.screenshot_detection_notice
77         container.addView(detectionNoticeView)
78 
79         messageContainer.setView(screenshotView)
80 
81         screenshotData.userHandle = userHandle
82     }
83 
84     @Test
testOnScreenshotTakenUserHandle_noWorkProfileFirstRunnull85     fun testOnScreenshotTakenUserHandle_noWorkProfileFirstRun() {
86         featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true)
87         // (just being explicit here)
88         whenever(workProfileMessageController.onScreenshotTaken(eq(userHandle))).thenReturn(null)
89 
90         messageContainer.onScreenshotTaken(userHandle)
91 
92         verify(workProfileMessageController, never()).populateView(any(), any(), any())
93     }
94 
95     @Test
testOnScreenshotTakenUserHandle_noWorkProfileFlagnull96     fun testOnScreenshotTakenUserHandle_noWorkProfileFlag() {
97         featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, false)
98 
99         messageContainer.onScreenshotTaken(userHandle)
100 
101         verify(workProfileMessageController, never()).onScreenshotTaken(any())
102         verify(workProfileMessageController, never()).populateView(any(), any(), any())
103     }
104 
105     @Test
testOnScreenshotTakenUserHandle_withWorkProfileFirstRunnull106     fun testOnScreenshotTakenUserHandle_withWorkProfileFirstRun() {
107         featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true)
108         whenever(workProfileMessageController.onScreenshotTaken(eq(userHandle)))
109             .thenReturn(workProfileData)
110         messageContainer.onScreenshotTaken(userHandle)
111 
112         verify(workProfileMessageController)
113             .populateView(eq(workProfileFirstRunView), eq(workProfileData), any())
114         assertEquals(View.VISIBLE, workProfileFirstRunView.visibility)
115         assertEquals(View.GONE, detectionNoticeView.visibility)
116     }
117 
118     @Test
testOnScreenshotTakenScreenshotData_flagsOffnull119     fun testOnScreenshotTakenScreenshotData_flagsOff() {
120         featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, false)
121         featureFlags.set(Flags.SCREENSHOT_DETECTION, false)
122 
123         messageContainer.onScreenshotTaken(screenshotData)
124 
125         verify(workProfileMessageController, never()).onScreenshotTaken(any())
126         verify(screenshotDetectionController, never()).maybeNotifyOfScreenshot(any())
127 
128         assertEquals(View.GONE, container.visibility)
129     }
130 
131     @Test
testOnScreenshotTakenScreenshotData_nothingToShownull132     fun testOnScreenshotTakenScreenshotData_nothingToShow() {
133         featureFlags.set(Flags.SCREENSHOT_WORK_PROFILE_POLICY, true)
134         featureFlags.set(Flags.SCREENSHOT_DETECTION, true)
135 
136         messageContainer.onScreenshotTaken(screenshotData)
137 
138         verify(workProfileMessageController, never()).populateView(any(), any(), any())
139         verify(screenshotDetectionController, never()).populateView(any(), any())
140 
141         assertEquals(View.GONE, container.visibility)
142     }
143 }
144