Continue migrating Settings to Jetpack Compose
This commit is contained in:
@@ -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">Doesn’t 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 -> ""
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user