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 -> "" }