<lambda>null1 package com.android.launcher3.widget
2
3 import android.appwidget.AppWidgetManager
4 import android.appwidget.AppWidgetProviderInfo
5 import android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN
6 import android.content.ComponentName
7 import android.content.Context
8 import android.content.pm.ActivityInfo
9 import android.content.pm.ApplicationInfo
10 import android.platform.test.annotations.RequiresFlagsEnabled
11 import android.platform.test.flag.junit.CheckFlagsRule
12 import android.platform.test.flag.junit.DeviceFlagsValueProvider
13 import android.view.ContextThemeWrapper
14 import android.view.LayoutInflater
15 import android.widget.RemoteViews
16 import androidx.test.ext.junit.runners.AndroidJUnit4
17 import androidx.test.filters.SmallTest
18 import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
19 import com.android.launcher3.Flags.FLAG_ENABLE_GENERATED_PREVIEWS
20 import com.android.launcher3.R
21 import com.android.launcher3.icons.IconCache
22 import com.android.launcher3.model.WidgetItem
23 import com.android.launcher3.util.ActivityContextWrapper
24 import com.android.launcher3.util.Executors
25 import com.android.launcher3.util.Executors.MAIN_EXECUTOR
26 import com.android.launcher3.util.LauncherModelHelper.SandboxModelContext
27 import com.android.launcher3.util.TestUtil
28 import com.google.common.truth.Truth.assertThat
29 import org.junit.After
30 import org.junit.Before
31 import org.junit.Rule
32 import org.junit.Test
33 import org.junit.runner.RunWith
34 import org.mockito.Mock
35 import org.mockito.MockitoAnnotations
36 import org.mockito.kotlin.any
37 import org.mockito.kotlin.doAnswer
38 import org.mockito.kotlin.whenever
39
40 @SmallTest
41 @RunWith(AndroidJUnit4::class)
42 @RequiresFlagsEnabled(FLAG_ENABLE_GENERATED_PREVIEWS)
43 class GeneratedPreviewTest {
44 @get:Rule val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
45 private val providerName =
46 ComponentName(
47 getInstrumentation().context.packageName,
48 "com.android.launcher3.testcomponent.AppWidgetNoConfig",
49 )
50 private val generatedPreviewLayout =
51 getInstrumentation().context.run {
52 resources.getIdentifier("test_layout_appwidget_blue", "layout", packageName)
53 }
54
55 private lateinit var context: SandboxModelContext
56 private lateinit var uiContext: Context
57 private lateinit var generatedPreview: RemoteViews
58 private lateinit var widgetCell: WidgetCell
59 private lateinit var appWidgetProviderInfo: LauncherAppWidgetProviderInfo
60 private lateinit var widgetItem: WidgetItem
61
62 @Mock lateinit var iconCache: IconCache
63
64 @Before
65 fun setup() {
66 MockitoAnnotations.initMocks(this)
67 context = SandboxModelContext()
68 generatedPreview = RemoteViews(context.packageName, generatedPreviewLayout)
69 uiContext =
70 ActivityContextWrapper(ContextThemeWrapper(context, R.style.WidgetContainerTheme))
71 widgetCell =
72 LayoutInflater.from(uiContext).inflate(R.layout.widget_cell, null) as WidgetCell
73 appWidgetProviderInfo =
74 AppWidgetProviderInfo()
75 .apply {
76 generatedPreviewCategories = WIDGET_CATEGORY_HOME_SCREEN
77 provider = providerName
78 providerInfo = ActivityInfo().apply { applicationInfo = ApplicationInfo() }
79 }
80 .let { LauncherAppWidgetProviderInfo.fromProviderInfo(context, it) }
81
82 val widgetManager = context.spyService(AppWidgetManager::class.java)
83 doAnswer { i ->
84 generatedPreview.takeIf {
85 i.arguments[0] == appWidgetProviderInfo.provider &&
86 i.arguments[1] == appWidgetProviderInfo.user &&
87 i.arguments[2] == WIDGET_CATEGORY_HOME_SCREEN
88 }
89 }
90 .whenever(widgetManager)
91 .getWidgetPreview(any(), any(), any())
92 createWidgetItem()
93 }
94
95 @After
96 fun tearDown() {
97 context.destroy()
98 }
99
100 private fun createWidgetItem() {
101 Executors.MODEL_EXECUTOR.submit {
102 val idp = context.appComponent.idp
103 widgetItem = WidgetItem(appWidgetProviderInfo, idp, iconCache, context)
104 }
105 .get()
106 }
107
108 @Test
109 fun widgetItem_hasGeneratedPreview_noPreview() {
110 appWidgetProviderInfo.generatedPreviewCategories = 0
111 createWidgetItem()
112 val preview = DatabaseWidgetPreviewLoader(uiContext).generatePreviewInfoBg(widgetItem, 1, 1)
113 assertThat(preview.remoteViews).isNull()
114 }
115
116 @Test
117 fun widgetItem_getGeneratedPreview() {
118 val preview = DatabaseWidgetPreviewLoader(uiContext).generatePreviewInfoBg(widgetItem, 1, 1)
119 assertThat(preview.remoteViews).isEqualTo(generatedPreview)
120 }
121
122 @Test
123 fun widgetCell_showGeneratedPreview() {
124 widgetCell.applyFromCellItem(widgetItem)
125 TestUtil.runOnExecutorSync(DatabaseWidgetPreviewLoader.getLoaderExecutor()) {}
126 TestUtil.runOnExecutorSync(MAIN_EXECUTOR) {}
127 assertThat(widgetCell.appWidgetHostViewPreview).isNotNull()
128 assertThat(widgetCell.appWidgetHostViewPreview?.appWidgetInfo)
129 .isEqualTo(appWidgetProviderInfo)
130 }
131 }
132