Continue migrating Settings to Jetpack Compose

This commit is contained in:
Patryk Michalik
2021-03-07 18:41:19 +01:00
parent c7aedd109c
commit 83fe50bcf3
6 changed files with 208 additions and 8 deletions
+2
View File
@@ -12,4 +12,6 @@
<string name="home_screen_rotation_label">Home Screen Rotation</string>
<string name="home_screen_rotaton_description">When device is rotated.</string>
<string name="auto_add_shortcuts_label">Add New Apps to Home Screen</string>
<string name="make_icon_packs_adaptive_label">Make Adaptive Icons for Icon Packs</string>
<string name="make_icon_packs_adaptive_description">Doesnt affect Adaptive icon packs.</string>
</resources>
@@ -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
)
}
}
@@ -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)
)
}
@@ -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<String, IconPackInfo> {
val pm = context.packageManager
val iconPacks: MutableMap<String, IconPackInfo> = HashMap()
val list: MutableList<ResolveInfo> = 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
)
}
}
@@ -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)
}
}
}
}
@@ -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 -> ""
}