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