feature: lab5 done

This commit is contained in:
Danil Markov 2023-12-22 18:42:55 +04:00
parent 5c3621d7ec
commit 6a39009c3b
12 changed files with 116 additions and 77 deletions

64
.idea/workspace.xml generated
View File

@ -9,15 +9,19 @@
<option name="autoReloadType" value="NONE" /> <option name="autoReloadType" value="NONE" />
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="7c94e195-a540-483e-9a1c-11797aeb1741" name="Changes" comment="feature: lab5 almost done, save commit"> <list default="true" id="7c94e195-a540-483e-9a1c-11797aeb1741" name="Changes" comment="feature: lab5 main things works">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/ServerService.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/ServerService.kt" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/repository/RestServiceRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/repository/RestServiceRepository.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/repository/RestOrderRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/repository/RestOrderRepository.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/repository/OrderRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/repository/OrderRepository.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/viewmodel/BasketViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/viewmodel/BasketViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/viewmodel/OrderViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/viewmodel/OrderViewModel.kt" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/viewmodel/OrderViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/viewmodel/OrderViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/viewmodel/ServiceViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/businessLogic/viewmodel/ServiceViewModel.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Basket/Basket.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Basket/Basket.kt" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Basket/Basket.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Basket/Basket.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/List_of_Services/ListOfServices.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/List_of_Services/ListOfServices.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/List_of_Services/Service.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/List_of_Services/Service.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Orders/Orders.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Orders/Orders.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Profile/Login.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Profile/Login.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/AppDatabase.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/AppDatabase.kt" afterDir="false" /> <change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/AppDatabase.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/AppDatabase.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/dao/ServiceDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/dao/ServiceDao.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/repository/ServiceRepositoryImpl.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/repository/ServiceRepositoryImpl.kt" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -64,34 +68,36 @@
<option name="hideEmptyMiddlePackages" value="true" /> <option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" /> <option name="showLibraryContents" value="true" />
</component> </component>
<component name="PropertiesComponent"><![CDATA[{ <component name="PropertiesComponent">{
"keyToString": { &quot;keyToString&quot;: {
"ApkExportedModule": "My_Application.app", &quot;ApkExportedModule&quot;: &quot;My_Application.app&quot;,
"ExportApk.ApkPathForMy_Application.app": "C:\\Users\\Danil\\Desktop\\MDP\\labs\\app", &quot;ExportApk.ApkPathForMy_Application.app&quot;: &quot;C:\\Users\\Danil\\Desktop\\MDP\\labs\\app&quot;,
"PROJECT_TRUSTED_KEY": "true", &quot;PROJECT_TRUSTED_KEY&quot;: &quot;true&quot;,
"RunOnceActivity.OpenProjectViewOnStart": "true", &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
"RunOnceActivity.ShowReadmeOnStart": "true", &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
"RunOnceActivity.cidr.known.project.marker": "true", &quot;RunOnceActivity.cidr.known.project.marker&quot;: &quot;true&quot;,
"ToolWindowLogcat.ShowToolbar": "false", &quot;ToolWindowLogcat.ShowToolbar&quot;: &quot;false&quot;,
"cidr.known.project.marker": "true", &quot;cidr.known.project.marker&quot;: &quot;true&quot;,
"last_opened_file_path": "C:/Users/Danil/Downloads/test", &quot;com.android.tools.idea.devicemanager.tab&quot;: &quot;Physical&quot;,
"project.structure.last.edited": "Modules", &quot;last_opened_file_path&quot;: &quot;C:/Users/Danil/Desktop/Новая папка&quot;,
"project.structure.proportion": "0.17", &quot;project.structure.last.edited&quot;: &quot;Modules&quot;,
"project.structure.side.proportion": "0.2", &quot;project.structure.proportion&quot;: &quot;0.17&quot;,
"settings.editor.selected.configurable": "emulator" &quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;emulator&quot;
}, },
"keyToStringList": { &quot;keyToStringList&quot;: {
"ExportApk.BuildVariants": [ &quot;ExportApk.BuildVariants&quot;: [
"release" &quot;release&quot;
], ],
"com.android.tools.idea.sqlite.queryhistory": [ &quot;com.android.tools.idea.sqlite.queryhistory&quot;: [
"insert into tbl_user values (1, \"Danil\", \"Markov\", \"danil@mail.ru\", \"123\", \"ADMIN\", null)", &quot;delete from tbl_service&quot;,
"delete from tbl_user where userId = 6", &quot;insert into tbl_user values (1, \&quot;Danil\&quot;, \&quot;Markov\&quot;, \&quot;danil@mail.ru\&quot;, \&quot;123\&quot;, \&quot;ADMIN\&quot;, null)&quot;,
"delete from tbl_user where userId = 4", &quot;delete from tbl_user where userId = 6&quot;,
"delete from tbl_user where userId = 2" &quot;delete from tbl_user where userId = 4&quot;,
&quot;delete from tbl_user where userId = 2&quot;
] ]
} }
}]]></component> }</component>
<component name="PsdUISettings"> <component name="PsdUISettings">
<option name="MODULE_TAB" value="Signing Configs" /> <option name="MODULE_TAB" value="Signing Configs" />
<option name="LAST_EDITED_SIGNING_CONFIG" value="debug" /> <option name="LAST_EDITED_SIGNING_CONFIG" value="debug" />

