Files
Lawnchair/tests/multivalentTests/src/com/android/launcher3/util/LauncherBindableItemsContainerTest.kt
Sunny Goyal 476d926972 Simplifying some view iteration methods
Bug: 393703968
Flag: EXEMPT refactor
Test: Presubmit
Change-Id: Ieffa3a66fbf8595d542995c348df578a3aec9083
2025-03-04 10:39:55 -08:00

139 lines
5.5 KiB
Kotlin

/*
* Copyright (C) 2025 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.util
import android.content.ComponentName
import android.content.pm.LauncherApps
import android.graphics.Bitmap
import android.graphics.Bitmap.Config.ARGB_8888
import android.os.Process.myUserHandle
import android.platform.uiautomatorhelpers.DeviceHelpers.context
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.launcher3.BubbleTextView
import com.android.launcher3.graphics.PreloadIconDrawable
import com.android.launcher3.icons.BitmapInfo
import com.android.launcher3.icons.FastBitmapDrawable
import com.android.launcher3.icons.PlaceHolderIconDrawable
import com.android.launcher3.model.data.AppInfo
import com.android.launcher3.model.data.AppInfo.makeLaunchIntent
import com.android.launcher3.model.data.ItemInfo
import com.android.launcher3.model.data.WorkspaceItemInfo
import com.android.launcher3.pm.PackageInstallInfo
import com.android.launcher3.util.Executors.MAIN_EXECUTOR
import com.android.launcher3.util.LauncherBindableItemsContainer.ItemOperator
import com.android.launcher3.util.LauncherModelHelper.TEST_ACTIVITY
import com.android.launcher3.util.LauncherModelHelper.TEST_ACTIVITY2
import com.android.launcher3.util.LauncherModelHelper.TEST_ACTIVITY3
import com.android.launcher3.util.LauncherModelHelper.TEST_PACKAGE
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
class LauncherBindableItemsContainerTest {
private val icon1 by lazy { getLAI(TEST_ACTIVITY) }
private val icon2 by lazy { getLAI(TEST_ACTIVITY2) }
private val icon3 by lazy { getLAI(TEST_ACTIVITY3) }
private val container = TestContainer()
@Test
fun `icon bitmap is updated`() {
container.addIcon(icon1)
container.addIcon(icon2)
container.addIcon(icon3)
assertThat(container.getAppIcon(icon1).icon)
.isInstanceOf(PlaceHolderIconDrawable::class.java)
assertThat(container.getAppIcon(icon2).icon)
.isInstanceOf(PlaceHolderIconDrawable::class.java)
assertThat(container.getAppIcon(icon3).icon)
.isInstanceOf(PlaceHolderIconDrawable::class.java)
icon2.bitmap = BitmapInfo.fromBitmap(Bitmap.createBitmap(200, 200, ARGB_8888))
TestUtil.runOnExecutorSync(MAIN_EXECUTOR) {
container.updateContainerItems(setOf(icon2), container)
}
assertThat(container.getAppIcon(icon1).icon)
.isInstanceOf(PlaceHolderIconDrawable::class.java)
assertThat(container.getAppIcon(icon3).icon)
.isInstanceOf(PlaceHolderIconDrawable::class.java)
assertThat(container.getAppIcon(icon2).icon)
.isNotInstanceOf(PlaceHolderIconDrawable::class.java)
assertThat(container.getAppIcon(icon2).icon).isInstanceOf(FastBitmapDrawable::class.java)
}
@Test
fun `icon download progress updated`() {
container.addIcon(icon1)
container.addIcon(icon2)
assertThat(container.getAppIcon(icon1).icon)
.isInstanceOf(PlaceHolderIconDrawable::class.java)
assertThat(container.getAppIcon(icon2).icon)
.isInstanceOf(PlaceHolderIconDrawable::class.java)
icon1.status = WorkspaceItemInfo.FLAG_RESTORED_ICON
icon1.bitmap = BitmapInfo.fromBitmap(Bitmap.createBitmap(200, 200, ARGB_8888))
icon1.setProgressLevel(30, PackageInstallInfo.STATUS_INSTALLING)
TestUtil.runOnExecutorSync(MAIN_EXECUTOR) {
container.updateContainerItems(setOf(icon1), container)
}
assertThat(container.getAppIcon(icon2).icon)
.isInstanceOf(PlaceHolderIconDrawable::class.java)
assertThat(container.getAppIcon(icon1).icon).isInstanceOf(PreloadIconDrawable::class.java)
val oldIcon = container.getAppIcon(icon1).icon as PreloadIconDrawable
assertThat(oldIcon.level).isEqualTo(30)
}
private fun getLAI(className: String): WorkspaceItemInfo =
AppInfo(
context,
context
.getSystemService(LauncherApps::class.java)!!
.resolveActivity(
makeLaunchIntent(ComponentName(TEST_PACKAGE, className)),
myUserHandle(),
)!!,
myUserHandle(),
)
.makeWorkspaceItem(context)
class TestContainer : ActivityContextWrapper(context), LauncherBindableItemsContainer {
val items = mutableMapOf<ItemInfo, View>()
override fun mapOverItems(op: ItemOperator): View? =
items.firstNotNullOfOrNull { (item, view) ->
if (op.evaluate(item, view)) view else null
}
fun addIcon(info: WorkspaceItemInfo) {
val btv = BubbleTextView(this)
btv.applyFromWorkspaceItem(info)
items[info] = btv
}
fun getAppIcon(info: WorkspaceItemInfo) = items[info] as BubbleTextView
}
}