1 /* 2 * Copyright (C) 2022 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.wm.shell.desktopmode 18 19 import android.testing.AndroidTestingRunner 20 import androidx.test.filters.SmallTest 21 import com.android.wm.shell.ShellTestCase 22 import com.android.wm.shell.TestShellExecutor 23 import com.google.common.truth.Truth.assertThat 24 import org.junit.Before 25 import org.junit.Test 26 import org.junit.runner.RunWith 27 28 @SmallTest 29 @RunWith(AndroidTestingRunner::class) 30 class DesktopModeTaskRepositoryTest : ShellTestCase() { 31 32 private lateinit var repo: DesktopModeTaskRepository 33 34 @Before setUpnull35 fun setUp() { 36 repo = DesktopModeTaskRepository() 37 } 38 39 @Test addActiveTask_listenerNotifiedAndTaskIsActivenull40 fun addActiveTask_listenerNotifiedAndTaskIsActive() { 41 val listener = TestListener() 42 repo.addActiveTaskListener(listener) 43 44 repo.addActiveTask(1) 45 assertThat(listener.activeTaskChangedCalls).isEqualTo(1) 46 assertThat(repo.isActiveTask(1)).isTrue() 47 } 48 49 @Test addActiveTask_sameTaskDoesNotNotifynull50 fun addActiveTask_sameTaskDoesNotNotify() { 51 val listener = TestListener() 52 repo.addActiveTaskListener(listener) 53 54 repo.addActiveTask(1) 55 repo.addActiveTask(1) 56 assertThat(listener.activeTaskChangedCalls).isEqualTo(1) 57 } 58 59 @Test addActiveTask_multipleTasksAddedNotifiesForEachnull60 fun addActiveTask_multipleTasksAddedNotifiesForEach() { 61 val listener = TestListener() 62 repo.addActiveTaskListener(listener) 63 64 repo.addActiveTask(1) 65 repo.addActiveTask(2) 66 assertThat(listener.activeTaskChangedCalls).isEqualTo(2) 67 } 68 69 @Test removeActiveTask_listenerNotifiedAndTaskNotActivenull70 fun removeActiveTask_listenerNotifiedAndTaskNotActive() { 71 val listener = TestListener() 72 repo.addActiveTaskListener(listener) 73 74 repo.addActiveTask(1) 75 repo.removeActiveTask(1) 76 // Notify once for add and once for remove 77 assertThat(listener.activeTaskChangedCalls).isEqualTo(2) 78 assertThat(repo.isActiveTask(1)).isFalse() 79 } 80 81 @Test removeActiveTask_removeNotExistingTaskDoesNotNotifynull82 fun removeActiveTask_removeNotExistingTaskDoesNotNotify() { 83 val listener = TestListener() 84 repo.addActiveTaskListener(listener) 85 repo.removeActiveTask(99) 86 assertThat(listener.activeTaskChangedCalls).isEqualTo(0) 87 } 88 89 @Test isActiveTask_notExistingTaskReturnsFalsenull90 fun isActiveTask_notExistingTaskReturnsFalse() { 91 assertThat(repo.isActiveTask(99)).isFalse() 92 } 93 94 @Test addListener_notifiesVisibleFreeformTasknull95 fun addListener_notifiesVisibleFreeformTask() { 96 repo.updateVisibleFreeformTasks(1, true) 97 val listener = TestVisibilityListener() 98 val executor = TestShellExecutor() 99 repo.addVisibleTasksListener(listener, executor) 100 executor.flushAll() 101 102 assertThat(listener.hasVisibleFreeformTasks).isTrue() 103 assertThat(listener.visibleFreeformTaskChangedCalls).isEqualTo(1) 104 } 105 106 @Test updateVisibleFreeformTasks_addVisibleTasksNotifiesListenernull107 fun updateVisibleFreeformTasks_addVisibleTasksNotifiesListener() { 108 val listener = TestVisibilityListener() 109 val executor = TestShellExecutor() 110 repo.addVisibleTasksListener(listener, executor) 111 repo.updateVisibleFreeformTasks(1, true) 112 repo.updateVisibleFreeformTasks(2, true) 113 executor.flushAll() 114 115 assertThat(listener.hasVisibleFreeformTasks).isTrue() 116 // Equal to 2 because adding the listener notifies the current state 117 assertThat(listener.visibleFreeformTaskChangedCalls).isEqualTo(2) 118 } 119 120 @Test updateVisibleFreeformTasks_removeVisibleTasksNotifiesListenernull121 fun updateVisibleFreeformTasks_removeVisibleTasksNotifiesListener() { 122 val listener = TestVisibilityListener() 123 val executor = TestShellExecutor() 124 repo.addVisibleTasksListener(listener, executor) 125 repo.updateVisibleFreeformTasks(1, true) 126 repo.updateVisibleFreeformTasks(2, true) 127 executor.flushAll() 128 129 assertThat(listener.hasVisibleFreeformTasks).isTrue() 130 repo.updateVisibleFreeformTasks(1, false) 131 executor.flushAll() 132 133 // Equal to 2 because adding the listener notifies the current state 134 assertThat(listener.visibleFreeformTaskChangedCalls).isEqualTo(2) 135 136 repo.updateVisibleFreeformTasks(2, false) 137 executor.flushAll() 138 139 assertThat(listener.hasVisibleFreeformTasks).isFalse() 140 assertThat(listener.visibleFreeformTaskChangedCalls).isEqualTo(3) 141 } 142 143 @Test getVisibleTaskCountnull144 fun getVisibleTaskCount() { 145 // No tasks, count is 0 146 assertThat(repo.getVisibleTaskCount()).isEqualTo(0) 147 148 // New task increments count to 1 149 repo.updateVisibleFreeformTasks(taskId = 1, visible = true) 150 assertThat(repo.getVisibleTaskCount()).isEqualTo(1) 151 152 // Visibility update to same task does not increase count 153 repo.updateVisibleFreeformTasks(taskId = 1, visible = true) 154 assertThat(repo.getVisibleTaskCount()).isEqualTo(1) 155 156 // Second task visible increments count 157 repo.updateVisibleFreeformTasks(taskId = 2, visible = true) 158 assertThat(repo.getVisibleTaskCount()).isEqualTo(2) 159 160 // Hiding a task decrements count 161 repo.updateVisibleFreeformTasks(taskId = 1, visible = false) 162 assertThat(repo.getVisibleTaskCount()).isEqualTo(1) 163 164 // Hiding all tasks leaves count at 0 165 repo.updateVisibleFreeformTasks(taskId = 2, visible = false) 166 assertThat(repo.getVisibleTaskCount()).isEqualTo(0) 167 168 // Hiding a not existing task, count remains at 0 169 repo.updateVisibleFreeformTasks(taskId = 999, visible = false) 170 assertThat(repo.getVisibleTaskCount()).isEqualTo(0) 171 } 172 173 @Test addOrMoveFreeformTaskToTop_didNotExist_addsToTopnull174 fun addOrMoveFreeformTaskToTop_didNotExist_addsToTop() { 175 repo.addOrMoveFreeformTaskToTop(5) 176 repo.addOrMoveFreeformTaskToTop(6) 177 repo.addOrMoveFreeformTaskToTop(7) 178 179 val tasks = repo.getFreeformTasksInZOrder() 180 assertThat(tasks.size).isEqualTo(3) 181 assertThat(tasks[0]).isEqualTo(7) 182 assertThat(tasks[1]).isEqualTo(6) 183 assertThat(tasks[2]).isEqualTo(5) 184 } 185 186 @Test addOrMoveFreeformTaskToTop_alreadyExists_movesToTopnull187 fun addOrMoveFreeformTaskToTop_alreadyExists_movesToTop() { 188 repo.addOrMoveFreeformTaskToTop(5) 189 repo.addOrMoveFreeformTaskToTop(6) 190 repo.addOrMoveFreeformTaskToTop(7) 191 192 repo.addOrMoveFreeformTaskToTop(6) 193 194 val tasks = repo.getFreeformTasksInZOrder() 195 assertThat(tasks.size).isEqualTo(3) 196 assertThat(tasks.first()).isEqualTo(6) 197 } 198 199 class TestListener : DesktopModeTaskRepository.ActiveTasksListener { 200 var activeTaskChangedCalls = 0 onActiveTasksChangednull201 override fun onActiveTasksChanged() { 202 activeTaskChangedCalls++ 203 } 204 } 205 206 class TestVisibilityListener : DesktopModeTaskRepository.VisibleTasksListener { 207 var hasVisibleFreeformTasks = false 208 var visibleFreeformTaskChangedCalls = 0 209 onVisibilityChangednull210 override fun onVisibilityChanged(hasVisibleTasks: Boolean) { 211 hasVisibleFreeformTasks = hasVisibleTasks 212 visibleFreeformTaskChangedCalls++ 213 } 214 } 215 } 216