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
52     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
85     fun testOnScreenshotTakenUserHandle_noWorkProfileFirstRun() {
86         // (just being explicit here)
87         whenever(workProfileMessageController.onScreenshotTaken(eq(userHandle))).thenReturn(null)
88 
89         messageContainer.onScreenshotTaken(userHandle)
90 
91         verify(workProfileMessageController, never()).populateView(any(), any(), any())
92     }
93 
94     @Test
95     fun testOnScreenshotTakenUserHandle_withWorkProfileFirstRun() {
96         whenever(workProfileMessageController.onScreenshotTaken(eq(userHandle)))
97             .thenReturn(workProfileData)
98         messageContainer.onScreenshotTaken(userHandle)
99 
100         verify(workProfileMessageController)
101             .populateView(eq(workProfileFirstRunView), eq(workProfileData), any())
102         assertEquals(View.VISIBLE, workProfileFirstRunView.visibility)
103         assertEquals(View.GONE, detectionNoticeView.visibility)
104     }
105 
106     @Test
107     fun testOnScreenshotTakenScreenshotData_nothingToShow() {
108         featureFlags.set(Flags.SCREENSHOT_DETECTION, true)
109 
110         messageContainer.onScreenshotTaken(screenshotData)
111 
112         verify(workProfileMessageController, never()).populateView(any(), any(), any())
113         verify(screenshotDetectionController, never()).populateView(any(), any())
114 
115         assertEquals(View.GONE, container.visibility)
116     }
117 }
118