save commmit
This commit is contained in:
parent
0996e16a84
commit
21597aebe4
74
.idea/workspace.xml
generated
74
.idea/workspace.xml
generated
@ -9,43 +9,30 @@
|
||||
<option name="autoReloadType" value="NONE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="7c94e195-a540-483e-9a1c-11797aeb1741" name="Changes" comment="feature&fix: lab4 add viewmodel, fix repos">
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/AppContainer.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/AppDataContainer.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/MainActivity.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/AppViewModelProvider.kt" afterDir="false" />
|
||||
<list default="true" id="7c94e195-a540-483e-9a1c-11797aeb1741" name="Changes" comment="feature: lab4 maybe done">
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/ServerService.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/ServiceRemoteMediator.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/repository/RestBasketRepository.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/repository/RestOrderRepository.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/repository/RestServiceRepository.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/api/repository/RestUserRepository.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/dao/RemoteKeysDao.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/repository/RemoteKeysRepository.kt" afterDir="false" />
|
||||
<change afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/RemoteKeys.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/app/build.gradle.kts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/AndroidManifest.xml" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/AndroidManifest.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/App.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/App.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/BasketItemUI.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Basket/BasketItemUI.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/List_of_Services/AddService.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/List_of_Services/AddService.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/Navbar/NavController.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Navbar/NavController.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Navbar/NavItem.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Navbar/NavItem.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/composeui/Profile/Profile.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Profile/Profile.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Profile/ProfileChange.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Profile/ProfileChange.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Profile/ProfileNotAuth.kt" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Profile/Registration.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/Profile/Registration.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/UIComponents/MyTextField.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/composeui/UIComponents/MyTextField.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/BasketDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/BasketDao.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/OrderDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/OrderDao.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/ServiceDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/ServiceDao.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/UserDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/UserDao.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/AppContainer.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/di/AppContainer.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/AppDataContainer.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/di/AppDataContainer.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/BasketDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/dao/BasketDao.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/dao/OrderDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/dao/OrderDao.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/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/dao/UserDao.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/dao/UserDao.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/model/Basket.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/Basket.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/BasketItem.kt" beforeDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/BasketService.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/BasketService.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/OrderService.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/OrderService.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/Service.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/Service.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/User.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/model/User.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/BasketRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/BasketRepository.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/ServiceRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/ServiceRepository.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/BasketRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/repository/BasketRepository.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/OrderRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/repository/OrderRepository.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/ServiceRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/repository/ServiceRepository.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/repository/UserRepository.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/database/repository/UserRepository.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/BasketViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/BasketViewModel.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/OrderViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/OrderViewModel.kt" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/ServiceViewModel.kt" beforeDir="false" afterPath="$PROJECT_DIR$/app/src/main/java/com/example/myapplication/viewmodel/ServiceViewModel.kt" afterDir="false" />
|
||||
@ -56,7 +43,7 @@
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
<option name="LAST_RESOLUTION" value="IGNORE" />
|
||||
</component>
|
||||
<component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[adb-6681ed71-4kOMN8._adb-tls-connect._tcp]" />
|
||||
<component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[C:\Users\Danil\.android\avd\Pixel_3a_API_34_extension_level_7_x86_64.avd]" />
|
||||
<component name="ExternalProjectsData">
|
||||
<projectState path="$PROJECT_DIR$">
|
||||
<ProjectState />
|
||||
@ -67,6 +54,7 @@
|
||||
<list>
|
||||
<option value="resourceFile" />
|
||||
<option value="Class" />
|
||||
<option value="Kotlin Interface" />
|
||||
<option value="Kotlin Class" />
|
||||
</list>
|
||||
</option>
|
||||
@ -79,7 +67,7 @@
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_BRANCH_BY_REPOSITORY">
|
||||
<map>
|
||||
<entry key="$PROJECT_DIR$" value="LabWork03" />
|
||||
<entry key="$PROJECT_DIR$" value="LabWork04" />
|
||||
</map>
|
||||
</option>
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
@ -133,9 +121,13 @@
|
||||
<recent name="com.example.myapplication.Navbar" />
|
||||
</key>
|
||||
<key name="MoveFile.RECENT_KEYS">
|
||||
<recent name="C:\Users\Danil\Desktop\MDP\labs\app\src\main\java\com\example\myapplication\business_logic" />
|
||||
<recent name="C:\Users\Danil\Desktop\MDP\labs\app\src\main\res\drawable" />
|
||||
<recent name="C:\Users\Danil\Desktop\MDP\labs\app\src\main\java\com\example\myapplication\UIComponents" />
|
||||
</key>
|
||||
<key name="MoveKotlinTopLevelDeclarationsDialog.RECENTS_KEY">
|
||||
<recent name="com.example.myapplication.di" />
|
||||
</key>
|
||||
</component>
|
||||
<component name="RunManager" selected="Android App.app">
|
||||
<configuration name="App" type="AndroidRunConfigurationType" factoryName="Android App" temporary="true">
|
||||
@ -342,7 +334,14 @@
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1700915139985</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="8" />
|
||||
<task id="LOCAL-00008" summary="feature: lab4 maybe done">
|
||||
<created>1702138495251</created>
|
||||
<option name="number" value="00008" />
|
||||
<option name="presentableId" value="LOCAL-00008" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1702138495251</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="9" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="Vcs.Log.Tabs.Properties">
|
||||
@ -362,7 +361,8 @@
|
||||
<MESSAGE value="feature: lab3 is done" />
|
||||
<MESSAGE value="feature: lab4 add repos" />
|
||||
<MESSAGE value="feature&fix: lab4 add viewmodel, fix repos" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="feature&fix: lab4 add viewmodel, fix repos" />
|
||||
<MESSAGE value="feature: lab4 maybe done" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="feature: lab4 maybe done" />
|
||||
</component>
|
||||
<component name="XDebuggerManager">
|
||||
<breakpoint-manager>
|
||||
|
@ -2,6 +2,7 @@ plugins {
|
||||
id("com.android.application")
|
||||
id("org.jetbrains.kotlin.android")
|
||||
id ("kotlin-kapt")
|
||||
kotlin("plugin.serialization") version "1.4.21"
|
||||
}
|
||||
|
||||
android {
|
||||
|
@ -1,6 +1,8 @@
|
||||
package com.example.myapplication
|
||||
|
||||
import android.app.Application
|
||||
import com.example.myapplication.di.AppContainer
|
||||
import com.example.myapplication.di.AppDataContainer
|
||||
|
||||
class App : Application() {
|
||||
lateinit var container: AppContainer
|
||||
|
@ -1,13 +0,0 @@
|
||||
package com.example.myapplication
|
||||
|
||||
import com.example.myapplication.repository.BasketRepository
|
||||
import com.example.myapplication.repository.OrderRepository
|
||||
import com.example.myapplication.repository.ServiceRepository
|
||||
import com.example.myapplication.repository.UserRepository
|
||||
|
||||
interface AppContainer {
|
||||
val serviceRepo: ServiceRepository
|
||||
val userRepo: UserRepository
|
||||
val orderRepo: OrderRepository
|
||||
val basketRepo: BasketRepository
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
package com.example.myapplication
|
||||
|
||||
import android.content.Context
|
||||
import com.example.myapplication.database.AppDatabase
|
||||
import com.example.myapplication.repository.BasketRepository
|
||||
import com.example.myapplication.repository.OrderRepository
|
||||
import com.example.myapplication.repository.ServiceRepository
|
||||
import com.example.myapplication.repository.UserRepository
|
||||
|
||||
class AppDataContainer(context: Context) : AppContainer {
|
||||
override val serviceRepo = ServiceRepository(AppDatabase.getInstance(context).serviceDao())
|
||||
override val userRepo = UserRepository(AppDatabase.getInstance(context).userDao())
|
||||
override val orderRepo = OrderRepository(AppDatabase.getInstance(context).orderDao())
|
||||
override val basketRepo = BasketRepository(AppDatabase.getInstance(context).basketDao())
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.example.myapplication.api
|
||||
|
||||
import okhttp3.OkHttpClient
|
||||
|
||||
interface ServerService {
|
||||
companion object {
|
||||
private const val BASE_URL = "https://localhost:8080/api/"
|
||||
|
||||
@Volatile
|
||||
private var INSTANCE: ServerService? = null
|
||||
|
||||
fun getInstance(): ServerService {
|
||||
return INSTANCE ?: synchronized(this) {
|
||||
val client = OkHttpClient.Builder()
|
||||
.build()
|
||||
return Retrofit.Builder()
|
||||
.baseUrl(BASE_URL)
|
||||
.client(client)
|
||||
.addConverterFactory(Json.asConverterFactory("application/json".toMediaType()))
|
||||
.build()
|
||||
.create(BackendService::class.java)
|
||||
.also { INSTANCE = it }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,90 @@
|
||||
package com.example.myapplication.api
|
||||
|
||||
import com.example.myapplication.database.AppDatabase
|
||||
|
||||
@OptIn(ExperimentalPagingApi::class)
|
||||
class ServiceRemoteMediator(
|
||||
private val service: ServerService,
|
||||
private val sneakerRepository: SneakerRepoImpl,
|
||||
private val database: AppDatabase,
|
||||
private val dbRemoteKeyRepository: RemoteKeysRepositoryImpl
|
||||
) : RemoteMediator<Int, Sneaker>() {
|
||||
override suspend fun initialize(): InitializeAction {
|
||||
return InitializeAction.LAUNCH_INITIAL_REFRESH
|
||||
}
|
||||
override suspend fun load(
|
||||
loadType: LoadType,
|
||||
state: PagingState<Int, Sneaker>
|
||||
): MediatorResult {
|
||||
val page = when (loadType) {
|
||||
LoadType.REFRESH -> {
|
||||
val remoteKeys = getRemoteKeyClosestToCurrentPosition(state)
|
||||
remoteKeys?.nextKey?.minus(1) ?: 1
|
||||
}
|
||||
|
||||
LoadType.PREPEND -> {
|
||||
val remoteKeys = getRemoteKeyForFirstItem(state)
|
||||
remoteKeys?.prevKey
|
||||
?: return MediatorResult.Success(endOfPaginationReached = remoteKeys != null)
|
||||
}
|
||||
|
||||
LoadType.APPEND -> {
|
||||
val remoteKeys = getRemoteKeyForLastItem(state)
|
||||
remoteKeys?.nextKey
|
||||
?: return MediatorResult.Success(endOfPaginationReached = remoteKeys != null)
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
val sneakers = service.getSneakers(page, state.config.pageSize).map { it.toSneaker() }
|
||||
val endOfPaginationReached = sneakers.isEmpty()
|
||||
database.withTransaction {
|
||||
if (loadType == LoadType.REFRESH) {
|
||||
dbRemoteKeyRepository.deleteRemoteKey(RemoteKeyType.SNEAKER)
|
||||
sneakerRepository.clearSneakers()
|
||||
}
|
||||
val prevKey = if (page == 1) null else page - 1
|
||||
val nextKey = if (endOfPaginationReached) null else page + 1
|
||||
val keys = sneakers.map {
|
||||
RemoteKeys(
|
||||
entityId = it.sneakerId!!,
|
||||
type = RemoteKeyType.SNEAKER,
|
||||
prevKey = prevKey,
|
||||
nextKey = nextKey
|
||||
)
|
||||
}
|
||||
dbRemoteKeyRepository.createRemoteKeys(keys)
|
||||
sneakerRepository.insertSneakers(sneakers)
|
||||
}
|
||||
return MediatorResult.Success(endOfPaginationReached = endOfPaginationReached)
|
||||
} catch (exception: IOException) {
|
||||
return MediatorResult.Error(exception)
|
||||
} catch (exception: HttpException) {
|
||||
return MediatorResult.Error(exception)
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun getRemoteKeyForLastItem(state: PagingState<Int, Sneaker>): RemoteKeys? {
|
||||
return state.pages.lastOrNull { it.data.isNotEmpty() }?.data?.lastOrNull()
|
||||
?.let { sneaker ->
|
||||
sneaker.sneakerId?.let { dbRemoteKeyRepository.getAllRemoteKeys(it, RemoteKeyType.SNEAKER) }
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun getRemoteKeyForFirstItem(state: PagingState<Int, Sneaker>): RemoteKeys? {
|
||||
return state.pages.firstOrNull { it.data.isNotEmpty() }?.data?.firstOrNull()
|
||||
?.let { sneaker ->
|
||||
sneaker.sneakerId?.let { dbRemoteKeyRepository.getAllRemoteKeys(it, RemoteKeyType.SNEAKER) }
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun getRemoteKeyClosestToCurrentPosition(
|
||||
state: PagingState<Int, Sneaker>
|
||||
): RemoteKeys? {
|
||||
return state.anchorPosition?.let { position ->
|
||||
state.closestItemToPosition(position)?.sneakerId?.let { sneakerUid ->
|
||||
dbRemoteKeyRepository.getAllRemoteKeys(sneakerUid, RemoteKeyType.SNEAKER)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package com.example.myapplication.api.repository
|
||||
|
||||
class RestBasketRepository {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package com.example.myapplication.api.repository
|
||||
|
||||
class RestOrderRepository {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package com.example.myapplication.api.repository
|
||||
|
||||
class RestServiceRepository {
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.example.myapplication.api.repository
|
||||
|
||||
import com.example.myapplication.api.ServerService
|
||||
import com.example.myapplication.model.User
|
||||
import com.example.myapplication.database.repository.UserRepository
|
||||
|
||||
class RestUserRepository(
|
||||
private var server: ServerService
|
||||
): UserRepository {
|
||||
override suspend fun createUser(user: User){
|
||||
server.SignUp(user.toUserRemote())
|
||||
}
|
||||
}
|
@ -5,14 +5,15 @@ import androidx.room.Database
|
||||
import androidx.room.Room
|
||||
import androidx.room.RoomDatabase
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
import com.example.myapplication.dao.BasketDao
|
||||
import com.example.myapplication.dao.OrderDao
|
||||
import com.example.myapplication.dao.ServiceDao
|
||||
import com.example.myapplication.dao.UserDao
|
||||
import com.example.myapplication.database.dao.BasketDao
|
||||
import com.example.myapplication.database.dao.OrderDao
|
||||
import com.example.myapplication.database.dao.ServiceDao
|
||||
import com.example.myapplication.database.dao.UserDao
|
||||
import com.example.myapplication.model.Basket
|
||||
import com.example.myapplication.model.BasketService
|
||||
import com.example.myapplication.model.Order
|
||||
import com.example.myapplication.model.OrderService
|
||||
import com.example.myapplication.model.RemoteKeys
|
||||
import com.example.myapplication.model.RoleEnum
|
||||
import com.example.myapplication.model.Service
|
||||
import com.example.myapplication.model.User
|
||||
@ -20,12 +21,13 @@ 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], version = 7)
|
||||
@Database(entities = [User::class, Service::class, Order::class, OrderService::class, Basket::class, BasketService::class, RemoteKeys::class], version = 8)
|
||||
abstract class AppDatabase : RoomDatabase(){
|
||||
abstract fun serviceDao(): ServiceDao
|
||||
abstract fun userDao(): UserDao
|
||||
abstract fun orderDao(): OrderDao
|
||||
abstract fun basketDao(): BasketDao
|
||||
abstract fun remoteKeysDao(): RemoteKeysDao
|
||||
|
||||
companion object {
|
||||
private const val DB_NAME: String = "my-db"
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.example.myapplication.dao
|
||||
package com.example.myapplication.database.dao
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Delete
|
@ -1,4 +1,4 @@
|
||||
package com.example.myapplication.dao
|
||||
package com.example.myapplication.database.dao
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Delete
|
@ -0,0 +1,18 @@
|
||||
package com.example.myapplication.database.dao
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import com.example.myapplication.model.RemoteKeyType
|
||||
import com.example.myapplication.model.RemoteKeys
|
||||
|
||||
@Dao
|
||||
interface RemoteKeysDao {
|
||||
@Query("SELECT * FROM remote_keys WHERE entityId = :entityId AND type = :type")
|
||||
suspend fun getRemoteKeys(entityId: Int, type: RemoteKeyType): RemoteKeys?
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
suspend fun insertAll(remoteKey: List<RemoteKeys>)
|
||||
@Query("DELETE FROM remote_keys WHERE type = :type")
|
||||
suspend fun clearRemoteKeys(type: RemoteKeyType)
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package com.example.myapplication.dao
|
||||
package com.example.myapplication.database.dao
|
||||
|
||||
import androidx.paging.PagingSource
|
||||
import androidx.room.Dao
|
@ -1,4 +1,4 @@
|
||||
package com.example.myapplication.dao
|
||||
package com.example.myapplication.database.dao
|
||||
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Delete
|
@ -1,6 +1,6 @@
|
||||
package com.example.myapplication.repository
|
||||
package com.example.myapplication.database.repository
|
||||
|
||||
import com.example.myapplication.dao.BasketDao
|
||||
import com.example.myapplication.database.dao.BasketDao
|
||||
import com.example.myapplication.model.Basket
|
||||
import com.example.myapplication.model.BasketService
|
||||
import com.example.myapplication.model.BasketWithServices
|
@ -1,6 +1,6 @@
|
||||
package com.example.myapplication.repository
|
||||
package com.example.myapplication.database.repository
|
||||
|
||||
import com.example.myapplication.dao.OrderDao
|
||||
import com.example.myapplication.database.dao.OrderDao
|
||||
import com.example.myapplication.model.Order
|
||||
import com.example.myapplication.model.OrderService
|
||||
|
@ -0,0 +1,16 @@
|
||||
package com.example.myapplication.database.repository
|
||||
|
||||
import com.example.myapplication.database.dao.RemoteKeysDao
|
||||
import com.example.myapplication.model.RemoteKeyType
|
||||
import com.example.myapplication.model.RemoteKeys
|
||||
|
||||
class RemoteKeysRepositoryImpl(private val remoteKeysDao: RemoteKeysDao) {
|
||||
suspend fun getAllRemoteKeys(id: Int, type: RemoteKeyType) =
|
||||
remoteKeysDao.getRemoteKeys(id, type)
|
||||
|
||||
suspend fun createRemoteKeys(remoteKeys: List<RemoteKeys>) =
|
||||
remoteKeysDao.insertAll(remoteKeys)
|
||||
|
||||
suspend fun deleteRemoteKey(type: RemoteKeyType) =
|
||||
remoteKeysDao.clearRemoteKeys(type)
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package com.example.myapplication.repository
|
||||
package com.example.myapplication.database.repository
|
||||
|
||||
import androidx.paging.Pager
|
||||
import androidx.paging.PagingConfig
|
||||
import androidx.paging.PagingData
|
||||
import com.example.myapplication.dao.ServiceDao
|
||||
import com.example.myapplication.database.dao.ServiceDao
|
||||
import com.example.myapplication.model.Service
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.example.myapplication.repository
|
||||
package com.example.myapplication.database.repository
|
||||
|
||||
import com.example.myapplication.dao.UserDao
|
||||
import com.example.myapplication.database.dao.UserDao
|
||||
import com.example.myapplication.model.User
|
||||
|
||||
class UserRepository(private val userDao: UserDao) {
|
@ -0,0 +1,18 @@
|
||||
package com.example.myapplication.di
|
||||
|
||||
import com.example.myapplication.database.repository.BasketRepository
|
||||
import com.example.myapplication.database.repository.OrderRepository
|
||||
import com.example.myapplication.database.repository.ServiceRepository
|
||||
import com.example.myapplication.database.repository.UserRepository
|
||||
|
||||
interface AppContainer {
|
||||
val serviceRepo: ServiceRepository
|
||||
val userRepo: UserRepository
|
||||
val orderRepo: OrderRepository
|
||||
val basketRepo: BasketRepository
|
||||
|
||||
companion object {
|
||||
const val TIMEOUT = 5000L
|
||||
const val LIMIT = 10
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.example.myapplication.di
|
||||
|
||||
import android.content.Context
|
||||
import com.example.myapplication.api.ServerService
|
||||
import com.example.myapplication.api.repository.RestBasketRepository
|
||||
import com.example.myapplication.api.repository.RestOrderRepository
|
||||
import com.example.myapplication.api.repository.RestServiceRepository
|
||||
import com.example.myapplication.api.repository.RestUserRepository
|
||||
import com.example.myapplication.database.AppDatabase
|
||||
import com.example.myapplication.database.repository.BasketRepository
|
||||
import com.example.myapplication.database.repository.OrderRepository
|
||||
import com.example.myapplication.database.repository.ServiceRepository
|
||||
import com.example.myapplication.database.repository.UserRepository
|
||||
|
||||
class AppDataContainer(context: Context) : AppContainer {
|
||||
override val serviceRepo = ServiceRepository by lazy {
|
||||
RestServiceRepository(
|
||||
ServerService.getInstance(),
|
||||
serviceRepository,
|
||||
AppDatabase.getInstance(context),
|
||||
remoteKeyRepository
|
||||
)
|
||||
}
|
||||
override val userRepo = UserRepository by lazy{
|
||||
RestUserRepository(ServerService.getInstance())
|
||||
}
|
||||
override val orderRepo = OrderRepository by lazy {
|
||||
RestOrderRepository(ServerService.getInstance())
|
||||
}
|
||||
override val basketRepo = BasketRepository by lazy{
|
||||
RestBasketRepository(ServerService.getInstance())
|
||||
}
|
||||
|
||||
private val serviceRepository: ServiceRepository by lazy {
|
||||
ServiceRepository(AppDatabase.getInstance(context).serviceDao())
|
||||
}
|
||||
private val remoteKeyRepository: RemoteKeysRepository by lazy{
|
||||
RemoteKeysRepository(AppDatabase.getInstance(context).remoteKeysDao())
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.example.myapplication.model
|
||||
|
||||
import androidx.room.Entity
|
||||
import androidx.room.PrimaryKey
|
||||
import androidx.room.TypeConverter
|
||||
import androidx.room.TypeConverters
|
||||
|
||||
enum class RemoteKeyType(private val type: String) {
|
||||
SNEAKER(Service::class.simpleName ?: "Sneaker");
|
||||
@TypeConverter
|
||||
fun toRemoteKeyType(value: String) = RemoteKeyType.values().first { it.type == value }
|
||||
@TypeConverter
|
||||
fun fromRemoteKeyType(value: RemoteKeyType) = value.type
|
||||
}
|
||||
@Entity(tableName = "remote_keys")
|
||||
data class RemoteKeys(
|
||||
@PrimaryKey val entityId: Int,
|
||||
@TypeConverters(RemoteKeyType::class)
|
||||
val type: RemoteKeyType,
|
||||
val prevKey: Int?,
|
||||
val nextKey: Int?
|
||||
)
|
@ -8,8 +8,8 @@ import com.example.myapplication.GlobalUser
|
||||
import com.example.myapplication.model.Basket
|
||||
import com.example.myapplication.model.BasketService
|
||||
import com.example.myapplication.model.BasketWithServices
|
||||
import com.example.myapplication.repository.BasketRepository
|
||||
import com.example.myapplication.repository.OrderRepository
|
||||
import com.example.myapplication.database.repository.BasketRepository
|
||||
import com.example.myapplication.database.repository.OrderRepository
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
|
@ -11,8 +11,8 @@ import com.example.myapplication.model.OrderService
|
||||
import com.example.myapplication.model.OrderWithServices
|
||||
import com.example.myapplication.model.Service
|
||||
import com.example.myapplication.model.UserWithOrder
|
||||
import com.example.myapplication.repository.BasketRepository
|
||||
import com.example.myapplication.repository.OrderRepository
|
||||
import com.example.myapplication.database.repository.BasketRepository
|
||||
import com.example.myapplication.database.repository.OrderRepository
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.Date
|
||||
|
@ -8,7 +8,7 @@ import androidx.lifecycle.viewModelScope
|
||||
import androidx.paging.cachedIn
|
||||
import com.example.myapplication.R
|
||||
import com.example.myapplication.model.Service
|
||||
import com.example.myapplication.repository.ServiceRepository
|
||||
import com.example.myapplication.database.repository.ServiceRepository
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class ServiceViewModel(private val serviceRepository: ServiceRepository): ViewModel() {
|
||||
|
@ -9,8 +9,8 @@ import com.example.myapplication.R
|
||||
import com.example.myapplication.model.Basket
|
||||
import com.example.myapplication.model.RoleEnum
|
||||
import com.example.myapplication.model.User
|
||||
import com.example.myapplication.repository.BasketRepository
|
||||
import com.example.myapplication.repository.UserRepository
|
||||
import com.example.myapplication.database.repository.BasketRepository
|
||||
import com.example.myapplication.database.repository.UserRepository
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class UserViewModel(private val userRepository: UserRepository, private val basketRepository: BasketRepository): ViewModel() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user