1 /* 2 * Copyright (C) 2023 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 18 package com.android.quickstep.util 19 20 import android.graphics.Bitmap 21 import android.graphics.drawable.Drawable 22 import android.view.View 23 import androidx.test.ext.junit.runners.AndroidJUnit4 24 import com.android.launcher3.util.SplitConfigurationOptions 25 import com.android.quickstep.views.GroupedTaskView 26 import com.android.quickstep.views.IconView 27 import com.android.quickstep.views.TaskThumbnailView 28 import com.android.quickstep.views.TaskView 29 import com.android.quickstep.views.TaskView.TaskIdAttributeContainer 30 import com.android.systemui.shared.recents.model.Task 31 import org.junit.Assert.assertEquals 32 import org.junit.Before 33 import org.junit.Test 34 import org.junit.runner.RunWith 35 import org.mockito.Mock 36 import org.mockito.MockitoAnnotations 37 import org.mockito.Mockito.`when` as whenever 38 39 @RunWith(AndroidJUnit4::class) 40 class SplitAnimationControllerTest { 41 42 private val taskId = 9 43 44 @Mock lateinit var mockSplitSelectStateController: SplitSelectStateController 45 // TaskView 46 @Mock lateinit var mockTaskView: TaskView 47 @Mock lateinit var mockThumbnailView: TaskThumbnailView 48 @Mock lateinit var mockBitmap: Bitmap 49 @Mock lateinit var mockIconView: IconView 50 @Mock lateinit var mockTaskViewDrawable: Drawable 51 // GroupedTaskView 52 @Mock lateinit var mockGroupedTaskView: GroupedTaskView 53 @Mock lateinit var mockTask: Task 54 @Mock lateinit var mockTaskKey: Task.TaskKey 55 @Mock lateinit var mockTaskIdAttributeContainer: TaskIdAttributeContainer 56 57 // SplitSelectSource 58 @Mock lateinit var splitSelectSource: SplitConfigurationOptions.SplitSelectSource 59 @Mock lateinit var mockSplitSourceDrawable: Drawable 60 @Mock lateinit var mockSplitSourceView: View 61 62 lateinit var splitAnimationController: SplitAnimationController 63 64 @Before setupnull65 fun setup() { 66 MockitoAnnotations.initMocks(this) 67 68 whenever(mockTaskView.thumbnail).thenReturn(mockThumbnailView) 69 whenever(mockThumbnailView.thumbnail).thenReturn(mockBitmap) 70 whenever(mockTaskView.iconView).thenReturn(mockIconView) 71 whenever(mockIconView.drawable).thenReturn(mockTaskViewDrawable) 72 73 whenever(splitSelectSource.drawable).thenReturn(mockSplitSourceDrawable) 74 whenever(splitSelectSource.view).thenReturn(mockSplitSourceView) 75 76 splitAnimationController = SplitAnimationController(mockSplitSelectStateController) 77 } 78 79 @Test getFirstAnimInitViews_nullTaskViewIcon_useSplitSourceIconnull80 fun getFirstAnimInitViews_nullTaskViewIcon_useSplitSourceIcon() { 81 // Hit fullscreen task dismissal state 82 whenever(mockSplitSelectStateController.isAnimateCurrentTaskDismissal).thenReturn(true) 83 whenever(mockSplitSelectStateController.isDismissingFromSplitPair).thenReturn(false) 84 85 // Missing taskView icon 86 whenever(mockIconView.drawable).thenReturn(null) 87 88 val splitAnimInitProps : SplitAnimationController.Companion.SplitAnimInitProps = 89 splitAnimationController.getFirstAnimInitViews( 90 { mockTaskView }, { splitSelectSource }) 91 92 assertEquals("Did not fallback to use splitSource icon drawable", 93 mockSplitSourceDrawable, splitAnimInitProps.iconDrawable) 94 } 95 96 @Test getFirstAnimInitViews_validTaskViewIcon_useTaskViewIconnull97 fun getFirstAnimInitViews_validTaskViewIcon_useTaskViewIcon() { 98 // Hit fullscreen task dismissal state 99 whenever(mockSplitSelectStateController.isAnimateCurrentTaskDismissal).thenReturn(true) 100 whenever(mockSplitSelectStateController.isDismissingFromSplitPair).thenReturn(false) 101 102 val splitAnimInitProps : SplitAnimationController.Companion.SplitAnimInitProps = 103 splitAnimationController.getFirstAnimInitViews( 104 { mockTaskView }, { splitSelectSource }) 105 106 assertEquals("Did not use taskView icon drawable", mockTaskViewDrawable, 107 splitAnimInitProps.iconDrawable) 108 } 109 110 @Test getFirstAnimInitViews_validTaskViewNullSplitSource_useTaskViewIconnull111 fun getFirstAnimInitViews_validTaskViewNullSplitSource_useTaskViewIcon() { 112 // Hit fullscreen task dismissal state 113 whenever(mockSplitSelectStateController.isAnimateCurrentTaskDismissal).thenReturn(true) 114 whenever(mockSplitSelectStateController.isDismissingFromSplitPair).thenReturn(false) 115 116 // Set split source to null 117 whenever(splitSelectSource.drawable).thenReturn(null) 118 119 val splitAnimInitProps : SplitAnimationController.Companion.SplitAnimInitProps = 120 splitAnimationController.getFirstAnimInitViews( 121 { mockTaskView }, { splitSelectSource }) 122 123 assertEquals("Did not use taskView icon drawable", mockTaskViewDrawable, 124 splitAnimInitProps.iconDrawable) 125 } 126 127 @Test getFirstAnimInitViews_nullTaskViewValidSplitSource_noTaskDismissalnull128 fun getFirstAnimInitViews_nullTaskViewValidSplitSource_noTaskDismissal() { 129 // Hit initiating split from home 130 whenever(mockSplitSelectStateController.isAnimateCurrentTaskDismissal).thenReturn(false) 131 whenever(mockSplitSelectStateController.isDismissingFromSplitPair).thenReturn(false) 132 133 val splitAnimInitProps : SplitAnimationController.Companion.SplitAnimInitProps = 134 splitAnimationController.getFirstAnimInitViews( 135 { mockTaskView }, { splitSelectSource }) 136 137 assertEquals("Did not use splitSource icon drawable", mockSplitSourceDrawable, 138 splitAnimInitProps.iconDrawable) 139 } 140 141 @Test getFirstAnimInitViews_nullTaskViewValidSplitSource_groupedTaskViewnull142 fun getFirstAnimInitViews_nullTaskViewValidSplitSource_groupedTaskView() { 143 // Hit groupedTaskView dismissal 144 whenever(mockSplitSelectStateController.isAnimateCurrentTaskDismissal).thenReturn(true) 145 whenever(mockSplitSelectStateController.isDismissingFromSplitPair).thenReturn(true) 146 147 // Remove icon view from GroupedTaskView 148 whenever(mockIconView.drawable).thenReturn(null) 149 150 whenever(mockTaskIdAttributeContainer.task).thenReturn(mockTask) 151 whenever(mockTaskIdAttributeContainer.iconView).thenReturn(mockIconView) 152 whenever(mockTaskIdAttributeContainer.thumbnailView).thenReturn(mockThumbnailView) 153 whenever(mockTask.getKey()).thenReturn(mockTaskKey) 154 whenever(mockTaskKey.getId()).thenReturn(taskId) 155 whenever(mockSplitSelectStateController.initialTaskId).thenReturn(taskId) 156 whenever(mockGroupedTaskView.taskIdAttributeContainers) 157 .thenReturn(Array(1) { mockTaskIdAttributeContainer }) 158 val splitAnimInitProps : SplitAnimationController.Companion.SplitAnimInitProps = 159 splitAnimationController.getFirstAnimInitViews( 160 { mockGroupedTaskView }, { splitSelectSource }) 161 162 assertEquals("Did not use splitSource icon drawable", mockSplitSourceDrawable, 163 splitAnimInitProps.iconDrawable) 164 } 165 }