View File

@ -55,6 +55,9 @@ class RestServiceRepository(
} }
override suspend fun delete(service: Service) { override suspend fun delete(service: Service) {
try {
service.serviceId?.let { this.service.deleteService(it) } service.serviceId?.let { this.service.deleteService(it) }
dbServiceRepository.invalidateService(service.serviceId!!)
}catch (ex: Exception){}
} }
} }

View File

@ -11,6 +11,8 @@ import com.example.myapplication.businessLogic.repository.OrderRepository
import com.example.myapplication.model.Order import com.example.myapplication.model.Order
import com.example.myapplication.model.Service import com.example.myapplication.model.Service
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.util.Date import java.util.Date
@ -19,8 +21,10 @@ class OrderViewModel(private val orderRepository: OrderRepository, private val b
val selectedItems get() = _selectedItems val selectedItems get() = _selectedItems
private val _total = mutableDoubleStateOf(0.00) private val _total = mutableDoubleStateOf(0.00)
val total: State<Double> get() = _total val total: State<Double> get() = _total
private var _orders = MutableStateFlow<List<Order>>(emptyList())
fun createOrder() = viewModelScope.launch { val orders: StateFlow<List<Order>> get() = _orders
fun createOrder(): Boolean {
viewModelScope.launch {
val userId = GlobalUser.getInstance().getUser()?.userId!! val userId = GlobalUser.getInstance().getUser()?.userId!!
val order = Order( val order = Order(
date = Date().time, date = Date().time,
@ -29,13 +33,20 @@ class OrderViewModel(private val orderRepository: OrderRepository, private val b
) )
orderRepository.insert(order) orderRepository.insert(order)
} }
return true
}
suspend fun getOrderWithServices(id: Int) : Flow<List<Service>> { suspend fun getOrderWithServices(id: Int) : Flow<List<Service>> {
return orderRepository.getServiceFromOrder(id) return orderRepository.getServiceFromOrder(id)
} }
suspend fun getUserOrders(id: Int): Flow<List<Order>> { suspend fun getUserOrders(id: Int) {
return orderRepository.getUserOrders(id) viewModelScope.launch {
orderRepository.getUserOrders(id)
.collect{items ->
_orders.value = items
}
}
} }
fun updateSelectedItems(items: List<Service>) { fun updateSelectedItems(items: List<Service>) {

View File

@ -34,12 +34,7 @@ class ServiceViewModel(private val serviceRepository: ServiceRepository): ViewMo
} }
fun updateService() = viewModelScope.launch { fun updateService() = viewModelScope.launch {
val service = Service( serviceRepository.update(service.value)
name = name.value,
price = price.doubleValue,
photo = R.drawable.image_service
)
serviceRepository.update(service)
} }
fun getServiceList(){ fun getServiceList(){

View File

@ -91,7 +91,7 @@ fun Basket(navController : NavHostController,
Button( Button(
onClick = { onClick = {
orderViewModel.createOrder() orderViewModel.createOrder()
navController.navigate(NavItem.Orders.route) navController.navigate(NavItem.ListOfServices.route)
}, },
modifier = Modifier modifier = Modifier
.height(60.dp) .height(60.dp)

View File

@ -2,13 +2,19 @@ package com.example.myapplication.composeui.List_of_Services
import SearchBar import SearchBar
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.TextUnitType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController import androidx.navigation.NavHostController
@ -24,20 +30,33 @@ fun ListOfServices(navController: NavHostController, serviceViewModel: ServiceVi
LaunchedEffect(serviceViewModel){ LaunchedEffect(serviceViewModel){
serviceViewModel.getServiceList() serviceViewModel.getServiceList()
} }
Column( val services = serviceViewModel.serviceList.collectAsLazyPagingItems()
Row(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 30.dp),
horizontalArrangement = Arrangement.Center
){
Text(
text = "PetMed",
style = MaterialTheme.typography.bodyMedium
.copy(Color.White, fontSize = TextUnit(16.0f, TextUnitType.Em))
)
}
LazyColumn(
modifier = Modifier modifier = Modifier
.fillMaxSize()
.background(BlueMain) .background(BlueMain)
.padding(bottom = 60.dp) .padding(bottom = 60.dp)
){ ){
item{
SearchBar( SearchBar(
modifier = Modifier) modifier = Modifier)
{ {
searchText -> searchText ->
//TODO search logic //TODO search logic
} }
val services = serviceViewModel.serviceList.collectAsLazyPagingItems() }
LazyColumn(modifier = Modifier.padding(15.dp, 0.dp)){
items( items(
count = services.itemCount, count = services.itemCount,
key = services.itemKey { service -> service.serviceId!! } key = services.itemKey { service -> service.serviceId!! }
@ -49,5 +68,4 @@ fun ListOfServices(navController: NavHostController, serviceViewModel: ServiceVi
} }
} }
} }
}
} }

View File

@ -61,7 +61,7 @@ fun Service(navController: NavHostController, item: Service, basketViewModel: Ba
} }
Box( Box(
modifier = Modifier modifier = Modifier
.padding(0.dp, 0.dp, 0.dp, 10.dp) .padding(10.dp, 0.dp, 10.dp, 10.dp)
.height(150.dp) .height(150.dp)
.shadow( .shadow(
elevation = 4.dp, elevation = 4.dp,

View File

@ -7,8 +7,8 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -17,21 +17,17 @@ import androidx.navigation.NavController
import com.example.myapplication.GlobalUser import com.example.myapplication.GlobalUser
import com.example.myapplication.businessLogic.viewmodel.AppViewModelProvider import com.example.myapplication.businessLogic.viewmodel.AppViewModelProvider
import com.example.myapplication.businessLogic.viewmodel.OrderViewModel import com.example.myapplication.businessLogic.viewmodel.OrderViewModel
import com.example.myapplication.model.Order
import com.example.myapplication.ui.theme.BlueMain import com.example.myapplication.ui.theme.BlueMain
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@Composable @Composable
fun Orders (navController: NavController, orderViewModel: OrderViewModel = viewModel(factory = AppViewModelProvider.Factory)){ fun Orders (navController: NavController, orderViewModel: OrderViewModel = viewModel(factory = AppViewModelProvider.Factory)){
val ordersList = remember { mutableStateListOf<Order>() }
val user = GlobalUser.getInstance().getUser() val user = GlobalUser.getInstance().getUser()
val ordersList by orderViewModel.orders.collectAsState()
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
orderViewModel.getUserOrders(user?.userId!!).collect { data -> orderViewModel.getUserOrders(user?.userId!!)
ordersList.clear()
ordersList.addAll(data)
}
} }
} }
LazyColumn( LazyColumn(

View File

@ -1,5 +1,7 @@
package com.example.myapplication.composeui.Profile package com.example.myapplication.composeui.Profile
import android.view.Gravity
import android.widget.Toast
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@ -24,6 +26,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.TextUnitType import androidx.compose.ui.unit.TextUnitType
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -43,6 +46,7 @@ import kotlinx.coroutines.launch
@Composable @Composable
fun Login (navController: NavController, userViewModel: UserViewModel = viewModel(factory = AppViewModelProvider.Factory), basketViewModel: BasketViewModel = viewModel(factory = AppViewModelProvider.Factory)){ fun Login (navController: NavController, userViewModel: UserViewModel = viewModel(factory = AppViewModelProvider.Factory), basketViewModel: BasketViewModel = viewModel(factory = AppViewModelProvider.Factory)){
val context = LocalContext.current
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
@ -106,6 +110,9 @@ fun Login (navController: NavController, userViewModel: UserViewModel = viewMode
userViewModel.authUser() userViewModel.authUser()
navController.navigate(NavItem.Profile.route) navController.navigate(NavItem.Profile.route)
} }
val toast = Toast.makeText(context, "message", Toast.LENGTH_SHORT)
toast.setGravity(Gravity.TOP, 0, 100)
toast.show()
}, },
modifier = Modifier modifier = Modifier
.height(60.dp) .height(60.dp)

View File

@ -21,7 +21,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@Database(entities = [User::class, Service::class, Order::class, OrderService::class, Basket::class, BasketService::class, RemoteKeys::class], version = 9) @Database(entities = [User::class, Service::class, Order::class, OrderService::class, Basket::class, BasketService::class, RemoteKeys::class], version = 10)
abstract class AppDatabase : RoomDatabase(){ abstract class AppDatabase : RoomDatabase(){
abstract fun serviceDao(): ServiceDao abstract fun serviceDao(): ServiceDao
abstract fun userDao(): UserDao abstract fun userDao(): UserDao

View File

@ -24,4 +24,6 @@ interface ServiceDao {
suspend fun getServiceById(id: Int): Service suspend fun getServiceById(id: Int): Service
@Query("DELETE FROM tbl_service") @Query("DELETE FROM tbl_service")
suspend fun deleteAll() suspend fun deleteAll()
@Query("DELETE FROM tbl_service WHERE serviceId = :id")
suspend fun invalidateService(id: Int)
} }

View File

@ -27,4 +27,5 @@ class ServiceRepositoryImpl(private val serviceDao: ServiceDao): ServiceReposito
suspend fun insertServices(services: List<Service>) = suspend fun insertServices(services: List<Service>) =
serviceDao.insert(*services.toTypedArray()) serviceDao.insert(*services.toTypedArray())
fun getAllServicesPagingSource(): PagingSource<Int, Service> = serviceDao.getAll() fun getAllServicesPagingSource(): PagingSource<Int, Service> = serviceDao.getAll()
suspend fun invalidateService(id: Int) = serviceDao.invalidateService(id)
} }