mirror of
https://github.com/T8RIN/ImageToolbox.git
synced 2025-05-17 21:45:59 +08:00
Start to add custom keyboard
This commit is contained in:
@ -17,19 +17,23 @@
|
||||
|
||||
package ru.tech.imageresizershrinker.core.domain.utils
|
||||
|
||||
import java.util.regex.Pattern
|
||||
|
||||
inline fun <reified T> T?.notNullAnd(
|
||||
predicate: (T) -> Boolean
|
||||
): Boolean = if (this != null) predicate(this)
|
||||
else false
|
||||
|
||||
fun String.isBase64() = isNotEmpty() && BASE64_PATTERN.matcher(this).matches()
|
||||
fun String.isBase64() = isNotEmpty() && BASE64_PATTERN.matches(this)
|
||||
|
||||
fun String.trimToBase64() = filter { !it.isWhitespace() }.substringAfter(",")
|
||||
|
||||
private val BASE64_PATTERN = Pattern.compile(
|
||||
private val BASE64_PATTERN = Regex(
|
||||
"^(?=(.{4})*\$)[A-Za-z0-9+/]*={0,2}\$"
|
||||
)
|
||||
|
||||
inline fun <reified T, reified R> T.cast(): R = this as R
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline operator fun CharSequence.times(
|
||||
count: Int
|
||||
): CharSequence = repeat(count.coerceAtLeast(0))
|
@ -50,6 +50,7 @@ fun ImageToolboxCompositionLocals(
|
||||
val confettiHostState = rememberConfettiHostState()
|
||||
val context = LocalContext.current
|
||||
val customHapticFeedback = rememberEnhancedHapticFeedback(settingsState.hapticsStrength)
|
||||
val paddingManager = rememberKeyboardPaddingManager()
|
||||
|
||||
val values = remember(
|
||||
toastHostState,
|
||||
@ -58,7 +59,8 @@ fun ImageToolboxCompositionLocals(
|
||||
editPresetsController,
|
||||
confettiHostState,
|
||||
content,
|
||||
customHapticFeedback
|
||||
customHapticFeedback,
|
||||
paddingManager
|
||||
) {
|
||||
derivedStateOf {
|
||||
listOfNotNull(
|
||||
@ -68,7 +70,8 @@ fun ImageToolboxCompositionLocals(
|
||||
LocalEditPresetsController provides editPresetsController,
|
||||
LocalConfettiHostState provides confettiHostState,
|
||||
LocalImageLoader provides context.imageLoader,
|
||||
LocalHapticFeedback provides customHapticFeedback
|
||||
LocalHapticFeedback provides customHapticFeedback,
|
||||
LocalKeyboardPaddingManager provides paddingManager
|
||||
).toTypedArray()
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* ImageToolbox is an image editor for android
|
||||
* Copyright (c) 2025 T8RIN (Malik Mukhametzyanov)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* You should have received a copy of the Apache License
|
||||
* along with this program. If not, see <http://www.apache.org/licenses/LICENSE-2.0>.
|
||||
*/
|
||||
|
||||
package ru.tech.imageresizershrinker.core.ui.utils.provider
|
||||
|
||||
import androidx.compose.foundation.layout.WindowInsets
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.DisposableEffect
|
||||
import androidx.compose.runtime.NonRestartableComposable
|
||||
import androidx.compose.runtime.compositionLocalOf
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.composed
|
||||
import androidx.compose.ui.unit.Dp
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.foundation.layout.ime as imeImpl
|
||||
import androidx.compose.foundation.layout.imePadding as imePaddingImpl
|
||||
|
||||
val LocalKeyboardPaddingManager =
|
||||
compositionLocalOf<KeyboardPaddingManager> { error("LocalPaddingManager not present") }
|
||||
|
||||
|
||||
interface KeyboardPaddingManager {
|
||||
val keyboardHeight: Dp
|
||||
|
||||
fun updateHeight(keyboardHeight: Dp)
|
||||
|
||||
fun close()
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun rememberKeyboardPaddingManager(): KeyboardPaddingManager =
|
||||
remember { KeyboardPaddingManagerImpl() }
|
||||
|
||||
@Composable
|
||||
fun PropagateCustomKeyboardPadding(
|
||||
keyboardHeight: Dp
|
||||
) {
|
||||
val paddingManager = LocalKeyboardPaddingManager.current
|
||||
|
||||
DisposableEffect(keyboardHeight, paddingManager) {
|
||||
paddingManager.updateHeight(keyboardHeight)
|
||||
|
||||
onDispose { paddingManager.close() }
|
||||
}
|
||||
}
|
||||
|
||||
private class KeyboardPaddingManagerImpl : KeyboardPaddingManager {
|
||||
private val _keyboardHeight = mutableStateOf(0.dp)
|
||||
|
||||
override val keyboardHeight: Dp by _keyboardHeight
|
||||
|
||||
override fun updateHeight(keyboardHeight: Dp) {
|
||||
_keyboardHeight.value = keyboardHeight
|
||||
}
|
||||
|
||||
override fun close() = updateHeight(0.dp)
|
||||
|
||||
}
|
||||
|
||||
fun Modifier.imePadding(): Modifier = this.composed {
|
||||
val keyboardPaddingManager = LocalKeyboardPaddingManager.current
|
||||
|
||||
if (keyboardPaddingManager.keyboardHeight > 0.dp) {
|
||||
Modifier.padding(bottom = keyboardPaddingManager.keyboardHeight)
|
||||
} else {
|
||||
Modifier.imePaddingImpl()
|
||||
}
|
||||
}
|
||||
|
||||
val WindowInsets.Companion.ime: WindowInsets
|
||||
@Composable @NonRestartableComposable get() {
|
||||
val keyboardPaddingManager = LocalKeyboardPaddingManager.current
|
||||
|
||||
return if (keyboardPaddingManager.keyboardHeight > 0.dp) {
|
||||
WindowInsets(bottom = keyboardPaddingManager.keyboardHeight)
|
||||
} else {
|
||||
WindowInsets.imeImpl
|
||||
}
|
||||
}
|
@ -34,7 +34,6 @@ import androidx.compose.foundation.layout.calculateStartPadding
|
||||
import androidx.compose.foundation.layout.displayCutout
|
||||
import androidx.compose.foundation.layout.fillMaxHeight
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.ime
|
||||
import androidx.compose.foundation.layout.navigationBars
|
||||
import androidx.compose.foundation.layout.only
|
||||
import androidx.compose.foundation.layout.padding
|
||||
@ -75,6 +74,7 @@ import kotlinx.coroutines.launch
|
||||
import ru.tech.imageresizershrinker.core.resources.R
|
||||
import ru.tech.imageresizershrinker.core.settings.presentation.provider.LocalSettingsState
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.animation.fancySlideTransition
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.provider.ime
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedIconButton
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedTopAppBar
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedTopAppBarType
|
||||
|
@ -18,26 +18,60 @@
|
||||
package ru.tech.imageresizershrinker.core.ui.widget.controls
|
||||
|
||||
import androidx.compose.animation.animateContentSize
|
||||
import androidx.compose.foundation.LocalIndication
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||
import androidx.compose.foundation.interaction.collectIsPressedAsState
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.BoxWithConstraints
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxHeight
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.navigationBarsPadding
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.width
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.foundation.text.KeyboardOptions
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.outlined.Backspace
|
||||
import androidx.compose.material.icons.outlined.Done
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.LocalContentColor
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.contentColorFor
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.input.KeyboardType
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.t8rin.modalsheet.FullscreenPopup
|
||||
import ru.tech.imageresizershrinker.core.domain.image.model.ImageFormat
|
||||
import ru.tech.imageresizershrinker.core.domain.image.model.ImageInfo
|
||||
import ru.tech.imageresizershrinker.core.domain.model.IntegerSize
|
||||
import ru.tech.imageresizershrinker.core.resources.R
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.helper.ImageUtils
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.helper.ImageUtils.restrict
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.provider.PropagateCustomKeyboardPadding
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.hapticsClickable
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.modifier.animateShape
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.modifier.container
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.text.AutoSizeText
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.text.RoundedTextField
|
||||
|
||||
@Composable
|
||||
@ -133,4 +167,243 @@ fun ResizeImageField(
|
||||
)
|
||||
OOMWarning(visible = showWarning)
|
||||
}
|
||||
|
||||
CalculatorKeyboard()
|
||||
}
|
||||
|
||||
@Composable
|
||||
internal fun CalculatorKeyboard(
|
||||
|
||||
) {
|
||||
var keyboardHeight by remember {
|
||||
mutableStateOf(0.dp)
|
||||
}
|
||||
|
||||
PropagateCustomKeyboardPadding(
|
||||
keyboardHeight = keyboardHeight
|
||||
)
|
||||
|
||||
FullscreenPopup {
|
||||
BoxWithConstraints(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
contentAlignment = Alignment.BottomCenter
|
||||
) {
|
||||
var text by remember {
|
||||
mutableStateOf("")
|
||||
}
|
||||
|
||||
val onKey: (Key) -> Unit = {
|
||||
when (it) {
|
||||
Key.Backspace -> text = text.dropLast(1)
|
||||
Key.Done -> Unit
|
||||
is Key.Symbol -> text += it.char
|
||||
}
|
||||
}
|
||||
|
||||
Surface {
|
||||
val height = minOf(this.maxHeight / 2, 300.dp)
|
||||
|
||||
LaunchedEffect(height) {
|
||||
keyboardHeight = height
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.height(height)
|
||||
.background(
|
||||
MaterialTheme.colorScheme.surfaceContainer
|
||||
)
|
||||
.navigationBarsPadding()
|
||||
.padding(8.dp),
|
||||
verticalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.weight(1f),
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '1',
|
||||
onKey = onKey
|
||||
)
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '2',
|
||||
onKey = onKey
|
||||
)
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '3',
|
||||
onKey = onKey
|
||||
)
|
||||
}
|
||||
Row(
|
||||
modifier = Modifier.weight(1f),
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '4',
|
||||
onKey = onKey
|
||||
)
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '5',
|
||||
onKey = onKey
|
||||
)
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '6',
|
||||
onKey = onKey
|
||||
)
|
||||
}
|
||||
Row(
|
||||
modifier = Modifier.weight(1f),
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '7',
|
||||
onKey = onKey
|
||||
)
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '8',
|
||||
onKey = onKey
|
||||
)
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '9',
|
||||
onKey = onKey
|
||||
)
|
||||
}
|
||||
Row(
|
||||
modifier = Modifier.weight(1f),
|
||||
horizontalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
BackspaceKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
onKey = onKey
|
||||
)
|
||||
SymbolKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
letter = '0',
|
||||
onKey = onKey
|
||||
)
|
||||
DoneKey(
|
||||
modifier = Modifier.weight(1f),
|
||||
onKey = onKey
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private sealed interface Key {
|
||||
data object Backspace : Key
|
||||
data object Done : Key
|
||||
data class Symbol(val char: Char) : Key
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun SymbolKey(
|
||||
modifier: Modifier,
|
||||
letter: Char,
|
||||
onKey: (Key.Symbol) -> Unit
|
||||
) {
|
||||
Key(
|
||||
modifier = modifier,
|
||||
onClick = {
|
||||
onKey(Key.Symbol(letter))
|
||||
},
|
||||
containerColor = MaterialTheme.colorScheme.surfaceContainerHighest,
|
||||
content = {
|
||||
AutoSizeText(
|
||||
text = letter.toString(),
|
||||
style = MaterialTheme.typography.headlineMedium,
|
||||
fontWeight = FontWeight.Normal
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun DoneKey(
|
||||
modifier: Modifier,
|
||||
onKey: (Key.Done) -> Unit
|
||||
) {
|
||||
Key(
|
||||
modifier = modifier,
|
||||
onClick = {
|
||||
onKey(Key.Done)
|
||||
},
|
||||
containerColor = MaterialTheme.colorScheme.primary,
|
||||
content = {
|
||||
Icon(
|
||||
imageVector = Icons.Outlined.Done,
|
||||
contentDescription = null
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun BackspaceKey(
|
||||
modifier: Modifier,
|
||||
onKey: (Key.Backspace) -> Unit
|
||||
) {
|
||||
Key(
|
||||
modifier = modifier,
|
||||
onClick = {
|
||||
onKey(Key.Backspace)
|
||||
},
|
||||
containerColor = MaterialTheme.colorScheme.secondaryContainer,
|
||||
content = {
|
||||
Icon(
|
||||
imageVector = Icons.AutoMirrored.Outlined.Backspace,
|
||||
contentDescription = null
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Key(
|
||||
modifier: Modifier,
|
||||
onClick: () -> Unit,
|
||||
containerColor: Color,
|
||||
content: @Composable () -> Unit
|
||||
) {
|
||||
val interactionSource = remember { MutableInteractionSource() }
|
||||
val isPressed by interactionSource.collectIsPressedAsState()
|
||||
|
||||
Row(
|
||||
modifier = modifier
|
||||
.fillMaxHeight()
|
||||
.container(
|
||||
color = containerColor,
|
||||
shape = animateShape(
|
||||
if (isPressed) RoundedCornerShape(6.dp)
|
||||
else RoundedCornerShape(48.dp)
|
||||
),
|
||||
resultPadding = 0.dp
|
||||
)
|
||||
.hapticsClickable(
|
||||
interactionSource = interactionSource,
|
||||
indication = LocalIndication.current,
|
||||
onClick = onClick
|
||||
)
|
||||
.padding(ButtonDefaults.ContentPadding),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.Center
|
||||
) {
|
||||
CompositionLocalProvider(
|
||||
LocalContentColor provides contentColorFor(containerColor)
|
||||
) {
|
||||
content()
|
||||
}
|
||||
}
|
||||
}
|
@ -46,7 +46,6 @@ import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.input.pointer.pointerInput
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.Dp
|
||||
@ -141,7 +140,6 @@ fun ColorRowSelector(
|
||||
},
|
||||
state = tooltipState,
|
||||
content = {
|
||||
LocalHapticFeedback.current
|
||||
IconShapeContainer(
|
||||
enabled = true,
|
||||
content = {
|
||||
|
@ -58,7 +58,6 @@ import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.core.net.toUri
|
||||
@ -251,7 +250,6 @@ fun OneTimeSaveLocationSelectionDialog(
|
||||
},
|
||||
directions = setOf(RevealDirection.EndToStart),
|
||||
swipeableContent = {
|
||||
LocalHapticFeedback.current
|
||||
PreferenceItem(
|
||||
title = title,
|
||||
subtitle = subtitle,
|
||||
|
@ -59,7 +59,6 @@ import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.Shape
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.input.pointer.pointerInput
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.Dp
|
||||
import androidx.compose.ui.unit.dp
|
||||
@ -222,7 +221,6 @@ fun EnhancedSliderItem(
|
||||
},
|
||||
state = tooltipState,
|
||||
content = {
|
||||
LocalHapticFeedback.current
|
||||
IconShapeContainer(
|
||||
enabled = true,
|
||||
content = {
|
||||
|
@ -51,7 +51,6 @@ import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.draw.rotate
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.Shape
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.unit.dp
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.animation.FancyTransitionEasing
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedIconButton
|
||||
@ -73,7 +72,6 @@ fun ExpandableItem(
|
||||
onLongClick: (() -> Unit)? = null,
|
||||
expansionIconContainerColor: Color = Color.Transparent
|
||||
) {
|
||||
LocalHapticFeedback.current
|
||||
Column(
|
||||
Modifier
|
||||
.animateContentSize(
|
||||
|
@ -38,7 +38,6 @@ import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.heightIn
|
||||
import androidx.compose.foundation.layout.imePadding
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.size
|
||||
import androidx.compose.foundation.layout.systemBarsPadding
|
||||
@ -83,6 +82,7 @@ import ru.tech.imageresizershrinker.core.resources.R
|
||||
import ru.tech.imageresizershrinker.core.settings.presentation.provider.LocalSettingsState
|
||||
import ru.tech.imageresizershrinker.core.ui.theme.harmonizeWithPrimary
|
||||
import ru.tech.imageresizershrinker.core.ui.theme.outlineVariant
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.provider.imePadding
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.modifier.autoElevatedBorder
|
||||
import kotlin.coroutines.resume
|
||||
|
||||
|
@ -47,7 +47,6 @@ import androidx.compose.ui.draw.alpha
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.Shape
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
@ -87,7 +86,6 @@ fun PreferenceItemOverload(
|
||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||
bottomContent: (@Composable () -> Unit)? = null
|
||||
) {
|
||||
LocalHapticFeedback.current
|
||||
CompositionLocalProvider(
|
||||
LocalSettingsState provides LocalSettingsState.current.let {
|
||||
if (!enabled) it.copy(
|
||||
|
@ -45,7 +45,6 @@ import androidx.compose.ui.draw.alpha
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.Shape
|
||||
import androidx.compose.ui.graphics.vector.ImageVector
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.Dp
|
||||
@ -84,7 +83,6 @@ fun PreferenceRow(
|
||||
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
|
||||
drawContainer: Boolean = true,
|
||||
) {
|
||||
LocalHapticFeedback.current
|
||||
val internalColor = contentColor
|
||||
?: contentColorFor(backgroundColor = color)
|
||||
CompositionLocalProvider(
|
||||
|
@ -18,7 +18,6 @@
|
||||
package ru.tech.imageresizershrinker.core.ui.widget.text
|
||||
|
||||
import androidx.compose.foundation.layout.WindowInsets
|
||||
import androidx.compose.foundation.layout.ime
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.LaunchedEffect
|
||||
import androidx.compose.runtime.State
|
||||
@ -26,6 +25,7 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.platform.LocalFocusManager
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.provider.ime
|
||||
|
||||
@Composable
|
||||
fun isKeyboardVisibleAsState(): State<Boolean> {
|
||||
|
@ -64,7 +64,6 @@ import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalFocusManager
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
@ -111,8 +110,6 @@ import kotlin.random.Random
|
||||
fun CipherContent(
|
||||
component: CipherComponent
|
||||
) {
|
||||
LocalHapticFeedback.current
|
||||
|
||||
val context = LocalContext.current
|
||||
val settingsState = LocalSettingsState.current
|
||||
|
||||
|
@ -34,7 +34,6 @@ import androidx.compose.foundation.layout.asPaddingValues
|
||||
import androidx.compose.foundation.layout.displayCutout
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.ime
|
||||
import androidx.compose.foundation.layout.navigationBars
|
||||
import androidx.compose.foundation.layout.navigationBarsPadding
|
||||
import androidx.compose.foundation.layout.only
|
||||
@ -70,6 +69,7 @@ import com.t8rin.modalsheet.FullscreenPopup
|
||||
import kotlinx.collections.immutable.toPersistentList
|
||||
import kotlinx.coroutines.delay
|
||||
import ru.tech.imageresizershrinker.core.resources.R
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.provider.ime
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.provider.rememberLocalEssentials
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedIconButton
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedTopAppBar
|
||||
|
@ -43,7 +43,6 @@ import androidx.compose.foundation.layout.calculateStartPadding
|
||||
import androidx.compose.foundation.layout.displayCutout
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.imePadding
|
||||
import androidx.compose.foundation.layout.navigationBars
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.layout.safeDrawingPadding
|
||||
@ -86,6 +85,7 @@ import androidx.core.net.toUri
|
||||
import kotlinx.coroutines.launch
|
||||
import ru.tech.imageresizershrinker.core.resources.R
|
||||
import ru.tech.imageresizershrinker.core.ui.shapes.MaterialStarShape
|
||||
import ru.tech.imageresizershrinker.core.ui.utils.provider.imePadding
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedButton
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedFloatingActionButton
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedFloatingActionButtonType
|
||||
|
@ -53,7 +53,6 @@ import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.Dp
|
||||
@ -142,7 +141,6 @@ internal fun LazyItemScope.DownloadedLanguageItem(
|
||||
},
|
||||
directions = setOf(RevealDirection.EndToStart),
|
||||
swipeableContent = {
|
||||
LocalHapticFeedback.current
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
|
@ -28,7 +28,6 @@ import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.CompositionLocalProvider
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.unit.dp
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.hapticsClickable
|
||||
import ru.tech.imageresizershrinker.core.ui.widget.modifier.container
|
||||
@ -39,7 +38,6 @@ internal fun FillableButton(
|
||||
onClick: () -> Unit,
|
||||
content: @Composable RowScope.() -> Unit
|
||||
) {
|
||||
LocalHapticFeedback.current
|
||||
Row(
|
||||
modifier = modifier
|
||||
.container(
|
||||
|
@ -35,7 +35,6 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
@ -53,7 +52,6 @@ fun FilterSelectionBar(
|
||||
onSharpnessClick: () -> Unit,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
LocalHapticFeedback.current
|
||||
val (hasContrast, hasSharpness, hasThreshold) = remember(addedFilters) {
|
||||
derivedStateOf {
|
||||
Triple(
|
||||
|
@ -34,7 +34,6 @@ import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import ru.tech.imageresizershrinker.core.resources.R
|
||||
@ -51,8 +50,6 @@ fun ModelTypeSelector(
|
||||
value: SegmentationMode,
|
||||
onValueChange: (SegmentationMode) -> Unit
|
||||
) {
|
||||
LocalHapticFeedback.current
|
||||
|
||||
var showSelectionSheet by remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
|
@ -34,7 +34,6 @@ import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.unit.dp
|
||||
import ru.tech.imageresizershrinker.core.resources.R
|
||||
@ -51,8 +50,6 @@ fun OcrEngineModeSelector(
|
||||
value: OcrEngineMode,
|
||||
onValueChange: (OcrEngineMode) -> Unit
|
||||
) {
|
||||
LocalHapticFeedback.current
|
||||
|
||||
var showSelectionSheet by remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
|
@ -52,7 +52,6 @@ import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalHapticFeedback
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
@ -91,8 +90,6 @@ import java.util.Locale
|
||||
fun ZipContent(
|
||||
component: ZipComponent
|
||||
) {
|
||||
LocalHapticFeedback.current
|
||||
|
||||
val settingsState = LocalSettingsState.current
|
||||
|
||||
val essentials = rememberLocalEssentials()
|
||||
|
Reference in New Issue
Block a user