Use grid icon ID passed from the launcher

Use the icon resources from the launcher app

Test: Manually tested. See bug.
Fixes: 393921872
Bug: 348664593
Flag: com.android.systemui.shared.new_customization_picker_ui
Change-Id: I6119e54594e6b7be1732bd48695df7ec7a299bff
diff --git a/src/com/android/customization/model/grid/DefaultShapeGridManager.kt b/src/com/android/customization/model/grid/DefaultShapeGridManager.kt
index e2bccb7..6f20dd3 100644
--- a/src/com/android/customization/model/grid/DefaultShapeGridManager.kt
+++ b/src/com/android/customization/model/grid/DefaultShapeGridManager.kt
@@ -18,6 +18,8 @@
 
 import android.content.ContentValues
 import android.content.Context
+import android.graphics.drawable.Drawable
+import androidx.core.content.res.ResourcesCompat
 import com.android.wallpaper.R
 import com.android.wallpaper.picker.di.modules.BackgroundDispatcher
 import com.android.wallpaper.util.PreviewUtils
@@ -71,6 +73,10 @@
                                                     .toBoolean(),
                                             rows = rows,
                                             cols = cols,
+                                            iconId =
+                                                cursor.getInt(
+                                                    cursor.getColumnIndex(KEY_GRID_ICON_ID)
+                                                ),
                                         )
                                     )
                                 }
@@ -85,6 +91,7 @@
                                 }
                                 list
                             }
+                            .sortedByDescending { it.rows * it.cols }
                     }
             } else {
                 null
@@ -149,6 +156,14 @@
         )
     }
 
+    override fun getGridOptionDrawble(iconId: Int): Drawable? {
+        return ResourcesCompat.getDrawable(
+            context.packageManager.getResourcesForApplication(APP_RESOURCES_PACKAGE_NAME),
+            iconId,
+            /* theme = */ null,
+        )
+    }
+
     companion object {
         const val SHAPE_OPTIONS: String = "shape_options"
         const val GRID_OPTIONS: String = "list_options"
@@ -162,5 +177,8 @@
         const val COL_COLS: String = "cols"
         const val COL_IS_DEFAULT: String = "is_default"
         const val COL_PATH: String = "path"
+        const val KEY_GRID_ICON_ID: String = "grid_icon_id"
+        private const val APP_RESOURCES_PACKAGE_NAME: String =
+            "com.google.android.apps.nexuslauncher"
     }
 }
diff --git a/src/com/android/customization/model/grid/GridOptionModel.kt b/src/com/android/customization/model/grid/GridOptionModel.kt
index 3e10a01..d2bf4a5 100644
--- a/src/com/android/customization/model/grid/GridOptionModel.kt
+++ b/src/com/android/customization/model/grid/GridOptionModel.kt
@@ -22,4 +22,5 @@
     val isCurrent: Boolean,
     val rows: Int,
     val cols: Int,
+    val iconId: Int,
 )
diff --git a/src/com/android/customization/model/grid/ShapeGridManager.kt b/src/com/android/customization/model/grid/ShapeGridManager.kt
index 0a23346..7a74b8d 100644
--- a/src/com/android/customization/model/grid/ShapeGridManager.kt
+++ b/src/com/android/customization/model/grid/ShapeGridManager.kt
@@ -16,6 +16,8 @@
 
 package com.android.customization.model.grid
 
+import android.graphics.drawable.Drawable
+
 interface ShapeGridManager {
 
     suspend fun getGridOptions(): List<GridOptionModel>?
@@ -23,4 +25,6 @@
     suspend fun getShapeOptions(): List<ShapeOptionModel>?
 
     fun applyShapeGridOption(shapeKey: String, gridKey: String): Int
+
+    fun getGridOptionDrawble(iconId: Int): Drawable?
 }
diff --git a/src/com/android/customization/picker/grid/data/repository/ShapeGridRepository.kt b/src/com/android/customization/picker/grid/data/repository/ShapeGridRepository.kt
index 86c455e..84462ad 100644
--- a/src/com/android/customization/picker/grid/data/repository/ShapeGridRepository.kt
+++ b/src/com/android/customization/picker/grid/data/repository/ShapeGridRepository.kt
@@ -17,6 +17,7 @@
 
 package com.android.customization.picker.grid.data.repository
 
+import android.graphics.drawable.Drawable
 import com.android.customization.model.grid.GridOptionModel
 import com.android.customization.model.grid.ShapeGridManager
 import com.android.customization.model.grid.ShapeOptionModel
