• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

<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