diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index 1d81cd7af8..591a7ab689 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -223,4 +223,5 @@ Open search provider’s website even if their app is installed. Search Provider Status Bar + Failed to load more icons diff --git a/lawnchair/src/app/lawnchair/icons/CustomIconPack.kt b/lawnchair/src/app/lawnchair/icons/CustomIconPack.kt index b5908f7efe..69796489ee 100644 --- a/lawnchair/src/app/lawnchair/icons/CustomIconPack.kt +++ b/lawnchair/src/app/lawnchair/icons/CustomIconPack.kt @@ -144,29 +144,25 @@ class CustomIconPack(context: Context, packPackageName: String) : emit(ArrayList(result)) } - try { - val parser = getXml("drawable") - while (parser != null && parser.next() != XmlPullParser.END_DOCUMENT) { - if (parser.eventType != XmlPullParser.START_TAG) continue - when (parser.name) { - "category" -> { - endCategory() - currentTitle = parser["title"]!! - } - "item" -> { - val drawableName = parser["drawable"]!! - val resId = getDrawableId(drawableName) - if (resId != 0) { - val item = IconPickerItem(packPackageName, drawableName, drawableName, IconType.Normal) - currentItems.add(item) - } + val parser = getXml("drawable") + while (parser != null && parser.next() != XmlPullParser.END_DOCUMENT) { + if (parser.eventType != XmlPullParser.START_TAG) continue + when (parser.name) { + "category" -> { + endCategory() + currentTitle = parser["title"]!! + } + "item" -> { + val drawableName = parser["drawable"]!! + val resId = getDrawableId(drawableName) + if (resId != 0) { + val item = IconPickerItem(packPackageName, drawableName, drawableName, IconType.Normal) + currentItems.add(item) } } } - endCategory() - } catch (e: Exception) { - } + endCategory() }.flowOn(Dispatchers.IO) private fun getDrawableId(name: String) = idCache.getOrPut(name) { diff --git a/lawnchair/src/app/lawnchair/ui/preferences/IconPickerPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/IconPickerPreference.kt index 327696d648..9e9d8077ed 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/IconPickerPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/IconPickerPreference.kt @@ -39,6 +39,7 @@ import com.google.accompanist.drawablepainter.rememberDrawablePainter import com.google.accompanist.insets.ui.LocalScaffoldPadding import com.google.accompanist.navigation.animation.composable import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.launch import androidx.compose.material.MaterialTheme as Material2Theme @@ -136,7 +137,6 @@ fun IconPickerPreference(packageName: String) { searchQuery = searchQuery, onClickItem = onClickItem, modifier = Modifier - .padding(horizontal = 8.dp) .padding(top = topPadding) ) } @@ -157,7 +157,12 @@ fun IconPickerGrid( onClickItem: (item: IconPickerItem) -> Unit, modifier: Modifier = Modifier ) { - val categories by iconPack.getAllIcons().collectAsState(emptyList()) + var loadFailed by remember { mutableStateOf(false) } + val categoriesFlow = remember { + iconPack.getAllIcons() + .catch { loadFailed = true } + } + val categories by categoriesFlow.collectAsState(emptyList()) val filteredCategories by derivedStateOf { categories .map { it.filter(searchQuery) } @@ -183,15 +188,14 @@ fun IconPickerGrid( modifier = Modifier .fillMaxWidth() .background(MaterialTheme.colorScheme.background) - .padding( - vertical = 16.dp, - horizontal = 8.dp, - ), + .padding(16.dp), style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.primary ) } verticalGridItems( + modifier = Modifier + .padding(horizontal = 8.dp), items = category.items, numColumns = numColumns, gap = 0.dp, @@ -206,6 +210,13 @@ fun IconPickerGrid( } } } + if (loadFailed) { + item { + PreferenceGroupDescription( + description = stringResource(id = R.string.icon_picker_load_failed) + ) + } + } } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/LazyColumnGrid.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/LazyColumnGrid.kt index ed43ec558f..a64f2c73a8 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/LazyColumnGrid.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/LazyColumnGrid.kt @@ -7,6 +7,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.Dp fun LazyListScope.verticalGridItems( + modifier: Modifier = Modifier, count: Int, numColumns: Int, gap: Dp, @@ -18,7 +19,7 @@ fun LazyListScope.verticalGridItems( Spacer(modifier = Modifier.height(gap)) } Row( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { for (col in 0 until numColumns) { @@ -39,12 +40,14 @@ fun LazyListScope.verticalGridItems( } fun LazyListScope.verticalGridItems( + modifier: Modifier = Modifier, items: List, numColumns: Int, gap: Dp, itemContent: @Composable (index: Int, item: T) -> Unit ) { verticalGridItems( + modifier = modifier, count = items.size, numColumns = numColumns, gap = gap diff --git a/lawnchair/src/app/lawnchair/ui/preferences/components/PreferenceGroup.kt b/lawnchair/src/app/lawnchair/ui/preferences/components/PreferenceGroup.kt index 97b7d5ef6a..9c33beb143 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/components/PreferenceGroup.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/components/PreferenceGroup.kt @@ -17,20 +17,16 @@ package app.lawnchair.ui.preferences.components import androidx.compose.animation.* -import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.ContentAlpha import androidx.compose.material.MaterialTheme -import androidx.compose.material3.LocalAbsoluteTonalElevation import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import app.lawnchair.theme.surfaceColorAtElevation import androidx.compose.material3.MaterialTheme as Material3Theme @Composable @@ -98,7 +94,6 @@ fun PreferenceGroupHeading( } @Composable -@ExperimentalAnimationApi fun PreferenceGroupDescription(description: String? = null, showDescription: Boolean = true) { description?.let { AnimatedVisibility(