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