@@ -69,4 +70,8 @@
             _gridOptions.value = manager.getGridOptions()
             _shapeOptions.value = manager.getShapeOptions()
         }
+
+    fun getGridOptionDrawable(iconId: Int): Drawable? {
+        return manager.getGridOptionDrawble(iconId)
+    }
 }
diff --git a/src/com/android/customization/picker/grid/domain/interactor/ShapeGridInteractor.kt b/src/com/android/customization/picker/grid/domain/interactor/ShapeGridInteractor.kt
index 8c4522e..59eda52 100644
--- a/src/com/android/customization/picker/grid/domain/interactor/ShapeGridInteractor.kt
+++ b/src/com/android/customization/picker/grid/domain/interactor/ShapeGridInteractor.kt
@@ -17,6 +17,7 @@
 
 package com.android.customization.picker.grid.domain.interactor
 
+import android.graphics.drawable.Drawable
 import com.android.customization.picker.grid.data.repository.ShapeGridRepository
 import javax.inject.Inject
 import javax.inject.Singleton
@@ -34,4 +35,6 @@
 
     suspend fun applySelectedOption(shapeKey: String, gridKey: String) =
         repository.applySelectedOption(shapeKey, gridKey)
+
+    fun getGridOptionDrawable(iconId: Int): Drawable? = repository.getGridOptionDrawable(iconId)
 }
diff --git a/src/com/android/wallpaper/customization/ui/binder/ShapeGridFloatingSheetBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ShapeGridFloatingSheetBinder.kt
index af5b20d..07ea804 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ShapeGridFloatingSheetBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ShapeGridFloatingSheetBinder.kt
@@ -18,6 +18,7 @@
 
 import android.animation.ValueAnimator
 import android.content.Context
+import android.graphics.drawable.Drawable
 import android.view.View
 import android.view.ViewGroup
 import android.view.ViewTreeObserver.OnGlobalLayoutListener
@@ -31,8 +32,6 @@
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.android.customization.picker.common.ui.view.SingleRowListItemSpacing
-import com.android.customization.picker.grid.ui.binder.GridIconViewBinder
-import com.android.customization.picker.grid.ui.viewmodel.GridIconViewModel
 import com.android.customization.picker.grid.ui.viewmodel.ShapeIconViewModel
 import com.android.themepicker.R
 import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption.APP_SHAPE_GRID
@@ -286,14 +285,14 @@
         shouldAnimateColor: () -> Boolean,
         lifecycleOwner: LifecycleOwner,
         backgroundDispatcher: CoroutineDispatcher,
