1faa4edc42
InvariantDeviceProfile hold values that are not related to current DP in use. Now other classes get the value correctly from DeviceProfile, and each posture can hold different values, making it akin to iconSize. Fix: 309800141 Test: DeviceProfileResponsiveDumpTest Test: DeviceProfileResponsiveAlternativeDisplaysDumpTest Test: DeviceProfileDumpTest Test: DeviceProfileAlternativeDisplaysDumpTest Flag: ACONFIG com.android.launcher3.enable_responsive_workspace TEAMFOOD Change-Id: I32295738585de67205dcd6c8942d08a3d07d169a
185 lines
6.3 KiB
Kotlin
185 lines
6.3 KiB
Kotlin
/*
|
|
* Copyright (C) 2023 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
package com.android.launcher3.model
|
|
|
|
import androidx.test.ext.junit.runners.AndroidJUnit4
|
|
import androidx.test.filters.SmallTest
|
|
import com.android.launcher3.LauncherAppState
|
|
import com.android.launcher3.model.data.WorkspaceItemInfo
|
|
import com.android.launcher3.util.Executors
|
|
import com.android.launcher3.util.LauncherLayoutBuilder
|
|
import com.android.launcher3.util.LauncherModelHelper
|
|
import com.android.launcher3.util.LauncherModelHelper.*
|
|
import com.android.launcher3.util.TestUtil
|
|
import com.google.common.truth.Truth.assertThat
|
|
import com.google.common.truth.Truth.assertWithMessage
|
|
import java.util.concurrent.CountDownLatch
|
|
import org.junit.After
|
|
import org.junit.Before
|
|
import org.junit.Test
|
|
import org.junit.runner.RunWith
|
|
|
|
/** Tests to verify that folder icons are loaded with appropriate resolution */
|
|
@SmallTest
|
|
@RunWith(AndroidJUnit4::class)
|
|
class FolderIconLoadTest {
|
|
private lateinit var modelHelper: LauncherModelHelper
|
|
|
|
private val uniqueActivities =
|
|
listOf(
|
|
TEST_ACTIVITY,
|
|
TEST_ACTIVITY2,
|
|
TEST_ACTIVITY3,
|
|
TEST_ACTIVITY4,
|
|
TEST_ACTIVITY5,
|
|
TEST_ACTIVITY6,
|
|
TEST_ACTIVITY7,
|
|
TEST_ACTIVITY8,
|
|
TEST_ACTIVITY9,
|
|
TEST_ACTIVITY10,
|
|
TEST_ACTIVITY11,
|
|
TEST_ACTIVITY12,
|
|
TEST_ACTIVITY13,
|
|
TEST_ACTIVITY14
|
|
)
|
|
|
|
@Before
|
|
fun setUp() {
|
|
modelHelper = LauncherModelHelper()
|
|
}
|
|
|
|
@After
|
|
@Throws(Exception::class)
|
|
fun tearDown() {
|
|
modelHelper.destroy()
|
|
TestUtil.uninstallDummyApp()
|
|
}
|
|
|
|
@Test
|
|
@Throws(Exception::class)
|
|
fun folderLoadedWithHighRes_2x2() {
|
|
val items = setupAndLoadFolder(4)
|
|
assertThat(items.size).isEqualTo(4)
|
|
verifyHighRes(items, 0, 1, 2, 3)
|
|
}
|
|
|
|
@Test
|
|
@Throws(Exception::class)
|
|
fun folderLoadedWithHighRes_3x2() {
|
|
val items = setupAndLoadFolder(6)
|
|
assertThat(items.size).isEqualTo(6)
|
|
verifyHighRes(items, 0, 1, 3, 4)
|
|
verifyLowRes(items, 2, 5)
|
|
}
|
|
|
|
@Test
|
|
@Throws(Exception::class)
|
|
fun folderLoadedWithHighRes_max_3x3() {
|
|
val idp = LauncherAppState.getIDP(modelHelper.sandboxContext)
|
|
idp.numFolderColumns = intArrayOf(3, 3, 3, 3)
|
|
idp.numFolderRows = intArrayOf(3, 3, 3, 3)
|
|
recreateSupportedDeviceProfiles()
|
|
|
|
val items = setupAndLoadFolder(14)
|
|
verifyHighRes(items, 0, 1, 3, 4)
|
|
verifyLowRes(items, 2, 5, 6, 7, 8, 9, 10, 11, 12, 13)
|
|
}
|
|
|
|
@Test
|
|
@Throws(Exception::class)
|
|
fun folderLoadedWithHighRes_max_4x4() {
|
|
val idp = LauncherAppState.getIDP(modelHelper.sandboxContext)
|
|
idp.numFolderColumns = intArrayOf(4, 4, 4, 4)
|
|
idp.numFolderRows = intArrayOf(4, 4, 4, 4)
|
|
recreateSupportedDeviceProfiles()
|
|
|
|
val items = setupAndLoadFolder(14)
|
|
verifyHighRes(items, 0, 1, 4, 5)
|
|
verifyLowRes(items, 2, 3, 6, 7, 8, 9, 10, 11, 12, 13)
|
|
}
|
|
|
|
@Test
|
|
@Throws(Exception::class)
|
|
fun folderLoadedWithHighRes_differentFolderConfigurations() {
|
|
val idp = LauncherAppState.getIDP(modelHelper.sandboxContext)
|
|
idp.numFolderColumns = intArrayOf(4, 3, 4, 4)
|
|
idp.numFolderRows = intArrayOf(4, 3, 4, 4)
|
|
recreateSupportedDeviceProfiles()
|
|
|
|
val items = setupAndLoadFolder(14)
|
|
verifyHighRes(items, 0, 1, 3, 4, 5)
|
|
verifyLowRes(items, 2, 6, 7, 8, 9, 10, 11, 12, 13)
|
|
}
|
|
|
|
@Throws(Exception::class)
|
|
private fun setupAndLoadFolder(itemCount: Int): ArrayList<WorkspaceItemInfo> {
|
|
val builder =
|
|
LauncherLayoutBuilder()
|
|
.atWorkspace(0, 0, 1)
|
|
.putFolder("Sample")
|
|
.apply {
|
|
for (i in 0..itemCount - 1) this.addApp(TEST_PACKAGE, uniqueActivities[i])
|
|
}
|
|
.build()
|
|
|
|
modelHelper.setupDefaultLayoutProvider(builder)
|
|
modelHelper.loadModelSync()
|
|
|
|
// The first load initializes the DB, load again so that icons are now used from the DB
|
|
// Wait for the icon cache to be updated and then reload
|
|
val app = LauncherAppState.getInstance(modelHelper.sandboxContext)
|
|
val cache = app.iconCache
|
|
while (cache.isIconUpdateInProgress) {
|
|
val wait = CountDownLatch(1)
|
|
Executors.MODEL_EXECUTOR.handler.postDelayed({ wait.countDown() }, 10)
|
|
wait.await()
|
|
}
|
|
TestUtil.runOnExecutorSync(Executors.MODEL_EXECUTOR) { cache.clearMemoryCache() }
|
|
// Reload again with correct icon state
|
|
app.model.forceReload()
|
|
modelHelper.loadModelSync()
|
|
val folders = modelHelper.getBgDataModel().folders
|
|
|
|
assertThat(folders.size()).isEqualTo(1)
|
|
assertThat(folders.valueAt(0).contents.size).isEqualTo(itemCount)
|
|
return folders.valueAt(0).contents
|
|
}
|
|
|
|
private fun verifyHighRes(items: ArrayList<WorkspaceItemInfo>, vararg indices: Int) {
|
|
for (index in indices) {
|
|
assertWithMessage("Index $index was not highRes")
|
|
.that(items[index].bitmap.isNullOrLowRes)
|
|
.isFalse()
|
|
}
|
|
}
|
|
|
|
private fun verifyLowRes(items: ArrayList<WorkspaceItemInfo>, vararg indices: Int) {
|
|
for (index in indices) {
|
|
assertWithMessage("Index $index was not lowRes")
|
|
.that(items[index].bitmap.isNullOrLowRes)
|
|
.isTrue()
|
|
}
|
|
}
|
|
|
|
/** Recreate DeviceProfiles after changing InvariantDeviceProfile */
|
|
private fun recreateSupportedDeviceProfiles() {
|
|
LauncherAppState.getIDP(modelHelper.sandboxContext).supportedProfiles =
|
|
LauncherAppState.getIDP(modelHelper.sandboxContext).supportedProfiles.map {
|
|
it.copy(modelHelper.sandboxContext)
|
|
}
|
|
}
|
|
}
|