Сделано
This commit is contained in:
parent
6d16372dd4
commit
7aa7a2ffd9
1
.idea/vcs.xml
generated
1
.idea/vcs.xml
generated
@ -2,5 +2,6 @@
|
|||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="VcsDirectoryMappings">
|
<component name="VcsDirectoryMappings">
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
<mapping directory="$PROJECT_DIR$/app/src/main/assets/texts" vcs="Git" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
@ -5,7 +5,7 @@ plugins {
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
namespace = "com.example.shortbooks"
|
namespace = "com.example.shortbooks"
|
||||||
compileSdk = 33
|
compileSdk = 34
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId = "com.example.shortbooks"
|
applicationId = "com.example.shortbooks"
|
||||||
@ -53,8 +53,9 @@ dependencies {
|
|||||||
|
|
||||||
implementation("androidx.core:core-ktx:1.9.0")
|
implementation("androidx.core:core-ktx:1.9.0")
|
||||||
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
|
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
|
||||||
implementation("androidx.activity:activity-compose:1.8.1")
|
implementation("androidx.activity:activity-compose:1.8.0")
|
||||||
implementation(platform("androidx.compose:compose-bom:2023.03.00"))
|
implementation(platform("androidx.compose:compose-bom:2023.03.00"))
|
||||||
|
implementation("androidx.navigation:navigation-compose:2.6.0")
|
||||||
implementation("androidx.compose.ui:ui")
|
implementation("androidx.compose.ui:ui")
|
||||||
implementation("androidx.compose.ui:ui-graphics")
|
implementation("androidx.compose.ui:ui-graphics")
|
||||||
implementation("androidx.compose.ui:ui-tooling-preview")
|
implementation("androidx.compose.ui:ui-tooling-preview")
|
||||||
|
BIN
app/src/main/assets/images/dostoevskiy_besy.jpg
Normal file
BIN
app/src/main/assets/images/dostoevskiy_besy.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
@ -1,15 +1,16 @@
|
|||||||
package com.example.shortbooks
|
package com.example.shortbooks
|
||||||
|
|
||||||
|
import android.content.res.Configuration
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.Text
|
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import com.example.shortbooks.navigation.MainNavbar
|
||||||
import com.example.shortbooks.ui.theme.ShortBooksTheme
|
import com.example.shortbooks.ui.theme.ShortBooksTheme
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
@ -17,30 +18,26 @@ class MainActivity : ComponentActivity() {
|
|||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContent {
|
setContent {
|
||||||
ShortBooksTheme {
|
ShortBooksTheme {
|
||||||
// A surface container using the 'background' color from the theme
|
|
||||||
Surface(
|
Surface(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
color = MaterialTheme.colorScheme.background
|
color = MaterialTheme.colorScheme.background
|
||||||
) {
|
) {
|
||||||
Greeting("Android")
|
MainNavbar()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
|
||||||
|
@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
@Composable
|
@Composable
|
||||||
fun Greeting(name: String, modifier: Modifier = Modifier) {
|
fun MainNavbarPreview() {
|
||||||
Text(
|
|
||||||
text = "Hello $name!",
|
|
||||||
modifier = modifier
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview(showBackground = true)
|
|
||||||
@Composable
|
|
||||||
fun GreetingPreview() {
|
|
||||||
ShortBooksTheme {
|
ShortBooksTheme {
|
||||||
Greeting("Android")
|
Surface(
|
||||||
|
color = MaterialTheme.colorScheme.background
|
||||||
|
) {
|
||||||
|
MainNavbar()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,109 @@
|
|||||||
|
package com.example.shortbooks.book.composeui
|
||||||
|
|
||||||
|
import android.content.res.AssetManager
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import android.graphics.BitmapFactory
|
||||||
|
import androidx.compose.foundation.Image
|
||||||
|
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.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
|
import androidx.compose.material3.Card
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Surface
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.draw.clip
|
||||||
|
import androidx.compose.ui.graphics.asImageBitmap
|
||||||
|
import androidx.compose.ui.graphics.painter.BitmapPainter
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import androidx.navigation.NavController
|
||||||
|
import com.example.shortbooks.book.model.getBooks
|
||||||
|
import com.example.shortbooks.navigation.Screen
|
||||||
|
import com.example.shortbooks.ui.theme.ShortBooksTheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun BookList(navController: NavController?) {
|
||||||
|
Column(
|
||||||
|
Modifier
|
||||||
|
.padding(all = 10.dp)
|
||||||
|
.padding(vertical = 30.dp)
|
||||||
|
.verticalScroll(rememberScrollState()))
|
||||||
|
{
|
||||||
|
Text(text = "Книги", fontSize = 32.sp, modifier = Modifier.padding(all=10.dp))
|
||||||
|
getBooks().forEachIndexed() { index, book ->
|
||||||
|
val bookId = Screen.BookText.route.replace("{id}", index.toString())
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(all = 10.dp)
|
||||||
|
.clickable { navController?.navigate(bookId) },
|
||||||
|
shape = RoundedCornerShape(10.dp),
|
||||||
|
) {
|
||||||
|
Box(){
|
||||||
|
Row(
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
){
|
||||||
|
ImageConverse(imagePath = book.image)
|
||||||
|
Column {
|
||||||
|
Text("${book.name}", fontSize = 22.sp)
|
||||||
|
Text("${book.author}", fontSize = 18.sp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun ImageConverse(imagePath: String) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val assetManager: AssetManager = context.assets
|
||||||
|
// Открываем поток данных для изображения в каталоге assets
|
||||||
|
val inputStream = assetManager.open(imagePath)
|
||||||
|
|
||||||
|
// Преобразуем поток данных в Bitmap
|
||||||
|
val bitmap = BitmapFactory.decodeStream(inputStream)
|
||||||
|
|
||||||
|
// Преобразуем Bitmap в ImageBitmap
|
||||||
|
val imageBitmap = bitmap.asImageBitmap()
|
||||||
|
|
||||||
|
// Создаем BitmapPainter из ImageBitmap
|
||||||
|
val painter = BitmapPainter(imageBitmap)
|
||||||
|
|
||||||
|
// Отображаем изображение с помощью Image и BitmapPainter
|
||||||
|
Image(
|
||||||
|
painter = painter,
|
||||||
|
contentDescription = "Image",
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(all = 5.dp)
|
||||||
|
.size(64.dp)
|
||||||
|
.clip(RoundedCornerShape(10.dp))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
|
||||||
|
@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
fun BookListPreview() {
|
||||||
|
ShortBooksTheme {
|
||||||
|
Surface(
|
||||||
|
color = MaterialTheme.colorScheme.background
|
||||||
|
) {
|
||||||
|
BookList(navController = null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.example.shortbooks.book.composeui
|
||||||
|
|
||||||
|
import android.content.res.AssetManager
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
|
import androidx.compose.material3.Button
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Surface
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import com.example.shortbooks.book.model.getBooks
|
||||||
|
import com.example.shortbooks.ui.theme.ShortBooksTheme
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun BookText(id: Int) {
|
||||||
|
|
||||||
|
val context = LocalContext.current
|
||||||
|
val assetManager: AssetManager = context.assets
|
||||||
|
|
||||||
|
|
||||||
|
val book = getBooks()[id]
|
||||||
|
val textContent: String = assetManager.open(book.text).bufferedReader().use { it.readText() }
|
||||||
|
Column(
|
||||||
|
verticalArrangement = Arrangement.Center,
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally
|
||||||
|
) {
|
||||||
|
Button(onClick = { }) {
|
||||||
|
Text(text = "Добавить в избранное")
|
||||||
|
}
|
||||||
|
Text(text = textContent, modifier = Modifier.verticalScroll(rememberScrollState()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
|
||||||
|
@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
fun BookTextPreview() {
|
||||||
|
ShortBooksTheme {
|
||||||
|
Surface(
|
||||||
|
color = MaterialTheme.colorScheme.background
|
||||||
|
) {
|
||||||
|
BookText(id = 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
18
app/src/main/java/com/example/shortbooks/book/model/Book.kt
Normal file
18
app/src/main/java/com/example/shortbooks/book/model/Book.kt
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package com.example.shortbooks.book.model
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
data class Book(
|
||||||
|
val name: String,
|
||||||
|
val author: String,
|
||||||
|
val ageLimit: Int,
|
||||||
|
val text: String,
|
||||||
|
val image: String
|
||||||
|
):Serializable
|
||||||
|
fun getBooks(): List<Book> {
|
||||||
|
return listOf(
|
||||||
|
Book("Книга 1", "Автор 1", 18, "texts/dostoevskiy_besy.txt", "images/dostoevskiy_besy.jpg"),
|
||||||
|
Book("Книга 2", "Автор 2", 12, "texts/dostoevskiy_besy.txt", "images/dostoevskiy_besy.jpg"),
|
||||||
|
Book("Книга 3", "Автор 3", 6, "texts/dostoevskiy_besy.txt", "images/dostoevskiy_besy.jpg"),
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,107 @@
|
|||||||
|
package com.example.shortbooks.favorite.composeui
|
||||||
|
|
||||||
|
import android.content.res.AssetManager
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import android.graphics.BitmapFactory
|
||||||
|
import androidx.compose.foundation.Image
|
||||||
|
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.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
|
import androidx.compose.material3.Card
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Surface
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.draw.clip
|
||||||
|
import androidx.compose.ui.graphics.asImageBitmap
|
||||||
|
import androidx.compose.ui.graphics.painter.BitmapPainter
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import androidx.navigation.NavController
|
||||||
|
import com.example.shortbooks.favorite.model.getFavorites
|
||||||
|
import com.example.shortbooks.navigation.Screen
|
||||||
|
import com.example.shortbooks.ui.theme.ShortBooksTheme
|
||||||
|
@Composable
|
||||||
|
fun FavoriteList(navController: NavController?) {
|
||||||
|
Column(
|
||||||
|
Modifier
|
||||||
|
.padding(all = 10.dp)
|
||||||
|
.padding(vertical = 30.dp)
|
||||||
|
.verticalScroll(rememberScrollState())) {
|
||||||
|
Text(text = "Избранное", fontSize = 32.sp, modifier = Modifier.padding(all=10.dp))
|
||||||
|
getFavorites().forEachIndexed() { index, favorite ->
|
||||||
|
val favoriteId = Screen.FavoriteText.route.replace("{id}", index.toString())
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(all = 10.dp)
|
||||||
|
.clickable { navController?.navigate(favoriteId) },
|
||||||
|
shape = RoundedCornerShape(15.dp),
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Box(){
|
||||||
|
Row(
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
){
|
||||||
|
ImageConverse(imagePath = favorite.image)
|
||||||
|
Column {
|
||||||
|
Text("${favorite.name}", fontSize = 22.sp)
|
||||||
|
Text("${favorite.author}", fontSize = 18.sp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun ImageConverse(imagePath: String, modifier: Modifier = Modifier) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val assetManager: AssetManager = context.assets
|
||||||
|
// Открываем поток данных для изображения в каталоге assets
|
||||||
|
val inputStream = assetManager.open(imagePath)
|
||||||
|
|
||||||
|
// Преобразуем поток данных в Bitmap
|
||||||
|
val bitmap = BitmapFactory.decodeStream(inputStream)
|
||||||
|
|
||||||
|
// Преобразуем Bitmap в ImageBitmap
|
||||||
|
val imageBitmap = bitmap.asImageBitmap()
|
||||||
|
|
||||||
|
// Создаем BitmapPainter из ImageBitmap
|
||||||
|
val painter = BitmapPainter(imageBitmap)
|
||||||
|
|
||||||
|
// Отображаем изображение с помощью Image и BitmapPainter
|
||||||
|
Image(
|
||||||
|
painter = painter,
|
||||||
|
contentDescription = "Image",
|
||||||
|
modifier = modifier
|
||||||
|
.padding(all = 5.dp)
|
||||||
|
.size(64.dp)
|
||||||
|
.clip(RoundedCornerShape(10.dp))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
|
||||||
|
@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
fun BookListPreview() {
|
||||||
|
ShortBooksTheme {
|
||||||
|
Surface(
|
||||||
|
color = MaterialTheme.colorScheme.background
|
||||||
|
) {
|
||||||
|
FavoriteList(navController = null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package com.example.shortbooks.favorite.composeui
|
||||||
|
|
||||||
|
import android.content.res.AssetManager
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
|
import androidx.compose.material3.Button
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Surface
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import com.example.shortbooks.favorite.model.getFavorites
|
||||||
|
import com.example.shortbooks.ui.theme.ShortBooksTheme
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun FavoriteText(id: Int) {
|
||||||
|
|
||||||
|
val context = LocalContext.current
|
||||||
|
val assetManager: AssetManager = context.assets
|
||||||
|
|
||||||
|
|
||||||
|
val favorite = getFavorites()[id]
|
||||||
|
val textContent: String = assetManager.open(favorite.text).bufferedReader().use { it.readText() }
|
||||||
|
Column(
|
||||||
|
verticalArrangement = Arrangement.Center,
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally
|
||||||
|
) {
|
||||||
|
Button(onClick = { }) {
|
||||||
|
Text(text = "Удалить из избранного")
|
||||||
|
}
|
||||||
|
Text(text = textContent, modifier = Modifier.verticalScroll(rememberScrollState()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
|
||||||
|
@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
fun BookTextPreview() {
|
||||||
|
ShortBooksTheme {
|
||||||
|
Surface(
|
||||||
|
color = MaterialTheme.colorScheme.background
|
||||||
|
) {
|
||||||
|
FavoriteText(id = 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.example.shortbooks.favorite.model
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
data class Favorite(
|
||||||
|
val name: String,
|
||||||
|
val author: String,
|
||||||
|
val ageLimit: Int,
|
||||||
|
val text: String,
|
||||||
|
val image: String
|
||||||
|
):Serializable
|
||||||
|
fun getFavorites(): List<Favorite>{
|
||||||
|
return listOf(
|
||||||
|
Favorite( "Книга 1", "Автор 1", 18, "texts/dostoevskiy_besy.txt", "images/dostoevskiy_besy.jpg"),
|
||||||
|
Favorite( "Книга 2", "Автор 2", 18, "texts/dostoevskiy_besy.txt", "images/dostoevskiy_besy.jpg"),
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,121 @@
|
|||||||
|
package com.example.shortbooks.navigation
|
||||||
|
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.NavigationBar
|
||||||
|
import androidx.compose.material3.NavigationBarItem
|
||||||
|
import androidx.compose.material3.Scaffold
|
||||||
|
import androidx.compose.material3.Surface
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.navigation.NavDestination
|
||||||
|
import androidx.navigation.NavDestination.Companion.hierarchy
|
||||||
|
import androidx.navigation.NavGraph.Companion.findStartDestination
|
||||||
|
import androidx.navigation.NavHostController
|
||||||
|
import androidx.navigation.NavType
|
||||||
|
import androidx.navigation.compose.NavHost
|
||||||
|
import androidx.navigation.compose.composable
|
||||||
|
import androidx.navigation.compose.currentBackStackEntryAsState
|
||||||
|
import androidx.navigation.compose.rememberNavController
|
||||||
|
import androidx.navigation.navArgument
|
||||||
|
import com.example.shortbooks.book.composeui.BookList
|
||||||
|
import com.example.shortbooks.book.composeui.BookText
|
||||||
|
import com.example.shortbooks.favorite.composeui.FavoriteList
|
||||||
|
import com.example.shortbooks.favorite.composeui.FavoriteText
|
||||||
|
import com.example.shortbooks.ui.theme.ShortBooksTheme
|
||||||
|
import com.example.shortbooks.user.composeui.UserInfo
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Navbar(
|
||||||
|
navController: NavHostController,
|
||||||
|
currentDestination: NavDestination?,
|
||||||
|
modifier: Modifier = Modifier
|
||||||
|
) {
|
||||||
|
NavigationBar(modifier) {
|
||||||
|
Screen.bottomBarItems.forEach { screen ->
|
||||||
|
NavigationBarItem(
|
||||||
|
icon = { Icon(screen.icon, contentDescription = null) },
|
||||||
|
label = { Text(stringResource(screen.resourceId)) },
|
||||||
|
selected = currentDestination?.hierarchy?.any { it.route == screen.route } == true,
|
||||||
|
onClick = {
|
||||||
|
navController.navigate(screen.route) {
|
||||||
|
popUpTo(navController.graph.findStartDestination().id) {
|
||||||
|
saveState = true
|
||||||
|
}
|
||||||
|
launchSingleTop = true
|
||||||
|
restoreState = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Navhost(
|
||||||
|
navController: NavHostController,
|
||||||
|
innerPadding: PaddingValues, modifier:
|
||||||
|
Modifier = Modifier
|
||||||
|
) {
|
||||||
|
NavHost(
|
||||||
|
navController,
|
||||||
|
startDestination = Screen.BookList.route,
|
||||||
|
modifier.padding(innerPadding)
|
||||||
|
) {
|
||||||
|
composable(Screen.BookList.route) { BookList(navController) }
|
||||||
|
composable(Screen.FavoriteList.route) { FavoriteList(navController) }
|
||||||
|
composable(Screen.UserInfo.route) { UserInfo() }
|
||||||
|
composable(
|
||||||
|
Screen.BookText.route,
|
||||||
|
arguments = listOf(navArgument("id") { type = NavType.IntType })
|
||||||
|
) { backStackEntry ->
|
||||||
|
backStackEntry.arguments?.let { BookText(it.getInt("id")) }
|
||||||
|
}
|
||||||
|
composable(
|
||||||
|
Screen.FavoriteText.route,
|
||||||
|
arguments = listOf(navArgument("id") { type = NavType.IntType })
|
||||||
|
) { backStackEntry ->
|
||||||
|
backStackEntry.arguments?.let { FavoriteText(it.getInt("id")) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun MainNavbar() {
|
||||||
|
val navController = rememberNavController()
|
||||||
|
val navBackStackEntry by navController.currentBackStackEntryAsState()
|
||||||
|
val currentDestination = navBackStackEntry?.destination
|
||||||
|
val currentScreen = currentDestination?.route?.let { Screen.getItem(it) }
|
||||||
|
|
||||||
|
Scaffold(
|
||||||
|
bottomBar = {
|
||||||
|
if (currentScreen == null || currentScreen.showInBottomBar) {
|
||||||
|
Navbar(navController, currentDestination)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
) { innerPadding ->
|
||||||
|
Navhost(navController, innerPadding)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
|
||||||
|
@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
fun MainNavbarPreview() {
|
||||||
|
ShortBooksTheme {
|
||||||
|
Surface(
|
||||||
|
color = MaterialTheme.colorScheme.background
|
||||||
|
) {
|
||||||
|
MainNavbar()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package com.example.shortbooks.navigation
|
||||||
|
|
||||||
|
import androidx.annotation.StringRes
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.AccountBox
|
||||||
|
import androidx.compose.material.icons.filled.Favorite
|
||||||
|
import androidx.compose.material.icons.filled.List
|
||||||
|
import androidx.compose.ui.graphics.vector.ImageVector
|
||||||
|
import com.example.shortbooks.R
|
||||||
|
|
||||||
|
enum class Screen(
|
||||||
|
val route: String,
|
||||||
|
@StringRes val resourceId: Int,
|
||||||
|
val icon: ImageVector = Icons.Filled.Favorite,
|
||||||
|
val showInBottomBar: Boolean = true
|
||||||
|
) {
|
||||||
|
BookList(
|
||||||
|
"book-list", R.string.book_main_title, Icons.Filled.List
|
||||||
|
),
|
||||||
|
FavoriteList(
|
||||||
|
"favorite-list", R.string.favorite_main_title, Icons.Filled.Favorite
|
||||||
|
),
|
||||||
|
UserInfo(
|
||||||
|
"user-info", R.string.user_main_title, Icons.Filled.AccountBox
|
||||||
|
),
|
||||||
|
BookText(
|
||||||
|
"book-view/{id}",R.string.text_main_title,showInBottomBar = false
|
||||||
|
),
|
||||||
|
FavoriteText(
|
||||||
|
"favorite-view/{id}",R.string.text_main_title,showInBottomBar = false
|
||||||
|
);
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val bottomBarItems = listOf(
|
||||||
|
BookList,
|
||||||
|
FavoriteList,
|
||||||
|
UserInfo
|
||||||
|
)
|
||||||
|
|
||||||
|
fun getItem(route: String): Screen? {
|
||||||
|
val findRoute = route.split("/").first()
|
||||||
|
return values().find { value -> value.route.startsWith(findRoute) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,71 @@
|
|||||||
|
package com.example.shortbooks.user.composeui
|
||||||
|
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.OutlinedTextField
|
||||||
|
import androidx.compose.material3.Surface
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import com.example.shortbooks.R
|
||||||
|
import com.example.shortbooks.ui.theme.ShortBooksTheme
|
||||||
|
import com.example.shortbooks.user.model.getUser
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun UserInfo() {
|
||||||
|
val user = getUser()
|
||||||
|
Column(
|
||||||
|
Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(all = 20.dp,)
|
||||||
|
.padding(vertical = 30.dp)
|
||||||
|
) {
|
||||||
|
Text(text = "Профиль", fontSize=32.sp)
|
||||||
|
OutlinedTextField(modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(vertical = 10.dp),
|
||||||
|
value = user.name, onValueChange = {}, readOnly = true,
|
||||||
|
label = {
|
||||||
|
Text(stringResource(id = R.string.user_name))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
OutlinedTextField(modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(vertical = 10.dp),
|
||||||
|
value = user.age.toString(), onValueChange = {}, readOnly = true,
|
||||||
|
label = {
|
||||||
|
Text(stringResource(id = R.string.user_age))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
OutlinedTextField(modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(vertical = 10.dp),
|
||||||
|
value = user.email, onValueChange = {}, readOnly = true,
|
||||||
|
label = {
|
||||||
|
Text(stringResource(id = R.string.user_email))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
|
||||||
|
@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
fun UserInfoPreview() {
|
||||||
|
ShortBooksTheme {
|
||||||
|
Surface(
|
||||||
|
color = MaterialTheme.colorScheme.background
|
||||||
|
) {
|
||||||
|
UserInfo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
app/src/main/java/com/example/shortbooks/user/model/User.kt
Normal file
14
app/src/main/java/com/example/shortbooks/user/model/User.kt
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package com.example.shortbooks.user.model
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
data class User(
|
||||||
|
val email: String,
|
||||||
|
val password: String,
|
||||||
|
val name: String,
|
||||||
|
val age: Int
|
||||||
|
): Serializable
|
||||||
|
|
||||||
|
fun getUser():User{
|
||||||
|
return User("anatoliqw@gmail.com","anatol213","Анатолий", 47)
|
||||||
|
}
|
@ -1,3 +1,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">ShortBooks</string>
|
<string name="app_name">MiniBooks</string>
|
||||||
|
<string name="book_main_title">Книги</string>
|
||||||
|
<string name="text_main_title">Текст</string>
|
||||||
|
<string name="favorite_main_title">Избранное</string>
|
||||||
|
<string name="user_main_title">Профиль</string>
|
||||||
|
<string name="user_name">Имя</string>
|
||||||
|
<string name="user_email">Email</string>
|
||||||
|
<string name="user_age">Возраст</string>
|
||||||
</resources>
|
</resources>
|
Loading…
x
Reference in New Issue
Block a user