xref: /aosp_15_r20/frameworks/base/packages/SystemUI/tests/src/com/android/systemui/controls/ui/DetailDialogTest.kt (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1 /*
2  * Copyright (C) 2021 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.controls.ui
18 
19 import android.app.ActivityOptions
20 import android.app.PendingIntent
21 import android.content.Context
22 import android.testing.TestableLooper
23 import androidx.test.ext.junit.rules.ActivityScenarioRule
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.activity.EmptyTestActivity
28 import com.android.systemui.broadcast.BroadcastSender
29 import com.android.systemui.plugins.ActivityStarter
30 import com.android.systemui.statusbar.policy.KeyguardStateController
31 import com.android.systemui.util.mockito.argumentCaptor
32 import com.android.systemui.util.mockito.capture
33 import com.android.wm.shell.taskview.TaskView
34 import com.google.common.truth.Truth.assertThat
35 import org.junit.Before
36 import org.junit.Rule
37 import org.junit.Test
38 import org.junit.runner.RunWith
39 import org.mockito.ArgumentMatchers.eq
40 import org.mockito.Mock
41 import org.mockito.Mockito.any
42 import org.mockito.Mockito.never
43 import org.mockito.Mockito.verify
44 import org.mockito.MockitoAnnotations
45 
46 @SmallTest
47 @RunWith(AndroidJUnit4::class)
48 @TestableLooper.RunWithLooper
49 class DetailDialogTest : SysuiTestCase() {
50 
51     @Rule
52     @JvmField
53     val activityRule: ActivityScenarioRule<EmptyTestActivity> =
54         ActivityScenarioRule(EmptyTestActivity::class.java)
55 
56     @Mock private lateinit var taskView: TaskView
57     @Mock private lateinit var broadcastSender: BroadcastSender
58     @Mock private lateinit var controlViewHolder: ControlViewHolder
59     @Mock private lateinit var pendingIntent: PendingIntent
60     @Mock private lateinit var keyguardStateController: KeyguardStateController
61     @Mock private lateinit var activityStarter: ActivityStarter
62 
63     private lateinit var underTest: DetailDialog
64 
65     @Before
setUpnull66     fun setUp() {
67         MockitoAnnotations.initMocks(this)
68 
69         underTest = createDialog(pendingIntent)
70     }
71 
72     @Test
testPendingIntentIsUnModifiednull73     fun testPendingIntentIsUnModified() {
74         // WHEN the TaskView is initialized
75         underTest.stateCallback.onInitialized()
76 
77         // THEN the PendingIntent used to call startActivity is unmodified by systemui
78         verify(taskView).startActivity(eq(pendingIntent), any(), any(), any())
79     }
80 
81     @Test
testActivityOptionsAllowBalnull82     fun testActivityOptionsAllowBal() {
83         // WHEN the TaskView is initialized
84         underTest.stateCallback.onInitialized()
85 
86         val optionsCaptor = argumentCaptor<ActivityOptions>()
87 
88         // THEN the ActivityOptions have the correct flags
89         verify(taskView).startActivity(any(), any(), capture(optionsCaptor), any())
90 
91         assertThat(optionsCaptor.value.pendingIntentBackgroundActivityStartMode)
92             .isEqualTo(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS)
93         assertThat(optionsCaptor.value.taskAlwaysOnTop).isTrue()
94     }
95 
96     @Test
testDismissRemovesTheTasknull97     fun testDismissRemovesTheTask() {
98         activityRule.scenario.onActivity {
99             underTest = createDialog(pendingIntent, it)
100             underTest.show()
101 
102             underTest.dismiss()
103 
104             verify(taskView).removeTask()
105             verify(taskView, never()).release()
106         }
107     }
108 
109     @Test
testTaskRemovalReleasesTaskViewnull110     fun testTaskRemovalReleasesTaskView() {
111         underTest.stateCallback.onTaskRemovalStarted(0)
112 
113         verify(taskView).release()
114     }
115 
createDialognull116     private fun createDialog(
117         pendingIntent: PendingIntent,
118         context: Context = mContext,
119     ): DetailDialog {
120         return DetailDialog(
121             context,
122             broadcastSender,
123             taskView,
124             pendingIntent,
125             controlViewHolder,
126             keyguardStateController,
127             activityStarter,
128         )
129     }
130 }
131