From 096481fc5d5fee9dcde5706ad60713f48058d8b9 Mon Sep 17 00:00:00 2001 From: T8RIN Date: Fri, 10 Jan 2025 10:16:57 +0300 Subject: [PATCH] Start to add custom keyboard --- .../core/domain/utils/KotlinUtils.kt | 12 +- .../provider/ImageToolboxCompositionLocals.kt | 7 +- .../ui/utils/provider/LocalPaddingManager.kt | 97 +++++++ .../core/ui/widget/AdaptiveLayoutScreen.kt | 2 +- .../ui/widget/controls/ResizeImageField.kt | 273 ++++++++++++++++++ .../controls/selection/ColorRowSelector.kt | 2 - .../OneTimeSaveLocationSelectionDialog.kt | 2 - .../ui/widget/enhanced/EnhancedSliderItem.kt | 2 - .../core/ui/widget/other/ExpandableItem.kt | 2 - .../core/ui/widget/other/ToastHost.kt | 2 +- .../preferences/PreferenceItemOverload.kt | 2 - .../ui/widget/preferences/PreferenceRow.kt | 2 - .../widget/text/IsKeyboardVisibleAsState.kt | 2 +- .../cipher/presentation/CipherContent.kt | 3 - .../presentation/LibrariesInfoContent.kt | 2 +- .../components/MediaPickerGridWithOverlays.kt | 2 +- .../components/DownloadedLanguageItem.kt | 2 - .../presentation/components/FillableButton.kt | 2 - .../components/FilterSelectionBar.kt | 2 - .../components/ModelTypeSelector.kt | 3 - .../components/OcrEngineModeSelector.kt | 3 - .../feature/zip/presentation/ZipContent.kt | 3 - 22 files changed, 388 insertions(+), 41 deletions(-) create mode 100644 core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/LocalPaddingManager.kt diff --git a/core/domain/src/main/kotlin/ru/tech/imageresizershrinker/core/domain/utils/KotlinUtils.kt b/core/domain/src/main/kotlin/ru/tech/imageresizershrinker/core/domain/utils/KotlinUtils.kt index 3b70de8c8..cf3d3a35a 100644 --- a/core/domain/src/main/kotlin/ru/tech/imageresizershrinker/core/domain/utils/KotlinUtils.kt +++ b/core/domain/src/main/kotlin/ru/tech/imageresizershrinker/core/domain/utils/KotlinUtils.kt @@ -17,19 +17,23 @@ package ru.tech.imageresizershrinker.core.domain.utils -import java.util.regex.Pattern inline fun 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 T.cast(): R = this as R \ No newline at end of file +inline fun T.cast(): R = this as R + +@Suppress("NOTHING_TO_INLINE") +inline operator fun CharSequence.times( + count: Int +): CharSequence = repeat(count.coerceAtLeast(0)) \ No newline at end of file diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/ImageToolboxCompositionLocals.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/ImageToolboxCompositionLocals.kt index 95b0d2724..f5df2f50f 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/ImageToolboxCompositionLocals.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/ImageToolboxCompositionLocals.kt @@ -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() } } diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/LocalPaddingManager.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/LocalPaddingManager.kt new file mode 100644 index 000000000..869da2f93 --- /dev/null +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/LocalPaddingManager.kt @@ -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 . + */ + +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 { 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 + } + } \ No newline at end of file diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/AdaptiveLayoutScreen.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/AdaptiveLayoutScreen.kt index 299e6598f..71fd4416b 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/AdaptiveLayoutScreen.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/AdaptiveLayoutScreen.kt @@ -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 diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/controls/ResizeImageField.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/controls/ResizeImageField.kt index c76a6d985..b49cf7d45 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/controls/ResizeImageField.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/controls/ResizeImageField.kt @@ -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() + } + } } \ No newline at end of file diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/controls/selection/ColorRowSelector.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/controls/selection/ColorRowSelector.kt index 8b91bae99..fc98c1e20 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/controls/selection/ColorRowSelector.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/controls/selection/ColorRowSelector.kt @@ -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 = { diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/dialogs/OneTimeSaveLocationSelectionDialog.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/dialogs/OneTimeSaveLocationSelectionDialog.kt index 9d3f8cb3f..ea959a7c6 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/dialogs/OneTimeSaveLocationSelectionDialog.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/dialogs/OneTimeSaveLocationSelectionDialog.kt @@ -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, diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/enhanced/EnhancedSliderItem.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/enhanced/EnhancedSliderItem.kt index 453530657..dc2a2a2a1 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/enhanced/EnhancedSliderItem.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/enhanced/EnhancedSliderItem.kt @@ -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 = { diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/other/ExpandableItem.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/other/ExpandableItem.kt index 6b25e3b71..749bfd718 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/other/ExpandableItem.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/other/ExpandableItem.kt @@ -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( diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/other/ToastHost.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/other/ToastHost.kt index 6bb465924..d451a7c02 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/other/ToastHost.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/other/ToastHost.kt @@ -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 diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/preferences/PreferenceItemOverload.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/preferences/PreferenceItemOverload.kt index 68f742c36..c7361832d 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/preferences/PreferenceItemOverload.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/preferences/PreferenceItemOverload.kt @@ -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( diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/preferences/PreferenceRow.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/preferences/PreferenceRow.kt index 76b015d98..d1faf40f4 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/preferences/PreferenceRow.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/preferences/PreferenceRow.kt @@ -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( diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/text/IsKeyboardVisibleAsState.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/text/IsKeyboardVisibleAsState.kt index f9b9a9180..32c6cca91 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/text/IsKeyboardVisibleAsState.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/widget/text/IsKeyboardVisibleAsState.kt @@ -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 { diff --git a/feature/cipher/src/main/java/ru/tech/imageresizershrinker/feature/cipher/presentation/CipherContent.kt b/feature/cipher/src/main/java/ru/tech/imageresizershrinker/feature/cipher/presentation/CipherContent.kt index 6fd89b09e..d1e46b4d7 100644 --- a/feature/cipher/src/main/java/ru/tech/imageresizershrinker/feature/cipher/presentation/CipherContent.kt +++ b/feature/cipher/src/main/java/ru/tech/imageresizershrinker/feature/cipher/presentation/CipherContent.kt @@ -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 diff --git a/feature/libraries-info/src/main/java/ru/tech/imageresizershrinker/feature/libraries_info/presentation/LibrariesInfoContent.kt b/feature/libraries-info/src/main/java/ru/tech/imageresizershrinker/feature/libraries_info/presentation/LibrariesInfoContent.kt index fecb70fa5..ca9b1a789 100644 --- a/feature/libraries-info/src/main/java/ru/tech/imageresizershrinker/feature/libraries_info/presentation/LibrariesInfoContent.kt +++ b/feature/libraries-info/src/main/java/ru/tech/imageresizershrinker/feature/libraries_info/presentation/LibrariesInfoContent.kt @@ -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 diff --git a/feature/media-picker/src/main/java/ru/tech/imageresizershrinker/feature/media_picker/presentation/components/MediaPickerGridWithOverlays.kt b/feature/media-picker/src/main/java/ru/tech/imageresizershrinker/feature/media_picker/presentation/components/MediaPickerGridWithOverlays.kt index 8d919a055..131335b20 100644 --- a/feature/media-picker/src/main/java/ru/tech/imageresizershrinker/feature/media_picker/presentation/components/MediaPickerGridWithOverlays.kt +++ b/feature/media-picker/src/main/java/ru/tech/imageresizershrinker/feature/media_picker/presentation/components/MediaPickerGridWithOverlays.kt @@ -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 diff --git a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/DownloadedLanguageItem.kt b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/DownloadedLanguageItem.kt index e2437def5..d672d689d 100644 --- a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/DownloadedLanguageItem.kt +++ b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/DownloadedLanguageItem.kt @@ -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() diff --git a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/FillableButton.kt b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/FillableButton.kt index 7e2263945..8f866114c 100644 --- a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/FillableButton.kt +++ b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/FillableButton.kt @@ -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( diff --git a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/FilterSelectionBar.kt b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/FilterSelectionBar.kt index 04e390618..072732ae8 100644 --- a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/FilterSelectionBar.kt +++ b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/FilterSelectionBar.kt @@ -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( diff --git a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/ModelTypeSelector.kt b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/ModelTypeSelector.kt index 41da61b82..b6b7b485d 100644 --- a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/ModelTypeSelector.kt +++ b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/ModelTypeSelector.kt @@ -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) } diff --git a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/OcrEngineModeSelector.kt b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/OcrEngineModeSelector.kt index 26e669c39..86154a14a 100644 --- a/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/OcrEngineModeSelector.kt +++ b/feature/recognize-text/src/main/java/ru/tech/imageresizershrinker/feature/recognize/text/presentation/components/OcrEngineModeSelector.kt @@ -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) } diff --git a/feature/zip/src/main/java/ru/tech/imageresizershrinker/feature/zip/presentation/ZipContent.kt b/feature/zip/src/main/java/ru/tech/imageresizershrinker/feature/zip/presentation/ZipContent.kt index 4f04fbf24..a1d5c8ce9 100644 --- a/feature/zip/src/main/java/ru/tech/imageresizershrinker/feature/zip/presentation/ZipContent.kt +++ b/feature/zip/src/main/java/ru/tech/imageresizershrinker/feature/zip/presentation/ZipContent.kt @@ -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()