diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml
index 39e247e56e..ac07fa24a5 100644
--- a/lawnchair/res/values/strings.xml
+++ b/lawnchair/res/values/strings.xml
@@ -12,4 +12,6 @@
Home Screen Rotation
When device is rotated.
Add New Apps to Home Screen
+ Make Adaptive Icons for Icon Packs
+ Doesn’t affect Adaptive icon packs.
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/GeneralSettings.kt b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/GeneralSettings.kt
index e084e1f9a5..a12fab3b2e 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/GeneralSettings.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/GeneralSettings.kt
@@ -1,18 +1,48 @@
package ch.deletescape.lawnchair.compose.ui.settings
import androidx.compose.foundation.layout.Column
-import androidx.compose.runtime.Composable
+import androidx.compose.runtime.*
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
+import androidx.navigation.NavController
+import ch.deletescape.lawnchair.sharedprefs.LawnchairPreferences
import com.android.launcher3.R
+import com.android.launcher3.Utilities
@Composable
-fun GeneralSettings() {
+fun GeneralSettings(navController: NavController) {
+ val context = LocalContext.current
+ val sharedPref = Utilities.getPrefs(context)
+
+ val dbPrefAllowRotation = sharedPref.getBoolean("pref_allowRotation", true)
+ var allowRotation by remember { mutableStateOf(dbPrefAllowRotation) }
+
+ val dbGenerateAdaptiveIconsForIconPacks = sharedPref.getBoolean(LawnchairPreferences.WRAP_ADAPTIVE_ICONS, false)
+ var generateAdaptiveIconsForIconPacks by remember { mutableStateOf(dbGenerateAdaptiveIconsForIconPacks) }
+
Column {
SwitchSetting(
- checked = true,
- onCheckedChange = { /*TODO*/ },
+ checked = allowRotation,
+ onCheckedChange = {
+ allowRotation = it
+ sharedPref.edit().putBoolean("pref_allowRotation", it).apply()
+ },
title = stringResource(id = R.string.home_screen_rotation_label),
subtitle = stringResource(id = R.string.home_screen_rotaton_description)
)
+ SwitchSetting(
+ checked = generateAdaptiveIconsForIconPacks,
+ onCheckedChange = {
+ generateAdaptiveIconsForIconPacks = it
+ sharedPref.edit().putBoolean(LawnchairPreferences.WRAP_ADAPTIVE_ICONS, it).apply()
+ },
+ title = stringResource(id = R.string.make_icon_packs_adaptive_label),
+ subtitle = stringResource(id = R.string.make_icon_packs_adaptive_description)
+ )
+ NavActionSetting(
+ title = stringResource(id = R.string.icon_pack),
+ navController = navController,
+ destination = Screen.IconPackSettings.route
+ )
}
}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/HomeScreenSettings.kt b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/HomeScreenSettings.kt
index 041a74888b..808820655f 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/HomeScreenSettings.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/HomeScreenSettings.kt
@@ -1,16 +1,27 @@
package ch.deletescape.lawnchair.compose.ui.settings
+import android.content.Context
import androidx.compose.foundation.layout.Column
-import androidx.compose.runtime.Composable
+import androidx.compose.runtime.*
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
+import com.android.launcher3.LauncherFiles.SHARED_PREFERENCES_KEY
import com.android.launcher3.R
@Composable
fun HomeScreenSettings() {
+ val context = LocalContext.current
+ val sharedPref = context.getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE)
+ val dbPrefAddIconToHome = sharedPref.getBoolean("pref_add_icon_to_home", false)
+ var addIconToHome by remember { mutableStateOf(dbPrefAddIconToHome) }
+
Column {
SwitchSetting(
- checked = false,
- onCheckedChange = { /*TODO*/ },
+ checked = addIconToHome,
+ onCheckedChange = {
+ addIconToHome = it
+ sharedPref.edit().putBoolean("pref_add_icon_to_home", it).apply()
+ },
title = stringResource(id = R.string.auto_add_shortcuts_label)
)
}
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/IconPackSettings.kt b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/IconPackSettings.kt
new file mode 100644
index 0000000000..f23a9b7cd8
--- /dev/null
+++ b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/IconPackSettings.kt
@@ -0,0 +1,113 @@
+package ch.deletescape.lawnchair.compose.ui.settings
+
+import android.content.Intent
+import android.content.SharedPreferences
+import android.content.pm.ResolveInfo
+import android.graphics.drawable.Drawable
+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.material.MaterialTheme
+import androidx.compose.material.RadioButton
+import androidx.compose.material.Text
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.asImageBitmap
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.unit.dp
+import androidx.core.graphics.drawable.toBitmap
+import ch.deletescape.lawnchair.sharedprefs.LawnchairPreferences
+import com.android.launcher3.R
+import com.android.launcher3.Utilities
+
+data class IconPackInfo(val name: String, val packageName: String, val icon: Drawable)
+
+@Composable
+fun IconPackSettings() {
+ val context = LocalContext.current
+
+ val sharedPref: SharedPreferences by lazy { Utilities.getPrefs(context) }
+ val dbSelectedIconPackPackageName by lazy { sharedPref.getString(LawnchairPreferences.ICON_PACK_PACKAGE, "")!! }
+
+ var selectedIconPackPackageName by remember { mutableStateOf(dbSelectedIconPackPackageName) }
+
+ fun getIconPacks(): MutableMap {
+ val pm = context.packageManager
+ val iconPacks: MutableMap = HashMap()
+ val list: MutableList = pm.queryIntentActivities(Intent("com.novalauncher.THEME"), 0)
+
+ list.addAll(pm.queryIntentActivities(Intent("org.adw.launcher.icons.ACTION_PICK_ICON"), 0))
+ list.addAll(pm.queryIntentActivities(Intent("com.dlto.atom.launcher.THEME"), 0))
+ list.addAll(
+ pm.queryIntentActivities(Intent("android.intent.action.MAIN").addCategory("com.anddoes.launcher.THEME"), 0)
+ )
+
+ iconPacks["system"] =
+ IconPackInfo("System Icons", "", AppCompatResources.getDrawable(context, R.drawable.ic_launcher_home)!!)
+
+ for (info in list) {
+ iconPacks[info.activityInfo.packageName] = IconPackInfo(
+ info.loadLabel(pm).toString(),
+ info.activityInfo.packageName,
+ info.loadIcon(pm)
+ )
+ }
+
+ return iconPacks
+ }
+
+ Box {
+ LazyColumn(Modifier.fillMaxWidth()) {
+ items(getIconPacks().values.toList()) { iconPack ->
+ IconPackListItem(
+ iconPack,
+ selectedIconPackPackageName,
+ onSelectionChange = { selectedIconPackPackageName = it },
+ sharedPref
+ )
+ }
+ }
+ }
+}
+
+@Composable
+fun IconPackListItem(
+ iconPack: IconPackInfo,
+ selectedIconPackPackageName: String,
+ onSelectionChange: (String) -> Unit,
+ sharedPref: SharedPreferences
+) {
+ fun select() {
+ onSelectionChange(iconPack.packageName)
+ sharedPref.edit().putString(LawnchairPreferences.ICON_PACK_PACKAGE, iconPack.packageName).apply()
+ }
+ 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.subtitle1
+ )
+ }
+}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/NavActionSetting.kt b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/NavActionSetting.kt
new file mode 100644
index 0000000000..44b9746430
--- /dev/null
+++ b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/NavActionSetting.kt
@@ -0,0 +1,38 @@
+package ch.deletescape.lawnchair.compose.ui.settings
+
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.*
+import androidx.compose.material.ContentAlpha
+import androidx.compose.material.LocalContentAlpha
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import androidx.navigation.NavController
+import androidx.navigation.compose.navigate
+
+@Composable
+fun NavActionSetting(
+ title: String,
+ subtitle: String? = null,
+ navController: NavController,
+ destination: String
+) {
+ Column(
+ verticalArrangement = Arrangement.Center,
+ modifier = Modifier
+ .height(if (subtitle != null) 64.dp else 48.dp)
+ .fillMaxWidth()
+ .clickable { navController.navigate(route = destination) }
+ .padding(start = 16.dp, end = 16.dp),
+ ) {
+ Text(text = title, style = MaterialTheme.typography.subtitle1)
+ subtitle?.let {
+ CompositionLocalProvider(LocalContentAlpha provides ContentAlpha.medium) {
+ Text(text = subtitle, style = MaterialTheme.typography.body2)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/Settings.kt b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/Settings.kt
index 2fb28c8cc4..a6bfc1a5a4 100644
--- a/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/Settings.kt
+++ b/lawnchair/src/ch/deletescape/lawnchair/compose/ui/settings/Settings.kt
@@ -48,6 +48,10 @@ sealed class Screen(
subtitleResId = R.string.home_screen_description,
iconResId = R.drawable.ic_home_screen
)
+ object IconPackSettings : Screen(
+ route = "iconPackSettings",
+ titleResId = R.string.icon_pack
+ )
}
val screens = listOf(
@@ -69,7 +73,8 @@ fun Settings() {
NavHost(navController = navController, startDestination = Screen.Top.route) {
composable(route = Screen.Top.route) { Top(navController) }
composable(route = Screen.HomeScreenSettings.route) { HomeScreenSettings() }
- composable(route = Screen.GeneralSettings.route) { GeneralSettings() }
+ composable(route = Screen.GeneralSettings.route) { GeneralSettings(navController) }
+ composable(route = Screen.IconPackSettings.route) { IconPackSettings() }
}
}
}
@@ -97,6 +102,7 @@ private fun TopBar(navController: NavController) {
"top" -> stringResource(id = R.string.settings)
"homeScreenSettings" -> stringResource(id = R.string.home_screen_label)
"generalSettings" -> stringResource(id = R.string.general_label)
+ "iconPackSettings" -> stringResource(id = R.string.icon_pack)
else -> ""
}