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" />
</component>
<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$/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/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/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/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/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/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>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -64,34 +68,36 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"ApkExportedModule": "My_Application.app",
"ExportApk.ApkPathForMy_Application.app": "C:\\Users\\Danil\\Desktop\\MDP\\labs\\app",
"PROJECT_TRUSTED_KEY": "true",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.cidr.known.project.marker": "true",
"ToolWindowLogcat.ShowToolbar": "false",
"cidr.known.project.marker": "true",
"last_opened_file_path": "C:/Users/Danil/Downloads/test",
"project.structure.last.edited": "Modules",
"project.structure.proportion": "0.17",
"project.structure.side.proportion": "0.2",
"settings.editor.selected.configurable": "emulator"
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;ApkExportedModule&quot;: &quot;My_Application.app&quot;,
&quot;ExportApk.ApkPathForMy_Application.app&quot;: &quot;C:\\Users\\Danil\\Desktop\\MDP\\labs\\app&quot;,
&quot;PROJECT_TRUSTED_KEY&quot;: &quot;true&quot;,
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.cidr.known.project.marker&quot;: &quot;true&quot;,
&quot;ToolWindowLogcat.ShowToolbar&quot;: &quot;false&quot;,
&quot;cidr.known.project.marker&quot;: &quot;true&quot;,
&quot;com.android.tools.idea.devicemanager.tab&quot;: &quot;Physical&quot;,
&quot;last_opened_file_path&quot;: &quot;C:/Users/Danil/Desktop/Новая папка&quot;,
&quot;project.structure.last.edited&quot;: &quot;Modules&quot;,
&quot;project.structure.proportion&quot;: &quot;0.17&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;emulator&quot;
},
"keyToStringList": {
"ExportApk.BuildVariants": [
"release"
&quot;keyToStringList&quot;: {
&quot;ExportApk.BuildVariants&quot;: [
&quot;release&quot;
],
"com.android.tools.idea.sqlite.queryhistory": [
"insert into tbl_user values (1, \"Danil\", \"Markov\", \"danil@mail.ru\", \"123\", \"ADMIN\", null)",
"delete from tbl_user where userId = 6",
"delete from tbl_user where userId = 4",
"delete from tbl_user where userId = 2"
&quot;com.android.tools.idea.sqlite.queryhistory&quot;: [
&quot;delete from tbl_service&quot;,
&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;,
&quot;delete from tbl_user where userId = 6&quot;,
&quot;delete from tbl_user where userId = 4&quot;,
&quot;delete from tbl_user where userId = 2&quot;
]
}
}]]></component>
}</component>
<component name="PsdUISettings">
<option name="MODULE_TAB" value="Signing Configs" />
<option name="LAST_EDITED_SIGNING_CONFIG" value="debug" />

View File

@ -55,6 +55,9 @@ class RestServiceRepository(
}
override suspend fun delete(service: Service) {
service.serviceId?.let { this.service.deleteService(it) }
try {
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.Service
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import java.util.Date
@ -19,23 +21,32 @@ class OrderViewModel(private val orderRepository: OrderRepository, private val b
val selectedItems get() = _selectedItems
private val _total = mutableDoubleStateOf(0.00)
val total: State<Double> get() = _total
fun createOrder() = viewModelScope.launch {
val userId = GlobalUser.getInstance().getUser()?.userId!!
val order = Order(
date = Date().time,
total = getTotal(userId),
creatorUserId = userId
)
orderRepository.insert(order)
private var _orders = MutableStateFlow<List<Order>>(emptyList())
val orders: StateFlow<List<Order>> get() = _orders
fun createOrder(): Boolean {
viewModelScope.launch {
val userId = GlobalUser.getInstance().getUser()?.userId!!
val order = Order(
date = Date().time,
total = getTotal(userId),
creatorUserId = userId
)
orderRepository.insert(order)
}
return true
}
suspend fun getOrderWithServices(id: Int) : Flow<List<Service>> {
return orderRepository.getServiceFromOrder(id)
}
suspend fun getUserOrders(id: Int): Flow<List<Order>> {
return orderRepository.getUserOrders(id)
suspend fun getUserOrders(id: Int) {
viewModelScope.launch {
orderRepository.getUserOrders(id)
.collect{items ->
_orders.value = items
}
}
}
fun updateSelectedItems(items: List<Service>) {

View File

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

View File

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

View File

@ -2,13 +2,19 @@ package com.example.myapplication.composeui.List_of_Services
import SearchBar
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
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.LaunchedEffect
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.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavHostController
@ -24,29 +30,41 @@ fun ListOfServices(navController: NavHostController, serviceViewModel: ServiceVi
LaunchedEffect(serviceViewModel){
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
.fillMaxSize()
.background(BlueMain)
.padding(bottom = 60.dp)
){
SearchBar(
modifier = Modifier)
{
searchText ->
//TODO search logic
item{
SearchBar(
modifier = Modifier)
{
searchText ->
//TODO search logic
}
}
val services = serviceViewModel.serviceList.collectAsLazyPagingItems()
LazyColumn(modifier = Modifier.padding(15.dp, 0.dp)){
items(
count = services.itemCount,
key = services.itemKey { service -> service.serviceId!! }
){
items(
count = services.itemCount,
key = services.itemKey { service -> service.serviceId!! }
){
index: Int ->
val service: Service? = services[index]
if (service != null){
Service(navController, item = service)
}
val service: Service? = services[index]
if (service != null){
Service(navController, item = service)
}
}
}

View File

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

View File

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

View File

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

View File

@ -21,7 +21,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
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 fun serviceDao(): ServiceDao
abstract fun userDao(): UserDao

View File

@ -24,4 +24,6 @@ interface ServiceDao {
suspend fun getServiceById(id: Int): Service
@Query("DELETE FROM tbl_service")
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>) =
serviceDao.insert(*services.toTypedArray())
fun getAllServicesPagingSource(): PagingSource<Int, Service> = serviceDao.getAll()
suspend fun invalidateService(id: Int) = serviceDao.invalidateService(id)
}