Осталось поправить мелочи
This commit is contained in:
parent
530972ba22
commit
18d1ad1392
app/src/main/java/com/example/mobileapp
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
163
app/src/main/java/com/example/mobileapp/screens/ViewScreens.kt
Normal file
163
app/src/main/java/com/example/mobileapp/screens/ViewScreens.kt
Normal file
@ -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)
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user