diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 600b76c..b268ef3 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -5,12 +5,6 @@ - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 0e106ff..e19a045 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,9 +1,9 @@ - diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore old mode 100644 new mode 100755 diff --git a/app/build.gradle.kts b/app/build.gradle.kts old mode 100644 new mode 100755 index e484071..415cd0c --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,7 +2,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) - kotlin("kapt") + id("com.google.devtools.ksp") id("com.google.dagger.hilt.android") } @@ -60,7 +60,7 @@ dependencies { debugImplementation(libs.androidx.ui.test.manifest) implementation(libs.hilt.android) - kapt(libs.hilt.android.compiler) + ksp(libs.hilt.android.compiler) implementation(libs.voyager.navigator) diff --git a/app/data/.gitignore b/app/data/.gitignore old mode 100644 new mode 100755 diff --git a/app/data/build.gradle.kts b/app/data/build.gradle.kts old mode 100644 new mode 100755 diff --git a/app/data/proguard-rules.pro b/app/data/proguard-rules.pro old mode 100644 new mode 100755 diff --git a/app/data/src/androidTest/java/ru/megboyzz/lks/data/ExampleInstrumentedTest.kt b/app/data/src/androidTest/java/ru/megboyzz/lks/data/ExampleInstrumentedTest.kt old mode 100644 new mode 100755 diff --git a/app/data/src/main/AndroidManifest.xml b/app/data/src/main/AndroidManifest.xml old mode 100644 new mode 100755 diff --git a/app/data/src/test/java/ru/megboyzz/lks/data/ExampleUnitTest.kt b/app/data/src/test/java/ru/megboyzz/lks/data/ExampleUnitTest.kt old mode 100644 new mode 100755 diff --git a/app/domain/.gitignore b/app/domain/.gitignore old mode 100644 new mode 100755 diff --git a/app/domain/build.gradle.kts b/app/domain/build.gradle.kts old mode 100644 new mode 100755 diff --git a/app/domain/src/test/kotlin/EntityTest.kt b/app/domain/src/test/kotlin/EntityTest.kt old mode 100644 new mode 100755 diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro old mode 100644 new mode 100755 diff --git a/app/src/androidTest/java/ru/megboyzz/lks/profile/ExampleInstrumentedTest.kt b/app/src/androidTest/java/ru/megboyzz/lks/profile/ExampleInstrumentedTest.kt old mode 100644 new mode 100755 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml old mode 100644 new mode 100755 diff --git a/app/src/main/assets/dict.json b/app/src/main/assets/dict.json new file mode 100755 index 0000000..4985ae4 --- /dev/null +++ b/app/src/main/assets/dict.json @@ -0,0 +1,105 @@ +{ + "ИДО": "Институт дополнительного образования", + "ИМО": "Институт международного образования", + "ИДП": "Институт довузовской подготовки", + "ИТХТ": "Институт тонких химических технологий имени М.В. Ломоносова", + "ИИИ": "Институт искусственного интеллекта", + "БК250": "Базовая кафедра № 250 - математического обеспечения информационных систем", + "ИПТ": "Институт перспективных технологий и индустриального программирования", + "БК235": "Базовая кафедра № 235 - цифровых устройств и систем защиты информации", + "КСТУ": "Кафедра современных технологий управления", + "БК536": "Базовая кафедра № 536 - программного обеспечения систем РЭА", + "ИКДТ": "Институт кибербезопасности и цифровых технологий", + "УПО": "Управление платных образовательных услуг", + "КВМ3": "Кафедра высшей математики-3", + "КФТМ": "Кафедра физики и технической механики", + "УОРТ": "Учебный отдел Института радиотехнических и телекоммуникационных систем", + "БК333": "Базовая кафедра № 333 имени профессора Лобанова Б.С. - систем радиоэлектронной борьбы", + "БК334": "Базовая кафедра № 334 - дальней радиосвязи", + "БК338": "Базовая кафедра № 338 - космической радиоэлектроники", + "КИЭТ": "Кафедра инженерной экологии техносферы", + "КИЯ1": "Кафедра иностранных языков 1", + "КРЭСК": "Кафедра радиоэлектронных систем и комплексов", + "КБПФ": "Кафедра биотехнологии и промышленной фармации", + "КДГП": "Кафедра документоведения, истории государства и права", + "БК340": "Базовая кафедра № 340 - информационных космических систем", + "БК343": "Базовая кафедра № 343 - моделирования радиофизических процессов", + "ЦДО": "Центр дистанционного обучения", + "КФТМ2024": "Кафедра физики и технической механики (от 19.06.2024 № 26-ст)", + "КИТГУ": "Кафедра информационных технологий в государственном управлении", + "КМОСИТ": "Кафедра математического обеспечения и стандартизации информационных технологий", + "КПК": "Колледж программирования и кибербезопасности", + "КВТ": "Кафедра вычислительной техники", + "ИИТ": "Институт информационных технологий", + "КИГ": "Кафедра инженерной графики", + "КЭТ": "Кафедра экономической теории", + "КОИ": "Кафедра общей информатики", + "ККПРЭС": "Кафедра конструирования и производства радиоэлектронных средств", + "КСИ": "Кафедра системной инженерии", + "Аспирантура": "Аспирантура", + "ПОДГ": "Подготовительное отделение для иностранных граждан", + "Ректорат": "Ректорат", + "ИРИ": "Институт радиоэлектроники и информатики", + "ЮО": "Юридический отдел", + "УМУ": "Учебно-методическое управление", + "УК": "Управление кадров", + "ФФГБОУВОС": "Филиал федерального государственного бюджетного образовательного учреждения высшего образования «МИРЭА - Российский технологический университет» в г. Ставрополе", + "УГОЧС": "Управление гражданской обороны и чрезвычайных ситуаций", + "КН": "Кафедра наноэлектроники", + "Бухгалтерия": "Бухгалтерия", + "УОИМО": "Учебный отдел института международного образования", + "СПВ86": "Сектор «Проспект Вернадского, 86»", + "СИАО": "Студенческий информационно-архивный отдел", + "УЭФ": "Управление экономики и финансов", + "УМС": "Управление международных связей", + "УВСР": "Управление по воспитательной и социальной работе", + "ПР": "Первый отдел", + "СГИ": "Служба главного инженера", + "НТБ": "Научно-техническая библиотека", + "УИ": "Управление информатизации", + "КМС": "Кафедра метрологии и стандартизации", + "ССт20": "Сектор «Стромынка, 20»", + "ИАО": "Информационно-аналитический отдел", + "ОСПР": "Отдел судебно-претензионной работы", + "БК140": "Базовая кафедра № 140 - фотоники", + "УД": "Управление делами", + "УМП": "Управление мобилизационной подготовки", + "БК130": "Базовая кафедра № 130 - твердотельной электроники", + "НОЦТЦ": "Научно-образовательный центр «Технологический центр»", + "БК131": "Базовая кафедра № 131 - оптико-физических измерений", + "БК132": "Базовая кафедра № 132 - лазерной техники", + "БК136": "Базовая кафедра № 136 - СВЧ приборов и устройств", + "ФМШ": "Физико-математическая школа", + "КПВВ": "Курсы по подготовке к поступлению в вуз", + "ОМКО": "Отдел менеджмента качества образования", + "ОТСО": "Отдел технических средств обучения", + "ОЗЗИ": "Отдел обеспечения защиты информации", + "ОТК": "Отдел технического контроля", + "Автобаза": "Автобаза", + "Академия ТВ": "Академия ТВ", + "ГИВЦ": "Главный информационно-вычислительный центр", + "УНИР": "Управление научно-исследовательских разработок", + "КДЦ": "Культурно-досуговый центр", + "МНТЦИС": "Межотраслевой научно-технический центр интеллектуальных технологий обработки информации и управления «Интеллектуальные системы»", + "НТЦН": "Научно-технологический центр «Наука»", + "НИЦРСВТ": "Научно-исследовательский центр разработки специальной вычислительной техники", + "НИЦИПМ": "Научно-исследовательский центр «Инновационные полимерные материалы и изделия»", + "ОИТОСБ": "Отдел инженерно-технического обеспечения средств безопасности", + "ЦПИС": "Центр проектирования интегральных схем, устройств наноэлектроники и микросистем", + "ЦЯП": "Центр языковой подготовки", + "ИМПМО": "Институт молодежной политики и международных отношений", + "НИИМФП": "Научно-исследовательский институт медицинской и фармацевтической промышленности", + "ИПЦСНК": "Инженерно-научный производственный центр «Средства неразрушающего контроля» МИРЭА", + "УЦВ": "Учебный центр подготовки водителей", + "ИТП": "Институт технологического предпринимательства", + "СУЛСДФ": "Специализированная учебно-научная лаборатория сверхбыстрой динамики ферроиков", + "УНИИСУ": "Учебно-научный институт информатики и систем управления", + "УМЦИТ": "Учебно-методический центр интерактивных технологий", + "ОКБМИРЭА": "Особое конструкторское бюро МИРЭА", + "ИУС": "Институт учета и статистики", + "НИЦПНТП": "Научно-инжиниринговый центр «Перспективные научно-технические проекты»", + "Наноцентр МИРЭА": "Наноцентр МИРЭА", + "НТЦИРФ": "Научно-технологический центр «Интегральная радиофотоника»", + "РИО": "Редакционно-издательский отдел", + "ПЛМА": "Проблемная лаборатория молекулярной активации" +} diff --git a/app/src/main/java/ru/megboyzz/lks/profile/MainActivity.kt b/app/src/main/java/ru/megboyzz/lks/profile/MainActivity.kt old mode 100644 new mode 100755 index 84d197e..1dace87 --- a/app/src/main/java/ru/megboyzz/lks/profile/MainActivity.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/MainActivity.kt @@ -26,6 +26,7 @@ import ru.megboyzz.lks.profile.ui.theme.MainTheme @AndroidEntryPoint class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() diff --git a/app/src/main/java/ru/megboyzz/lks/profile/data/App.kt b/app/src/main/java/ru/megboyzz/lks/profile/data/App.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/data/Core.kt b/app/src/main/java/ru/megboyzz/lks/profile/data/Core.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/data/di/CoroutineModule.kt b/app/src/main/java/ru/megboyzz/lks/profile/data/di/CoroutineModule.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/data/di/DataModule.kt b/app/src/main/java/ru/megboyzz/lks/profile/data/di/DataModule.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/data/repositories/LksRepositoryImpl.kt b/app/src/main/java/ru/megboyzz/lks/profile/data/repositories/LksRepositoryImpl.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/data/repositories/StudentRepositoryImpl.kt b/app/src/main/java/ru/megboyzz/lks/profile/data/repositories/StudentRepositoryImpl.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/domain/Scopes.kt b/app/src/main/java/ru/megboyzz/lks/profile/domain/Scopes.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/LksRequest.kt b/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/LksRequest.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/LksResponse.kt b/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/LksResponse.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/LksStudent.kt b/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/LksStudent.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/Resource.kt b/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/Resource.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/Student.kt b/app/src/main/java/ru/megboyzz/lks/profile/domain/entities/Student.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/domain/repositories/LksRepository.kt b/app/src/main/java/ru/megboyzz/lks/profile/domain/repositories/LksRepository.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/domain/repositories/StudentRepository.kt b/app/src/main/java/ru/megboyzz/lks/profile/domain/repositories/StudentRepository.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/HiltModule.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/HiltModule.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/Util.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/Util.kt old mode 100644 new mode 100755 index 7463f33..8f2b7fc --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/Util.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/Util.kt @@ -1,5 +1,9 @@ package ru.megboyzz.lks.profile.ui +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.widget.Toast import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable @@ -24,5 +28,27 @@ fun Modifier.clickableWithNormalRipple( onLongClick = onLongClick ) +@OptIn(ExperimentalFoundationApi::class) @Composable -fun Int.asPainter() = painterResource(this) \ No newline at end of file +fun Modifier.clickableWithNoEffect( + onClick: () -> Unit = {}, + onLongClick: () -> Unit = {}, +) = this.combinedClickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = onClick, + onLongClick = onLongClick +) + +@Composable +fun Int.asPainter() = painterResource(this) + +fun Context.copyToClipboard(content: String) { + val clipboardManager = this.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + + val clip = ClipData.newPlainText("label", content) + + clipboardManager.setPrimaryClip(clip) + + Toast.makeText(this, "Текст скопирован в буфер обмена", Toast.LENGTH_SHORT).show() +} \ No newline at end of file diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/components/MainNavigator.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/components/MainNavigator.kt old mode 100644 new mode 100755 index caddf38..bf73cdd --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/components/MainNavigator.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/components/MainNavigator.kt @@ -9,14 +9,17 @@ import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.bottomSheet.BottomSheetNavigator import cafe.adriel.voyager.transitions.SlideTransition import ru.megboyzz.lks.profile.ui.screens.SearchScreen +import ru.megboyzz.lks.profile.ui.theme.MainTheme @Composable fun MainNavigator(screen: Screen) { BottomSheetNavigator( sheetShape = RoundedCornerShape(12.dp) ) { - Navigator(screen) { - SlideTransition(it) + MainTheme { + Navigator(screen) { + SlideTransition(it) + } } } } \ No newline at end of file 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 old mode 100644 new mode 100755 index 31d8521..d006933 --- 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 @@ -1,7 +1,6 @@ package ru.megboyzz.lks.profile.ui.components import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -18,19 +17,18 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight import androidx.compose.material.icons.filled.KeyboardArrowDown -import androidx.compose.material.icons.filled.KeyboardArrowRight import androidx.compose.material.icons.filled.KeyboardArrowUp +import androidx.compose.material.icons.outlined.AccountCircle +import androidx.compose.material.icons.outlined.Person import androidx.compose.material3.Button import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.Text -import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf @@ -42,7 +40,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.tooling.preview.Preview @@ -62,7 +60,7 @@ fun ContextMenuContainer( Column( modifier = Modifier - .padding(4.dp) + .padding(horizontal = 4.dp, vertical = 8.dp) .fillMaxWidth() .navigationBarsPadding(), horizontalAlignment = Alignment.CenterHorizontally @@ -264,7 +262,7 @@ fun ContextMenuButton( Box( modifier = Modifier - .padding(8.dp) + .padding(0.dp) .clickableWithNormalRipple(onClick = onClick) ) { Row( @@ -275,19 +273,20 @@ fun ContextMenuButton( Row( verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(4.dp) + horizontalArrangement = Arrangement.spacedBy(16.dp) ) { Icon( painter = icon, contentDescription = null, - tint = Color.Unspecified + tint = Color.Unspecified, + modifier = Modifier.size(36.dp) ) Text(text = label) } Icon( imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight, - contentDescription = null + contentDescription = null, ) } @@ -311,10 +310,12 @@ fun ContextMenuButtonPrev() { @Composable fun LongPressCardContextMenu( lksStudent: LksStudent, - onClick: () -> Unit + onGoToVk: () -> Unit, + onCopyName: (String) -> Unit, + onCopyGroup: (String) -> Unit ) { ContextMenuContainer { - Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Column(verticalArrangement = Arrangement.spacedBy(16.dp)) { Text( "${lksStudent.studentFullName} ${lksStudent.group}" @@ -323,7 +324,17 @@ fun LongPressCardContextMenu( ContextMenuButton( icon = R.drawable.vk_ic.asPainter(), label = "Переидти в VK", - onClick = onClick + 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 ?: "") } ) } } @@ -340,7 +351,9 @@ private fun LongPressCardContextMenuPrev() { LongPressCardContextMenu( lksStudent = lksStudent, - onClick = {} + onGoToVk = {}, + onCopyName = {}, + onCopyGroup = {} ) diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SearchComponents.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SearchComponents.kt old mode 100644 new mode 100755 index b9dbc8d..ea23c5d --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SearchComponents.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SearchComponents.kt @@ -52,6 +52,7 @@ import kotlinx.coroutines.withContext import ru.megboyzz.lks.profile.MainActivity import ru.megboyzz.lks.profile.domain.entities.LksResponse import ru.megboyzz.lks.profile.domain.entities.LksStudent +import ru.megboyzz.lks.profile.ui.clickableWithNoEffect import ru.megboyzz.lks.profile.ui.clickableWithNormalRipple import ru.megboyzz.lks.profile.ui.screens.sub.LongPressMenu import ru.megboyzz.lks.profile.ui.theme.MainTheme @@ -120,12 +121,16 @@ fun ProfileCard( @Composable fun MainScaffold( onFloatingButtonClick: () -> Unit, + onTopClick: () -> Unit = {}, content: @Composable (PaddingValues) -> Unit ) { Scaffold( topBar = { - Surface(shadowElevation = 8.dp) { + Surface( + shadowElevation = 8.dp, + modifier = Modifier.clickableWithNoEffect(onTopClick) + ) { TopAppBar( title = { Text("LKS Search") } ) @@ -217,7 +222,10 @@ fun CardsColumn( } } - Column(modifier) { + Column( + modifier = modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally + ) { LazyColumn( state = listState, contentPadding = PaddingValues(12.dp), diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SharedComponets.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/components/SharedComponets.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/model/SearchScreenModel.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/model/SearchScreenModel.kt old mode 100644 new mode 100755 index 95d3eba..59a5875 --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/model/SearchScreenModel.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/model/SearchScreenModel.kt @@ -39,28 +39,27 @@ class SearchScreenModel @Inject constructor( val state = MutableStateFlow(UiState.Idle) - init { - _curPageNumber.onEach { + suspend fun nextPage() { + if(_responseList.value.availablePages > _curPageNumber.value) { + _curPageNumber.emit(_curPageNumber.value + 1) update(_request.value) - }.launchIn(CoroutineScope(Dispatchers.IO)) + } } - fun nextPage() = screenModelScope.launch { _curPageNumber.emit(_curPageNumber.value++) } - - fun resetStudents() = screenModelScope.launch { + suspend fun resetStudents() { + _curPageNumber.value = 1 _responseList.emit(LksResponse()) } fun newSearch(request: LksRequest) { screenModelScope.launch(Dispatchers.IO) { + state.emit(UiState.Loading) resetStudents() - update(request) + state.emit(update(request)) } } - private suspend fun update(request: LksRequest) { - - state.emit(UiState.Loading) + suspend fun update(request: LksRequest): UiState { _request.emit(request) @@ -68,21 +67,19 @@ class SearchScreenModel @Inject constructor( val result = lksRepository.getPage(request, repoCookies, curPageNumber.value) - if(result.isFailure) { - state.emit(UiState.Error("Ошибка :-(")) - return - } + if(result.isFailure) + return UiState.Error("Ошибка :-(") val list = result.getOrElse { LksResponse() } - val updatedStudents = _responseList.value.copy( + val updatedStudents = LksResponse( students = _responseList.value.students + list.students, - availablePages = _responseList.value.availablePages + list.availablePages + availablePages = list.availablePages ) _responseList.emit(updatedStudents) - state.emit(UiState.Idle) + return UiState.Idle } diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/model/SignInScreenModel.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/model/SignInScreenModel.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/SearchScreen.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/SearchScreen.kt old mode 100644 new mode 100755 index 858eb5a..abb90ed --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/SearchScreen.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/SearchScreen.kt @@ -43,10 +43,9 @@ class SearchScreen : Screen { val list by screenModel.responseList.collectAsState() - val context = LocalContext.current - MainScaffold( - onFloatingButtonClick = { bottomSheetNavigator.show(SearchBottomScreen(screenModel)) } + onFloatingButtonClick = { bottomSheetNavigator.show(SearchBottomScreen(screenModel)) }, + onTopClick = { } ) { when (state) { @@ -60,7 +59,7 @@ class SearchScreen : Screen { onColumnOverflow = { //Toast.makeText(context, "Hello!", Toast.LENGTH_SHORT).show() screenModel.nextPage() - screenModel.update(screenModel.request.value) + //screenModel.update(screenModel.request.value) //screenModel.nextPage() } ) diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/SignInScreen.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/SignInScreen.kt old mode 100644 new mode 100755 index ee30be8..c373b70 --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/SignInScreen.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/SignInScreen.kt @@ -1,5 +1,7 @@ package ru.megboyzz.lks.profile.ui.screens +import android.os.Parcel +import android.os.Parcelable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/LongPressMenu.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/LongPressMenu.kt old mode 100644 new mode 100755 index d25fb96..9610665 --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/LongPressMenu.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/LongPressMenu.kt @@ -8,6 +8,7 @@ import androidx.compose.ui.platform.LocalContext import cafe.adriel.voyager.core.screen.Screen import ru.megboyzz.lks.profile.domain.entities.LksStudent import ru.megboyzz.lks.profile.ui.components.LongPressCardContextMenu +import ru.megboyzz.lks.profile.ui.copyToClipboard class LongPressMenu(private val lksStudent: LksStudent) : Screen { @@ -18,13 +19,20 @@ class LongPressMenu(private val lksStudent: LksStudent) : Screen { val context = LocalContext.current LongPressCardContextMenu( - lksStudent = lksStudent - ) { - Toast.makeText(context, "Переход на VK", Toast.LENGTH_SHORT).show() - val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://vk.com/search?q=${lksStudent.studentFullName?.split(" ")?.dropLast(1)?.joinToString(" ")}")) - browserIntent.`package` = "com.vkontakte.android" - context.startActivity(browserIntent) - } + lksStudent = lksStudent, + onCopyName = { + context.copyToClipboard(lksStudent.studentFullName.toString()) + }, + onCopyGroup = { + context.copyToClipboard(lksStudent.studentFullName.toString()) + }, + onGoToVk = { + Toast.makeText(context, "Переход на VK", Toast.LENGTH_SHORT).show() + val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://vk.com/search?q=${lksStudent.studentFullName?.split(" ")?.dropLast(1)?.joinToString(" ")}")) + browserIntent.`package` = "com.vkontakte.android" + context.startActivity(browserIntent) + } + ) } diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/SearchBottomScreen.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/screens/sub/SearchBottomScreen.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/theme/Color.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/theme/Color.kt old mode 100644 new mode 100755 diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/theme/Theme.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/theme/Theme.kt old mode 100644 new mode 100755 index 33aa5e3..016f20e --- a/app/src/main/java/ru/megboyzz/lks/profile/ui/theme/Theme.kt +++ b/app/src/main/java/ru/megboyzz/lks/profile/ui/theme/Theme.kt @@ -12,47 +12,44 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 + primary = Color(0xFFB0BEC5), // Серый с голубым оттенком + secondary = Color(0xFF90A4AE), // Более мягкий серо-голубой + tertiary = Color(0xFFB39DDB), // Нежный фиолетовый + + background = Color(0xFF121212), // Темный фон для контраста + surface = Color(0xFF1E1E1E), // Темная поверхность + onPrimary = Color.Black, + onSecondary = Color.Black, + onTertiary = Color.Black, + onBackground = Color(0xFFECEFF1), // Светлый текст на темном фоне + onSurface = Color(0xFFECEFF1) // Светлый текст на поверхностях ) private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40, + primary = Color(0xFF90CAF9), // Голубой с пастельным оттенком + secondary = Color(0xFFB3E5FC), // Мягкий голубой + tertiary = Color(0xFFC5CAE9), // Светлый фиолетовый - // Other default colors to override - background = Color(0xFFFFFBFE), - surface = Color(0xFFFFFBFE), + background = Color(0xFFF5F5F5), // Очень светлый фон + surface = Color(0xFFFFFFFF), // Чисто белая поверхность onPrimary = Color.White, - onSecondary = Color.White, - onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), - onSurface = Color(0xFF1C1B1F), - + onSecondary = Color.Black, + onTertiary = Color.Black, + onBackground = Color(0xFF212121), // Темный текст на светлом фоне + onSurface = Color(0xFF212121) // Темный текст на поверхностях ) @Composable fun MainTheme( darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, + dynamicColor: Boolean = false, // Отключаем динамические цвета для четкости палитры content: @Composable () -> Unit ) { - val colorScheme = when { - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } - - darkTheme -> DarkColorScheme - else -> LightColorScheme - } + val colorScheme = if (darkTheme) DarkColorScheme else LightColorScheme MaterialTheme( colorScheme = colorScheme, typography = Typography, content = content ) -} \ No newline at end of file +} diff --git a/app/src/main/java/ru/megboyzz/lks/profile/ui/theme/Type.kt b/app/src/main/java/ru/megboyzz/lks/profile/ui/theme/Type.kt old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/drawable/vk_ic.xml b/app/src/main/res/drawable/vk_ic.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp old mode 100644 new mode 100755 diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml old mode 100644 new mode 100755 diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml old mode 100644 new mode 100755 diff --git a/app/src/test/java/ru/megboyzz/lks/profile/ExampleUnitTest.kt b/app/src/test/java/ru/megboyzz/lks/profile/ExampleUnitTest.kt old mode 100644 new mode 100755 diff --git a/build.gradle.kts b/build.gradle.kts old mode 100644 new mode 100755 index cb4c2b2..338e8c2 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,5 +5,6 @@ plugins { alias(libs.plugins.kotlin.compose) apply false alias(libs.plugins.jetbrains.kotlin.jvm) apply false alias(libs.plugins.android.library) apply false + id("com.google.devtools.ksp") version "2.0.0-1.0.24" apply false id("com.google.dagger.hilt.android") version "2.51.1" apply false } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties old mode 100644 new mode 100755 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml old mode 100644 new mode 100755 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar old mode 100644 new mode 100755 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties old mode 100644 new mode 100755 diff --git a/gradlew.bat b/gradlew.bat old mode 100644 new mode 100755 diff --git a/settings.gradle.kts b/settings.gradle.kts old mode 100644 new mode 100755