Files
Lawnchair/tests/multivalentTests/src/com/android/launcher3/widget/GeneratedPreviewTest.kt
T
Shamali P 4cb6ff3838 Pass device profile as constructor arg to DatabaseWidgetPreviewLoader
This is so, we can use it with compose, and let caller pass the needed
dependencies. May also convert to dagger in
 followup

Bug: 408283627
Flag: EXEMPT BUGFIX
Test: N/A
Change-Id: I9b04011ec2592df3bd02bd74ec4889eb05928e7f
2025-05-16 11:47:18 -07:00

137 lines
5.3 KiB
Kotlin

package com.android.launcher3.widget
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProviderInfo
import android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN
import android.content.ComponentName
import android.content.Context
import android.content.pm.ActivityInfo
import android.content.pm.ApplicationInfo
import android.platform.test.annotations.RequiresFlagsEnabled
import android.platform.test.flag.junit.CheckFlagsRule
import android.platform.test.flag.junit.DeviceFlagsValueProvider
import android.view.ContextThemeWrapper
import android.view.LayoutInflater
import android.widget.RemoteViews
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.Flags.FLAG_ENABLE_GENERATED_PREVIEWS
import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.R
import com.android.launcher3.icons.IconCache
import com.android.launcher3.model.WidgetItem
import com.android.launcher3.util.ActivityContextWrapper
import com.android.launcher3.util.Executors
import com.android.launcher3.util.Executors.MAIN_EXECUTOR
import com.android.launcher3.util.SandboxApplication
import com.android.launcher3.util.TestUtil
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
import org.mockito.kotlin.any
import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.whenever
@SmallTest
@RunWith(AndroidJUnit4::class)
@RequiresFlagsEnabled(FLAG_ENABLE_GENERATED_PREVIEWS)
class GeneratedPreviewTest {
@get:Rule val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
private val providerName =
ComponentName(
getInstrumentation().context.packageName,
"com.android.launcher3.testcomponent.AppWidgetNoConfig",
)
private val generatedPreviewLayout =
getInstrumentation().context.run {
resources.getIdentifier("test_layout_appwidget_blue", "layout", packageName)
}
@get:Rule val context = SandboxApplication()
private lateinit var uiContext: Context
private lateinit var generatedPreview: RemoteViews
private lateinit var widgetCell: WidgetCell
private lateinit var appWidgetProviderInfo: LauncherAppWidgetProviderInfo
private lateinit var widgetItem: WidgetItem
private lateinit var idp: InvariantDeviceProfile
@Mock lateinit var iconCache: IconCache
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
generatedPreview = RemoteViews(context.packageName, generatedPreviewLayout)
uiContext =
ActivityContextWrapper(ContextThemeWrapper(context, R.style.WidgetContainerTheme))
idp = InvariantDeviceProfile.INSTANCE[uiContext]
widgetCell =
LayoutInflater.from(uiContext).inflate(R.layout.widget_cell, null) as WidgetCell
appWidgetProviderInfo =
AppWidgetProviderInfo()
.apply {
generatedPreviewCategories = WIDGET_CATEGORY_HOME_SCREEN
provider = providerName
providerInfo = ActivityInfo().apply { applicationInfo = ApplicationInfo() }
}
.let { LauncherAppWidgetProviderInfo.fromProviderInfo(context, it) }
val widgetManager = context.spyService(AppWidgetManager::class.java)
doAnswer { i ->
generatedPreview.takeIf {
i.arguments[0] == appWidgetProviderInfo.provider &&
i.arguments[1] == appWidgetProviderInfo.user &&
i.arguments[2] == WIDGET_CATEGORY_HOME_SCREEN
}
}
.whenever(widgetManager)
.getWidgetPreview(any(), any(), any())
createWidgetItem()
}
@After
fun tearDown() {
context.destroy()
}
private fun createWidgetItem() {
Executors.MODEL_EXECUTOR.submit {
widgetItem = WidgetItem(appWidgetProviderInfo, idp, iconCache, context)
}
.get()
}
@Test
fun widgetItem_hasGeneratedPreview_noPreview() {
appWidgetProviderInfo.generatedPreviewCategories = 0
createWidgetItem()
val preview =
DatabaseWidgetPreviewLoader(uiContext, idp.getDeviceProfile(uiContext))
.generatePreviewInfoBg(widgetItem, 1, 1)
assertThat(preview.remoteViews).isNull()
}
@Test
fun widgetItem_getGeneratedPreview() {
val preview =
DatabaseWidgetPreviewLoader(uiContext, idp.getDeviceProfile(uiContext))
.generatePreviewInfoBg(widgetItem, 1, 1)
assertThat(preview.remoteViews).isEqualTo(generatedPreview)
}
@Test
fun widgetCell_showGeneratedPreview() {
widgetCell.applyFromCellItem(widgetItem)
TestUtil.runOnExecutorSync(DatabaseWidgetPreviewLoader.getLoaderExecutor()) {}
TestUtil.runOnExecutorSync(MAIN_EXECUTOR) {}
assertThat(widgetCell.appWidgetHostViewPreview).isNotNull()
assertThat(widgetCell.appWidgetHostViewPreview?.appWidgetInfo)
.isEqualTo(appWidgetProviderInfo)
}
}