• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }