1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.systemui.statusbar.chips.mediaprojection.ui.view
18 
19 import android.content.ComponentName
20 import android.content.Intent
21 import android.content.packageManager
22 import android.content.pm.ApplicationInfo
23 import android.content.pm.PackageManager
24 import androidx.test.ext.junit.runners.AndroidJUnit4
25 import androidx.test.filters.SmallTest
26 import com.android.systemui.SysuiTestCase
27 import com.android.systemui.kosmos.Kosmos
28 import com.android.systemui.kosmos.testCase
29 import com.android.systemui.mediaprojection.data.model.MediaProjectionState
30 import com.android.systemui.mediaprojection.taskswitcher.FakeActivityTaskManager.Companion.createTask
31 import com.android.systemui.statusbar.phone.SystemUIDialog
32 import com.android.systemui.statusbar.phone.mockSystemUIDialogFactory
33 import com.google.common.truth.Truth.assertThat
34 import kotlin.test.Test
35 import org.junit.runner.RunWith
36 import org.mockito.kotlin.any
37 import org.mockito.kotlin.eq
38 import org.mockito.kotlin.mock
39 import org.mockito.kotlin.verify
40 import org.mockito.kotlin.whenever
41 
42 @SmallTest
43 @RunWith(AndroidJUnit4::class)
44 class EndMediaProjectionDialogHelperTest : SysuiTestCase() {
<lambda>null45     private val kosmos = Kosmos().also { it.testCase = this }
46 
47     private val underTest = kosmos.endMediaProjectionDialogHelper
48 
49     @Test
createDialog_usesDelegateAndFactorynull50     fun createDialog_usesDelegateAndFactory() {
51         val dialog = mock<SystemUIDialog>()
52         val delegate = SystemUIDialog.Delegate { dialog }
53         whenever(kosmos.mockSystemUIDialogFactory.create(eq(delegate))).thenReturn(dialog)
54 
55         underTest.createDialog(delegate)
56 
57         verify(kosmos.mockSystemUIDialogFactory).create(delegate)
58     }
59 
60     @Test
getAppName_stateVersion_entireScreen_returnsNullnull61     fun getAppName_stateVersion_entireScreen_returnsNull() {
62         val result =
63             underTest.getAppName(MediaProjectionState.Projecting.EntireScreen("host.package"))
64 
65         assertThat(result).isNull()
66     }
67 
68     @Test
getAppName_stateVersion_singleTask_cannotFindPackage_returnsNullnull69     fun getAppName_stateVersion_singleTask_cannotFindPackage_returnsNull() {
70         val baseIntent =
71             Intent().apply { this.component = ComponentName("fake.task.package", "cls") }
72         whenever(kosmos.packageManager.getApplicationInfo(eq("fake.task.package"), any<Int>()))
73             .thenThrow(PackageManager.NameNotFoundException())
74 
75         val projectionState =
76             MediaProjectionState.Projecting.SingleTask(
77                 "host.package",
78                 hostDeviceName = null,
79                 createTask(taskId = 1, baseIntent = baseIntent),
80             )
81 
82         val result = underTest.getAppName(projectionState)
83 
84         assertThat(result).isNull()
85     }
86 
87     @Test
getAppName_stateVersion_singleTask_findsPackage_returnsNamenull88     fun getAppName_stateVersion_singleTask_findsPackage_returnsName() {
89         val baseIntent =
90             Intent().apply { this.component = ComponentName("fake.task.package", "cls") }
91         val appInfo = mock<ApplicationInfo>()
92         whenever(appInfo.loadLabel(kosmos.packageManager)).thenReturn("Fake Package")
93         whenever(kosmos.packageManager.getApplicationInfo(eq("fake.task.package"), any<Int>()))
94             .thenReturn(appInfo)
95 
96         val projectionState =
97             MediaProjectionState.Projecting.SingleTask(
98                 "host.package",
99                 hostDeviceName = null,
100                 createTask(taskId = 1, baseIntent = baseIntent),
101             )
102 
103         val result = underTest.getAppName(projectionState)
104 
105         assertThat(result).isEqualTo("Fake Package")
106     }
107 
108     @Test
getAppName_taskInfoVersion_null_returnsNullnull109     fun getAppName_taskInfoVersion_null_returnsNull() {
110         val result = underTest.getAppName(specificTaskInfo = null)
111 
112         assertThat(result).isNull()
113     }
114 
115     @Test
getAppName_taskInfoVersion_cannotFindPackage_returnsNullnull116     fun getAppName_taskInfoVersion_cannotFindPackage_returnsNull() {
117         val baseIntent =
118             Intent().apply { this.component = ComponentName("fake.task.package", "cls") }
119         whenever(kosmos.packageManager.getApplicationInfo(eq("fake.task.package"), any<Int>()))
120             .thenThrow(PackageManager.NameNotFoundException())
121 
122         val result = underTest.getAppName(createTask(taskId = 1, baseIntent = baseIntent))
123 
124         assertThat(result).isNull()
125     }
126 
127     @Test
getAppName_taskInfoVersion_findsPackage_returnsNamenull128     fun getAppName_taskInfoVersion_findsPackage_returnsName() {
129         val baseIntent =
130             Intent().apply { this.component = ComponentName("fake.task.package", "cls") }
131         val appInfo = mock<ApplicationInfo>()
132         whenever(appInfo.loadLabel(kosmos.packageManager)).thenReturn("Fake Package")
133         whenever(kosmos.packageManager.getApplicationInfo(eq("fake.task.package"), any<Int>()))
134             .thenReturn(appInfo)
135 
136         val result = underTest.getAppName(createTask(taskId = 1, baseIntent = baseIntent))
137 
138         assertThat(result).isEqualTo("Fake Package")
139     }
140 
141     @Test
getAppName_packageNameVersion_cannotFindPackage_returnsNullnull142     fun getAppName_packageNameVersion_cannotFindPackage_returnsNull() {
143         whenever(kosmos.packageManager.getApplicationInfo(eq("fake.task.package"), any<Int>()))
144             .thenThrow(PackageManager.NameNotFoundException())
145 
146         val result = underTest.getAppName("fake.task.package")
147 
148         assertThat(result).isNull()
149     }
150 
151     @Test
getAppName_packageNameVersion_findsPackage_returnsNamenull152     fun getAppName_packageNameVersion_findsPackage_returnsName() {
153         val appInfo = mock<ApplicationInfo>()
154         whenever(appInfo.loadLabel(kosmos.packageManager)).thenReturn("Fake Package")
155         whenever(kosmos.packageManager.getApplicationInfo(eq("fake.task.package"), any<Int>()))
156             .thenReturn(appInfo)
157 
158         val result = underTest.getAppName("fake.task.package")
159 
160         assertThat(result).isEqualTo("Fake Package")
161     }
162 }
163