-    ): OptionItemAdapter2<GridIconViewModel> =
+    ): OptionItemAdapter2<Drawable> =
         OptionItemAdapter2(
             layoutResourceId = R.layout.grid_option2,
             lifecycleOwner = lifecycleOwner,
             backgroundDispatcher = backgroundDispatcher,
-            bindPayload = { view: View, gridIcon: GridIconViewModel ->
+            bindPayload = { view: View, gridIcon: Drawable ->
                 val imageView = view.findViewById(R.id.foreground) as? ImageView
-                imageView?.let { GridIconViewBinder.bind(imageView, gridIcon) }
+                imageView?.setImageDrawable(gridIcon)
                 return@OptionItemAdapter2 null
             },
             colorUpdateViewModel = WeakReference(colorUpdateViewModel),
@@ -302,7 +301,7 @@
 
     private fun RecyclerView.initGridOptionList(
         context: Context,
-        adapter: OptionItemAdapter2<GridIconViewModel>,
+        adapter: OptionItemAdapter2<Drawable>,
     ) {
         apply {
             this.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
diff --git a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
index 3016299..b44b152 100644
--- a/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
+++ b/src/com/android/wallpaper/customization/ui/binder/ThemePickerCustomizationOptionBinder.kt
@@ -37,7 +37,6 @@
 import com.android.customization.picker.color.ui.binder.ColorOptionIconBinder2
 import com.android.customization.picker.color.ui.view.ColorOptionIconView2
 import com.android.customization.picker.color.ui.viewmodel.ColorOptionIconViewModel
-import com.android.customization.picker.grid.ui.binder.GridIconViewBinder
 import com.android.customization.picker.settings.ui.binder.ColorContrastSectionViewBinder2
 import com.android.systemui.plugins.clocks.ClockFontAxisSetting
 import com.android.systemui.plugins.clocks.ClockPreviewConfig
@@ -273,12 +272,7 @@
                     optionsViewModel.shapeGridPickerViewModel.selectedGridOption.collect {
                         gridOption ->
                         TextViewBinder.bind(optionShapeGridDescription, gridOption.text)
-                        gridOption.payload?.let { gridIconViewModel ->
-                            GridIconViewBinder.bind(
-                                view = optionShapeGridIcon,
-                                viewModel = gridIconViewModel,
-                            )
-                        }
+                        gridOption.payload?.let { optionShapeGridIcon.setImageDrawable(it) }
                     }
                 }
 
diff --git a/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModel.kt b/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModel.kt
index 60b5c35..ce97154 100644
--- a/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModel.kt
+++ b/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModel.kt
@@ -17,12 +17,10 @@
 package com.android.wallpaper.customization.ui.viewmodel
 
 import android.content.Context
-import android.content.res.Resources
-import com.android.customization.model.ResourceConstants
+import android.graphics.drawable.Drawable
 import com.android.customization.model.grid.GridOptionModel
 import com.android.customization.model.grid.ShapeOptionModel
 import com.android.customization.picker.grid.domain.interactor.ShapeGridInteractor
-import com.android.customization.picker.grid.ui.viewmodel.GridIconViewModel
 import com.android.customization.picker.grid.ui.viewmodel.ShapeIconViewModel
 import com.android.themepicker.R
 import com.android.wallpaper.picker.common.icon.ui.viewmodel.Icon
@@ -50,7 +48,7 @@
 @AssistedInject
 constructor(
     @ApplicationContext private val context: Context,
-    interactor: ShapeGridInteractor,
+    private val interactor: ShapeGridInteractor,
     @Assisted private val viewModelScope: CoroutineScope,
 ) {
 
@@ -126,7 +124,7 @@
             overridingGridOptionKey ?: selectedGridOption.key.value
         }
 
-    val gridOptions: Flow<List<OptionItemViewModel2<GridIconViewModel>>> =
+    val gridOptions: Flow<List<OptionItemViewModel2<Drawable>>> =
         interactor.gridOptions
             .filterNotNull()
             .map { gridOptions -> gridOptions.map { toGridOptionItemViewModel(it) } }
@@ -187,18 +185,7 @@
         )
     }
 
-    private fun toGridOptionItemViewModel(
-        option: GridOptionModel
-    ): OptionItemViewModel2<GridIconViewModel> {
-        val iconShapePath =
-            context.resources.getString(
-                Resources.getSystem()
-                    .getIdentifier(
-                        ResourceConstants.CONFIG_ICON_MASK,
-                        "string",
-                        ResourceConstants.ANDROID_PACKAGE,
-                    )
-            )
+    private fun toGridOptionItemViewModel(option: GridOptionModel): OptionItemViewModel2<Drawable> {
         val isSelected =
             previewingGridKey
                 .map { it == option.key }
@@ -210,8 +197,7 @@
 
         return OptionItemViewModel2(
             key = MutableStateFlow(option.key),
-            payload =
-                GridIconViewModel(columns = option.cols, rows = option.rows, path = iconShapePath),
+            payload = interactor.getGridOptionDrawable(option.iconId),
             text = Text.Loaded(option.title),
             isSelected = isSelected,
             onClicked =
diff --git a/tests/common/src/com/android/customization/model/grid/FakeShapeGridManager.kt b/tests/common/src/com/android/customization/model/grid/FakeShapeGridManager.kt
index b1f044a..6269fee 100644
--- a/tests/common/src/com/android/customization/model/grid/FakeShapeGridManager.kt
+++ b/tests/common/src/com/android/customization/model/grid/FakeShapeGridManager.kt
@@ -16,12 +16,18 @@
 
 package com.android.customization.model.grid
 
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.graphics.drawable.Drawable
 import javax.inject.Inject
 import javax.inject.Singleton
 
 @Singleton
 class FakeShapeGridManager @Inject constructor() : ShapeGridManager {
 
+    val gridOptionDrawable0: Drawable = ColorDrawable(Color.BLUE)
+    val gridOptionDrawable1: Drawable = ColorDrawable(Color.GREEN)
+
     private var gridOptions: List<GridOptionModel>? = DEFAULT_GRID_OPTION_LIST
 
     private var shapeOptions: List<ShapeOptionModel>? = DEFAULT_SHAPE_OPTION_LIST
@@ -36,6 +42,14 @@
         return 0
     }
 
+    override fun getGridOptionDrawble(iconId: Int): Drawable? {
+        return when (iconId) {
+            0 -> gridOptionDrawable0
+            1 -> gridOptionDrawable1
+            else -> null
+        }
+    }
+
     companion object {
         val DEFAULT_GRID_OPTION_LIST =
             listOf(
@@ -45,6 +59,7 @@
                     isCurrent = true,
                     rows = 5,
                     cols = 5,
+                    iconId = 0,
                 ),
                 GridOptionModel(
                     key = "practical",
@@ -52,6 +67,7 @@
                     isCurrent = false,
                     rows = 5,
                     cols = 4,
+                    iconId = 1,
                 ),
             )
 
diff --git a/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModelTest.kt b/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModelTest.kt
index 2bca39c..0bf5125 100644
--- a/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModelTest.kt
+++ b/tests/robotests/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModelTest.kt
@@ -17,13 +17,10 @@
 package com.android.wallpaper.customization.ui.viewmodel
 
 import android.content.Context
-import android.content.res.Resources
-import androidx.test.core.app.ApplicationProvider
+import android.graphics.drawable.Drawable
 import androidx.test.filters.SmallTest
-import com.android.customization.model.ResourceConstants
 import com.android.customization.model.grid.FakeShapeGridManager
 import com.android.customization.picker.grid.domain.interactor.ShapeGridInteractor
-import com.android.customization.picker.grid.ui.viewmodel.GridIconViewModel
 import com.android.customization.picker.grid.ui.viewmodel.ShapeIconViewModel
 import com.android.wallpaper.picker.common.text.ui.viewmodel.Text
 import com.android.wallpaper.picker.option.ui.viewmodel.OptionItemViewModel2
@@ -57,18 +54,6 @@
     @Inject lateinit var interactor: ShapeGridInteractor
     @Inject @ApplicationContext lateinit var appContext: Context
 
-    private val iconShapePath =
-        ApplicationProvider.getApplicationContext<Context>()
-            .resources
-            .getString(
-                Resources.getSystem()
-                    .getIdentifier(
-                        ResourceConstants.CONFIG_ICON_MASK,
-                        "string",
-                        ResourceConstants.ANDROID_PACKAGE,
-                    )
-            )
-
     private lateinit var underTest: ShapeGridPickerViewModel
 
     @Before
@@ -162,7 +147,7 @@
             assertGridItem(
                 optionItem = selectedGridOption(),
                 key = "normal",
-                payload = GridIconViewModel(5, 5, iconShapePath),
+                payload = gridOptionsManager.gridOptionDrawable0,
                 text = Text.Loaded("5x5"),
                 isTextUserVisible = true,
                 isSelected = true,
@@ -186,7 +171,7 @@
             assertGridItem(
                 optionItem = selectedGridOption(),
                 key = "practical",
-                payload = GridIconViewModel(4, 5, iconShapePath),
+                payload = gridOptionsManager.gridOptionDrawable1,
                 text = Text.Loaded("4x5"),
                 isTextUserVisible = true,
                 isSelected = true,
@@ -202,7 +187,7 @@
             assertGridItem(
                 optionItem = optionItems()?.get(0),
                 key = "normal",
-                payload = GridIconViewModel(5, 5, iconShapePath),
+                payload = gridOptionsManager.gridOptionDrawable0,
                 text = Text.Loaded("5x5"),
                 isTextUserVisible = true,
                 isSelected = true,
@@ -211,7 +196,7 @@
             assertGridItem(
                 optionItem = optionItems()?.get(1),
                 key = "practical",
-                payload = GridIconViewModel(4, 5, iconShapePath),
+                payload = gridOptionsManager.gridOptionDrawable1,
                 text = Text.Loaded("4x5"),
                 isTextUserVisible = true,
                 isSelected = false,
@@ -232,7 +217,7 @@
             assertGridItem(
                 optionItem = optionItems()?.get(0),
                 key = "normal",
-                payload = GridIconViewModel(5, 5, iconShapePath),
+                payload = gridOptionsManager.gridOptionDrawable0,
                 text = Text.Loaded("5x5"),
                 isTextUserVisible = true,
                 isSelected = false,
@@ -241,7 +226,7 @@
             assertGridItem(
                 optionItem = optionItems()?.get(1),
                 key = "practical",
-                payload = GridIconViewModel(4, 5, iconShapePath),
+                payload = gridOptionsManager.gridOptionDrawable1,
                 text = Text.Loaded("4x5"),
                 isTextUserVisible = true,
                 isSelected = true,
@@ -268,9 +253,9 @@
     }
 
     private fun TestScope.assertGridItem(
-        optionItem: OptionItemViewModel2<GridIconViewModel>?,
+        optionItem: OptionItemViewModel2<Drawable>?,
         key: String,
-        payload: GridIconViewModel?,
+        payload: Drawable?,
         text: Text,
         isTextUserVisible: Boolean,
         isSelected: Boolean,