Update dependency androidx.compose:compose-bom-alpha to v2026.09.00 (#3752)

Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
This commit is contained in:
Mend Renovate
2026-09-12 13:21:37 +01:00
committed by GitHub
parent 6c6eff3ab8
commit 855918bbf4
6 changed files with 100 additions and 60 deletions
@@ -6,8 +6,11 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.input.TextFieldLineLimits
import androidx.compose.foundation.text.input.clearText
import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd
import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
@@ -25,12 +28,15 @@ import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.material3.rememberTooltipState import androidx.compose.material3.rememberTooltipState
import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.key import androidx.compose.runtime.key
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusDirection import androidx.compose.ui.focus.FocusDirection
import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.FocusRequester
@@ -42,10 +48,10 @@ import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import kotlinx.coroutines.flow.drop
import mihon.icons.materialsymbols.MaterialSymbols import mihon.icons.materialsymbols.MaterialSymbols
import mihon.icons.materialsymbols.automirroredrounded.ArrowBack import mihon.icons.materialsymbols.automirroredrounded.ArrowBack
import mihon.icons.materialsymbols.rounded.Close import mihon.icons.materialsymbols.rounded.Close
@@ -272,10 +278,26 @@ fun SearchToolbar(
onClickCloseSearch: () -> Unit = { onChangeSearchQuery(null) }, onClickCloseSearch: () -> Unit = { onChangeSearchQuery(null) },
actions: @Composable RowScope.() -> Unit = {}, actions: @Composable RowScope.() -> Unit = {},
scrollBehavior: TopAppBarScrollBehavior? = null, scrollBehavior: TopAppBarScrollBehavior? = null,
visualTransformation: VisualTransformation = VisualTransformation.None,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
) { ) {
val focusRequester = remember { FocusRequester() } val focusRequester = remember { FocusRequester() }
val searchFieldState = rememberTextFieldState(searchQuery.orEmpty())
val currentOnChangeSearchQuery by rememberUpdatedState(onChangeSearchQuery)
val searchOpen by rememberUpdatedState(searchQuery != null)
LaunchedEffect(searchFieldState) {
snapshotFlow { searchFieldState.text.toString() }
.drop(1)
.collect { if (searchOpen) currentOnChangeSearchQuery(it) }
}
LaunchedEffect(searchQuery) {
when {
searchQuery == null -> searchFieldState.clearText()
searchQuery != searchFieldState.text.toString() -> {
searchFieldState.setTextAndPlaceCursorAtEnd(searchQuery)
}
}
}
AppBar( AppBar(
modifier = modifier, modifier = modifier,
@@ -286,16 +308,16 @@ fun SearchToolbar(
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
val searchAndClearFocus: () -> Unit = f@{ val searchAndClearFocus: () -> Unit = f@{
if (searchQuery.isBlank()) return@f val query = searchFieldState.text.toString()
onSearch(searchQuery) if (query.isBlank()) return@f
onSearch(query)
focusManager.clearFocus() focusManager.clearFocus()
keyboardController?.hide() keyboardController?.hide()
focusManager.moveFocus(FocusDirection.Next) focusManager.moveFocus(FocusDirection.Next)
} }
BasicTextField( BasicTextField(
value = searchQuery, state = searchFieldState,
onValueChange = onChangeSearchQuery,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.focusRequester(focusRequester) .focusRequester(focusRequester)
@@ -308,34 +330,30 @@ fun SearchToolbar(
fontSize = 18.sp, fontSize = 18.sp,
), ),
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
keyboardActions = KeyboardActions(onSearch = { searchAndClearFocus() }), onKeyboardAction = { searchAndClearFocus() },
singleLine = true, lineLimits = TextFieldLineLimits.SingleLine,
cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground), cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground),
visualTransformation = visualTransformation,
interactionSource = interactionSource, interactionSource = interactionSource,
decorationBox = { innerTextField -> decorator = TextFieldDefaults.decorator(
TextFieldDefaults.DecorationBox( state = searchFieldState,
value = searchQuery, enabled = true,
innerTextField = innerTextField, lineLimits = TextFieldLineLimits.SingleLine,
enabled = true, outputTransformation = null,
singleLine = true, interactionSource = interactionSource,
visualTransformation = visualTransformation, placeholder = {
interactionSource = interactionSource, Text(
placeholder = { modifier = Modifier.secondaryItemAlpha(),
Text( text = (placeholderText ?: stringResource(MR.strings.action_search_hint)),
modifier = Modifier.secondaryItemAlpha(), maxLines = 1,
text = (placeholderText ?: stringResource(MR.strings.action_search_hint)), overflow = TextOverflow.Ellipsis,
maxLines = 1, style = MaterialTheme.typography.titleMedium.copy(
overflow = TextOverflow.Ellipsis, fontSize = 18.sp,
style = MaterialTheme.typography.titleMedium.copy( fontWeight = FontWeight.Normal,
fontSize = 18.sp, ),
fontWeight = FontWeight.Normal, )
), },
) container = {},
}, ),
container = {},
)
},
) )
}, },
navigateUp = if (searchQuery == null) navigateUp else onClickCloseSearch, navigateUp = if (searchQuery == null) navigateUp else onClickCloseSearch,
@@ -378,6 +396,7 @@ fun SearchToolbar(
) { ) {
IconButton( IconButton(
onClick = { onClick = {
searchFieldState.clearText()
onClick() onClick()
focusRequester.requestFocus() focusRequester.requestFocus()
}, },
@@ -7,6 +7,9 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.input.TextFieldLineLimits
import androidx.compose.foundation.text.input.TextObfuscationMode
import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
@@ -14,6 +17,7 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.OutlinedSecureTextField
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@@ -33,9 +37,6 @@ import androidx.compose.ui.semantics.contentType
import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import dev.icerock.moko.resources.StringResource import dev.icerock.moko.resources.StringResource
@@ -204,8 +205,8 @@ object SettingsTrackingScreen : SearchableSettings {
val context = LocalContext.current val context = LocalContext.current
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
var username by remember { mutableStateOf(TextFieldValue(tracker.getUsername())) } val username = rememberTextFieldState(tracker.getUsername())
var password by remember { mutableStateOf(TextFieldValue(tracker.getPassword())) } val password = rememberTextFieldState(tracker.getPassword())
var processing by remember { mutableStateOf(false) } var processing by remember { mutableStateOf(false) }
var inputError by remember { mutableStateOf(false) } var inputError by remember { mutableStateOf(false) }
@@ -231,21 +232,19 @@ object SettingsTrackingScreen : SearchableSettings {
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.semantics { contentType = ContentType.Username + ContentType.EmailAddress }, .semantics { contentType = ContentType.Username + ContentType.EmailAddress },
value = username, state = username,
onValueChange = { username = it },
label = { Text(text = stringResource(uNameStringRes)) }, label = { Text(text = stringResource(uNameStringRes)) },
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
singleLine = true, lineLimits = TextFieldLineLimits.SingleLine,
isError = inputError && !processing, isError = inputError && !processing,
) )
var hidePassword by remember { mutableStateOf(true) } var hidePassword by remember { mutableStateOf(true) }
OutlinedTextField( OutlinedSecureTextField(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.semantics { contentType = ContentType.Password }, .semantics { contentType = ContentType.Password },
value = password, state = password,
onValueChange = { password = it },
label = { Text(text = stringResource(MR.strings.password)) }, label = { Text(text = stringResource(MR.strings.password)) },
trailingIcon = { trailingIcon = {
IconButton(onClick = { hidePassword = !hidePassword }) { IconButton(onClick = { hidePassword = !hidePassword }) {
@@ -259,16 +258,15 @@ object SettingsTrackingScreen : SearchableSettings {
) )
} }
}, },
visualTransformation = if (hidePassword) { textObfuscationMode = if (hidePassword) {
PasswordVisualTransformation() TextObfuscationMode.Hidden
} else { } else {
VisualTransformation.None TextObfuscationMode.Visible
}, },
keyboardOptions = KeyboardOptions( keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Password, keyboardType = KeyboardType.Password,
imeAction = ImeAction.Done, imeAction = ImeAction.Done,
), ),
singleLine = true,
isError = inputError && !processing, isError = inputError && !processing,
) )
} }
@@ -283,8 +281,8 @@ object SettingsTrackingScreen : SearchableSettings {
val result = checkLogin( val result = checkLogin(
context = context, context = context,
tracker = tracker, tracker = tracker,
username = username.text, username = username.text.toString(),
password = password.text, password = password.text.toString(),
) )
inputError = !result inputError = !result
if (result) onDismissRequest() if (result) onDismissRequest()
@@ -21,11 +21,13 @@ import androidx.compose.material3.Slider
import androidx.compose.material3.SliderState import androidx.compose.material3.SliderState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.VerticalSlider import androidx.compose.material3.VerticalSlider
import androidx.compose.material3.rememberSliderState
import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
@@ -75,16 +77,14 @@ fun ChapterNavigator(
) { ) {
val haptic = LocalHapticFeedback.current val haptic = LocalHapticFeedback.current
val state = remember(totalPages) { val state = key(totalPages) {
SliderState( rememberSliderState(
value = currentPage.toFloat(), value = currentPage.toFloat(),
steps = totalPages - 2, steps = totalPages - 2,
valueRange = 1f..totalPages.toFloat(), trackRange = 1f..totalPages.toFloat(),
) )
} }
state.value = currentPage.toFloat() state.value = currentPage.toFloat()
state.onValueChange = { onPageIndexChange(it.roundToInt() - 1) }
state.onValueChangeFinished = onPageIndexChangeFinished
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
val sliderDragged by interactionSource.collectIsDraggedAsState() val sliderDragged by interactionSource.collectIsDraggedAsState()
@@ -106,6 +106,8 @@ fun ChapterNavigator(
disabledContainerColor = backgroundColor, disabledContainerColor = backgroundColor,
) )
val onPageChange: (Int) -> Unit = { onPageIndexChange(it - 1) }
if (type.isHorizontal()) { if (type.isHorizontal()) {
HorizontalChapterNavigator( HorizontalChapterNavigator(
isRtl = type == ChapterNavigatorType.HORIZONTAL_RTL, isRtl = type == ChapterNavigatorType.HORIZONTAL_RTL,
@@ -116,6 +118,8 @@ fun ChapterNavigator(
enabledPrevious = enabledPrevious, enabledPrevious = enabledPrevious,
currentPage = currentPage, currentPage = currentPage,
totalPages = totalPages, totalPages = totalPages,
onPageChange = onPageChange,
onPageChangeFinished = onPageIndexChangeFinished,
interactionSource = interactionSource, interactionSource = interactionSource,
mainAxisPadding = mainAxisPadding, mainAxisPadding = mainAxisPadding,
backgroundColor = backgroundColor, backgroundColor = backgroundColor,
@@ -131,6 +135,8 @@ fun ChapterNavigator(
enabledPrevious = enabledPrevious, enabledPrevious = enabledPrevious,
currentPage = currentPage, currentPage = currentPage,
totalPages = totalPages, totalPages = totalPages,
onPageChange = onPageChange,
onPageChangeFinished = onPageIndexChangeFinished,
interactionSource = interactionSource, interactionSource = interactionSource,
mainAxisPadding = mainAxisPadding, mainAxisPadding = mainAxisPadding,
backgroundColor = backgroundColor, backgroundColor = backgroundColor,
@@ -150,6 +156,8 @@ fun HorizontalChapterNavigator(
enabledPrevious: Boolean, enabledPrevious: Boolean,
currentPage: Int, currentPage: Int,
totalPages: Int, totalPages: Int,
onPageChange: (Int) -> Unit,
onPageChangeFinished: () -> Unit,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
mainAxisPadding: Dp, mainAxisPadding: Dp,
backgroundColor: Color, backgroundColor: Color,
@@ -200,6 +208,8 @@ fun HorizontalChapterNavigator(
modifier = Modifier modifier = Modifier
.weight(1f) .weight(1f)
.padding(horizontal = 8.dp), .padding(horizontal = 8.dp),
onValueChange = { onPageChange(it.roundToInt()) },
onValueChangeFinished = onPageChangeFinished,
interactionSource = interactionSource, interactionSource = interactionSource,
) )
@@ -235,6 +245,8 @@ fun VerticalChapterNavigator(
enabledPrevious: Boolean, enabledPrevious: Boolean,
currentPage: Int, currentPage: Int,
totalPages: Int, totalPages: Int,
onPageChange: (Int) -> Unit,
onPageChangeFinished: () -> Unit,
interactionSource: MutableInteractionSource, interactionSource: MutableInteractionSource,
mainAxisPadding: Dp, mainAxisPadding: Dp,
backgroundColor: Color, backgroundColor: Color,
@@ -275,6 +287,8 @@ fun VerticalChapterNavigator(
modifier = Modifier modifier = Modifier
.weight(1f) .weight(1f)
.padding(vertical = 8.dp), .padding(vertical = 8.dp),
onValueChange = { onPageChange(it.roundToInt()) },
onValueChangeFinished = onPageChangeFinished,
interactionSource = interactionSource, interactionSource = interactionSource,
) )
+1 -1
View File
@@ -8,7 +8,7 @@ androidx-appCompat = "1.8.0"
androidx-baselineProfile = "1.5.0" androidx-baselineProfile = "1.5.0"
androidx-benchmark = "1.5.0" androidx-benchmark = "1.5.0"
androidx-biometric = "1.2.0-alpha05" androidx-biometric = "1.2.0-alpha05"
androidx-compose-bom = "2026.07.01" androidx-compose-bom = "2026.09.00"
androidx-constraintLayout = "2.2.2" androidx-constraintLayout = "2.2.2"
androidx-core = "1.19.0" androidx-core = "1.19.0"
androidx-coreSplashScreen = "1.2.0" androidx-coreSplashScreen = "1.2.0"
@@ -17,6 +17,7 @@ import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.material3.Checkbox import androidx.compose.material3.Checkbox
import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExposedDropdownMenu
import androidx.compose.material3.ExposedDropdownMenuAnchorType import androidx.compose.material3.ExposedDropdownMenuAnchorType
import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.ExposedDropdownMenuDefaults
@@ -6,7 +6,9 @@ import androidx.compose.material3.Slider
import androidx.compose.material3.SliderColors import androidx.compose.material3.SliderColors
import androidx.compose.material3.SliderDefaults import androidx.compose.material3.SliderDefaults
import androidx.compose.material3.SliderState import androidx.compose.material3.SliderState
import androidx.compose.material3.rememberSliderState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.key
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import kotlin.math.roundToInt import kotlin.math.roundToInt
@@ -33,13 +35,19 @@ fun Slider(
SliderDefaults.Track(colors = colors, enabled = enabled, sliderState = sliderState) SliderDefaults.Track(colors = colors, enabled = enabled, sliderState = sliderState)
}, },
) { ) {
val state = key(steps, valueRange) {
rememberSliderState(
value = value.toFloat(),
steps = steps,
trackRange = with(valueRange) { first.toFloat()..last.toFloat() },
)
}
state.value = value.toFloat()
Slider( Slider(
value = value.toFloat(), state = state,
onValueChange = { onValueChange(it.roundToInt()) },
modifier = modifier, modifier = modifier,
enabled = enabled, enabled = enabled,
valueRange = with(valueRange) { first.toFloat()..last.toFloat() }, onValueChange = { onValueChange(it.roundToInt()) },
steps = steps,
onValueChangeFinished = onValueChangeFinished, onValueChangeFinished = onValueChangeFinished,
colors = colors, colors = colors,
interactionSource = interactionSource, interactionSource = interactionSource,