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:
@@ -6,8 +6,11 @@ import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.RowScope
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.text.BasicTextField
|
||||
import androidx.compose.foundation.text.KeyboardActions
|
||||
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.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
@@ -25,12 +28,15 @@ import androidx.compose.material3.TopAppBarScrollBehavior
|
||||
import androidx.compose.material3.rememberTooltipState
|
||||
import androidx.compose.material3.surfaceColorAtElevation
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.derivedStateOf
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.key
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.runtime.snapshotFlow
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.focus.FocusDirection
|
||||
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.text.font.FontWeight
|
||||
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.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import kotlinx.coroutines.flow.drop
|
||||
import mihon.icons.materialsymbols.MaterialSymbols
|
||||
import mihon.icons.materialsymbols.automirroredrounded.ArrowBack
|
||||
import mihon.icons.materialsymbols.rounded.Close
|
||||
@@ -272,10 +278,26 @@ fun SearchToolbar(
|
||||
onClickCloseSearch: () -> Unit = { onChangeSearchQuery(null) },
|
||||
actions: @Composable RowScope.() -> Unit = {},
|
||||
scrollBehavior: TopAppBarScrollBehavior? = null,
|
||||
visualTransformation: VisualTransformation = VisualTransformation.None,
|
||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||
) {
|
||||
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(
|
||||
modifier = modifier,
|
||||
@@ -286,16 +308,16 @@ fun SearchToolbar(
|
||||
val focusManager = LocalFocusManager.current
|
||||
|
||||
val searchAndClearFocus: () -> Unit = f@{
|
||||
if (searchQuery.isBlank()) return@f
|
||||
onSearch(searchQuery)
|
||||
val query = searchFieldState.text.toString()
|
||||
if (query.isBlank()) return@f
|
||||
onSearch(query)
|
||||
focusManager.clearFocus()
|
||||
keyboardController?.hide()
|
||||
focusManager.moveFocus(FocusDirection.Next)
|
||||
}
|
||||
|
||||
BasicTextField(
|
||||
value = searchQuery,
|
||||
onValueChange = onChangeSearchQuery,
|
||||
state = searchFieldState,
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.focusRequester(focusRequester)
|
||||
@@ -308,34 +330,30 @@ fun SearchToolbar(
|
||||
fontSize = 18.sp,
|
||||
),
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
|
||||
keyboardActions = KeyboardActions(onSearch = { searchAndClearFocus() }),
|
||||
singleLine = true,
|
||||
onKeyboardAction = { searchAndClearFocus() },
|
||||
lineLimits = TextFieldLineLimits.SingleLine,
|
||||
cursorBrush = SolidColor(MaterialTheme.colorScheme.onBackground),
|
||||
visualTransformation = visualTransformation,
|
||||
interactionSource = interactionSource,
|
||||
decorationBox = { innerTextField ->
|
||||
TextFieldDefaults.DecorationBox(
|
||||
value = searchQuery,
|
||||
innerTextField = innerTextField,
|
||||
enabled = true,
|
||||
singleLine = true,
|
||||
visualTransformation = visualTransformation,
|
||||
interactionSource = interactionSource,
|
||||
placeholder = {
|
||||
Text(
|
||||
modifier = Modifier.secondaryItemAlpha(),
|
||||
text = (placeholderText ?: stringResource(MR.strings.action_search_hint)),
|
||||
maxLines = 1,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
style = MaterialTheme.typography.titleMedium.copy(
|
||||
fontSize = 18.sp,
|
||||
fontWeight = FontWeight.Normal,
|
||||
),
|
||||
)
|
||||
},
|
||||
container = {},
|
||||
)
|
||||
},
|
||||
decorator = TextFieldDefaults.decorator(
|
||||
state = searchFieldState,
|
||||
enabled = true,
|
||||
lineLimits = TextFieldLineLimits.SingleLine,
|
||||
outputTransformation = null,
|
||||
interactionSource = interactionSource,
|
||||
placeholder = {
|
||||
Text(
|
||||
modifier = Modifier.secondaryItemAlpha(),
|
||||
text = (placeholderText ?: stringResource(MR.strings.action_search_hint)),
|
||||
maxLines = 1,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
style = MaterialTheme.typography.titleMedium.copy(
|
||||
fontSize = 18.sp,
|
||||
fontWeight = FontWeight.Normal,
|
||||
),
|
||||
)
|
||||
},
|
||||
container = {},
|
||||
),
|
||||
)
|
||||
},
|
||||
navigateUp = if (searchQuery == null) navigateUp else onClickCloseSearch,
|
||||
@@ -378,6 +396,7 @@ fun SearchToolbar(
|
||||
) {
|
||||
IconButton(
|
||||
onClick = {
|
||||
searchFieldState.clearText()
|
||||
onClick()
|
||||
focusRequester.requestFocus()
|
||||
},
|
||||
|
||||
+15
-17
@@ -7,6 +7,9 @@ import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.RowScope
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
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.Button
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
@@ -14,6 +17,7 @@ import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.OutlinedButton
|
||||
import androidx.compose.material3.OutlinedSecureTextField
|
||||
import androidx.compose.material3.OutlinedTextField
|
||||
import androidx.compose.material3.Text
|
||||
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.text.input.ImeAction
|
||||
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.unit.dp
|
||||
import dev.icerock.moko.resources.StringResource
|
||||
@@ -204,8 +205,8 @@ object SettingsTrackingScreen : SearchableSettings {
|
||||
val context = LocalContext.current
|
||||
val scope = rememberCoroutineScope()
|
||||
|
||||
var username by remember { mutableStateOf(TextFieldValue(tracker.getUsername())) }
|
||||
var password by remember { mutableStateOf(TextFieldValue(tracker.getPassword())) }
|
||||
val username = rememberTextFieldState(tracker.getUsername())
|
||||
val password = rememberTextFieldState(tracker.getPassword())
|
||||
var processing by remember { mutableStateOf(false) }
|
||||
var inputError by remember { mutableStateOf(false) }
|
||||
|
||||
@@ -231,21 +232,19 @@ object SettingsTrackingScreen : SearchableSettings {
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.semantics { contentType = ContentType.Username + ContentType.EmailAddress },
|
||||
value = username,
|
||||
onValueChange = { username = it },
|
||||
state = username,
|
||||
label = { Text(text = stringResource(uNameStringRes)) },
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
|
||||
singleLine = true,
|
||||
lineLimits = TextFieldLineLimits.SingleLine,
|
||||
isError = inputError && !processing,
|
||||
)
|
||||
|
||||
var hidePassword by remember { mutableStateOf(true) }
|
||||
OutlinedTextField(
|
||||
OutlinedSecureTextField(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.semantics { contentType = ContentType.Password },
|
||||
value = password,
|
||||
onValueChange = { password = it },
|
||||
state = password,
|
||||
label = { Text(text = stringResource(MR.strings.password)) },
|
||||
trailingIcon = {
|
||||
IconButton(onClick = { hidePassword = !hidePassword }) {
|
||||
@@ -259,16 +258,15 @@ object SettingsTrackingScreen : SearchableSettings {
|
||||
)
|
||||
}
|
||||
},
|
||||
visualTransformation = if (hidePassword) {
|
||||
PasswordVisualTransformation()
|
||||
textObfuscationMode = if (hidePassword) {
|
||||
TextObfuscationMode.Hidden
|
||||
} else {
|
||||
VisualTransformation.None
|
||||
TextObfuscationMode.Visible
|
||||
},
|
||||
keyboardOptions = KeyboardOptions(
|
||||
keyboardType = KeyboardType.Password,
|
||||
imeAction = ImeAction.Done,
|
||||
),
|
||||
singleLine = true,
|
||||
isError = inputError && !processing,
|
||||
)
|
||||
}
|
||||
@@ -283,8 +281,8 @@ object SettingsTrackingScreen : SearchableSettings {
|
||||
val result = checkLogin(
|
||||
context = context,
|
||||
tracker = tracker,
|
||||
username = username.text,
|
||||
password = password.text,
|
||||
username = username.text.toString(),
|
||||
password = password.text.toString(),
|
||||
)
|
||||
inputError = !result
|
||||
if (result) onDismissRequest()
|
||||
|
||||
@@ -21,11 +21,13 @@ import androidx.compose.material3.Slider
|
||||
import androidx.compose.material3.SliderState
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.VerticalSlider
|
||||
import androidx.compose.material3.rememberSliderState
|
||||
import androidx.compose.material3.surfaceColorAtElevation
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.key
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
@@ -75,16 +77,14 @@ fun ChapterNavigator(
|
||||
) {
|
||||
val haptic = LocalHapticFeedback.current
|
||||
|
||||
val state = remember(totalPages) {
|
||||
SliderState(
|
||||
val state = key(totalPages) {
|
||||
rememberSliderState(
|
||||
value = currentPage.toFloat(),
|
||||
steps = totalPages - 2,
|
||||
valueRange = 1f..totalPages.toFloat(),
|
||||
trackRange = 1f..totalPages.toFloat(),
|
||||
)
|
||||
}
|
||||
state.value = currentPage.toFloat()
|
||||
state.onValueChange = { onPageIndexChange(it.roundToInt() - 1) }
|
||||
state.onValueChangeFinished = onPageIndexChangeFinished
|
||||
|
||||
val interactionSource = remember { MutableInteractionSource() }
|
||||
val sliderDragged by interactionSource.collectIsDraggedAsState()
|
||||
@@ -106,6 +106,8 @@ fun ChapterNavigator(
|
||||
disabledContainerColor = backgroundColor,
|
||||
)
|
||||
|
||||
val onPageChange: (Int) -> Unit = { onPageIndexChange(it - 1) }
|
||||
|
||||
if (type.isHorizontal()) {
|
||||
HorizontalChapterNavigator(
|
||||
isRtl = type == ChapterNavigatorType.HORIZONTAL_RTL,
|
||||
@@ -116,6 +118,8 @@ fun ChapterNavigator(
|
||||
enabledPrevious = enabledPrevious,
|
||||
currentPage = currentPage,
|
||||
totalPages = totalPages,
|
||||
onPageChange = onPageChange,
|
||||
onPageChangeFinished = onPageIndexChangeFinished,
|
||||
interactionSource = interactionSource,
|
||||
mainAxisPadding = mainAxisPadding,
|
||||
backgroundColor = backgroundColor,
|
||||
@@ -131,6 +135,8 @@ fun ChapterNavigator(
|
||||
enabledPrevious = enabledPrevious,
|
||||
currentPage = currentPage,
|
||||
totalPages = totalPages,
|
||||
onPageChange = onPageChange,
|
||||
onPageChangeFinished = onPageIndexChangeFinished,
|
||||
interactionSource = interactionSource,
|
||||
mainAxisPadding = mainAxisPadding,
|
||||
backgroundColor = backgroundColor,
|
||||
@@ -150,6 +156,8 @@ fun HorizontalChapterNavigator(
|
||||
enabledPrevious: Boolean,
|
||||
currentPage: Int,
|
||||
totalPages: Int,
|
||||
onPageChange: (Int) -> Unit,
|
||||
onPageChangeFinished: () -> Unit,
|
||||
interactionSource: MutableInteractionSource,
|
||||
mainAxisPadding: Dp,
|
||||
backgroundColor: Color,
|
||||
@@ -200,6 +208,8 @@ fun HorizontalChapterNavigator(
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(horizontal = 8.dp),
|
||||
onValueChange = { onPageChange(it.roundToInt()) },
|
||||
onValueChangeFinished = onPageChangeFinished,
|
||||
interactionSource = interactionSource,
|
||||
)
|
||||
|
||||
@@ -235,6 +245,8 @@ fun VerticalChapterNavigator(
|
||||
enabledPrevious: Boolean,
|
||||
currentPage: Int,
|
||||
totalPages: Int,
|
||||
onPageChange: (Int) -> Unit,
|
||||
onPageChangeFinished: () -> Unit,
|
||||
interactionSource: MutableInteractionSource,
|
||||
mainAxisPadding: Dp,
|
||||
backgroundColor: Color,
|
||||
@@ -275,6 +287,8 @@ fun VerticalChapterNavigator(
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(vertical = 8.dp),
|
||||
onValueChange = { onPageChange(it.roundToInt()) },
|
||||
onValueChangeFinished = onPageChangeFinished,
|
||||
interactionSource = interactionSource,
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user