diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6dcfe8a..5998675 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,6 +52,7 @@ dependencies { implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) + implementation(libs.androidx.foundation.layout.android) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SearchBottomComponents.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SearchBottomComponents.kt index e2c6bae..a957b9b 100755 --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SearchBottomComponents.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SearchBottomComponents.kt @@ -170,9 +170,6 @@ fun SearchTextFieldPrev() { fun SearchContextMenu( onSearch: (LksRequest) -> Unit ) { - - - var name by remember { mutableStateOf("") } var surname by remember { mutableStateOf("") } var family by remember { mutableStateOf("") } @@ -180,63 +177,62 @@ fun SearchContextMenu( var group by remember { mutableStateOf("") } var departamnet by remember { mutableStateOf("") } - ContextMenuContainer { + Column( + verticalArrangement = Arrangement.spacedBy(8.dp), + modifier = Modifier.padding(horizontal = 24.dp) + ) { - Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + SearchTextField( + value = family, + onValueChange = {family = it}, + label = "Фамилия" + ) - SearchTextField( - value = family, - onValueChange = {family = it}, - label = "Фамилия" - ) + SearchTextField( + value = name, + onValueChange = {name = it}, + label = "Имя" + ) - SearchTextField( - value = name, - onValueChange = {name = it}, - label = "Имя" - ) + SearchTextField( + value = surname, + onValueChange = {surname = it}, + label = "Отчество" + ) - SearchTextField( - value = surname, - onValueChange = {surname = it}, - label = "Отчество" - ) + Spacer(Modifier.height(1.dp)) + HorizontalDivider(color = MaterialTheme.colorScheme.onBackground) - Spacer(Modifier.height(1.dp)) - HorizontalDivider(color = MaterialTheme.colorScheme.onBackground) + SearchTextField( + value = group, + onValueChange = {group = it}, + label = "Учебная группа" + ) - SearchTextField( - value = group, - onValueChange = {group = it}, - label = "Учебная группа" - ) + SearchTextField( + value = departamnet, + onValueChange = { departamnet = it }, + label = "Подразделение" + ) - SearchTextField( - value = departamnet, - onValueChange = { departamnet = it }, - label = "Подразделение" - ) - - Button( - shape = OutlinedTextFieldDefaults.shape, - modifier = Modifier.fillMaxWidth(), - onClick = { - val lksRequest = LksRequest( - student = Student( - name = name.ifEmpty { null }, - surname = family.ifEmpty { null }, - patronymic = surname.ifEmpty { null }, - ), - group = group.ifEmpty { null }, - department = departamnet.ifEmpty { null } - ) - onSearch(lksRequest) - //bottomSheetNavigator?.hide() - } - ) { - Text("Поиск") + Button( + shape = OutlinedTextFieldDefaults.shape, + modifier = Modifier.fillMaxWidth(), + onClick = { + val lksRequest = LksRequest( + student = Student( + name = name.ifEmpty { null }, + surname = family.ifEmpty { null }, + patronymic = surname.ifEmpty { null }, + ), + group = group.ifEmpty { null }, + department = departamnet.ifEmpty { null } + ) + onSearch(lksRequest) + //bottomSheetNavigator?.hide() } - + ) { + Text("Поиск") } } @@ -314,29 +310,27 @@ fun LongPressCardContextMenu( onCopyName: (String) -> Unit, onCopyGroup: (String) -> Unit ) { - ContextMenuContainer { - Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { + Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { - Text( - "${lksStudent.studentFullName} ${lksStudent.group}" - ) - HorizontalDivider(color = MaterialTheme.colorScheme.onBackground) - ContextMenuButton( - icon = R.drawable.vk_ic.asPainter(), - label = "Переидти в VK", - onClick = onGoToVk - ) - ContextMenuButton( - icon = rememberVectorPainter(Icons.Outlined.AccountCircle), - label = "Скопировать имя пользователя", - onClick = { onCopyName.invoke(lksStudent.studentFullName ?: "") } - ) - ContextMenuButton( - icon = rememberVectorPainter(Icons.Outlined.Person), - label = "Скопировать группу", - onClick = { onCopyGroup.invoke(lksStudent.group ?: "") } - ) - } + Text( + "${lksStudent.studentFullName} ${lksStudent.group}" + ) + HorizontalDivider(color = MaterialTheme.colorScheme.onBackground) + ContextMenuButton( + icon = R.drawable.vk_ic.asPainter(), + label = "Переидти в VK", + onClick = onGoToVk + ) + ContextMenuButton( + icon = rememberVectorPainter(Icons.Outlined.AccountCircle), + label = "Скопировать имя пользователя", + onClick = { onCopyName.invoke(lksStudent.studentFullName ?: "") } + ) + ContextMenuButton( + icon = rememberVectorPainter(Icons.Outlined.Person), + label = "Скопировать группу", + onClick = { onCopyGroup.invoke(lksStudent.group ?: "") } + ) } } diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/SearchBottomSheet.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/SearchBottomSheet.kt index b969d04..aec4d69 100755 --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/SearchBottomSheet.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/SearchBottomSheet.kt @@ -1,11 +1,25 @@ package ru.megboyzz.lks.profile.ui.screens.sub +import android.view.ViewTreeObserver import androidx.activity.viewModels +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.ime +import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalView +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import kotlinx.coroutines.launch import ru.megboyzz.lks.profile.ui.components.SearchContextMenu import ru.megboyzz.lks.profile.ui.model.SearchViewModel @@ -18,15 +32,41 @@ fun SearchBottomSheet(onDismiss: () -> Unit) { val viewModel by LocalMainActivity.current.viewModels() - val sheetState = rememberModalBottomSheetState() + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) val coroutineScope = rememberCoroutineScope() + val view = LocalView.current + var isImeVisible by remember { mutableStateOf(false) } + + // Observe keyboard visibility using ViewTreeObserver + DisposableEffect(Unit) { + val listener = ViewTreeObserver.OnPreDrawListener { + // Check if the IME (keyboard) is visible + isImeVisible = ViewCompat.getRootWindowInsets(view) + ?.isVisible(WindowInsetsCompat.Type.ime()) == true + true + } + view.viewTreeObserver.addOnPreDrawListener(listener) + onDispose { + view.viewTreeObserver.removeOnPreDrawListener(listener) + } + } + ModalBottomSheet( sheetState = sheetState, - onDismissRequest = onDismiss + onDismissRequest = onDismiss, + windowInsets = WindowInsets.ime, + dragHandle = { BottomSheetDefaults.DragHandle() }, + modifier = Modifier.then( + if (isImeVisible) + Modifier.fillMaxHeight(1.0F) // Full height when keyboard is visible + else + Modifier.fillMaxHeight(0.73F) // Partial height when keyboard is hidden + ) ) { SearchContextMenu { lksRequest -> viewModel.newSearch(lksRequest) + onDismiss() coroutineScope.launch { sheetState.hide() } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1066eee..c6875e1 100755 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -14,6 +14,7 @@ jetbrainsKotlinJvm = "2.0.0" composeNavigation = "2.8.0-alpha08" room_version = "2.6.1" serialization = "1.6.3" +foundationLayoutAndroid = "1.6.6" [libraries] androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room_version" } @@ -38,6 +39,7 @@ androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit androidx-material3 = { group = "androidx.compose.material3", name = "material3" } navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "composeNavigation" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization"} +androidx-foundation-layout-android = { group = "androidx.compose.foundation", name = "foundation-layout-android", version.ref = "foundationLayoutAndroid" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }