Merge "Fix crash of resource not found for grid options" into main
diff --git a/src/com/android/customization/model/grid/DefaultShapeGridManager.kt b/src/com/android/customization/model/grid/DefaultShapeGridManager.kt
index 6f20dd3..f8b0c3a 100644
--- a/src/com/android/customization/model/grid/DefaultShapeGridManager.kt
+++ b/src/com/android/customization/model/grid/DefaultShapeGridManager.kt
@@ -18,7 +18,9 @@
import android.content.ContentValues
import android.content.Context
+import android.content.res.Resources
import android.graphics.drawable.Drawable
+import android.util.Log
import androidx.core.content.res.ResourcesCompat
import com.android.wallpaper.R
import com.android.wallpaper.picker.di.modules.BackgroundDispatcher
@@ -156,15 +158,26 @@
)
}
- override fun getGridOptionDrawble(iconId: Int): Drawable? {
- return ResourcesCompat.getDrawable(
- context.packageManager.getResourcesForApplication(APP_RESOURCES_PACKAGE_NAME),
- iconId,
- /* theme = */ null,
- )
+ override fun getGridOptionDrawable(iconId: Int): Drawable? {
+ try {
+ val drawable =
+ ResourcesCompat.getDrawable(
+ context.packageManager.getResourcesForApplication(APP_RESOURCES_PACKAGE_NAME),
+ iconId,
+ /* theme = */ null,
+ )
+ return drawable
+ } catch (exception: Resources.NotFoundException) {
+ Log.w(
+ TAG,
+ "Unable to find drawable resource from package $APP_RESOURCES_PACKAGE_NAME with resource ID $iconId",
+ )
+ return null
+ }
}
companion object {
+ const val TAG = "DefaultShapeGridManager"
const val SHAPE_OPTIONS: String = "shape_options"
const val GRID_OPTIONS: String = "list_options"
const val SHAPE_GRID: String = "default_grid"
diff --git a/src/com/android/customization/model/grid/ShapeGridManager.kt b/src/com/android/customization/model/grid/ShapeGridManager.kt
index 7a74b8d..7699783 100644
--- a/src/com/android/customization/model/grid/ShapeGridManager.kt
+++ b/src/com/android/customization/model/grid/ShapeGridManager.kt
@@ -26,5 +26,5 @@
fun applyShapeGridOption(shapeKey: String, gridKey: String): Int
- fun getGridOptionDrawble(iconId: Int): Drawable?
+ fun getGridOptionDrawable(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 84462ad..93a2d01 100644
--- a/src/com/android/customization/picker/grid/data/repository/ShapeGridRepository.kt
+++ b/src/com/android/customization/picker/grid/data/repository/ShapeGridRepository.kt
@@ -72,6 +72,6 @@
}
fun getGridOptionDrawable(iconId: Int): Drawable? {
- return manager.getGridOptionDrawble(iconId)
+ return manager.getGridOptionDrawable(iconId)
}
}
diff --git a/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModel.kt b/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModel.kt
index ce97154..fe1c6f8 100644
--- a/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModel.kt
+++ b/src/com/android/wallpaper/customization/ui/viewmodel/ShapeGridPickerViewModel.kt
@@ -17,11 +17,14 @@
package com.android.wallpaper.customization.ui.viewmodel
import android.content.Context
+import android.content.res.Resources
import android.graphics.drawable.Drawable
+import com.android.customization.model.ResourceConstants
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.ShapeIconViewModel
+import com.android.customization.widget.GridTileDrawable
import com.android.themepicker.R
import com.android.wallpaper.picker.common.icon.ui.viewmodel.Icon
import com.android.wallpaper.picker.common.text.ui.viewmodel.Text
@@ -186,6 +189,21 @@
}
private fun toGridOptionItemViewModel(option: GridOptionModel): OptionItemViewModel2<Drawable> {
+ // Fallback to use GridTileDrawable when no resource found for the icon ID
+ val drawable =
+ interactor.getGridOptionDrawable(option.iconId)
+ ?: GridTileDrawable(
+ option.cols,
+ option.rows,
+ context.resources.getString(
+ Resources.getSystem()
+ .getIdentifier(
+ ResourceConstants.CONFIG_ICON_MASK,
+ "string",
+ ResourceConstants.ANDROID_PACKAGE,
+ )
+ ),
+ )
val isSelected =
previewingGridKey
.map { it == option.key }
@@ -194,10 +212,9 @@
started = SharingStarted.Lazily,
initialValue = false,
)
-
return OptionItemViewModel2(
key = MutableStateFlow(option.key),
- payload = interactor.getGridOptionDrawable(option.iconId),
+ payload = drawable,
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 0166cc0..b39988a 100644
--- a/tests/common/src/com/android/customization/model/grid/FakeShapeGridManager.kt
+++ b/tests/common/src/com/android/customization/model/grid/FakeShapeGridManager.kt
@@ -42,7 +42,7 @@
return 0
}
- override fun getGridOptionDrawble(iconId: Int): Drawable? {
+ override fun getGridOptionDrawable(iconId: Int): Drawable? {
return when (iconId) {
0 -> gridOptionDrawable0
1 -> gridOptionDrawable1