Осталось поправить мелочи

This commit is contained in:
maxnes3 2023-12-09 10:42:23 +04:00
parent 530972ba22
commit 18d1ad1392
12 changed files with 228 additions and 20 deletions

@ -82,13 +82,14 @@ fun PasswordInputField(label: String, startValue: String? = null, onPasswordChan
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun SearchInputField(){ fun SearchInputField(onTextChanged: (String) -> Unit){
var text = remember { mutableStateOf("") } var text = remember { mutableStateOf("") }
OutlinedTextField( OutlinedTextField(
value = text.value, value = text.value,
onValueChange = { onValueChange = {
text.value = it text.value = it
onTextChanged(it)
}, },
leadingIcon = { leadingIcon = {
Icon( Icon(

@ -74,7 +74,7 @@ fun <T : Any> DataListScroll(navController: NavHostController, dataList: List<T>
items(dataList){ item -> items(dataList){ item ->
when(item){ when(item){
is Story -> StoryListItem(item = item, navController = navController) is Story -> StoryListItem(item = item, navController = navController)
is Mail -> MailListItem(item = item) is Mail -> MailListItem(item = item, navController = navController)
} }
} }
} }
@ -143,7 +143,7 @@ fun StoryListItem(item: Story, navController: NavHostController,
if (isReadOnly!!){ if (isReadOnly!!){
DataListItemButton(label = "Подробнее", backgroundColor = ButtonColor2, DataListItemButton(label = "Подробнее", backgroundColor = ButtonColor2,
textColor = Color.White, onClickAction = { textColor = Color.White, onClickAction = {
navController.navigate("viewstory/${item.id}")
}) })
} }
else{ else{
@ -193,7 +193,7 @@ fun DataListItemButton(label: String, backgroundColor: Color, textColor: Color,
} }
@Composable @Composable
fun MailListItem(item: Mail){ fun MailListItem(item: Mail, navController: NavHostController){
val isExpanded = remember { val isExpanded = remember {
mutableStateOf(false) mutableStateOf(false)
} }
@ -241,7 +241,7 @@ fun MailListItem(item: Mail){
) { ) {
DataListItemButton(label = "Подробнее", backgroundColor = ButtonColor2, DataListItemButton(label = "Подробнее", backgroundColor = ButtonColor2,
textColor = Color.White, onClickAction = { textColor = Color.White, onClickAction = {
navController.navigate("viewmail/${item.id}")
}) })
} }
} }

@ -43,9 +43,11 @@ import com.example.mobileapp.screens.EditStoryScreen
import com.example.mobileapp.screens.EditUserScreen import com.example.mobileapp.screens.EditUserScreen
import com.example.mobileapp.screens.ListMailScreen import com.example.mobileapp.screens.ListMailScreen
import com.example.mobileapp.screens.ListStoryScreen import com.example.mobileapp.screens.ListStoryScreen
import com.example.mobileapp.screens.MailViewScreen
import com.example.mobileapp.screens.MainScreen import com.example.mobileapp.screens.MainScreen
import com.example.mobileapp.screens.Registration import com.example.mobileapp.screens.Registration
import com.example.mobileapp.screens.SettingsScreen import com.example.mobileapp.screens.SettingsScreen
import com.example.mobileapp.screens.StoryViewScreen
val navBarItems = listOf( val navBarItems = listOf(
NavBarItem(route = "main", label = "Главная", icon = R.drawable.home), NavBarItem(route = "main", label = "Главная", icon = R.drawable.home),
@ -179,6 +181,26 @@ fun NavBar(navController: NavHostController) {
bottomBarState.value = false bottomBarState.value = false
EditUserScreen(navController = navController) EditUserScreen(navController = navController)
} }
composable(
"viewstory/{id}",
arguments = listOf(navArgument("id") { type = NavType.IntType }) //С аргументом
) { backStackEntry ->
backStackEntry.arguments?.let {
topBarState.value = false
bottomBarState.value = false
StoryViewScreen(navController = navController, storyId = it.getInt("id"))
}
}
composable(
"viewmail/{id}",
arguments = listOf(navArgument("id") { type = NavType.IntType }) //С аргументом
) { backStackEntry ->
backStackEntry.arguments?.let {
topBarState.value = false
bottomBarState.value = false
MailViewScreen(navController = navController, mailId = it.getInt("id"))
}
}
} }
} }
} }

@ -45,10 +45,18 @@ abstract class MobileAppDataBase : RoomDatabase() {
cover = BitmapFactory.decodeResource(appContext.resources, R.drawable.king), userId = 2)) cover = BitmapFactory.decodeResource(appContext.resources, R.drawable.king), userId = 2))
val mailDao = database.mailDao() val mailDao = database.mailDao()
for (i in 0..50){
if (i % 2 == 0){
mailDao.insert(Mail(message = "Выложил новые страницы", userId = 1)) mailDao.insert(Mail(message = "Выложил новые страницы", userId = 1))
}
else{
mailDao.insert(Mail(message = "Меня отменили в Твиттере", userId = 2)) mailDao.insert(Mail(message = "Меня отменили в Твиттере", userId = 2))
} }
} }
/*mailDao.insert(Mail(message = "Выложил новые страницы", userId = 1))
mailDao.insert(Mail(message = "Меня отменили в Твиттере", userId = 2))*/
}
}
fun getInstance(appContext: Context): MobileAppDataBase { fun getInstance(appContext: Context): MobileAppDataBase {
return INSTANCE ?: synchronized(this) { return INSTANCE ?: synchronized(this) {

@ -15,7 +15,7 @@ interface UserDao {
fun getAll(): Flow<List<User>> fun getAll(): Flow<List<User>>
@Query("select * from users where users.id = :id") @Query("select * from users where users.id = :id")
suspend fun getById(id: Int): User? fun getById(id: Int): Flow<User?>
@Query("select * from users where users.login = :login") @Query("select * from users where users.login = :login")
suspend fun getByLogin(login: String): User? suspend fun getByLogin(login: String): User?

@ -7,7 +7,7 @@ import kotlinx.coroutines.flow.Flow
class OfflineUserRepository(private val userDao: UserDao): UserRepository { class OfflineUserRepository(private val userDao: UserDao): UserRepository {
override fun getAllUsers(): Flow<List<User>> = userDao.getAll() override fun getAllUsers(): Flow<List<User>> = userDao.getAll()
override suspend fun getUser(id: Int): User? = userDao.getById(id) override fun getUser(id: Int): Flow<User?> = userDao.getById(id)
override suspend fun getUserByLogin(login: String): User? = userDao.getByLogin(login) override suspend fun getUserByLogin(login: String): User? = userDao.getByLogin(login)

@ -6,7 +6,7 @@ import kotlinx.coroutines.flow.Flow
interface UserRepository { interface UserRepository {
fun getAllUsers(): Flow<List<User>> fun getAllUsers(): Flow<List<User>>
suspend fun getUser(id: Int): User? fun getUser(id: Int): Flow<User?>
suspend fun getUserByLogin(login: String): User? suspend fun getUserByLogin(login: String): User?

@ -11,7 +11,7 @@ import kotlinx.coroutines.launch
class UserViewModel(private val userRepository: UserRepository): ViewModel() { class UserViewModel(private val userRepository: UserRepository): ViewModel() {
val getAllUsers = userRepository.getAllUsers() val getAllUsers = userRepository.getAllUsers()
suspend fun getUser(id: Int): User? = userRepository.getUser(id) fun getUser(id: Int): Flow<User?> = userRepository.getUser(id)
fun updateUser(user: User) = viewModelScope.launch { fun updateUser(user: User) = viewModelScope.launch {
if (user.login.isEmpty()){ if (user.login.isEmpty()){

@ -76,14 +76,21 @@ fun EditStoryScreen(navController: NavHostController, storyId: Int? = null,
} }
} }
storyId?.let{ LaunchedEffect(Unit) {
val story by storyViewModel.getStoryById(storyId).collectAsState(null) storyId?.let {
story?.let { storyViewModel.getStoryById(storyId).collect {
if (it != null) {
cover.value = it.cover cover.value = it.cover
}
if (it != null) {
title.value = it.title title.value = it.title
}
if (it != null) {
description.value = it.description description.value = it.description
} }
} }
}
}
Column( Column(
modifier = Modifier modifier = Modifier

@ -54,7 +54,7 @@ fun ListMailScreen(navController: NavHostController,
) { index: Int -> ) { index: Int ->
val mail: Mail? = mails[index] val mail: Mail? = mails[index]
if (mail != null) { if (mail != null) {
MailListItem(item = mail) MailListItem(item = mail, navController = navController)
} }
} }
} }

@ -12,6 +12,8 @@ import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@ -39,11 +41,16 @@ fun MainScreen(navController: NavHostController,
factory = MobileAppViewModelProvider.Factory factory = MobileAppViewModelProvider.Factory
)) { )) {
val stories = storyViewModel.getAllStories.collectAsLazyPagingItems() val stories = storyViewModel.getAllStories.collectAsLazyPagingItems()
val search = remember { mutableStateOf("") }
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
) { ) {
SearchInputField() SearchInputField(onTextChanged = {newsearch ->
search.value = newsearch
})
if (stories.itemCount > 0){ if (stories.itemCount > 0){
LazyVerticalGrid( LazyVerticalGrid(
columns = GridCells.Fixed(1) columns = GridCells.Fixed(1)
@ -53,7 +60,7 @@ fun MainScreen(navController: NavHostController,
key = stories.itemKey { item -> item.id!! } key = stories.itemKey { item -> item.id!! }
) { index: Int -> ) { index: Int ->
val story: Story? = stories[index] val story: Story? = stories[index]
if (story != null) { if (story != null && (search.value.isEmpty() || story.title.contains(search.value, ignoreCase = true))) {
StoryListItem(item = story, navController = navController, isReadOnly = true) StoryListItem(item = story, navController = navController, isReadOnly = true)
} }
} }

@ -0,0 +1,163 @@
package com.example.mobileapp.screens
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import androidx.compose.foundation.Image
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
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.graphics.asImageBitmap
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
import com.example.mobileapp.R
import com.example.mobileapp.components.NavigationButton
import com.example.mobileapp.database.viewmodels.MailViewModel
import com.example.mobileapp.database.viewmodels.MobileAppViewModelProvider
import com.example.mobileapp.database.viewmodels.StoryViewModel
import com.example.mobileapp.database.viewmodels.UserViewModel
import com.example.mobileapp.ui.theme.ButtonColor2
import java.text.SimpleDateFormat
import java.util.Date
val dateFormat = SimpleDateFormat("dd.MM.yyyy")
@Composable
fun StoryViewScreen(navController: NavHostController, storyId: Int,
storyViewModel: StoryViewModel = viewModel(
factory = MobileAppViewModelProvider.Factory
)) {
val context = LocalContext.current
val cover = remember { mutableStateOf<Bitmap>(BitmapFactory.decodeResource(context.resources, R.drawable.editplaceholder)) }
val title = remember { mutableStateOf("") }
val description = remember { mutableStateOf("") }
val postdate = remember { mutableStateOf<Long>(0) }
val story by storyViewModel.getStoryById(storyId).collectAsState(null)
story?.let {
cover.value = it.cover
title.value = it.title
description.value = it.description
postdate.value = it.postdate!!
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(bottom = 8.dp),
verticalArrangement = Arrangement.Center
) {
Image(
bitmap = cover.value.asImageBitmap(),
contentDescription = "cover",
contentScale = ContentScale.Crop,
modifier = Modifier
.size(512.dp)
.padding(8.dp)
.align(Alignment.CenterHorizontally))
Text(text = "Название: ${title.value}",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(8.dp))
Text(text = "Дата публикации: ${dateFormat.format(Date(postdate.value))}",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(8.dp))
Text(text = "Описание: ${description.value}",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(8.dp))
NavigationButton(navController = navController, destination = "main", label = "Назад",
backgroundColor = ButtonColor2, textColor = Color.White)
}
}
@Composable
fun MailViewScreen(navController: NavHostController, mailId: Int,
mailViewModel: MailViewModel = viewModel(
factory = MobileAppViewModelProvider.Factory
),
userViewModel: UserViewModel = viewModel(
factory = MobileAppViewModelProvider.Factory
)) {
val context = LocalContext.current
val userId = remember { mutableStateOf(0) }
val userName = remember { mutableStateOf("") }
val photo = remember { mutableStateOf<Bitmap>(BitmapFactory.decodeResource(context.resources, R.drawable.photoplaceholder)) }
val message = remember { mutableStateOf("") }
val postdate = remember { mutableStateOf<Long>(0) }
val mail by mailViewModel.getMail(mailId).collectAsState(null)
mail?.let {
userId.value = it.userId
message.value = it.message
postdate.value = it.postdate!!
val user by userViewModel.getUser(userId.value).collectAsState(null)
user?.let {data ->
photo.value = data.photo!!
userName.value = data.login
}
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(bottom = 8.dp),
verticalArrangement = Arrangement.Center
) {
Image(
bitmap = photo.value.asImageBitmap(),
contentDescription = "editplaceholder",
contentScale = ContentScale.Crop,
modifier = Modifier
.padding(8.dp)
.clip(CircleShape)
.size(384.dp)
.border(
width = 2.dp,
color = MaterialTheme.colorScheme.onPrimary,
)
.align(Alignment.CenterHorizontally))
Text(text = "Автор: ${userName.value}",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(8.dp))
Text(text = "Дата публикации: ${dateFormat.format(Date(postdate.value))}",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(8.dp))
Text(text = "Текст: ${message.value}",
fontSize = 20.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier
.padding(8.dp))
NavigationButton(navController = navController, destination = "mail", label = "Назад",
backgroundColor = ButtonColor2, textColor = Color.White)
}
}