commit 742f6e5bbc975c30156b55af60c9b0ffa2e4f2d3 Author: AnnZhimol Date: Mon Oct 9 23:55:12 2023 +0400 lab2 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..3f24034 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ae388c2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..44ca2d9 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,41 @@ + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..0fc3113 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8978d23 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..3e9fdaf --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,75 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") +} + +android { + namespace = "com.example.pmulabs" + compileSdk = 34 + + defaultConfig { + applicationId = "com.example.pmulabs" + minSdk = 24 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.4.3" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + + implementation("androidx.core:core-ktx:1.9.0") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2") + implementation("androidx.activity:activity-compose:1.7.2") + implementation(platform("androidx.compose:compose-bom:2023.03.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material3:material3:1.2.0-alpha08") + implementation("androidx.compose.ui:ui-tooling-preview-android:1.5.2") + implementation("androidx.leanback:leanback:1.0.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") + implementation("androidx.compose.material:material-icons-extended") + implementation("androidx.navigation:navigation-compose:2.6.0") + implementation("androidx.navigation:navigation-compose:2.4.0-alpha10") + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/pmulabs/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/pmulabs/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..0eb42e3 --- /dev/null +++ b/app/src/androidTest/java/com/example/pmulabs/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.pmulabs + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.pmulabs", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c303088 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/MainActivity.kt b/app/src/main/java/com/example/pmulabs/MainActivity.kt new file mode 100644 index 0000000..20b4f9a --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/MainActivity.kt @@ -0,0 +1,24 @@ +package com.example.pmulabs + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.viewModels +import androidx.navigation.compose.rememberNavController +import com.example.pmulabs.designElem.SearchViewModel +import com.example.pmulabs.designElem.SharedViewModel +import com.example.pmulabs.graphs.RootNavigationGraph +import com.example.pmulabs.ui.theme.PMULabsTheme + +class MainActivity : ComponentActivity() { + private val searchViewModel: SearchViewModel by viewModels() + private val sharedViewModel: SharedViewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + PMULabsTheme { + RootNavigationGraph(navController = rememberNavController(),searchViewModel, sharedViewModel = sharedViewModel) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/basecomponents/navigate/BackButton.kt b/app/src/main/java/com/example/pmulabs/basecomponents/navigate/BackButton.kt new file mode 100644 index 0000000..6cc6d80 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/basecomponents/navigate/BackButton.kt @@ -0,0 +1,47 @@ +package com.example.pmulabs.basecomponents.navigate + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +@Composable +fun BackButton(modifier: Modifier = Modifier) { + Box( + modifier = modifier + .requiredWidth(width = 80.dp) + .requiredHeight(height = 30.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 80.dp) + .requiredHeight(height = 30.dp) + .clip(shape = RoundedCornerShape(6.dp)) + .background(color = Color(0xff423a99))) + Text( + text = "Back", + color = Color.White, + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 20.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 17.dp, + y = 3.dp)) + } +} + diff --git a/app/src/main/java/com/example/pmulabs/basecomponents/navigate/BottomBarScreen.kt b/app/src/main/java/com/example/pmulabs/basecomponents/navigate/BottomBarScreen.kt new file mode 100644 index 0000000..797fea2 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/basecomponents/navigate/BottomBarScreen.kt @@ -0,0 +1,87 @@ +package com.example.pmulabs.basecomponents.navigate + +import com.example.pmulabs.R + +const val SEARCH_ARGUMENT_TEXT="text" +const val CALENDAR_ARGUMENT_DATE="date" +const val SEARCHBYTAG_ARGUMENT_KEY="id" +const val ARTICLE_ARGUMENT_KEY="id" + +sealed class BottomBarScreen( + val route: String, + val title: String, + val icon: Int, + val iconFocused: Int + +){ + object Profile: BottomBarScreen( + route = "PROFILE", + title="Me", + icon= R.drawable.ic_bottom_profile, + iconFocused=R.drawable.ic_bottom_profile_focused + ) + object Categories: BottomBarScreen( + route = "CATEGORIES", + title="Tags", + icon= R.drawable.ic_bottom_categories, + iconFocused=R.drawable.ic_bottom_categories_focused + ) + object Main: BottomBarScreen( + route = "MAIN", + title="Main", + icon= R.drawable.ic_bottom_main, + iconFocused=R.drawable.ic_bottom_main_focused + ) + object ArticlePage: BottomBarScreen( + route = "ARTICLEPAGE/{$ARTICLE_ARGUMENT_KEY}", + title="Article", + icon= R.drawable.ic_bottom_main, + iconFocused=R.drawable.ic_bottom_main_focused + ){ + fun passId(id: String): String{ + return "ARTICLEPAGE/$id" + } + } + object Search: BottomBarScreen( + route = "SEARCH/{$SEARCH_ARGUMENT_TEXT}", + title="Search", + icon= R.drawable.ic_bottom_main, + iconFocused=R.drawable.ic_bottom_main_focused + ){ + fun passText(text: String): String{ + return "SEARCH/$text" + } + } + object Calendar: BottomBarScreen( + route = "CALENDAR/{$CALENDAR_ARGUMENT_DATE}", + title="Calendar", + icon= R.drawable.ic_bottom_main, + iconFocused=R.drawable.ic_bottom_main_focused + ){ + fun passDate(date: String): String{ + return "CALENDAR/$date" + } + } + object SearchByTag: BottomBarScreen( + route = "SEARCHBYTAG/{$SEARCHBYTAG_ARGUMENT_KEY}", + title="SEARCHBYTAG", + icon= R.drawable.ic_bottom_main, + iconFocused=R.drawable.ic_bottom_main_focused + ){ + fun passId(id: String): String{ + return "SEARCHBYTAG/$id" + } + } + object Cooperation: BottomBarScreen( + route = "COOPERATION", + title="Coop", + icon= R.drawable.ic_bottom_cooperation, + iconFocused=R.drawable.ic_bottom_cooperation_focused + ) + object Info: BottomBarScreen( + route = "INFO", + title="Info", + icon= R.drawable.ic_bottom_info, + iconFocused=R.drawable.ic_bottom_info_focused + ) +} diff --git a/app/src/main/java/com/example/pmulabs/basecomponents/navigate/EmailTextInput.kt b/app/src/main/java/com/example/pmulabs/basecomponents/navigate/EmailTextInput.kt new file mode 100644 index 0000000..0dddc3e --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/basecomponents/navigate/EmailTextInput.kt @@ -0,0 +1,63 @@ +package com.example.pmulabs.basecomponents.navigate + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun EmailTextField(email: String, onEmailChange: (String) -> Unit) { + TextField( + value = email, + onValueChange = { + onEmailChange(it) + }, + colors = TextFieldDefaults.textFieldColors( + containerColor = Color.White + ), + modifier = Modifier + .requiredWidth(width = 269.dp) + .requiredHeight(height = 53.dp) + .shadow(shape = RoundedCornerShape(40.dp), elevation = 5.dp) + .clip(shape = RoundedCornerShape(40.dp)), + label = { Text("Email") }, + placeholder = { Text("Email") }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email), + singleLine = true, + ) +} + +fun isValidEmail(email: String): Boolean { + val emailRegex = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+".toRegex() + return email.matches(emailRegex) +} + +@Composable +fun ValidateEmail(email: String, onEmailChange: (String) -> Unit) { + + Column (modifier = Modifier.padding(16.dp)) { + EmailTextField(email = email, onEmailChange = { onEmailChange(it)}) + + if (email.isNotEmpty()) { + if (isValidEmail(email)) { + Text(text = "Email is valid", color = Color(0xFF5D925E)) + } else { + Text(text = "Email is not valid", color = Color(0xFF94474D)) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/designElem/ArticleItem.kt b/app/src/main/java/com/example/pmulabs/designElem/ArticleItem.kt new file mode 100644 index 0000000..e79539b --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/ArticleItem.kt @@ -0,0 +1,191 @@ +package com.example.pmulabs.designElem + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.pmulabs.R +import com.example.pmulabs.models.Article +import com.example.pmulabs.repository.CommentRepository +import com.example.pmulabs.repository.TegRepository +import java.text.SimpleDateFormat + +@Composable +fun ArticleItem(article: Article,modifier: Modifier = Modifier,onArticleClick: () -> Unit) { + + val tagRepository= TegRepository() + val getAllData= tagRepository.getAllData() + val commRepository= CommentRepository() + val countComm= commRepository.getCountComment(article.id) + val formatter = SimpleDateFormat("dd.MM.YY") + val publishDate=formatter.format(article.publishDate) + var tagName="" + getAllData.forEach{teg -> + if(article.tagId == teg.id){ + tagName=teg.title + } + } + + Card( + colors = CardDefaults.outlinedCardColors( + containerColor = Color.White, + contentColor = Color(0xff423a99) + ), + border = BorderStroke(3.dp, Color(0xffdbdbf1)), + modifier = modifier + .clip(shape = RoundedCornerShape(5.dp)) + .clickable{onArticleClick()} + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 199.dp) + ) { + Card( + colors = CardDefaults.outlinedCardColors( + containerColor = Color.White + ), + border = BorderStroke(3.dp, Color(0xffdbdbf1)), + content = {}, + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 199.dp) + .clip(shape = RoundedCornerShape(5.dp)) + .background(color = Color.White) + .border(border = BorderStroke(3.dp, Color(0xffdbdbf1)), + shape = RoundedCornerShape(5.dp))) + LazyRow( + modifier = Modifier + .requiredWidth(width = 387.dp) + .requiredHeight(height = 199.dp) + ) { + item { + Image( + painter = painterResource(id = R.drawable.image2), + contentDescription = "image 2", + modifier = Modifier + .requiredWidth(width = 180.dp) + .requiredHeight(height = 199.dp) + .clip(shape = RoundedCornerShape(5.dp)) + .border(border = BorderStroke(3.dp, Color(0xffdbdbf1)), + shape = RoundedCornerShape(5.dp))) + } + item { + Column( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 5.dp, + y = 8.dp) + .requiredWidth(width = 201.dp) + .requiredHeight(height = 177.dp) + ) { + LazyColumn( + modifier = Modifier + .requiredWidth(width = 201.dp) + .requiredHeight(height = 150.dp) + ) { + item { + LazyRow( + modifier = Modifier + .requiredWidth(width = 150.dp) + .requiredHeight(height = 20.dp) + ) { + item { + Text( + text = "${publishDate}", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 17.sp)) + } + item { + Text( + text = "#${tagName}", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 17.sp), + modifier = Modifier + //.align(alignment = Alignment.TopStart) + .offset(x = 12.dp, + y = 0.dp)) + } + } + } + item { + Text( + text = "${article.title}", + maxLines=4, + color = Color(0xff423a99), + style = TextStyle( + fontSize = 20.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + //.align(alignment = Alignment.TopStart) + .offset(x = 0.dp, + y = 15.dp) + .requiredWidth(width = 201.dp) + .requiredHeight(height = 100.dp)) + } + } + LazyRow( + modifier = Modifier + //.align(alignment = Alignment.TopStart) + .offset(x = 3.dp, + y = 5.dp) + .requiredWidth(width = 80.dp) + .requiredHeight(height = 25.dp) + ) { + item { + Row( + modifier = Modifier + .requiredWidth(width = 58.dp) + .requiredHeight(height = 22.dp) + ) { + Image( + painter = painterResource(id = R.drawable.ic_comment), + contentDescription = "icon \"heart\"", + modifier = Modifier + .requiredWidth(width = 25.dp) + .requiredHeight(height = 22.dp)) + Text( + text = "${countComm}", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 17.sp), + modifier = Modifier + //.align(alignment = Alignment.TopStart) + .offset(x = 5.dp, + y = 1.dp)) + } + } + } + } + } + } + } + } +} + + diff --git a/app/src/main/java/com/example/pmulabs/designElem/BottomBar.kt b/app/src/main/java/com/example/pmulabs/designElem/BottomBar.kt new file mode 100644 index 0000000..3b66a51 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/BottomBar.kt @@ -0,0 +1,132 @@ +package com.example.pmulabs.designElem + +import androidx.compose.animation.AnimatedVisibility +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.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.NavDestination +import androidx.navigation.NavDestination.Companion.hierarchy +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.NavHostController +import androidx.navigation.compose.currentBackStackEntryAsState +import com.example.pmulabs.basecomponents.navigate.BottomBarScreen + +@Composable +fun BottomBar(navController: NavHostController){ + val screens = listOf( + BottomBarScreen.Profile, + BottomBarScreen.Categories, + BottomBarScreen.Main, + BottomBarScreen.Cooperation, + BottomBarScreen.Info + ) + val navBackStackEntry by navController.currentBackStackEntryAsState() + val currentDestination=navBackStackEntry?.destination + val bottomBarDestination=screens.any{ it.route==currentDestination?.route } + Row( + modifier = Modifier + .padding(start = 17.dp, end = 17.dp, top = 8.dp, bottom = 8.dp) + .background(Color.Transparent), + horizontalArrangement = Arrangement.SpaceEvenly, + verticalAlignment = Alignment.CenterVertically + ) { + if (bottomBarDestination) { + NavigationBar( + containerColor = Color(0xFFDBDBF1), + modifier = Modifier + .height(40.dp) + .clip(shape = RoundedCornerShape(20.dp)) + ) { + screens.forEach { screen -> + AddItem( + screen = screen, + currentDestination = currentDestination, + navController = navController + ) + } + } + } + } +} + +@Composable +fun RowScope.AddItem( + screen: BottomBarScreen, + currentDestination: NavDestination?, + navController: NavController +){ + val selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true + + val background = if (selected) Color(0xff423a99) else Color.Transparent + + val contentColor = + if (selected) Color.White else Color(0xff423a99) + + Box( + modifier = Modifier + .height(40.dp) + .clip(CircleShape) + .background(background) + .clickable(onClick = { + navController.navigate(screen.route) { + popUpTo(navController.graph.findStartDestination().id) + launchSingleTop = true + } + }) + ) { + Row( + modifier = Modifier + .padding(start = 17.dp, end = 17.dp, top = 8.dp, bottom = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + Icon( + painter = painterResource(id = if (selected) screen.iconFocused else screen.icon), + contentDescription = "icon", + tint = Color.Unspecified + ) + AnimatedVisibility(visible = selected) { + Text( + text = screen.title, + color = contentColor + ) + } + } + } + + /*NavigationBarItem( + label = { + Text(text=screen.title, color = Color(0xff423a99)) + }, + icon = { + Icon( + painter = painterResource(id = screen.icon), + tint = Color.Unspecified, + contentDescription = "navigation icon") + }, + selected = selected, + onClick = { + navController.navigate(screen.route) + } + + )*/ +} diff --git a/app/src/main/java/com/example/pmulabs/designElem/CommentItem.kt b/app/src/main/java/com/example/pmulabs/designElem/CommentItem.kt new file mode 100644 index 0000000..37c70f3 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/CommentItem.kt @@ -0,0 +1,76 @@ +package com.example.pmulabs.designElem + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.pmulabs.models.Comment +import com.example.pmulabs.repository.UserRepository + +@Composable +fun CommentItem(modifier: Modifier = Modifier,comm : Comment) { + + val userRep= UserRepository() + val user=userRep.getUserById(comm.userId.toString()) + + Box( + modifier = modifier + .requiredWidth(width = 376.dp) + .requiredHeight(height = 105.dp) + .offset( + y=10.dp + ) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 376.dp) + .requiredHeight(height = 87.dp) + .clip(shape = RoundedCornerShape(10.dp)) + .background(color = Color.White) + .border(border = BorderStroke(3.dp, Color(0xff423a99)), + shape = RoundedCornerShape(10.dp))) + HorizontalDivider( + thickness=3.dp, + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 1.dp, + y = 31.dp) + .requiredWidth(width = 374.dp), color = Color(0xff423a99) + ) + Text( + text = "${user.nickname}", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 15.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 13.dp, + y = 7.dp)) + Text( + text = "${comm.text}", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 15.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 13.dp, + y = 36.dp)) + } +} diff --git a/app/src/main/java/com/example/pmulabs/designElem/LeftCircles.kt b/app/src/main/java/com/example/pmulabs/designElem/LeftCircles.kt new file mode 100644 index 0000000..d7798c0 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/LeftCircles.kt @@ -0,0 +1,60 @@ +package com.example.pmulabs.designElem + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredSize +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.foundation.shape.CircleShape + +@Composable +fun LeftCircles(modifier: Modifier = Modifier) { + Box( + modifier = modifier + .requiredWidth(width = 250.dp) + .requiredHeight(height = 290.dp) + .rotate(degrees = -13.96f) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 166.4320068359375.dp, + y = 30.8746337890625.dp) + .requiredWidth(width = 122.dp) + .requiredHeight(height = 115.dp) + .clip(shape = CircleShape) + .background(color = Color(0xff423a99).copy(alpha = 0.7f))) + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = (-0.000030517578125).dp, + y = 145.57101440429688.dp) + .requiredWidth(width = 144.dp) + .requiredHeight(height = 140.dp) + .clip(shape = CircleShape) + .background(color = Color(0xff423a99).copy(alpha = 0.7f))) + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 74.10296630859375.dp, + y = 48.450347900390625.dp) + .requiredSize(size = 155.dp) + .clip(shape = CircleShape) + .background(color = Color(0xffb7b7e3).copy(alpha = 0.5f))) + } +} + +@Preview(widthDp = 250, heightDp = 290) +@Composable +private fun LeftCirclesPreview() { + LeftCircles(Modifier) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/designElem/LogoMobile.kt b/app/src/main/java/com/example/pmulabs/designElem/LogoMobile.kt new file mode 100644 index 0000000..48a260e --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/LogoMobile.kt @@ -0,0 +1,52 @@ +package com.example.pmulabs.designElem + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.pmulabs.R + +@Composable +fun LogoMobile(modifier: Modifier = Modifier) { + Box( + modifier = modifier + .requiredWidth(width = 250.dp) + .requiredHeight(height = 138.dp) + ) { + Image( + painter = painterResource(id = R.drawable.ellipse7), + contentDescription = "Ellipse 7", + modifier = Modifier + .fillMaxWidth() + .requiredHeight(height = 115.dp) + ) + Image( + painter = painterResource(id = R.drawable.ixbtcom_colored_logo1), + contentDescription = "IXBT.com_colored_logo 1", + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 0.dp, + y = 0.dp) + .fillMaxWidth() + .requiredHeight(height = 113.dp)) + } +} + +@Preview(widthDp = 250, heightDp = 138) +@Composable +private fun LogoMobilePreview() { + LogoMobile(Modifier) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/designElem/RightCircles.kt b/app/src/main/java/com/example/pmulabs/designElem/RightCircles.kt new file mode 100644 index 0000000..13b564a --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/RightCircles.kt @@ -0,0 +1,59 @@ +package com.example.pmulabs.designElem + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredSize +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp + +@Composable +fun RightCircles(modifier: Modifier = Modifier) { + Box( + modifier = modifier + .requiredWidth(width = 355.dp) + .requiredHeight(height = 267.dp) + .rotate(degrees = -6.33f) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 171.71197509765625.dp, + y = 17.979248046875.dp) + .requiredWidth(width = 192.dp) + .requiredHeight(height = 179.dp) + .clip(shape = CircleShape) + .background(color = Color(0xff423a99).copy(alpha = 0.7f))) + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 86.4691162109375.dp, + y = 75.193603515625.dp) + .requiredSize(size = 201.dp) + .clip(shape = CircleShape) + .background(color = Color(0xff423a99).copy(alpha = 0.7f))) + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 0.7720947265625.dp, + y = 122.24951171875.dp) + .requiredSize(size = 137.dp) + .clip(shape = CircleShape) + .background(color = Color(0xffb7b7e3).copy(alpha = 0.5f))) + } +} + +@Preview(widthDp = 355, heightDp = 267) +@Composable +private fun RightCirclesPreview() { + RightCircles(Modifier) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/designElem/SearchViewModel.kt b/app/src/main/java/com/example/pmulabs/designElem/SearchViewModel.kt new file mode 100644 index 0000000..6c2d465 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/SearchViewModel.kt @@ -0,0 +1,29 @@ +package com.example.pmulabs.designElem + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import com.example.pmulabs.screensMobile.MainScreen + +class SearchViewModel : ViewModel() { + + private val _searchWidgetState: MutableState = + mutableStateOf(value = SearchWidget.CLOSED) + + val searchWidgetState: State = _searchWidgetState + + private val _searchTextState: MutableState = + mutableStateOf(value = "") + + val searchTextState: State = _searchTextState + + fun updateSearchWidgetState(newValue: SearchWidget) { + _searchWidgetState.value = newValue + } + + fun updateSearchTextState(newValue: String) { + _searchTextState.value = newValue + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/designElem/SearchWidget.kt b/app/src/main/java/com/example/pmulabs/designElem/SearchWidget.kt new file mode 100644 index 0000000..54a5e1e --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/SearchWidget.kt @@ -0,0 +1,6 @@ +package com.example.pmulabs.designElem + +enum class SearchWidget { + OPENED, + CLOSED +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/designElem/SharedViewModel.kt b/app/src/main/java/com/example/pmulabs/designElem/SharedViewModel.kt new file mode 100644 index 0000000..f292ba1 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/SharedViewModel.kt @@ -0,0 +1,12 @@ +package com.example.pmulabs.designElem + +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel + +class SharedViewModel : ViewModel() { + val argument = mutableStateOf(null) + + fun setArgument(arg: String) { + argument.value = arg + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/designElem/TagItem.kt b/app/src/main/java/com/example/pmulabs/designElem/TagItem.kt new file mode 100644 index 0000000..3c4f914 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/TagItem.kt @@ -0,0 +1,63 @@ +package com.example.pmulabs.designElem + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.pmulabs.R +import com.example.pmulabs.models.Teg + +@Composable +fun TagItem(teg: Teg, modifier: Modifier = Modifier,onTagClick: () -> Unit) { + Box( + modifier = modifier + .requiredWidth(width = 365.dp) + .requiredHeight(height = 58.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 365.dp) + .requiredHeight(height = 58.dp) + .clip(shape = RoundedCornerShape(15.dp)) + .background(color = Color(0xFFDBDBF1)) + .clickable { onTagClick() } + ) + Icon( + painter = painterResource(id = R.drawable.iconhashtag1), + tint= Color(0xff423a99), + contentDescription = "icon \"hashtag 1\"", + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 20.dp, + y = 14.dp) + .requiredWidth(width = 31.dp) + .requiredHeight(height = 29.dp)) + Text( + text = "${teg.title}", + color = Color(0xff423a99), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 24.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 64.dp, + y = 14.dp)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/designElem/TopBar.kt b/app/src/main/java/com/example/pmulabs/designElem/TopBar.kt new file mode 100644 index 0000000..e1ac41a --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/designElem/TopBar.kt @@ -0,0 +1,155 @@ +package com.example.pmulabs.designElem + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.CalendarToday +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.ExperimentalMaterial3Api +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.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.example.pmulabs.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TopBar(onSearchClicked:() -> Unit, onCalendarClicked: () -> Unit) { + TopAppBar( + colors = TopAppBarDefaults.smallTopAppBarColors(containerColor = Color(0xff423a99) ), + title = { + Image( + painter = painterResource(id = R.drawable.ellipse7), + contentDescription = "Ellipse 7", + modifier = Modifier + .requiredHeight(height = 62.dp) + ) + Image( + painter = painterResource(id = R.drawable.ixbtcom_colored_logo1), + contentDescription = "IXBT.com_colored_logo 1", + modifier = Modifier + .offset( + x = 4.dp, + y = 0.dp + ) + .requiredHeight(height = 60.dp) + ) + }, + actions = { + IconButton(onClick = { onSearchClicked() }) { + Icon( + imageVector = Icons.Filled.Search, + contentDescription = "Search Icon", + tint = Color.White + ) + } + IconButton(onClick = { onCalendarClicked() }) { + Icon( + imageVector = Icons.Filled.CalendarToday, + contentDescription = "Calendar Icon", + tint = Color.White + ) + } + }) + } + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SearchAppBar( + text: String, + onTextChange: (String) -> Unit, + onCloseClicked: () -> Unit, + onSearchClicked: (String) -> Unit +){ + Surface( + modifier = Modifier + .fillMaxWidth() + .height(62.dp), + color = Color(0xff423a99) + ) { + TextField( + colors=TextFieldDefaults.textFieldColors( + Color.White, containerColor = Color(0xff423a99) + ), + modifier = Modifier + .fillMaxWidth(), + value=text, + onValueChange={ + onTextChange(it) + }, + placeholder = { + Text( + text ="Search...", + color = Color.White + ) + }, + textStyle = TextStyle( + fontSize = MaterialTheme.typography.titleMedium.fontSize + ), + singleLine = true, + leadingIcon = { + IconButton( + onClick = { } + ) { + Icon(imageVector = Icons.Default.Search, + contentDescription = "Search Icon", + tint = Color.White) + } + }, + trailingIcon = { + IconButton( + onClick = { + if(text.isNotEmpty()){ + onTextChange("") + }else{ + onCloseClicked() + } + } + ) { + Icon(imageVector = Icons.Default.Close, + contentDescription = "Close Icon", + tint = Color.White) + } + }, + keyboardOptions = KeyboardOptions( + imeAction = ImeAction.Search, + ), + keyboardActions = KeyboardActions( + onSearch = { + onSearchClicked(text) + } + ) + ) + } +} + +@Composable +@Preview +fun TopBarPreview(){ + TopBar(onSearchClicked = {},onCalendarClicked = {}) +} + +@Composable +@Preview +fun SearchBarPreview(){ + SearchAppBar(text = "вапвапв", onSearchClicked = {}, onCloseClicked = {}, onTextChange = {}) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/graphs/AuthNavGraph.kt b/app/src/main/java/com/example/pmulabs/graphs/AuthNavGraph.kt new file mode 100644 index 0000000..b622a04 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/graphs/AuthNavGraph.kt @@ -0,0 +1,34 @@ +package com.example.pmulabs.graphs + +import androidx.compose.ui.Modifier +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavHostController +import androidx.navigation.compose.composable +import androidx.navigation.navigation +import com.example.pmulabs.designElem.SharedViewModel +import com.example.pmulabs.screensMobile.EntryScreen +import com.example.pmulabs.screensMobile.RegisterScreen +import com.example.pmulabs.screensMobile.SplashScreen + +fun NavGraphBuilder.authNavGraph(navController: NavHostController,sharedViewModel: SharedViewModel){ + navigation( + route=Graph.AUTHENTICATION, + startDestination = AuthScreen.Splash.route + ){ + composable(route=AuthScreen.Splash.route){ + SplashScreen(navController = navController, Modifier) + } + composable(route=AuthScreen.Entry.route){ + EntryScreen(navController = navController, Modifier,sharedViewModel) + } + composable(route=AuthScreen.Register.route){ + RegisterScreen(navController = navController, Modifier) + } + } +} + +sealed class AuthScreen(val route: String){ + object Splash : AuthScreen(route = "SPLASH") + object Entry : AuthScreen(route = "ENTRY") + object Register : AuthScreen(route="REGISTER") +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/graphs/HomeNavGraph.kt b/app/src/main/java/com/example/pmulabs/graphs/HomeNavGraph.kt new file mode 100644 index 0000000..d7dd5d2 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/graphs/HomeNavGraph.kt @@ -0,0 +1,83 @@ +package com.example.pmulabs.graphs + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavHostController +import androidx.navigation.NavType +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.navArgument +import com.example.pmulabs.basecomponents.navigate.ARTICLE_ARGUMENT_KEY +import com.example.pmulabs.basecomponents.navigate.BottomBarScreen +import com.example.pmulabs.basecomponents.navigate.CALENDAR_ARGUMENT_DATE +import com.example.pmulabs.basecomponents.navigate.SEARCHBYTAG_ARGUMENT_KEY +import com.example.pmulabs.basecomponents.navigate.SEARCH_ARGUMENT_TEXT +import com.example.pmulabs.designElem.SharedViewModel +import com.example.pmulabs.screensMobile.ArticlePageScreen +import com.example.pmulabs.screensMobile.CalendarScreen +import com.example.pmulabs.screensMobile.CoopScreen +import com.example.pmulabs.screensMobile.InfoScreen +import com.example.pmulabs.screensMobile.MainScreen +import com.example.pmulabs.screensMobile.ProfileScreen +import com.example.pmulabs.screensMobile.SearchByTagScreen +import com.example.pmulabs.screensMobile.SearchScreen +import com.example.pmulabs.screensMobile.TagsScreen + +@Composable +fun HomeNavGraph(navController: NavHostController,sharedViewModel: SharedViewModel){ + NavHost( + navController = navController, + route = Graph.MAIN, + startDestination = BottomBarScreen.Main.route + ){ + composable( + route=BottomBarScreen.Main.route + ){ + MainScreen(navController,Modifier) + } + composable( + route=BottomBarScreen.SearchByTag.route, + arguments = listOf(navArgument(SEARCHBYTAG_ARGUMENT_KEY){ + type= NavType.StringType + }) + ){ + SearchByTagScreen(navController,Modifier) + } + composable( + route=BottomBarScreen.ArticlePage.route, + arguments = listOf(navArgument(ARTICLE_ARGUMENT_KEY){ + type= NavType.StringType + }) + ){ + ArticlePageScreen(navController,Modifier) + } + composable( + route=BottomBarScreen.Search.route, + arguments = listOf(navArgument(SEARCH_ARGUMENT_TEXT){ + type= NavType.StringType + }) + ){ + SearchScreen(navController,Modifier) + } + composable( + route=BottomBarScreen.Calendar.route, + arguments = listOf(navArgument(CALENDAR_ARGUMENT_DATE){ + type= NavType.StringType + }) + ){ + CalendarScreen(navController,Modifier) + } + composable(route=BottomBarScreen.Profile.route){ + ProfileScreen(navController,Modifier,sharedViewModel) + } + composable(route=BottomBarScreen.Info.route){ + InfoScreen(navController,Modifier) + } + composable(route=BottomBarScreen.Cooperation.route){ + CoopScreen(navController,Modifier) + } + composable(route=BottomBarScreen.Categories.route){ + TagsScreen(navController,Modifier) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/graphs/RootNavGraph.kt b/app/src/main/java/com/example/pmulabs/graphs/RootNavGraph.kt new file mode 100644 index 0000000..37faec4 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/graphs/RootNavGraph.kt @@ -0,0 +1,39 @@ +package com.example.pmulabs.graphs + +import androidx.compose.runtime.Composable +import androidx.navigation.NavHostController +import androidx.navigation.NavType +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.navArgument +import com.example.pmulabs.designElem.SearchViewModel +import com.example.pmulabs.designElem.SharedViewModel +import com.example.pmulabs.screensMobile.LoadScreen + +const val USERID_ARGUMENT="userId" + +@Composable +fun RootNavigationGraph(navController: NavHostController,searchViewModel: SearchViewModel, sharedViewModel: SharedViewModel){ + NavHost( + navController=navController, + route = Graph.ROOT, + startDestination = Graph.AUTHENTICATION + ){ + authNavGraph(navController=navController,sharedViewModel) + composable(route=Graph.MAIN, + arguments = listOf(navArgument(USERID_ARGUMENT){ + type= NavType.StringType + })){ + LoadScreen(searchViewModel = searchViewModel, sharedViewModel = sharedViewModel) + } + } +} + +object Graph{ + const val ROOT="root_graph" + const val AUTHENTICATION="auth_graph" + const val MAIN="main_graph/{$USERID_ARGUMENT}" + fun passUserId(userId: String): String{ + return "main_graph/$userId" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/models/Article.kt b/app/src/main/java/com/example/pmulabs/models/Article.kt new file mode 100644 index 0000000..038bb5e --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/models/Article.kt @@ -0,0 +1,11 @@ +package com.example.pmulabs.models + +import java.util.Date + +data class Article( + val id: Int, + val title: String, + val text: String, + val publishDate: Date, + val tagId: Int +) \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/models/Comment.kt b/app/src/main/java/com/example/pmulabs/models/Comment.kt new file mode 100644 index 0000000..5acb650 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/models/Comment.kt @@ -0,0 +1,8 @@ +package com.example.pmulabs.models + +data class Comment( + val id: Int, + val userId: Int, + val text: String, + val articleId: Int +) diff --git a/app/src/main/java/com/example/pmulabs/models/Teg.kt b/app/src/main/java/com/example/pmulabs/models/Teg.kt new file mode 100644 index 0000000..f96d3e9 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/models/Teg.kt @@ -0,0 +1,6 @@ +package com.example.pmulabs.models + +data class Teg( + val id: Int, + val title: String, +) \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/models/User.kt b/app/src/main/java/com/example/pmulabs/models/User.kt new file mode 100644 index 0000000..b24c870 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/models/User.kt @@ -0,0 +1,9 @@ +package com.example.pmulabs.models + +data class User( + val id: Int, + val nickname: String, + val email: String, + val password: String, + val role: String +) \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/repository/ArticleRepository.kt b/app/src/main/java/com/example/pmulabs/repository/ArticleRepository.kt new file mode 100644 index 0000000..eede451 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/repository/ArticleRepository.kt @@ -0,0 +1,70 @@ +package com.example.pmulabs.repository + +import com.example.pmulabs.models.Article +import java.util.Date + +class ArticleRepository { + fun getArticleById(articleId : String): Article { + return getAllData()[articleId.toInt()] + } + fun getAllData(): List
{ + return listOf( + Article( + id=0, + title = "Заголовок 1", + text = "Текст статьи с заголовком 1", + publishDate = Date(2023,5,22), + tagId=5 + ), + Article( + id=1, + title = "Заголовок 2", + text = "Текст статьи с заголовком 2", + publishDate = Date(2022,11,13), + tagId=1 + ), + Article( + id=2, + title = "Заголовок 3", + text = "Текст статьи с заголовком 3", + publishDate = Date(2023,5,4), + tagId=0 + ), + Article( + id=3, + title = "Заголовок 4", + text = "Текст статьи с заголовком 4", + publishDate = Date(2023,2,14), + tagId=2 + ), + Article( + id=4, + title = "Заголовок 5", + text = "Текст статьи с заголовком 5", + publishDate = Date(2023,0,19), + tagId=3 + ), + Article( + id=5, + title = "Заголовок 6", + text = "Текст статьи с заголовком 6", + publishDate = Date(2023,5,22), + tagId=3 + ), + Article( + id=6, + title = "Заголовок 7", + text = "Текст статьи с заголовком 7", + publishDate = Date(2023,0,19), + tagId=4 + ), + Article( + id=7, + title = "Заголовок 8", + text = "Текст статьи с заголовком 8", + publishDate = Date(2022,11,13), + tagId=5 + ) + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/repository/CommentRepository.kt b/app/src/main/java/com/example/pmulabs/repository/CommentRepository.kt new file mode 100644 index 0000000..e6faf75 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/repository/CommentRepository.kt @@ -0,0 +1,86 @@ +package com.example.pmulabs.repository + +import com.example.pmulabs.models.Comment + +class CommentRepository { + fun getCountComment(articleId: Int): Int { + var count=0; + getAllData().forEach{ + comm -> + if(comm.articleId==articleId){ + count++ + } + } + return count + } + fun getAllData(): List{ + return listOf( + Comment( + id=0, + text = "Текст комментария 1", + userId = 0, + articleId = 7 + ), + Comment( + id=1, + text = "Текст комментария 2", + userId = 1, + articleId = 1 + ), + Comment( + id=2, + text = "Текст комментария 3", + userId = 2, + articleId = 2 + ), + Comment( + id=3, + text = "Текст комментария 4", + userId = 0, + articleId = 3 + ), + Comment( + id=4, + text = "Текст комментария 5", + userId = 1, + articleId = 0 + ), + Comment( + id=5, + text = "Текст комментария 6", + userId = 2, + articleId = 4 + ), + Comment( + id=6, + text = "Текст комментария 7", + userId = 0, + articleId = 5 + ), + Comment( + id=7, + text = "Текст комментария 8", + userId = 1, + articleId = 6 + ), + Comment( + id=8, + text = "Текст комментария 9", + userId = 2, + articleId = 0 + ), + Comment( + id=9, + text = "Текст комментария 10", + userId = 0, + articleId = 1 + ), + Comment( + id=10, + text = "Текст комментария 11", + userId = 1, + articleId = 2 + ), + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/repository/TegRepository.kt b/app/src/main/java/com/example/pmulabs/repository/TegRepository.kt new file mode 100644 index 0000000..dc695b3 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/repository/TegRepository.kt @@ -0,0 +1,37 @@ +package com.example.pmulabs.repository + +import com.example.pmulabs.models.Teg + +class TegRepository { + fun getTagById(tagId : String): Teg { + return getAllData()[tagId.toInt()] + } + fun getAllData(): List{ + return listOf( + Teg( + id=0, + title = "Тег_1" + ), + Teg( + id=1, + title = "Тег_2" + ), + Teg( + id=2, + title = "Тег_3" + ), + Teg( + id=3, + title = "Тег_4" + ), + Teg( + id=4, + title = "Тег_5" + ), + Teg( + id=5, + title = "Тег_6" + ), + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/repository/UserRepository.kt b/app/src/main/java/com/example/pmulabs/repository/UserRepository.kt new file mode 100644 index 0000000..60d074c --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/repository/UserRepository.kt @@ -0,0 +1,48 @@ +package com.example.pmulabs.repository + +import com.example.pmulabs.models.Comment +import com.example.pmulabs.models.User + +class UserRepository { + val commRepository=CommentRepository() + val getAlDataComm=commRepository.getAllData() + fun getAllData(): List{ + return listOf( + User( + id=0, + nickname = "LatinMisha", + email = "llmisha@gmail.com", + password = "user1", + role = "user" + ), + User( + id=1, + nickname = "Kasablanka", + email = "kasyul@gmail.com", + password = "user2", + role = "user" + ), + User( + id=2, + nickname = "Ilonherber", + email = "ihlon82@gmail.com", + password = "user3", + role = "user" + ) + ) + } + + fun getUserById(userId : String): User { + return getAllData()[userId.toInt()] + } + + fun getUserComm(userId : String): List { + val list = mutableListOf() + for (comm in getAlDataComm) { + if (comm.userId == userId.toInt()) { + list.add(comm) + } + } + return list + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/ArticlePageScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/ArticlePageScreen.kt new file mode 100644 index 0000000..692ec2d --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/ArticlePageScreen.kt @@ -0,0 +1,174 @@ +package com.example.pmulabs.screensMobile + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavController +import com.example.pmulabs.R +import com.example.pmulabs.basecomponents.navigate.ARTICLE_ARGUMENT_KEY +import com.example.pmulabs.basecomponents.navigate.BackButton +import com.example.pmulabs.designElem.CommentItem +import com.example.pmulabs.repository.ArticleRepository +import com.example.pmulabs.repository.CommentRepository +import com.example.pmulabs.repository.TegRepository +import java.text.SimpleDateFormat + +@Composable +fun ArticlePageScreen(navController: NavController,modifier: Modifier = Modifier) { + + var id=navController.currentBackStackEntry?.arguments?.getString(ARTICLE_ARGUMENT_KEY).toString() + val articleRep=ArticleRepository() + var article= articleRep.getArticleById("0") + if (id.toString() != "null") { + article = articleRep.getArticleById(id) + } + val tegRep=TegRepository() + val teg= tegRep.getTagById(article?.tagId.toString()) + val formatter = SimpleDateFormat("dd.MM.YY") + val publishDate=formatter.format(article?.publishDate) + + val commRep=CommentRepository() + val allComm=commRep.getAllData() + + LazyColumn( + contentPadding= PaddingValues(top=105.dp, bottom = 20.dp,start=15.dp,end=15.dp), + modifier = modifier + .requiredWidth(width = 412.dp) + .requiredHeight(height = 915.dp) + .background(color = Color.White) + .fillMaxSize(), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + item{ + BackButton(modifier=Modifier + .clickable { navController.popBackStack()} + .offset( + y=0.dp + )) + } + item { + Row( + modifier = Modifier + .requiredWidth(width = 245.dp) + .requiredHeight(height = 33.dp) + .offset( + y=0.dp + ) + ) { + Text( + text = "${publishDate}", + color = Color(0xff423a99), + style = MaterialTheme.typography.headlineMedium) + Text( + text = "#${teg.title}", + color = Color(0xff423a99), + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier + .offset(x = 60.dp, + y = 0.dp)) + } + } + item { + Text( + text = "${article?.title}", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 32.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .offset(x = 10.dp, + y = 0.dp) + .requiredWidth(width = 395.dp)) + + } + item { + Image( + painter = painterResource(id = R.drawable.image3), + contentDescription = "image 3", + modifier = Modifier + .requiredWidth(width = 412.dp) + .requiredHeight(height = 242.dp) + .offset( + y=0.dp + )) + } + item { + Text( + text = "${article?.text}", + color = Color(0xff423a99), + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier + .offset(x = 5.dp, + y = 0.dp) + .requiredWidth(width = 375.dp)) + } + item { + Box( + modifier = modifier + .requiredWidth(width = 412.dp) + .requiredHeight(height = 53.dp) + .offset( + y=0.dp + ) + ) { + Text( + text = "Комментарии:", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 32.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 15.dp, + y = 6.dp) + .requiredWidth(width = 395.dp) + .requiredHeight(height = 43.dp)) + HorizontalDivider( + thickness=5.dp, + modifier = Modifier + .requiredWidth(width = 270.dp) + .border(BorderStroke(3.dp, Color(0xff423a99))), color = Color(0xff423a99) + ) + HorizontalDivider( + thickness=5.dp, + modifier = Modifier + .align(alignment = Alignment.TopStart) + .border(BorderStroke(3.dp, Color(0xff423a99))) + .offset(x = 142.dp, + y = 53.dp) + .requiredWidth(width = 270.dp), color = Color(0xff423a99) + ) + } + } + item{ + allComm.forEach{ comm -> + if(comm.articleId==article.id) { + CommentItem(comm = comm, modifier = Modifier.offset( y = 10.dp)) + } + } + } + } +} diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/CalendarScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/CalendarScreen.kt new file mode 100644 index 0000000..b41659e --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/CalendarScreen.kt @@ -0,0 +1,52 @@ +package com.example.pmulabs.screensMobile + +import android.util.Log +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.pmulabs.basecomponents.navigate.BackButton +import com.example.pmulabs.basecomponents.navigate.BottomBarScreen +import com.example.pmulabs.basecomponents.navigate.CALENDAR_ARGUMENT_DATE +import com.example.pmulabs.designElem.ArticleItem +import com.example.pmulabs.repository.ArticleRepository +import java.text.SimpleDateFormat + +@Composable +fun CalendarScreen(navController: NavController, modifier: Modifier = Modifier){ + + val articleRepository= ArticleRepository() + val getAllData= articleRepository.getAllData() + var date=navController.currentBackStackEntry?.arguments?.getString(CALENDAR_ARGUMENT_DATE).toString() + Log.d("date: ",date) + val formatter = SimpleDateFormat("dd-MMMM-YY") + + LazyColumn( + modifier= Modifier + .background(Color.White) + .fillMaxSize(), + contentPadding = PaddingValues(top =75.dp, bottom = 10.dp, start = 10.dp,end=10.dp), + verticalArrangement = Arrangement.spacedBy(1.dp)){ + item{ + BackButton(modifier=Modifier + .clickable { navController.popBackStack()}) + } + items(items = getAllData){ article -> + val publishDate=formatter.format(article.publishDate) + if(publishDate==date) { + ArticleItem( + article = article, + onArticleClick = {navController.navigate(BottomBarScreen.ArticlePage.passId(article.id.toString()))} + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/CoopScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/CoopScreen.kt new file mode 100644 index 0000000..82968e3 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/CoopScreen.kt @@ -0,0 +1,200 @@ +package com.example.pmulabs.screensMobile + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavController + +@Composable +fun CoopScreen(navController: NavController,modifier: Modifier = Modifier) { + LazyColumn( + modifier = modifier + .background(Color.White), + contentPadding = PaddingValues(top =70.dp, bottom = 105.dp, start = 10.dp), + verticalArrangement = Arrangement.spacedBy(15.dp) + ) { + item { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 275.dp) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 0.dp, + y = 21.810302734375.dp) + .requiredWidth(width = 393.dp) + .requiredHeight(height = 253.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 253.dp) + .clip(shape = RoundedCornerShape(5.dp)) + .background(color = Color.White) + .border(border = BorderStroke(3.dp, Color(0xffdbdbf1)), + shape = RoundedCornerShape(5.dp))) + Text( + text = " Мы предлагаем рекламные размещения под любой бюджет и аудиторию. \n\n На ресурсе самые лучшие посетители. У нас нет \"школьников\", \"мимо проходящих\", ботов, \"просто интересующихся\". Нас читают те, кто глубоко погружен в технику.\n\n У нас много трафика и нормальные цены за нормальную отдачу,а также рекламные возможности на любой бюджет. ", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 15.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 14.dp, + y = 34.189697265625.dp) + .requiredWidth(width = 368.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 44.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 44.dp) + .clip(shape = RoundedCornerShape(15.dp)) + .background(color = Color(0xff423a99))) + Text( + text = "О рекламе", + color = Color.White, + style = TextStyle( + fontSize = 17.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 24.dp, + y = 0.dp) + .requiredWidth(width = 210.dp) + .requiredHeight(height = 44.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + } + } + item { + Box( + modifier = Modifier + .offset(x = 0.dp, + y = 11.dp) + .requiredWidth(width = 404.dp) + .requiredHeight(height = 420.dp) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 0.dp, + y = 21.dp) + .requiredWidth(width = 404.dp) + .requiredHeight(height = 420.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 420.dp) + .clip(shape = RoundedCornerShape(5.dp)) + .background(color = Color.White) + .border(border = BorderStroke(3.dp, Color(0xffdbdbf1)), + shape = RoundedCornerShape(5.dp))) + Text( + text = buildAnnotatedString { + withStyle(style = SpanStyle( + color = Color(0xff423a99), + fontSize = 15.sp, + fontWeight = FontWeight.Bold)) {append("КОММЕРЧЕСКИЙ ДИРЕКТОР:\n")} + withStyle(style = SpanStyle( + color = Color(0xff847fbe), + fontSize = 15.sp, + fontWeight = FontWeight.Bold)) {append("Александр Воробьёв\nvorobiev@ixbt.com\n+7 (499) 519-00-95\n")} + withStyle(style = SpanStyle( + color = Color(0xff423a99), + fontSize = 15.sp, + fontWeight = FontWeight.Bold)) {append("ДИРЕКТОР ПО РЕКЛАМЕ:\n")} + withStyle(style = SpanStyle( + color = Color(0xff847fbe), + fontSize = 15.sp, + fontWeight = FontWeight.Bold)) {append("Владимир Сливко\nvslivko@ixbt.com\n+7 (916) 134-14-72\n")} + withStyle(style = SpanStyle( + color = Color(0xff423a99), + fontSize = 15.sp, + fontWeight = FontWeight.Bold)) {append("ПРОДАКТ-МЕНЕДЖЕР:")} + withStyle(style = SpanStyle( + color = Color(0xff423a99), + fontSize = 15.sp, + fontWeight = FontWeight.Bold)) {append(" \n")} + withStyle(style = SpanStyle( + color = Color(0xff847fbe), + fontSize = 15.sp, + fontWeight = FontWeight.Bold)) {append("Дарья Галиева\ndgalieva@ixbt.games\n+7 (499) 519-00-95\n")} + withStyle(style = SpanStyle( + color = Color(0xff423a99), + fontSize = 15.sp, + fontWeight = FontWeight.Bold)) {append("ГЛАВНЫЙ РЕДАКТОР:\n")} + withStyle(style = SpanStyle( + color = Color(0xff847fbe), + fontSize = 15.sp, + fontWeight = FontWeight.Bold)) {append("Виталий Казунов\nlock@ixbt.com\n+7 (499) 519-00-95")}}, + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 11.dp, + y = 10.dp) + .requiredWidth(width = 393.dp) + .requiredHeight(height = 420.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 42.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 42.dp) + .clip(shape = RoundedCornerShape(15.dp)) + .background(color = Color(0xff423a99))) + Text( + text = "Контакты", + color = Color.White, + style = TextStyle( + fontSize = 17.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 24.dp, + y = 0.dp) + .requiredWidth(width = 210.dp) + .requiredHeight(height = 42.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + } + } + } +} + + diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/EntryScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/EntryScreen.kt new file mode 100644 index 0000000..9148fa7 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/EntryScreen.kt @@ -0,0 +1,234 @@ +package com.example.pmulabs.screensMobile + +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 +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.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Visibility +import androidx.compose.material.icons.filled.VisibilityOff +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +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.draw.clip +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavController +import com.example.pmulabs.basecomponents.navigate.ValidateEmail +import com.example.pmulabs.basecomponents.navigate.isValidEmail +import com.example.pmulabs.designElem.LeftCircles +import com.example.pmulabs.designElem.LogoMobile +import com.example.pmulabs.designElem.RightCircles +import com.example.pmulabs.designElem.SharedViewModel +import com.example.pmulabs.graphs.AuthScreen +import com.example.pmulabs.graphs.Graph +import com.example.pmulabs.repository.UserRepository + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun EntryScreen(navController: NavController,modifier: Modifier = Modifier, sharedViewModel: SharedViewModel) { + + var emailValue by rememberSaveable { mutableStateOf("") } + var passwordValue by rememberSaveable { mutableStateOf("") } + val userRepository= UserRepository() + val getAllData= userRepository.getAllData() + val argument = sharedViewModel.argument.value + + var passwordVisibility by rememberSaveable { mutableStateOf(false) } + val emailRegex = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+".toRegex() + + Box( + modifier = modifier + .requiredWidth(width = 412.dp) + .requiredHeight(height = 915.dp) + .background(color = Color.White) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 128.dp, + y = 730.dp + ) + .requiredWidth(width = 381.dp) + .requiredHeight(height = 268.dp) + .rotate(degrees = 8.33f) + ) { + RightCircles() + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = (-111.28436279296875).dp, + y = (-96.86965942382812).dp + ) + .requiredWidth(width = 250.dp) + .requiredHeight(height = 290.dp) + .rotate(degrees = 12.96f) + ) { + LeftCircles() + } + + } + + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.BottomCenter) { + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(0.8f) + .clip(RoundedCornerShape(15.dp)) + .background(Color.Transparent) + .padding(10.dp) + ) { + + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box( + modifier = Modifier + .fillMaxWidth() + .background(Color.Transparent), contentAlignment = Alignment.TopCenter + ) { + + LogoMobile( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .fillMaxWidth() + .requiredHeight(height = 131.dp) + ) + + } + Text( + text = "Please, Sign In to your account", + color = Color(0xff7d7dbd), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 20.sp + ), + modifier = modifier + .requiredWidth(width = 436.dp) + .requiredHeight(height = 27.dp) + ) + Spacer(modifier = Modifier.padding(10.dp)) + + Column(horizontalAlignment = Alignment.CenterHorizontally) { + ValidateEmail(emailValue, {emailValue=it} ) + Spacer(modifier = Modifier.padding(3.dp)) + TextField( + value = passwordValue, + onValueChange = { passwordValue = it }, + colors = TextFieldDefaults.textFieldColors( + containerColor = Color.White + ), + modifier = modifier + .requiredWidth(width = 269.dp) + .requiredHeight(height = 53.dp) + .shadow(shape = RoundedCornerShape(40.dp), elevation = 5.dp) + .clip(shape = RoundedCornerShape(40.dp)), + label = { Text("Password") }, + singleLine = true, + placeholder = { Text("Password") }, + visualTransformation = if (passwordVisibility) VisualTransformation.None else PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + trailingIcon = { + val image = if (passwordVisibility) + Icons.Filled.Visibility + else Icons.Filled.VisibilityOff + + val description = + if (passwordVisibility) "Hide password" else "Show password" + + IconButton(onClick = { passwordVisibility = !passwordVisibility }) { + Icon(imageVector = image, description) + } + } + ) + + Spacer(modifier = Modifier.padding(10.dp)) + Button( + colors = ButtonColors( + containerColor = Color(0xff423a99), + disabledContainerColor = Color(0xff423a99), + contentColor = Color.White, + disabledContentColor = Color.White + ), + onClick = { + if (passwordValue.isNotEmpty() && isValidEmail(emailValue)) { + getAllData.forEach { user -> + if (user.password == passwordValue && user.email == emailValue) { + sharedViewModel.setArgument(user.id.toString()) + navController.navigate(route = Graph.passUserId(user.id.toString())) { + } + } + } + } + }, + modifier = Modifier + .fillMaxWidth(0.5f) + .height(50.dp) + ) { + Text(text = "Sign In", fontSize = 20.sp) + } + + Spacer(modifier = Modifier.padding(3.dp)) + + Text( + text = "Don't have an account yet? Sign Up", + color = Color(0xff7d7dbd), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 20.sp + ), + modifier = Modifier + .fillMaxSize() + .offset( + x = 0.dp, + y = 75.dp + ) + .clickable { + navController.navigate(route = AuthScreen.Register.route) + { + popUpTo(AuthScreen.Splash.route) + } + } + ) + Spacer(modifier = Modifier.padding(20.dp)) + } + } + } + } +} diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/InfoScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/InfoScreen.kt new file mode 100644 index 0000000..193730c --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/InfoScreen.kt @@ -0,0 +1,230 @@ +package com.example.pmulabs.screensMobile + +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavController + +@Composable +fun InfoScreen(navController: NavController,modifier: Modifier = Modifier) { + LazyColumn( + modifier = modifier + .background(Color.White), + contentPadding = PaddingValues(top =75.dp, bottom = 85.dp, start = 10.dp), + verticalArrangement = Arrangement.spacedBy(15.dp) + ) { + item { + Box( + modifier = Modifier + .requiredWidth(width = 400.dp) + .requiredHeight(height = 309.dp) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 0.dp, + y = 22.dp) + .requiredWidth(width = 393.dp) + .requiredHeight(height = 287.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 287.dp) + .clip(shape = RoundedCornerShape(5.dp)) + .background(color = Color.White) + .border(border = BorderStroke(3.dp, Color(0xffdbdbf1)), + shape = RoundedCornerShape(5.dp))) + Text( + text=" iXBT.com — специализированный российский информационно-аналитический сайт с самыми актуальными новостями из сферы компьютерных и мобильных игр, развлекательной и интернет-индустрии, детальными обзорами персональных компьютеров, компьютерных комплектующих, периферийных устройств и техники для гейминга. Мы работаем для вас с 2007 года.\n\n Наш адрес: \"115201, Москва, Каширское шоссе, д. 22 кор. 3 стр. 2; тел. +7(499)519-00-95\"", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 15.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 12.dp, + y = 27.dp) + .requiredWidth(width = 364.dp) + .requiredHeight(height = 250.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + + } + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 44.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 44.dp) + .clip(shape = RoundedCornerShape(15.dp)) + .background(color = Color(0xff423a99))) + Text( + text = "О сайте iXBT.com", + color = Color.White, + style = TextStyle( + fontSize = 17.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 24.dp, + y = 0.dp) + .requiredWidth(width = 210.dp) + .requiredHeight(height = 44.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + } + } + item { + Box( + modifier = Modifier + .offset(x = 0.dp, + y = 15.dp) + .requiredWidth(width = 400.dp) + .requiredHeight(height = 200.dp) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 0.dp, + y = 23.dp) + .requiredWidth(width = 393.dp) + .requiredHeight(height = 177.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 177.dp) + .clip(shape = RoundedCornerShape(5.dp)) + .background(color = Color.White) + .border(border = BorderStroke(3.dp, Color(0xffdbdbf1)), + shape = RoundedCornerShape(5.dp))) + Text( + text = " Информация, размещенная на сайте iXBT.games, может быть изменена без предварительного уведомления. Все названия компаний, их логотипы и названия продуктов являются зарегистрированными торговыми марками соответствующих компаний.", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 15.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 12.dp, + y = 20.dp) + .requiredWidth(width = 364.dp) + .requiredHeight(height = 144.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 42.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 42.dp) + .clip(shape = RoundedCornerShape(15.dp)) + .background(color = Color(0xff423a99))) + Text( + text = "Прежде всего", + color = Color.White, + style = TextStyle( + fontSize = 17.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 24.dp, + y = 0.dp) + .requiredWidth(width = 210.dp) + .requiredHeight(height = 42.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + } + } + item { + Box( + modifier = Modifier + .offset(x = 0.dp, + y = 25.dp) + .requiredWidth(width = 400.dp) + .requiredHeight(height = 782.dp) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 0.dp, + y = 0.dp) + .requiredWidth(width = 393.dp) + .requiredHeight(height = 759.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 759.dp) + .clip(shape = RoundedCornerShape(5.dp)) + .background(color = Color.White) + .border(border = BorderStroke(3.dp, Color(0xffdbdbf1)), + shape = RoundedCornerShape(5.dp))) + Text( + text = " Проект iXBT.games (Ай-Экс-Би-Ти Дот Геймс) является частью проекта iXBT.com (Ай-Экс-Би-Ти Дот Ком) - интернет-портала, освещающего новости ИТ-индустрии, технологий, техники, ПО и сети Интернет.\n\n Компания «Аспект Исследования и Публикации» (Aspect Research and Publishing, Ltd) имеет свидетельство о регистрации средства массовой информации iXBT.com (Ай-Экс-Би-Ти Дот Ком) за номером: ЭЛ № ФС 77 - 56280 от 28 ноября 2013 года. Свидетельство выдано Федеральной службой по надзору в сфере связи, информационных технологий и массовых коммуникаций в соответствии с Законом Российской Федерации от 27 декабря 1991 года.\n\n Ранее электронное периодическое издание iXBT.com (Ай-Экс-Би-Ти Дот Ком) было зарегистрировано за номером: ЭЛ № ФС77-22565 от 20 декабря 2005. СМИ перерегистрировано в связи со сменой учредителя 28 ноября 2013 года.\n\n Ранее электронное периодическое издание «Ай-Экс-Би-Ти дот ком / iXBT.com» («iXBT.com / Ай-Экс-Би-Ти дот ком») зарегистрировано Министерством Российской Федерации по делам печати, телерадиовещания и средств массовых коммуникаций — свидетельство ЭЛ № 77-6328 от 10 июня 2002 года. СМИ перерегистрировано в связи со сменой учредителя и изменением названия 20 декабря 2005 года.\n\n На все материалы, опубликованные на сайте iXBT.games, распространяются нормы законодательства о СМИ РФ.", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 15.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 12.dp, + y = 30.dp) + .requiredWidth(width = 368.dp) + .requiredHeight(height = 727.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 42.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 42.dp) + .clip(shape = RoundedCornerShape(15.dp)) + .background(color = Color(0xff423a99))) + Text( + text = "Правовые основы деятельности сайта", + color = Color.White, + style = TextStyle( + fontSize = 17.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset(x = 24.dp, + y = 0.dp) + .requiredWidth(width = 354.dp) + .requiredHeight(height = 42.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + } + } + } +} diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/MainScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/MainScreen.kt new file mode 100644 index 0000000..d61c7a6 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/MainScreen.kt @@ -0,0 +1,268 @@ +package com.example.pmulabs.screensMobile + +import android.annotation.SuppressLint +import android.util.Log +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.DatePicker +import androidx.compose.material3.DatePickerColors +import androidx.compose.material3.DatePickerDialog +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.material3.rememberDatePickerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.NavHostController +import androidx.navigation.compose.rememberNavController +import com.example.pmulabs.basecomponents.navigate.BottomBarScreen +import com.example.pmulabs.designElem.ArticleItem +import com.example.pmulabs.designElem.BottomBar +import com.example.pmulabs.designElem.SearchAppBar +import com.example.pmulabs.designElem.SearchViewModel +import com.example.pmulabs.designElem.SearchWidget +import com.example.pmulabs.designElem.SharedViewModel +import com.example.pmulabs.designElem.TopBar +import com.example.pmulabs.graphs.HomeNavGraph +import com.example.pmulabs.repository.ArticleRepository +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date + +@Composable +fun MainScreen(navController: NavController, modifier: Modifier = Modifier){ + + val articleRepository=ArticleRepository() + val getAllData= articleRepository.getAllData() + + LazyColumn( + modifier=Modifier + .background(Color.White) + .fillMaxSize(), + contentPadding = PaddingValues(top=75.dp, bottom = 70.dp, start = 10.dp,end=10.dp), + verticalArrangement = Arrangement.spacedBy(15.dp)){ + items(items = getAllData){ article -> + ArticleItem(article = article,onArticleClick = {navController.navigate(BottomBarScreen.ArticlePage.passId(article.id.toString()))}) + } + } +} + +@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun LoadScreen(navController: NavHostController=rememberNavController(), searchViewModel: SearchViewModel,sharedViewModel: SharedViewModel){ + + val searchWidgetState by searchViewModel.searchWidgetState + val searchTextState by searchViewModel.searchTextState + val formatter = SimpleDateFormat("dd-MMMM-YY") + + val calendar = Calendar.getInstance() + calendar.set(2023, 0, 1) // add year, month (Jan), date + + // set the initial date + val datePickerState = rememberDatePickerState(initialSelectedDateMillis = calendar.timeInMillis) + + var showDatePicker by remember { + mutableStateOf(false) + } + + var selectedDate by remember { + mutableLongStateOf(calendar.timeInMillis) // or use mutableStateOf(calendar.timeInMillis) + } + + if (showDatePicker) { + DatePickerDialog( + colors= DatePickerColors( + containerColor = Color.White, + currentYearContentColor=Color(0xff423a99), + dateTextFieldColors = TextFieldDefaults.textFieldColors( + Color(0xff423a99), + containerColor = Color.White, + focusedLabelColor = Color(0xff423a99), + focusedPlaceholderColor = Color(0xff423a99), + focusedTrailingIconColor = Color(0xff423a99) + ), + dayContentColor=Color(0xff423a99), + dayInSelectionRangeContainerColor=Color(0xff423a99), + dayInSelectionRangeContentColor=Color(0xff423a99), + disabledDayContentColor=Color(0xff423a99), + disabledSelectedDayContainerColor=Color(0xff423a99), + disabledSelectedDayContentColor=Color(0xff423a99), + disabledSelectedYearContainerColor=Color(0xff423a99), + disabledSelectedYearContentColor=Color(0xff423a99), + disabledYearContentColor=Color(0xff423a99), + dividerColor=Color(0xff423a99), + headlineContentColor=Color(0xff423a99), + navigationContentColor=Color(0xff423a99), + selectedDayContainerColor=Color(0xff423a99), + selectedDayContentColor=Color.White, + selectedYearContainerColor=Color(0xff423a99), + selectedYearContentColor=Color.White, + subheadContentColor=Color(0xff423a99), + titleContentColor=Color(0xff423a99), + todayContentColor=Color.White, + todayDateBorderColor=Color(0xff423a99), + weekdayContentColor=Color(0xff423a99), + yearContentColor=Color(0xff423a99) + ), + onDismissRequest = { + showDatePicker = false + }, + confirmButton = { + TextButton( + modifier=Modifier + .background(Color.White), + colors = ButtonColors( + contentColor = Color(0xff423a99), + containerColor=Color.Transparent, + disabledContainerColor=Color.Transparent, + disabledContentColor= Color.Transparent + ), + onClick = { + showDatePicker = false + selectedDate = datePickerState.selectedDateMillis!! + Log.d("Selected date: ", formatter.format(Date(selectedDate))) + navController.navigate(BottomBarScreen.Calendar.passDate(formatter.format(Date(selectedDate)))){ + popUpTo(BottomBarScreen.Main.route) + } + }) { + Text(text = "Confirm") + } + }, + dismissButton = { + TextButton( + modifier=Modifier + .background(Color.White), + colors = ButtonColors( + contentColor = Color(0xff423a99), + containerColor=Color.Transparent, + disabledContainerColor=Color.Transparent, + disabledContentColor= Color.Transparent + ), + onClick = { + showDatePicker = false + navController.navigate(BottomBarScreen.Main.route) + }) { + Text(text = "Cancel") + } + } + ) { + DatePicker( + modifier= Modifier + .background(Color.White) + .clip(RoundedCornerShape(15.dp)), + colors = DatePickerColors( + containerColor = Color.White, + currentYearContentColor=Color(0xff423a99), + dateTextFieldColors = TextFieldDefaults.textFieldColors( + Color(0xff423a99), + containerColor = Color.White, + focusedLabelColor = Color(0xff423a99), + focusedPlaceholderColor = Color(0xff423a99), + focusedTrailingIconColor = Color(0xff423a99) + ), + dayContentColor=Color(0xff423a99), + dayInSelectionRangeContainerColor=Color(0xff423a99), + dayInSelectionRangeContentColor=Color(0xff423a99), + disabledDayContentColor=Color(0xff423a99), + disabledSelectedDayContainerColor=Color(0xff423a99), + disabledSelectedDayContentColor=Color(0xff423a99), + disabledSelectedYearContainerColor=Color(0xff423a99), + disabledSelectedYearContentColor=Color(0xff423a99), + disabledYearContentColor=Color(0xff423a99), + dividerColor=Color(0xff423a99), + headlineContentColor=Color(0xff423a99), + navigationContentColor=Color(0xff423a99), + selectedDayContainerColor=Color(0xff423a99), + selectedDayContentColor=Color.White, + selectedYearContainerColor=Color(0xff423a99), + selectedYearContentColor=Color.White, + subheadContentColor=Color(0xff423a99), + titleContentColor=Color(0xff423a99), + todayContentColor=Color.White, + todayDateBorderColor=Color(0xff423a99), + weekdayContentColor=Color(0xff423a99), + yearContentColor=Color(0xff423a99) + ), + state = datePickerState + ) + } + } + + Scaffold( + bottomBar = { BottomBar(navController = navController) }, + topBar = { MainAppBar(searchWidgetState= searchWidgetState, + searchTextState= searchTextState, + onTextChange= { searchViewModel.updateSearchTextState(newValue = it) + if(it!="") { + navController.navigate(BottomBarScreen.Search.passText(it)) + }}, + onCloseClicked= { + searchViewModel.updateSearchWidgetState(newValue = SearchWidget.CLOSED) + navController.navigate(BottomBarScreen.Main.route) + }, + onSearchClicked= { + navController.navigate(BottomBarScreen.Search.passText(it)) + }, + onSearchTriggered= { + searchViewModel.updateSearchWidgetState(newValue = SearchWidget.OPENED) + }, + onCalendarTriggered = { + showDatePicker = true + })} + ) { + Modifier + .padding(it) + HomeNavGraph(navController = navController,sharedViewModel) + } +} + +@Composable +fun MainAppBar( + searchWidgetState: SearchWidget, + searchTextState: String, + onTextChange: (String) -> Unit, + onCloseClicked: () -> Unit, + onSearchClicked: (String) -> Unit, + onSearchTriggered: () -> Unit, + onCalendarTriggered: () -> Unit +) { + when (searchWidgetState) { + SearchWidget.CLOSED -> { + TopBar( + onSearchClicked = onSearchTriggered, + onCalendarClicked = onCalendarTriggered + ) + } + SearchWidget.OPENED -> { + SearchAppBar( + text = searchTextState, + onTextChange = onTextChange, + onCloseClicked = onCloseClicked, + onSearchClicked = onSearchClicked + ) + } + } +} + + + + diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/ProfileScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/ProfileScreen.kt new file mode 100644 index 0000000..49bae84 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/ProfileScreen.kt @@ -0,0 +1,213 @@ +package com.example.pmulabs.screensMobile + +import android.util.Log +import androidx.compose.foundation.BorderStroke +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredSize +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavController +import com.example.pmulabs.R +import com.example.pmulabs.designElem.SharedViewModel +import com.example.pmulabs.repository.UserRepository + +@Composable +fun ProfileScreen(navController: NavController, modifier: Modifier = Modifier,sharedViewModel: SharedViewModel) { + val argument = sharedViewModel.argument.value + val userRepository =UserRepository() + var getUser=userRepository.getUserById(argument.toString()) + var getComms=userRepository.getUserComm(argument.toString()) + Log.d("UserId", argument.toString()) + LazyColumn( + modifier = modifier + .requiredWidth(width = 412.dp) + .requiredHeight(height = 915.dp) + .background(color = Color.White) + ) { + item { + Box( + modifier = Modifier + .offset( + x = 106.dp, + y = 95.dp + ) + .requiredWidth(width = 200.dp) + .requiredHeight(height = 310.dp) + ) { + Image( + painter = painterResource(id = R.drawable.ixbtcom_colored_logo1), + contentDescription = "Ellipse 8", + modifier = Modifier + .requiredSize(size = 200.dp) + .clip(shape = CircleShape)) + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 0.dp, + y = 215.dp + ) + .requiredWidth(width = 200.dp) + .requiredHeight(height = 44.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 200.dp) + .requiredHeight(height = 44.dp) + .clip(shape = RoundedCornerShape(15.dp)) + .background(color = Color(0xffdbdbf1))) + Text( + text = "${getUser.nickname}", + color = Color(0xff423a99), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 17.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .requiredWidth(width = 200.dp) + .requiredHeight(height = 44.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 0.dp, + y = 266.dp + ) + .requiredWidth(width = 200.dp) + .requiredHeight(height = 44.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 200.dp) + .requiredHeight(height = 44.dp) + .clip(shape = RoundedCornerShape(15.dp)) + .background(color = Color(0xffdbdbf1))) + Text( + text = "${getUser.email}", + color = Color(0xff423a99), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 17.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .requiredWidth(width = 200.dp) + .requiredHeight(height = 44.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + } + } + item { + Box( + modifier = Modifier + .offset( + x = 9.dp, + y = 120.dp + ) + .requiredWidth(width = 393.dp) + .requiredHeight(height = 342.dp) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 0.dp, + y = 27.1240234375.dp + ) + .requiredWidth(width = 393.dp) + .requiredHeight(height = 315.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 315.dp) + .clip(shape = RoundedCornerShape(5.dp)) + .background(color = Color.White) + .border( + border = BorderStroke(3.dp, Color(0xffdbdbf1)), + shape = RoundedCornerShape(5.dp) + ) + ) + + LazyColumn( + + contentPadding = PaddingValues( + top = 38.dp, + bottom = 50.dp, + start = 30.dp, + end = 30.dp + ), + verticalArrangement = Arrangement.spacedBy(1.dp) + ) { + items(items = getComms) { comment -> + Text( + text = "${comment.text}", + color = Color(0xff423a99), + style = TextStyle( + fontSize = 15.sp, + fontWeight = FontWeight.Bold + ), + modifier = Modifier + .align(alignment = Alignment.TopStart) + ) + + } + + } + + } + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 54.dp) + ) { + Box( + modifier = Modifier + .requiredWidth(width = 393.dp) + .requiredHeight(height = 54.dp) + .clip(shape = RoundedCornerShape(15.dp)) + .background(color = Color(0xff423a99))) + Text( + text = "Комментарии:", + color = Color.White, + style = TextStyle( + fontSize = 17.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 24.dp, + y = 0.dp + ) + .requiredWidth(width = 210.dp) + .requiredHeight(height = 54.dp) + .wrapContentHeight(align = Alignment.CenterVertically)) + } + } + } + } +} diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/RegisterScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/RegisterScreen.kt new file mode 100644 index 0000000..27da7cb --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/RegisterScreen.kt @@ -0,0 +1,454 @@ +package com.example.pmulabs.screensMobile + +import android.util.Log +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 +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.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Visibility +import androidx.compose.material.icons.filled.VisibilityOff +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +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.draw.clip +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavController +import com.example.pmulabs.basecomponents.navigate.ValidateEmail +import com.example.pmulabs.basecomponents.navigate.isValidEmail +import com.example.pmulabs.designElem.LeftCircles +import com.example.pmulabs.designElem.LogoMobile +import com.example.pmulabs.designElem.RightCircles +import com.example.pmulabs.graphs.AuthScreen +import com.example.pmulabs.graphs.Graph +import com.example.pmulabs.repository.UserRepository + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun RegisterScreen(navController: NavController,modifier: Modifier = Modifier) { + + var emailValue by rememberSaveable { mutableStateOf("") } + var passwordValue by rememberSaveable { mutableStateOf("") } + var nicknameValue by rememberSaveable { mutableStateOf("") } + val userRepository= UserRepository() + val getAllData= userRepository.getAllData() + + var passwordVisibility by rememberSaveable { mutableStateOf(false) } + val emailRegex = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+".toRegex() + + Box( + modifier = modifier + .requiredWidth(width = 412.dp) + .requiredHeight(height = 915.dp) + .background(color = Color.White) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 128.dp, + y = 730.dp + ) + .requiredWidth(width = 381.dp) + .requiredHeight(height = 268.dp) + .rotate(degrees = 8.33f) + ) { + RightCircles() + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = (-111.28436279296875).dp, + y = (-96.86965942382812).dp + ) + .requiredWidth(width = 250.dp) + .requiredHeight(height = 290.dp) + .rotate(degrees = 12.96f) + ) { + LeftCircles() + } + + } + + Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.BottomCenter) { + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center, + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(0.8f) + .clip(RoundedCornerShape(15.dp)) + .background(Color.Transparent) + .padding(10.dp) + ) { + + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Box( + modifier = Modifier + .fillMaxWidth() + .background(Color.Transparent), contentAlignment = Alignment.TopCenter + ) { + + LogoMobile( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .fillMaxWidth() + .requiredHeight(height = 131.dp) + ) + + } + Text( + text = "Please, Sign In to your account", + color = Color(0xff7d7dbd), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 20.sp + ), + modifier = modifier + .requiredWidth(width = 436.dp) + .requiredHeight(height = 27.dp) + ) + Spacer(modifier = Modifier.padding(10.dp)) + + Column(horizontalAlignment = Alignment.CenterHorizontally) { + TextField( + value = nicknameValue, + onValueChange = { + nicknameValue=it + }, + colors = TextFieldDefaults.textFieldColors( + containerColor = Color.White + ), + modifier = Modifier + .requiredWidth(width = 269.dp) + .requiredHeight(height = 53.dp) + .shadow(shape = RoundedCornerShape(40.dp), elevation = 5.dp) + .clip(shape = RoundedCornerShape(40.dp)), + label = { Text("Nickname") }, + placeholder = { Text("Nickname") }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email), + singleLine = true, + ) + Spacer(modifier = Modifier.padding(3.dp)) + ValidateEmail(emailValue, {emailValue=it} ) + Spacer(modifier = Modifier.padding(3.dp)) + TextField( + value = passwordValue, + onValueChange = { passwordValue = it }, + colors = TextFieldDefaults.textFieldColors( + containerColor = Color.White + ), + modifier = modifier + .requiredWidth(width = 269.dp) + .requiredHeight(height = 53.dp) + .shadow(shape = RoundedCornerShape(40.dp), elevation = 5.dp) + .clip(shape = RoundedCornerShape(40.dp)), + label = { Text("Password") }, + singleLine = true, + placeholder = { Text("Password") }, + visualTransformation = if (passwordVisibility) VisualTransformation.None else PasswordVisualTransformation(), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), + trailingIcon = { + val image = if (passwordVisibility) + Icons.Filled.Visibility + else Icons.Filled.VisibilityOff + + val description = + if (passwordVisibility) "Hide password" else "Show password" + + IconButton(onClick = { passwordVisibility = !passwordVisibility }) { + Icon(imageVector = image, description) + } + } + ) + + Spacer(modifier = Modifier.padding(10.dp)) + Button( + colors = ButtonColors( + containerColor = Color(0xff423a99), + disabledContainerColor = Color(0xff423a99), + contentColor = Color.White, + disabledContentColor = Color.White + ), + onClick = { + if (passwordValue.isNotEmpty() && isValidEmail(emailValue) && nicknameValue.isNotEmpty()) { + if(!isUserExist(passwordValue,emailValue,nicknameValue)){ + navController.navigate(route = Graph.MAIN){ + popUpTo(Graph.MAIN) + } + } + } + + }, + modifier = Modifier + .fillMaxWidth(0.5f) + .height(50.dp) + ) { + Text(text = "Sign Up", fontSize = 20.sp) + } + + Spacer(modifier = Modifier.padding(0.dp)) + + Text( + text = "Do you have an account? Sign In", + color = Color(0xff7d7dbd), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 20.sp + ), + modifier = Modifier + .fillMaxSize() + .offset( + x = 0.dp, + y = 75.dp + ) + .clickable { + navController.navigate(route = AuthScreen.Entry.route) + { + popUpTo(AuthScreen.Splash.route) + } + } + ) + Spacer(modifier = Modifier.padding(20.dp)) + } + } + } + } +} + +fun isUserExist(passwordValue: String, emailValue: String, nicknameValue: String): Boolean { + val userRepository = UserRepository() + val getAllData = userRepository.getAllData() + + if (passwordValue.isNotEmpty() && isValidEmail(emailValue) && nicknameValue.isNotEmpty()) { + getAllData.forEach { user -> + if (user.email == emailValue || user.nickname == nicknameValue) { + Log.d("User already exist. User id: ", user.id.toString()) + return true + } + } + } + + return false +} + +/* +@Composable +fun RegisterScreen(navController: NavController,modifier: Modifier = Modifier) { + Box( + modifier = modifier + .requiredWidth(width = 412.dp) + .requiredHeight(height = 915.dp) + .background(color = Color.White) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = (-17).dp, + y = 329.dp + ) + .requiredWidth(width = 436.dp) + .requiredHeight(height = 325.dp) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 69.1444091796875.dp, + y = 122.9124755859375.dp + ) + .requiredWidth(width = 308.dp) + .requiredHeight(height = 61.dp) + ) { + + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 69.1444091796875.dp, + y = 193.824951171875.dp + ) + .requiredWidth(width = 308.dp) + .requiredHeight(height = 61.dp) + ) { + + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 68.dp, + y = 52.dp + ) + .requiredWidth(width = 308.dp) + .requiredHeight(height = 61.dp) + ) { + + } + Text( + textAlign = TextAlign.Center, + text = buildAnnotatedString { + withStyle(style = SpanStyle( + color = Color(0xff7d7dbd), + fontSize = 20.sp)) {append("Please, ")} + withStyle(style = SpanStyle( + color = Color(0xff7d7dbd), + fontSize = 20.sp, + fontWeight = FontWeight.Bold)) {append("Sign Up")}}, + modifier = Modifier + .fillMaxSize()) + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 128.dp, + y = 730.dp + ) + .requiredWidth(width = 381.dp) + .requiredHeight(height = 268.dp) + .rotate(degrees = 8.33f) + ) { + RightCircles() + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = (-111.28436279296875).dp, + y = (-96.86965942382812).dp + ) + .requiredWidth(width = 250.dp) + .requiredHeight(height = 290.dp) + ) { + Box( + modifier = Modifier + .rotate(degrees = 12.96f) + ) { + LeftCircles() + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 140.35101318359375.dp, + y = 152.06341552734375.dp + ) + .requiredWidth(width = 66.dp) + .requiredHeight(height = 27.dp) + ) { + BackButton(modifier=Modifier + .clickable { navController.navigate(route = AuthScreen.Entry.route){ + popUpTo(AuthScreen.Splash.route) + } })} + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 50.dp, + y = 681.dp + ) + .requiredWidth(width = 308.dp) + .requiredHeight(height = 127.dp) + ) { + Text( + text = "Do you have an account? ", + color = Color(0xff7d7dbd), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 20.sp), + modifier = Modifier + .fillMaxSize() + .offset( + x = 0.dp, + y = 75.dp + )) + Text( + text = "Sign In", + color = Color(0xff7d7dbd), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 20.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .fillMaxSize() + .offset( + x = 0.dp, + y = 95.dp + ) + .clickable { navController.navigate(route = AuthScreen.Entry.route) + { + popUpTo(AuthScreen.Splash.route) + }}) + Box( + modifier = Modifier + .requiredWidth(width = 308.dp) + .requiredHeight(height = 82.dp) + ) { + ButtonCustom(name = "Sign Up",modifier = Modifier + .fillMaxSize() + .clickable { navController.navigate(route = Graph.MAIN){ + popUpTo(Graph.MAIN) + } } + ) + } + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 57.dp, + y = 165.dp + ) + .requiredWidth(width = 302.dp) + .requiredHeight(height = 140.dp) + ) { + LogoMobile(modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 0.dp, + y = 9.dp + ) + .fillMaxWidth() + .requiredHeight(height = 131.dp)) + } + } +}*/ diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/SearchByTagScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/SearchByTagScreen.kt new file mode 100644 index 0000000..3fef6d6 --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/SearchByTagScreen.kt @@ -0,0 +1,45 @@ +package com.example.pmulabs.screensMobile + +import android.util.Log +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.pmulabs.basecomponents.navigate.BackButton +import com.example.pmulabs.basecomponents.navigate.BottomBarScreen +import com.example.pmulabs.basecomponents.navigate.SEARCHBYTAG_ARGUMENT_KEY +import com.example.pmulabs.designElem.ArticleItem +import com.example.pmulabs.repository.ArticleRepository + +@Composable +fun SearchByTagScreen(navController: NavController, modifier: Modifier = Modifier){ + + val articleRepository= ArticleRepository() + val getAllData= articleRepository.getAllData() + var id=navController.currentBackStackEntry?.arguments?.getString(SEARCHBYTAG_ARGUMENT_KEY).toString() + Log.d("id: ",id) + + LazyColumn(modifier= Modifier + .background(Color.White) + .fillMaxSize(), + contentPadding = PaddingValues(top =75.dp, bottom = 10.dp, start = 10.dp,end=10.dp), + verticalArrangement = Arrangement.spacedBy(1.dp)){ + item{ + BackButton(modifier=Modifier + .clickable { navController.popBackStack()}) + } + items(items = getAllData){ article -> + if(article.tagId.toString()==id) { + ArticleItem(article = article, onArticleClick = {navController.navigate(BottomBarScreen.ArticlePage.passId(article.id.toString()))}) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/SearchScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/SearchScreen.kt new file mode 100644 index 0000000..136611b --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/SearchScreen.kt @@ -0,0 +1,46 @@ +package com.example.pmulabs.screensMobile + +import android.util.Log +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.pmulabs.basecomponents.navigate.BackButton +import com.example.pmulabs.basecomponents.navigate.BottomBarScreen +import com.example.pmulabs.basecomponents.navigate.SEARCH_ARGUMENT_TEXT +import com.example.pmulabs.designElem.ArticleItem +import com.example.pmulabs.repository.ArticleRepository + +@Composable +fun SearchScreen(navController: NavController, modifier: Modifier = Modifier){ + + val articleRepository= ArticleRepository() + val getAllData= articleRepository.getAllData() + var text=navController.currentBackStackEntry?.arguments?.getString(SEARCH_ARGUMENT_TEXT).toString() + Log.d("text: ",text) + + LazyColumn( + modifier= Modifier + .background(Color.White) + .fillMaxSize(), + contentPadding = PaddingValues(top =75.dp, bottom = 10.dp, start = 10.dp,end=10.dp), + verticalArrangement = Arrangement.spacedBy(1.dp)){ + item{ + BackButton(modifier=Modifier + .clickable { navController.popBackStack()}) + } + items(items = getAllData){ article -> + if(article.title.contains(text)) { + ArticleItem(article = article,onArticleClick = {navController.navigate(BottomBarScreen.ArticlePage.passId(article.id.toString()))}) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/SplashScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/SplashScreen.kt new file mode 100644 index 0000000..3fe5b9f --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/SplashScreen.kt @@ -0,0 +1,143 @@ +package com.example.pmulabs.screensMobile + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavController +import com.example.pmulabs.designElem.LeftCircles +import com.example.pmulabs.designElem.LogoMobile +import com.example.pmulabs.designElem.RightCircles +import com.example.pmulabs.graphs.AuthScreen + +@Composable +fun SplashScreen(navController: NavController,modifier: Modifier = Modifier) { + Box( + modifier = modifier + .requiredWidth(width = 412.dp) + .requiredHeight(height = 915.dp) + .background(color = Color.White) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 128.dp, + y = 730.dp + ) + .requiredWidth(width = 381.dp) + .requiredHeight(height = 268.dp) + .rotate(degrees = 8.33f) + ) { + RightCircles() + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = (-111.28436279296875).dp, + y = (-96.86965942382812).dp + ) + .requiredWidth(width = 250.dp) + .requiredHeight(height = 290.dp) + .rotate(degrees = 12.96f) + ) { + LeftCircles() + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 0.dp, + y = 200.dp + ) + .requiredWidth(width = 412.dp) + .requiredHeight(height = 190.dp) + ) { + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 62.00006103515625.dp, + y = 50.dp + ) + .requiredWidth(width = 302.dp) + .requiredHeight(height = 140.dp) + ) { + LogoMobile(modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 0.dp, + y = 9.dp + ) + .fillMaxWidth() + .requiredHeight(height = 131.dp)) + } + Text( + text = "Welcome to", + color = Color(0xff7d7dbd), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 48.sp, + fontWeight = FontWeight.Bold), + modifier = Modifier + .fillMaxSize()) + } + Box( + modifier = Modifier + .align(alignment = Alignment.TopStart) + .offset( + x = 0.dp, + y = 649.2312622070312.dp + ) + .requiredWidth(width = 412.dp) + .requiredHeight(height = 92.dp) + ) { + Text( + text = "Best app with game news!", + color = Color(0xff7d7dbd), + textAlign = TextAlign.Center, + style = TextStyle( + fontSize = 20.sp), + modifier = Modifier + .fillMaxSize()) + Button( + colors = ButtonColors( + containerColor = Color(0xff423a99), + disabledContainerColor = Color(0xff423a99), + contentColor = Color.White, + disabledContentColor = Color.White + ), + onClick = {navController.navigate(route = AuthScreen.Entry.route)}, + modifier = Modifier + .fillMaxWidth(0.5f) + .height(50.dp) + .align(alignment = Alignment.TopStart) + .offset( + x = 106.5.dp, + y = 31.31878662109375.dp + ) + ) { + Text(text = "Get Started", fontSize = 20.sp) + } + + } + } +} diff --git a/app/src/main/java/com/example/pmulabs/screensMobile/TagsScreen.kt b/app/src/main/java/com/example/pmulabs/screensMobile/TagsScreen.kt new file mode 100644 index 0000000..bf9b4bd --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/screensMobile/TagsScreen.kt @@ -0,0 +1,37 @@ +package com.example.pmulabs.screensMobile + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import com.example.pmulabs.basecomponents.navigate.BottomBarScreen +import com.example.pmulabs.designElem.TagItem +import com.example.pmulabs.repository.TegRepository + +@Composable +fun TagsScreen(navController: NavController, modifier: Modifier = Modifier){ + + val tegRepository= TegRepository() + val getAllData= tegRepository.getAllData() + + LazyColumn( + modifier= Modifier + .background(Color.White) + .fillMaxSize(), + contentPadding = PaddingValues(top =75.dp, bottom = 10.dp, start = 25.dp,end=25.dp), + verticalArrangement = Arrangement.spacedBy(15.dp)){ + items(items = getAllData){ tag -> + TagItem( + teg = tag, + onTagClick = {navController.navigate(BottomBarScreen.SearchByTag.passId(tag.id.toString()))} + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/ui/theme/Color.kt b/app/src/main/java/com/example/pmulabs/ui/theme/Color.kt new file mode 100644 index 0000000..da0688c --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package com.example.pmulabs.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/ui/theme/Theme.kt b/app/src/main/java/com/example/pmulabs/ui/theme/Theme.kt new file mode 100644 index 0000000..bc0364e --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/ui/theme/Theme.kt @@ -0,0 +1,70 @@ +package com.example.pmulabs.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.core.view.WindowCompat + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun PMULabsTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + 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 view = LocalView.current + if (!view.isInEditMode) { + SideEffect { + val window = (view.context as Activity).window + window.statusBarColor = colorScheme.primary.toArgb() + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme + } + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/example/pmulabs/ui/theme/Type.kt b/app/src/main/java/com/example/pmulabs/ui/theme/Type.kt new file mode 100644 index 0000000..433b3ea --- /dev/null +++ b/app/src/main/java/com/example/pmulabs/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package com.example.pmulabs.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/app/src/main/res/drawable/ellipse7.png b/app/src/main/res/drawable/ellipse7.png new file mode 100644 index 0000000..2e42650 Binary files /dev/null and b/app/src/main/res/drawable/ellipse7.png differ diff --git a/app/src/main/res/drawable/ic_bottom_categories.xml b/app/src/main/res/drawable/ic_bottom_categories.xml new file mode 100644 index 0000000..04e91fa --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_categories.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bottom_categories_focused.xml b/app/src/main/res/drawable/ic_bottom_categories_focused.xml new file mode 100644 index 0000000..5a08903 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_categories_focused.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bottom_cooperation.xml b/app/src/main/res/drawable/ic_bottom_cooperation.xml new file mode 100644 index 0000000..728f75e --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_cooperation.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bottom_cooperation_focused.xml b/app/src/main/res/drawable/ic_bottom_cooperation_focused.xml new file mode 100644 index 0000000..d9889a4 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_cooperation_focused.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bottom_info.xml b/app/src/main/res/drawable/ic_bottom_info.xml new file mode 100644 index 0000000..1295f47 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_info.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bottom_info_focused.xml b/app/src/main/res/drawable/ic_bottom_info_focused.xml new file mode 100644 index 0000000..654cfb3 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_info_focused.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bottom_main.xml b/app/src/main/res/drawable/ic_bottom_main.xml new file mode 100644 index 0000000..8cd1f3d --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_main.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bottom_main_focused.xml b/app/src/main/res/drawable/ic_bottom_main_focused.xml new file mode 100644 index 0000000..4c5e854 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_main_focused.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_bottom_profile.xml b/app/src/main/res/drawable/ic_bottom_profile.xml new file mode 100644 index 0000000..2ed616d --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_profile.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_bottom_profile_focused.xml b/app/src/main/res/drawable/ic_bottom_profile_focused.xml new file mode 100644 index 0000000..d92f742 --- /dev/null +++ b/app/src/main/res/drawable/ic_bottom_profile_focused.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_comment.xml b/app/src/main/res/drawable/ic_comment.xml new file mode 100644 index 0000000..a33cc70 --- /dev/null +++ b/app/src/main/res/drawable/ic_comment.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/iconhashtag1.png b/app/src/main/res/drawable/iconhashtag1.png new file mode 100644 index 0000000..05d9870 Binary files /dev/null and b/app/src/main/res/drawable/iconhashtag1.png differ diff --git a/app/src/main/res/drawable/image2.png b/app/src/main/res/drawable/image2.png new file mode 100644 index 0000000..7a78c7b Binary files /dev/null and b/app/src/main/res/drawable/image2.png differ diff --git a/app/src/main/res/drawable/image3.png b/app/src/main/res/drawable/image3.png new file mode 100644 index 0000000..e47c903 Binary files /dev/null and b/app/src/main/res/drawable/image3.png differ diff --git a/app/src/main/res/drawable/ixbtcom_colored_logo1.png b/app/src/main/res/drawable/ixbtcom_colored_logo1.png new file mode 100644 index 0000000..bcc7228 Binary files /dev/null and b/app/src/main/res/drawable/ixbtcom_colored_logo1.png differ diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file 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 new file mode 100644 index 0000000..6f3b755 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b2dfe3d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..62b611d Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..1b9a695 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9287f50 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9126ae3 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..f38ba96 --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + PMULabs + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..6a339ac --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +