diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/AccessTokenInterceptor.kt b/core/data/src/main/kotlin/dev/meloda/fast/data/AccessTokenInterceptor.kt index 72045b83..0717d2ed 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/AccessTokenInterceptor.kt +++ b/core/data/src/main/kotlin/dev/meloda/fast/data/AccessTokenInterceptor.kt @@ -1,24 +1,18 @@ package dev.meloda.fast.data -import androidx.core.net.toUri import okhttp3.Interceptor import okhttp3.Response -import java.net.URLEncoder class AccessTokenInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { - val builder = chain.request().url.newBuilder() + val request = chain.request() + val urlBuilder = request.url.newBuilder() - val uri = builder.build().toUri().toString().toUri() - - if (uri.getQueryParameter("access_token") == null) { - builder.addQueryParameter( - "access_token", - URLEncoder.encode(UserConfig.accessToken, "utf-8") - ) + if (request.url.queryParameter("access_token") == null) { + urlBuilder.addQueryParameter("access_token", UserConfig.accessToken) } - return chain.proceed(chain.request().newBuilder().apply { url(builder.build()) }.build()) + return chain.proceed(request.newBuilder().url(urlBuilder.build()).build()) } } diff --git a/core/data/src/main/kotlin/dev/meloda/fast/data/VkMemoryCache.kt b/core/data/src/main/kotlin/dev/meloda/fast/data/VkMemoryCache.kt index dfb2f748..66a8ea4e 100644 --- a/core/data/src/main/kotlin/dev/meloda/fast/data/VkMemoryCache.kt +++ b/core/data/src/main/kotlin/dev/meloda/fast/data/VkMemoryCache.kt @@ -1,6 +1,5 @@ package dev.meloda.fast.data -import dev.meloda.fast.data.UserConfig.userId import dev.meloda.fast.model.api.domain.VkContactDomain import dev.meloda.fast.model.api.domain.VkConvo import dev.meloda.fast.model.api.domain.VkGroupDomain @@ -38,7 +37,15 @@ object VkMemoryCache { contacts.forEach { contact -> VkMemoryCache.contacts[contact.userId] = contact } } - operator fun set(userid: Long, user: VkUser) { + fun clear() { + users.clear() + groups.clear() + messages.clear() + convos.clear() + contacts.clear() + } + + operator fun set(userId: Long, user: VkUser) { users[userId] = user } diff --git a/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/ChatMaterialsViewModel.kt b/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/ChatMaterialsViewModel.kt index 2853ac75..ebc96c27 100644 --- a/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/ChatMaterialsViewModel.kt +++ b/feature/chatmaterials/src/main/kotlin/dev/meloda/fast/chatmaterials/ChatMaterialsViewModel.kt @@ -10,11 +10,11 @@ import dev.meloda.fast.chatmaterials.util.asPresentation import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.data.State +import dev.meloda.fast.data.VkUtils import dev.meloda.fast.data.processState import dev.meloda.fast.domain.MessagesUseCase import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.api.domain.VkAttachmentHistoryMessage -import dev.meloda.fast.network.VkErrorCode import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -131,40 +131,8 @@ class ChatMaterialsViewModelImpl( } private fun handleError(error: State.Error) { - when (error) { - is State.Error.ApiError -> { - when (error.errorCode) { - VkErrorCode.USER_AUTHORIZATION_FAILED -> { - baseError.setValue { BaseError.SessionExpired } - } - - else -> { - baseError.setValue { - BaseError.SimpleError(message = error.errorMessage) - } - } - } - } - - State.Error.ConnectionError -> { - baseError.setValue { - BaseError.SimpleError(message = "Connection error") - } - } - - State.Error.InternalError -> { - baseError.setValue { - BaseError.SimpleError(message = "Internal error") - } - } - - State.Error.UnknownError -> { - baseError.setValue { - BaseError.SimpleError(message = "Unknown error") - } - } - - else -> Unit + VkUtils.parseError(error)?.let { newBaseError -> + baseError.setValue { newBaseError } } } diff --git a/feature/createchat/src/main/kotlin/dev/meloda/fast/convos/CreateChatViewModel.kt b/feature/createchat/src/main/kotlin/dev/meloda/fast/convos/CreateChatViewModel.kt index 45eafea4..9404e2e2 100644 --- a/feature/createchat/src/main/kotlin/dev/meloda/fast/convos/CreateChatViewModel.kt +++ b/feature/createchat/src/main/kotlin/dev/meloda/fast/convos/CreateChatViewModel.kt @@ -10,6 +10,7 @@ import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.convos.model.CreateChatScreenState import dev.meloda.fast.data.State import dev.meloda.fast.data.UserConfig +import dev.meloda.fast.data.VkUtils import dev.meloda.fast.data.processState import dev.meloda.fast.datastore.UserSettings import dev.meloda.fast.domain.FriendsUseCase @@ -18,7 +19,6 @@ import dev.meloda.fast.domain.MessagesUseCase import dev.meloda.fast.domain.util.asPresentation import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.api.domain.VkUser -import dev.meloda.fast.network.VkErrorCode import dev.meloda.fast.ui.model.vk.UiFriend import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -228,40 +228,8 @@ class CreateChatViewModel( } private fun handleError(error: State.Error) { - when (error) { - is State.Error.ApiError -> { - when (error.errorCode) { - VkErrorCode.USER_AUTHORIZATION_FAILED -> { - _baseError.setValue { BaseError.SessionExpired } - } - - else -> { - _baseError.setValue { - BaseError.SimpleError(message = error.errorMessage) - } - } - } - } - - State.Error.ConnectionError -> { - _baseError.setValue { - BaseError.SimpleError(message = "Connection error") - } - } - - State.Error.InternalError -> { - _baseError.setValue { - BaseError.SimpleError(message = "Internal error") - } - } - - State.Error.UnknownError -> { - _baseError.setValue { - BaseError.SimpleError(message = "Unknown error") - } - } - - else -> Unit + VkUtils.parseError(error)?.let { newBaseError -> + _baseError.setValue { newBaseError } } } diff --git a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt index 03b587cb..b953f886 100644 --- a/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt +++ b/feature/friends/src/main/kotlin/dev/meloda/fast/friends/FriendsViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.data.State +import dev.meloda.fast.data.VkUtils import dev.meloda.fast.data.processState import dev.meloda.fast.datastore.UserSettings import dev.meloda.fast.domain.FriendsUseCase @@ -13,7 +14,6 @@ import dev.meloda.fast.domain.util.asPresentation import dev.meloda.fast.friends.model.FriendsScreenState import dev.meloda.fast.model.BaseError import dev.meloda.fast.model.api.domain.VkUser -import dev.meloda.fast.network.VkErrorCode import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update @@ -80,40 +80,8 @@ abstract class BaseFriendsViewModelImpl : ViewModel(), FriendsViewModel { abstract fun loadFriends(offset: Int = currentOffset.value) protected fun handleError(error: State.Error) { - when (error) { - is State.Error.ApiError -> { - when (error.errorCode) { - VkErrorCode.USER_AUTHORIZATION_FAILED -> { - baseError.setValue { BaseError.SessionExpired } - } - - else -> { - baseError.setValue { - BaseError.SimpleError(message = error.errorMessage) - } - } - } - } - - State.Error.ConnectionError -> { - baseError.setValue { - BaseError.SimpleError(message = "Connection error") - } - } - - State.Error.InternalError -> { - baseError.setValue { - BaseError.SimpleError(message = "Internal error") - } - } - - State.Error.UnknownError -> { - baseError.setValue { - BaseError.SimpleError(message = "Unknown error") - } - } - - else -> Unit + VkUtils.parseError(error)?.let { newBaseError -> + baseError.setValue { newBaseError } } } diff --git a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModelImpl.kt b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModelImpl.kt index 0293deee..c3440949 100644 --- a/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModelImpl.kt +++ b/feature/messageshistory/src/main/kotlin/dev/meloda/fast/messageshistory/MessagesHistoryViewModelImpl.kt @@ -33,6 +33,7 @@ import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.common.provider.ResourceProvider import dev.meloda.fast.data.State import dev.meloda.fast.data.UserConfig +import dev.meloda.fast.data.VkUtils import dev.meloda.fast.data.VkMemoryCache import dev.meloda.fast.data.processState import dev.meloda.fast.datastore.AppSettings @@ -58,7 +59,6 @@ import dev.meloda.fast.model.LongPollParsedEvent import dev.meloda.fast.model.api.domain.FormatDataType import dev.meloda.fast.model.api.domain.VkMessage import dev.meloda.fast.model.api.domain.VkPhotoDomain -import dev.meloda.fast.network.VkErrorCode import dev.meloda.fast.ui.R import dev.meloda.fast.ui.model.vk.MessageUiItem import kotlinx.coroutines.Dispatchers @@ -954,40 +954,8 @@ class MessagesHistoryViewModelImpl( } private fun handleError(error: State.Error) { - when (error) { - is State.Error.ApiError -> { - when (error.errorCode) { - VkErrorCode.USER_AUTHORIZATION_FAILED -> { - baseError.setValue { BaseError.SessionExpired } - } - - else -> { - baseError.setValue { - BaseError.SimpleError(message = error.errorMessage) - } - } - } - } - - State.Error.ConnectionError -> { - baseError.setValue { - BaseError.SimpleError(message = "Connection error") - } - } - - State.Error.InternalError -> { - baseError.setValue { - BaseError.SimpleError(message = "Internal error") - } - } - - State.Error.UnknownError -> { - baseError.setValue { - BaseError.SimpleError(message = "Unknown error") - } - } - - else -> Unit + VkUtils.parseError(error)?.let { newBaseError -> + baseError.setValue { newBaseError } } } diff --git a/feature/profile/src/main/kotlin/dev/meloda/fast/profile/ProfileViewModel.kt b/feature/profile/src/main/kotlin/dev/meloda/fast/profile/ProfileViewModel.kt index 24cccd5a..427b674d 100644 --- a/feature/profile/src/main/kotlin/dev/meloda/fast/profile/ProfileViewModel.kt +++ b/feature/profile/src/main/kotlin/dev/meloda/fast/profile/ProfileViewModel.kt @@ -7,11 +7,11 @@ import dev.meloda.fast.common.extensions.listenValue import dev.meloda.fast.common.extensions.setValue import dev.meloda.fast.data.State import dev.meloda.fast.data.UserConfig +import dev.meloda.fast.data.VkUtils import dev.meloda.fast.data.processState import dev.meloda.fast.domain.GetLocalUserByIdUseCase import dev.meloda.fast.domain.LoadUserByIdUseCase import dev.meloda.fast.model.BaseError -import dev.meloda.fast.network.VkErrorCode import dev.meloda.fast.profile.model.ProfileScreenState import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -38,14 +38,8 @@ class ProfileViewModelImpl( .listenValue(viewModelScope) { state -> state.processState( error = { error -> - if (error is State.Error.ApiError) { - when (error.errorCode) { - VkErrorCode.USER_AUTHORIZATION_FAILED -> { - baseError.setValue { BaseError.SessionExpired } - } - - else -> Unit - } + VkUtils.parseError(error)?.let { newBaseError -> + baseError.setValue { newBaseError } } screenState.setValue { old -> diff --git a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt index fffff35b..751c9260 100644 --- a/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt +++ b/feature/settings/src/main/kotlin/dev/meloda/fast/settings/SettingsViewModel.kt @@ -17,6 +17,7 @@ import dev.meloda.fast.common.model.LongPollState import dev.meloda.fast.common.model.UiText import dev.meloda.fast.common.model.parseString import dev.meloda.fast.data.UserConfig +import dev.meloda.fast.data.VkMemoryCache import dev.meloda.fast.data.db.AccountsRepository import dev.meloda.fast.data.processState import dev.meloda.fast.datastore.AppSettings @@ -45,7 +46,8 @@ class SettingsViewModel( private val getCurrentAccountUseCase: GetCurrentAccountUseCase, private val userSettings: UserSettings, private val resources: Resources, - private val longPollController: LongPollController + private val longPollController: LongPollController, + private val vkMemoryCache: VkMemoryCache ) : ViewModel() { private val _screenState = MutableStateFlow(SettingsScreenState.EMPTY) @@ -112,6 +114,7 @@ class SettingsViewModel( ) accountsRepository.storeAccounts(listOf(account)) + vkMemoryCache.clear() _isNeedToRestart.setValue { true } } @@ -164,6 +167,7 @@ class SettingsViewModel( ) tasks.awaitAll() + vkMemoryCache.clear() } }