From 43da0f74f36fc4646ef747b3bde8642eadba6520 Mon Sep 17 00:00:00 2001 From: Practicum Date: Wed, 12 Nov 2025 10:41:19 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=9C=D0=9E=D0=B9=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D1=8B=D0=B9=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contacts/ExampleInstrumentedTest.java | 6 +- .../country/CountryCodeBottomSheet.kt | 115 ++++------------- .../presentation/main/ContactsScreen.kt | 31 ++++- .../messengers/MessengersBottomSheet.kt | 117 +++++------------- .../ui/components/CommonBottomSheet.kt | 15 ++- .../presentation/ui/components/ContactItem.kt | 18 ++- app/src/main/res/values/themes.xml | 2 +- .../practicum/contacts/ExampleUnitTest.java | 4 +- 8 files changed, 116 insertions(+), 192 deletions(-) diff --git a/app/src/androidTest/java/ru/yandex/practicum/contacts/ExampleInstrumentedTest.java b/app/src/androidTest/java/ru/yandex/practicum/contacts/ExampleInstrumentedTest.java index 8988aa5..cb573c4 100644 --- a/app/src/androidTest/java/ru/yandex/practicum/contacts/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/ru/yandex/practicum/contacts/ExampleInstrumentedTest.java @@ -1,15 +1,15 @@ package ru.yandex.practicum.contacts; +import static org.junit.Assert.assertEquals; + import android.content.Context; -import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.*; - /** * Instrumented test, which will execute on an Android device. * diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/country/CountryCodeBottomSheet.kt b/app/src/main/java/ru/yandex/practicum/contacts/presentation/country/CountryCodeBottomSheet.kt index e74ab23..34cf5a5 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/country/CountryCodeBottomSheet.kt +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/country/CountryCodeBottomSheet.kt @@ -1,32 +1,21 @@ package ru.yandex.practicum.contacts.presentation.country -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close -import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.Checkbox import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import ru.yandex.practicum.contacts.R import ru.yandex.practicum.contacts.data.models.CountryCode +import ru.yandex.practicum.contacts.presentation.ui.components.CommonBottomSheet @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -35,79 +24,35 @@ fun CountryCodeBottomSheet( onCodesSelected: (Set) -> Unit, onDismiss: () -> Unit ) { - ModalBottomSheet( - onDismissRequest = onDismiss, - dragHandle = { BottomSheetDefaults.DragHandle() } - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = stringResource(R.string.filter_by_country_code), - style = MaterialTheme.typography.titleLarge - ) - IconButton(onClick = onDismiss) { - Icon( - imageVector = Icons.Default.Close, - contentDescription = stringResource(R.string.close) - ) - } - } - - LazyColumn( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp) - ) { - items(CountryCode.COMMON_CODES) { countryCode -> - val isSelected = selectedCodes.contains(countryCode) - Surface( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 4.dp), - onClick = { - val newSelection = selectedCodes.toMutableSet() - if (isSelected) { - newSelection.remove(countryCode) - } else { - newSelection.add(countryCode) - } - onCodesSelected(newSelection) - }, - color = if (isSelected) { - MaterialTheme.colorScheme.primaryContainer - } else { - MaterialTheme.colorScheme.surface - } - ) { - CountryCodeOption( - isSelected = isSelected, - countryCode = countryCode, - selectedCodes = selectedCodes, - onCodesSelected = onCodesSelected - ) + CommonBottomSheet( + items = CountryCode.COMMON_CODES, + selectedItems = selectedCodes, + onItemsSelected = onCodesSelected, + onDismiss = onDismiss, + title = "Filter by country code", + itemContent = { countryCode, isSelected -> + CountryCodeItem( + countryCode = countryCode, + isSelected = isSelected, + onCheckedChange = { checked -> + val newSelection = selectedCodes.toMutableSet() + if (checked) { + newSelection.add(countryCode) + } else { + newSelection.remove(countryCode) } + onCodesSelected(newSelection) } - } + ) } - } + ) } @Composable -private fun CountryCodeOption( - isSelected: Boolean, +fun CountryCodeItem( countryCode: CountryCode, - selectedCodes: Set, - onCodesSelected: (Set) -> Unit + isSelected: Boolean, + onCheckedChange: (Boolean) -> Unit // ИСПРАВЛЕНО: (Boolean) -> Unit ) { Row( modifier = Modifier @@ -117,21 +62,13 @@ private fun CountryCodeOption( ) { Checkbox( checked = isSelected, - onCheckedChange = { checked -> - val newSelection = selectedCodes.toMutableSet() - if (checked) { - newSelection.add(countryCode) - } else { - newSelection.remove(countryCode) - } - onCodesSelected(newSelection) - } + onCheckedChange = onCheckedChange ) Spacer(modifier = Modifier.width(16.dp)) Column { - Text(countryCode.code) + Text(text = countryCode.code) Text( - countryCode.country, + text = countryCode.country, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactsScreen.kt b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactsScreen.kt index bdde8b7..c8025b9 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactsScreen.kt +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/main/ContactsScreen.kt @@ -1,13 +1,36 @@ package ru.yandex.practicum.contacts.presentation.main -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Sort -import androidx.compose.material.icons.filled.* -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material.icons.filled.FilterList +import androidx.compose.material.icons.filled.Language +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +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.platform.LocalContext diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/messengers/MessengersBottomSheet.kt b/app/src/main/java/ru/yandex/practicum/contacts/presentation/messengers/MessengersBottomSheet.kt index dcddf8d..3af25aa 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/messengers/MessengersBottomSheet.kt +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/messengers/MessengersBottomSheet.kt @@ -1,32 +1,20 @@ package ru.yandex.practicum.contacts.presentation.messengers -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close -import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.Checkbox import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import ru.yandex.practicum.contacts.R import ru.yandex.practicum.contacts.data.models.MessagingApp +import ru.yandex.practicum.contacts.presentation.ui.components.CommonBottomSheet @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -35,79 +23,35 @@ fun MessengersBottomSheet( onAppsSelected: (Set) -> Unit, onDismiss: () -> Unit ) { - ModalBottomSheet( - onDismissRequest = onDismiss, - dragHandle = { BottomSheetDefaults.DragHandle() } - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp) - ) { - Row( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = stringResource(R.string.filter_by_messaging_app), - style = MaterialTheme.typography.titleLarge - ) - IconButton(onClick = onDismiss) { - Icon( - imageVector = Icons.Default.Close, - contentDescription = stringResource(R.string.close) - ) - } - } - - LazyColumn( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 16.dp) - ) { - items(MessagingApp.entries) { app -> - val isSelected = selectedApps.contains(app) - Surface( - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 4.dp), - onClick = { - val newSelection = selectedApps.toMutableSet() - if (isSelected) { - newSelection.remove(app) - } else { - newSelection.add(app) - } - onAppsSelected(newSelection) - }, - color = if (isSelected) { - MaterialTheme.colorScheme.primaryContainer - } else { - MaterialTheme.colorScheme.surface - } - ) { - MessengerOption( - isSelected = isSelected, - app = app, - selectedApps = selectedApps, - onAppsSelected = onAppsSelected - ) + CommonBottomSheet( + items = MessagingApp.values().toList(), // или ваш источник данных + selectedItems = selectedApps, + onItemsSelected = onAppsSelected, + onDismiss = onDismiss, + title = "Select messaging apps", + itemContent = { app, isSelected -> + MessagingAppItem( + app = app, + isSelected = isSelected, + onCheckedChange = { checked -> + val newSelection = selectedApps.toMutableSet() + if (checked) { + newSelection.add(app) + } else { + newSelection.remove(app) } + onAppsSelected(newSelection) } - } + ) } - } + ) } @Composable -private fun MessengerOption( - isSelected: Boolean, +fun MessagingAppItem( app: MessagingApp, - selectedApps: Set, - onAppsSelected: (Set) -> Unit + isSelected: Boolean, + onCheckedChange: (Boolean) -> Unit ) { Row( modifier = Modifier @@ -117,17 +61,12 @@ private fun MessengerOption( ) { Checkbox( checked = isSelected, - onCheckedChange = { checked -> - val newSelection = selectedApps.toMutableSet() - if (checked) { - newSelection.add(app) - } else { - newSelection.remove(app) - } - onAppsSelected(newSelection) - } + onCheckedChange = onCheckedChange ) Spacer(modifier = Modifier.width(16.dp)) - Text(app.name) + Text( + text = app.name, + style = MaterialTheme.typography.bodyLarge + ) } } \ No newline at end of file diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/ui/components/CommonBottomSheet.kt b/app/src/main/java/ru/yandex/practicum/contacts/presentation/ui/components/CommonBottomSheet.kt index fbf8d02..e16b49b 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/ui/components/CommonBottomSheet.kt +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/ui/components/CommonBottomSheet.kt @@ -1,11 +1,22 @@ package ru.yandex.practicum.contacts.presentation.ui.components -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Close -import androidx.compose.material3.* +import androidx.compose.material3.BottomSheetDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier diff --git a/app/src/main/java/ru/yandex/practicum/contacts/presentation/ui/components/ContactItem.kt b/app/src/main/java/ru/yandex/practicum/contacts/presentation/ui/components/ContactItem.kt index 7166b8f..c49f49c 100644 --- a/app/src/main/java/ru/yandex/practicum/contacts/presentation/ui/components/ContactItem.kt +++ b/app/src/main/java/ru/yandex/practicum/contacts/presentation/ui/components/ContactItem.kt @@ -1,9 +1,23 @@ package ru.yandex.practicum.contacts.presentation.ui.components -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Phone -import androidx.compose.material3.* +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index c7caab8..be08a6b 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,4 +1,4 @@ - +