diff --git a/lawnchair/AndroidManifest.xml b/lawnchair/AndroidManifest.xml
index fe359e8fea..5ea31f2516 100644
--- a/lawnchair/AndroidManifest.xml
+++ b/lawnchair/AndroidManifest.xml
@@ -28,5 +28,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lawnchair/res/xml/general_settings.xml b/lawnchair/res/xml/general_settings.xml
index 821b274818..8d557be68e 100644
--- a/lawnchair/res/xml/general_settings.xml
+++ b/lawnchair/res/xml/general_settings.xml
@@ -17,4 +17,8 @@
+
+
+
+
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/activities/IconPackSettingsActivity.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/activities/IconPackSettingsActivity.kt
new file mode 100644
index 0000000000..741ba623e6
--- /dev/null
+++ b/lawnchair/src/ch/deletescape/lawnchair/settings/activities/IconPackSettingsActivity.kt
@@ -0,0 +1,138 @@
+package ch.deletescape.lawnchair.settings.activities
+
+import android.graphics.drawable.Drawable
+import android.os.Bundle
+import androidx.activity.compose.setContent
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.content.res.AppCompatResources
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.*
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.outlined.ArrowBack
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.asImageBitmap
+import androidx.compose.ui.unit.dp
+import androidx.core.graphics.drawable.toBitmap
+import ch.deletescape.lawnchair.settings.ui.theme.LawnchairTheme
+import com.android.launcher3.R
+
+class IconPackSettingsActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContent {
+ LawnchairTheme {
+ Surface(
+ color = MaterialTheme.colors.background,
+ modifier = Modifier.fillMaxHeight()
+ ) {
+ IconPackSettings()
+ }
+ }
+ }
+ }
+
+ data class IconPackInfo(val name: String, val packageName: String, val icon: Drawable)
+
+ val dataSet by lazy {
+ listOf(
+ IconPackInfo(
+ "System Icons",
+ "",
+ AppCompatResources.getDrawable(applicationContext, R.drawable.ic_launcher_home)!!
+ )
+ )
+ }
+
+ @Composable
+ fun IconPackSettings() {
+ var selectedIconPackPackageName by remember { mutableStateOf("") }
+ Column {
+ TopAppBar(
+ title = { Text(text = "Icon Packs") },
+ backgroundColor = MaterialTheme.colors.background,
+ navigationIcon = {
+ Box(
+ modifier = Modifier
+ .padding(start = 4.dp)
+ .height(40.dp)
+ .width(40.dp)
+ .clip(shape = RoundedCornerShape(20.dp))
+ .clickable { finish() },
+ contentAlignment = Alignment.Center
+ ) {
+ Icon(
+ Icons.Outlined.ArrowBack,
+ "Back",
+ modifier = Modifier,
+ MaterialTheme.colors.onBackground
+ )
+ }
+ }
+ )
+ IconPackList(
+ dataSet,
+ selectedIconPackPackageName,
+ onSelectionChange = { selectedIconPackPackageName = it })
+ }
+ }
+
+ @Composable
+ fun IconPackList(
+ iconPacks: List,
+ selectedIconPackPackageName: String,
+ modifier: Modifier = Modifier,
+ onSelectionChange: (String) -> Unit
+ ) {
+ Box(modifier) {
+ LazyColumn(Modifier.fillMaxWidth()) {
+ items(iconPacks) { iconPack ->
+ IconPackListItem(iconPack, selectedIconPackPackageName, onSelectionChange)
+ }
+ }
+ }
+ }
+
+ @Composable
+ fun IconPackListItem(
+ iconPack: IconPackInfo,
+ selectedIconPackPackageName: String,
+ onSelectionChange: (String) -> Unit
+ ) {
+ fun select() {
+ onSelectionChange(iconPack.packageName)
+ }
+ Row(
+ verticalAlignment = Alignment.CenterVertically,
+ modifier = Modifier
+ .fillMaxWidth()
+ .height(56.dp)
+ .clickable { select() }
+ .padding(start = 16.dp)
+ ) {
+ RadioButton(
+ selected = iconPack.packageName == selectedIconPackPackageName,
+ { select() })
+ Image(
+ iconPack.icon.toBitmap().asImageBitmap(),
+ iconPack.name,
+ modifier = Modifier
+ .padding(start = 32.dp)
+ .width(36.dp)
+ .height(36.dp)
+ )
+ Text(
+ modifier = Modifier.padding(start = 16.dp),
+ text = iconPack.name,
+ style = MaterialTheme.typography.body1
+ )
+ }
+ }
+}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Color.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Color.kt
new file mode 100644
index 0000000000..a0f1389cbc
--- /dev/null
+++ b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Color.kt
@@ -0,0 +1,8 @@
+package ch.deletescape.lawnchair.settings.ui.theme
+
+import androidx.compose.ui.graphics.Color
+
+val Purple200 = Color(0xFFBB86FC)
+val Purple500 = Color(0xFF6200EE)
+val Purple700 = Color(0xFF3700B3)
+val Teal200 = Color(0xFF03DAC5)
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Shape.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Shape.kt
new file mode 100644
index 0000000000..2012b2ceb7
--- /dev/null
+++ b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Shape.kt
@@ -0,0 +1,11 @@
+package ch.deletescape.lawnchair.settings.ui.theme
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.Shapes
+import androidx.compose.ui.unit.dp
+
+val Shapes = Shapes(
+ small = RoundedCornerShape(4.dp),
+ medium = RoundedCornerShape(4.dp),
+ large = RoundedCornerShape(0.dp)
+)
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Theme.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Theme.kt
new file mode 100644
index 0000000000..ee5fe233f9
--- /dev/null
+++ b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Theme.kt
@@ -0,0 +1,47 @@
+package ch.deletescape.lawnchair.settings.ui.theme
+
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.darkColors
+import androidx.compose.material.lightColors
+import androidx.compose.runtime.Composable
+
+private val DarkColorPalette = darkColors(
+ primary = Purple200,
+ primaryVariant = Purple500,
+ secondary = Purple200
+)
+
+private val LightColorPalette = lightColors(
+ primary = Purple500,
+ primaryVariant = Purple700,
+ secondary = Purple500
+
+ /* Other default colors to override
+background = Color.White,
+surface = Color.White,
+onPrimary = Color.White,
+onSecondary = Color.Black,
+onBackground = Color.Black,
+onSurface = Color.Black,
+*/
+)
+
+@Composable
+fun LawnchairTheme(
+ darkTheme: Boolean = isSystemInDarkTheme(),
+ content: @Composable() () -> Unit
+) {
+ val colors = if (darkTheme) {
+ DarkColorPalette
+ } else {
+ LightColorPalette
+ }
+
+ MaterialTheme(
+ colors = colors,
+ typography = Typography,
+ shapes = Shapes,
+ content = content
+ )
+}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Type.kt b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Type.kt
new file mode 100644
index 0000000000..e008e48e20
--- /dev/null
+++ b/lawnchair/src/ch/deletescape/lawnchair/settings/ui/theme/Type.kt
@@ -0,0 +1,28 @@
+package ch.deletescape.lawnchair.settings.ui.theme
+
+import androidx.compose.material.Typography
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.sp
+
+// Set of Material typography styles to start with
+val Typography = Typography(
+ body1 = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 16.sp
+ )
+ /* Other default text styles to override
+button = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.W500,
+ fontSize = 14.sp
+),
+caption = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 12.sp
+)
+*/
+)
\ No newline at end of file