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,