Start to add custom keyboard

This commit is contained in:
T8RIN
2025-01-10 10:16:57 +03:00
parent 25702bdb16
commit 096481fc5d
22 changed files with 388 additions and 41 deletions

View File

@ -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))

View File

@ -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()
}
}

View File

@ -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
}
}

View File

@ -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

View File

@ -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()
}
}
}

View File

@ -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 = {

View File

@ -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,

View File

@ -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 = {

View File

@ -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(

View File

@ -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

View File

@ -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(

View File

@ -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(

View File

@ -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> {

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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(

View File

@ -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(

View File

@ -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)
}

View File

@ -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)
}

View File

@ -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()