diff --git a/build.gradle b/build.gradle index 94f7f6e9c7..4f3075db79 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:7.0.0-alpha11' + classpath 'com.android.tools.build:gradle:7.0.0-alpha12' classpath PROTOBUF_CLASS_PATH classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.android.gms:oss-licenses-plugin:0.10.2' diff --git a/lawnchair/res/values-en-rGB/strings.xml b/lawnchair/res/values-en-rGB/strings.xml index 2c4370ea91..bd584967e9 100644 --- a/lawnchair/res/values-en-rGB/strings.xml +++ b/lawnchair/res/values-en-rGB/strings.xml @@ -29,7 +29,7 @@ Label Size Allow Empty Pages Make Coloured Backgrounds - For generated Adaptive icons. + For generated Adaptive Icons. Notification Dots Preferences About diff --git a/lawnchair/res/values/strings.xml b/lawnchair/res/values/strings.xml index f2a5c8196c..b9329ab171 100644 --- a/lawnchair/res/values/strings.xml +++ b/lawnchair/res/values/strings.xml @@ -34,7 +34,7 @@ Label Size Allow Empty Pages Make Colored Backgrounds - For generated Adaptive icons. + For generated Adaptive Icons. Notification Dots Preferences About diff --git a/lawnchair/src/app/lawnchair/ui/preferences/AppDrawerPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/AppDrawerPreferences.kt index 7fcc969a37..ab794d8529 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/AppDrawerPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/AppDrawerPreferences.kt @@ -1,13 +1,21 @@ package app.lawnchair.ui.preferences import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.android.launcher3.R @Composable fun AppDrawerPreferences(interactor: PreferenceInteractor) { - Column { + Column( + modifier = Modifier + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + ) { PreferenceGroup(heading = stringResource(id = R.string.general_label), isFirstChild = true) { SliderPreference( label = stringResource(id = R.string.background_opacity), diff --git a/lawnchair/src/app/lawnchair/ui/preferences/ClickListenerPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/ClickListenerPreference.kt index 4b2c7a35b2..906b3875f7 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/ClickListenerPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/ClickListenerPreference.kt @@ -10,8 +10,6 @@ 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 ClickListenerPreference( diff --git a/lawnchair/src/app/lawnchair/ui/preferences/ContributorRow.kt b/lawnchair/src/app/lawnchair/ui/preferences/ContributorRow.kt index a126b317c3..e5cc7438e8 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/ContributorRow.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/ContributorRow.kt @@ -43,9 +43,11 @@ fun ContributorRow(name: String, description: String, photoUrl: String, url: Str .width(32.dp) .height(32.dp), loading = { - Box(modifier = Modifier - .fillMaxSize() - .background(MaterialTheme.colors.onBackground.copy(alpha = 0.08F))) + Box( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colors.onBackground.copy(alpha = 0.08F)) + ) } ) Spacer(modifier = Modifier.requiredWidth(16.dp)) diff --git a/lawnchair/src/app/lawnchair/ui/preferences/DockPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/DockPreferences.kt index 36d2f14d01..c5bb050abb 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/DockPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/DockPreferences.kt @@ -1,13 +1,21 @@ package app.lawnchair.ui.preferences import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.android.launcher3.R @Composable fun DockPreferences(interactor: PreferenceInteractor) { - Column { + Column( + modifier = Modifier + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + ) { PreferenceGroup(heading = stringResource(id = R.string.grid), isFirstChild = true) { SliderPreference( label = stringResource(id = R.string.dock_icons), diff --git a/lawnchair/src/app/lawnchair/ui/preferences/FolderPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/FolderPreferences.kt index 235b838609..5c7b55e814 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/FolderPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/FolderPreferences.kt @@ -1,26 +1,37 @@ package app.lawnchair.ui.preferences +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.android.launcher3.R @Composable fun FolderPreferences(interactor: PreferenceInteractor) { - PreferenceGroup(heading = stringResource(id = R.string.grid), isFirstChild = true) { - SliderPreference( - label = stringResource(id = R.string.max_folder_columns), - value = interactor.folderColumns.value, - onValueChange = { interactor.setFolderColumns(it) }, - steps = 2, - valueRange = 2.0F..5.0F - ) - SliderPreference( - label = stringResource(id = R.string.max_folder_rows), - value = interactor.folderRows.value, - onValueChange = { interactor.setFolderRows(it) }, - steps = 2, - valueRange = 2.0F..5.0F, - showDivider = false - ) + Column( + modifier = Modifier + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + ) { + PreferenceGroup(heading = stringResource(id = R.string.grid), isFirstChild = true) { + SliderPreference( + label = stringResource(id = R.string.max_folder_columns), + value = interactor.folderColumns.value, + onValueChange = { interactor.setFolderColumns(it) }, + steps = 2, + valueRange = 2.0F..5.0F + ) + SliderPreference( + label = stringResource(id = R.string.max_folder_rows), + value = interactor.folderRows.value, + onValueChange = { interactor.setFolderRows(it) }, + steps = 2, + valueRange = 2.0F..5.0F, + showDivider = false + ) + } } } \ No newline at end of file diff --git a/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt index 32b2dff272..671fa62515 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/GeneralPreferences.kt @@ -2,7 +2,12 @@ package app.lawnchair.ui.preferences import android.os.Build import androidx.compose.animation.* +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.navigation.NavController import com.android.launcher3.R @@ -10,42 +15,48 @@ import com.android.launcher3.R @ExperimentalAnimationApi @Composable fun GeneralPreferences(navController: NavController, interactor: PreferenceInteractor) { - PreferenceGroup(isFirstChild = true) { - SwitchPreference( - checked = interactor.allowRotation.value, - onCheckedChange = { interactor.setAllowRotation(it) }, - label = stringResource(id = R.string.home_screen_rotation_label), - description = stringResource(id = R.string.home_screen_rotaton_description), - showDivider = false - ) - } - PreferenceGroup(heading = stringResource(id = R.string.icons)) { - NotificationDotsPreference(interactor) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Column( + modifier = Modifier + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + ) { + PreferenceGroup(isFirstChild = true) { SwitchPreference( - checked = interactor.wrapAdaptiveIcons.value, - onCheckedChange = { interactor.setWrapAdaptiveIcons(it) }, - label = stringResource(id = R.string.make_icon_packs_adaptive_label), - description = stringResource(id = R.string.make_icon_packs_adaptive_description) + checked = interactor.allowRotation.value, + onCheckedChange = { interactor.setAllowRotation(it) }, + label = stringResource(id = R.string.home_screen_rotation_label), + description = stringResource(id = R.string.home_screen_rotaton_description), + showDivider = false + ) + } + PreferenceGroup(heading = stringResource(id = R.string.icons)) { + NotificationDotsPreference(interactor) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + SwitchPreference( + checked = interactor.wrapAdaptiveIcons.value, + onCheckedChange = { interactor.setWrapAdaptiveIcons(it) }, + label = stringResource(id = R.string.make_icon_packs_adaptive_label), + description = stringResource(id = R.string.make_icon_packs_adaptive_description) + ) + AnimatedVisibility( + visible = interactor.wrapAdaptiveIcons.value, + enter = expandVertically() + fadeIn(), + exit = shrinkVertically() + fadeOut() + ) { + SwitchPreference( + checked = interactor.makeColoredBackgrounds.value, + onCheckedChange = { interactor.setMakeColoredBackgrounds(it) }, + label = stringResource(id = R.string.colored_generated_icon_backgrounds_label), + description = stringResource(id = R.string.colored_generated_icon_backgrounds_description) + ) + } + } + NavActionPreference( + label = stringResource(id = R.string.icon_pack), + navController = navController, + destination = ICON_PACK_PREFERENCES_ROUTE, + showDivider = false ) - AnimatedVisibility( - visible = interactor.wrapAdaptiveIcons.value, - enter = expandVertically() + fadeIn(), - exit = shrinkVertically() + fadeOut() - ) { - SwitchPreference( - checked = interactor.makeColoredBackgrounds.value, - onCheckedChange = { interactor.setMakeColoredBackgrounds(it) }, - label = stringResource(id = R.string.colored_generated_icon_backgrounds_label), - description = stringResource(id = R.string.colored_generated_icon_backgrounds_description) - ) - } } - NavActionPreference( - label = stringResource(id = R.string.icon_pack), - navController = navController, - destination = ICON_PACK_PREFERENCES_ROUTE, - showDivider = false - ) } } \ No newline at end of file diff --git a/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt index 201bc1e433..4ed26c13aa 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/HomeScreenPreferences.kt @@ -1,13 +1,21 @@ package app.lawnchair.ui.preferences import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.android.launcher3.R @Composable fun HomeScreenPreferences(interactor: PreferenceInteractor) { - Column { + Column( + modifier = Modifier + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + ) { PreferenceGroup(heading = "General", isFirstChild = true) { SwitchPreference( checked = interactor.addIconToHome.value, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/IconPackPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/IconPackPreference.kt index 7f7ba5b3c0..2aa68dbed3 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/IconPackPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/IconPackPreference.kt @@ -8,6 +8,8 @@ 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.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.Composable @@ -27,15 +29,21 @@ data class IconPackInfo(val name: String, val packageName: String, val icon: Dra fun IconPackPreference(interactor: PreferenceInteractor) { val iconPacks = interactor.getIconPacks().values.toList() - PreferenceGroup(isFirstChild = true) { - LazyColumn(Modifier.fillMaxWidth()) { - items(iconPacks) { iconPack -> - IconPackListItem( - iconPack, - interactor.iconPackPackage.value, - onSelectionChange = { interactor.setIconPackPackage(it) }, - showDivider = iconPacks.last().packageName != iconPack.packageName - ) + Column( + modifier = Modifier + .fillMaxHeight() + .verticalScroll(rememberScrollState()) + ) { + PreferenceGroup(isFirstChild = true) { + LazyColumn(Modifier.fillMaxWidth()) { + items(iconPacks) { iconPack -> + IconPackListItem( + iconPack, + interactor.iconPackPackage.value, + onSelectionChange = { interactor.setIconPackPackage(it) }, + showDivider = iconPacks.last().packageName != iconPack.packageName + ) + } } } } diff --git a/lawnchair/src/app/lawnchair/ui/preferences/PreferenceCategoryList.kt b/lawnchair/src/app/lawnchair/ui/preferences/PreferenceCategoryList.kt index 565715db1c..2be9e1b4b8 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/PreferenceCategoryList.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/PreferenceCategoryList.kt @@ -1,8 +1,12 @@ package app.lawnchair.ui.preferences +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.navigation.NavController import androidx.navigation.compose.navigate @@ -11,7 +15,10 @@ import androidx.navigation.compose.navigate fun PreferenceCategoryList(navController: NavController) { val context = LocalContext.current - LazyColumn { + LazyColumn( + modifier = Modifier + .fillMaxHeight() + ) { items(screens(context)) { screen -> PreferenceCategoryLink( titleResId = screen.labelResId, diff --git a/lawnchair/src/app/lawnchair/ui/preferences/Preferences.kt b/lawnchair/src/app/lawnchair/ui/preferences/Preferences.kt index 15502ca4e6..9330f9f864 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/Preferences.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/Preferences.kt @@ -5,9 +5,7 @@ import android.view.Window import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier diff --git a/lawnchair/src/app/lawnchair/ui/preferences/SwitchPreference.kt b/lawnchair/src/app/lawnchair/ui/preferences/SwitchPreference.kt index 2437b1422d..65a067f995 100644 --- a/lawnchair/src/app/lawnchair/ui/preferences/SwitchPreference.kt +++ b/lawnchair/src/app/lawnchair/ui/preferences/SwitchPreference.kt @@ -6,6 +6,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp @Composable @@ -16,26 +17,38 @@ fun SwitchPreference( description: String? = null, showDivider: Boolean = true ) = + // TODO: Wrap overflowing text instead of using an ellipsis. PreferenceTemplate(height = if (description != null) 72.dp else 52.dp, showDivider = showDivider) { Row( modifier = Modifier - .padding(start = 16.dp, end = 16.dp) + .fillMaxHeight() .fillMaxWidth() - .fillMaxHeight(), - horizontalArrangement = Arrangement.SpaceBetween, + .padding(start = 16.dp, end = 16.dp), verticalAlignment = Alignment.CenterVertically ) { - Column { - Text(text = label, style = MaterialTheme.typography.subtitle1, color = MaterialTheme.colors.onBackground) + Column(modifier = Modifier.weight(1f)) { + Text( + text = label, + style = MaterialTheme.typography.subtitle1, + color = MaterialTheme.colors.onBackground, + overflow = TextOverflow.Ellipsis, + maxLines = 1 + ) description?.let { CompositionLocalProvider( LocalContentAlpha provides ContentAlpha.medium, LocalContentColor provides MaterialTheme.colors.onBackground ) { - Text(text = it, style = MaterialTheme.typography.body2) + Text( + text = it, + style = MaterialTheme.typography.body2, + overflow = TextOverflow.Ellipsis, + maxLines = 1 + ) } } } + Spacer(modifier = Modifier.requiredWidth(16.dp)) Switch( checked = checked, onCheckedChange = onCheckedChange,