From ff5d449b3bfeb7b193a02ca66033b8dd352c1969 Mon Sep 17 00:00:00 2001 From: Danil Nikolaev Date: Sun, 10 Oct 2021 17:27:04 +0300 Subject: [PATCH] fix avatar on conversations screen refactoring removing unused classes --- .../kotlin/com/meloda/fast/api/VKException.kt | 6 +- .../fast/api/model/response/UsersResponse.kt | 2 - .../com/meloda/fast/api/network/VkUrls.kt | 3 + .../{datasource => auth}/AuthDataSource.kt | 4 +- .../api/network/{repo => auth}/AuthRepo.kt | 10 +- .../request => network/auth}/AuthRequest.kt | 2 +- .../response => network/auth}/AuthResponse.kt | 2 +- .../ConversationsDataSource.kt | 7 +- .../ConversationsRepo.kt | 15 +- .../conversations}/ConversationsRequest.kt | 2 +- .../conversations}/ConversationsResponse.kt | 2 +- .../{repo => longpoll}/LongPollRepo.kt | 2 +- .../MessagesDataSource.kt | 4 +- .../{repo => messages}/MessagesRepo.kt | 3 +- .../messages}/MessagesRequest.kt | 2 +- .../messages}/MessagesResponse.kt | 2 +- .../{datasource => users}/UsersDataSource.kt | 4 +- .../api/network/{repo => users}/UsersRepo.kt | 2 +- .../request => network/users}/UsersRequest.kt | 2 +- .../fast/api/network/users/UsersResponse.kt | 2 + .../com/meloda/fast/di/NetworkModule.kt | 14 +- .../fast/extensions/ContextExtensions.kt | 37 ---- .../fast/extensions/DrawableExtensions.kt | 13 -- .../com/meloda/fast/extensions/Extensions.kt | 77 -------- .../meloda/fast/extensions/FloatExtensions.kt | 11 -- .../fast/extensions/LiveDataExtensions.kt | 116 ------------ .../fast/extensions/StringExtensions.kt | 11 -- .../fast/extensions/TextViewExtensions.kt | 8 +- .../com/meloda/fast/io/BytesOutputStream.kt | 10 - .../kotlin/com/meloda/fast/io/Charsets.kt | 12 -- .../kotlin/com/meloda/fast/io/EasyStreams.kt | 174 ------------------ .../kotlin/com/meloda/fast/io/FileStreams.kt | 96 ---------- .../conversations/ConversationsFragment.kt | 46 +---- .../conversations/ConversationsViewModel.kt | 12 +- .../fast/screens/login/LoginViewModel.kt | 4 +- .../messages/MessagesHistoryViewModel.kt | 5 +- .../meloda/fast/service/LongPollService.kt | 6 +- .../kotlin/com/meloda/fast/util/ArrayUtils.kt | 59 ------ .../kotlin/com/meloda/fast/util/ColorUtils.kt | 30 --- .../kotlin/com/meloda/fast/util/ImageUtils.kt | 55 ------ .../kotlin/com/meloda/fast/util/TextUtils.kt | 15 -- .../main/kotlin/com/meloda/fast/util/Utils.kt | 49 ----- .../com/meloda/fast/widget/NoItemsView.kt | 19 +- app/src/main/res/drawable/test.png | Bin 44277 -> 0 bytes .../res/layout/fragment_conversations.xml | 50 ++--- .../main/res/menu/fragment_conversations.xml | 5 + 46 files changed, 113 insertions(+), 899 deletions(-) delete mode 100644 app/src/main/kotlin/com/meloda/fast/api/model/response/UsersResponse.kt rename app/src/main/kotlin/com/meloda/fast/api/network/{datasource => auth}/AuthDataSource.kt (62%) rename app/src/main/kotlin/com/meloda/fast/api/network/{repo => auth}/AuthRepo.kt (65%) rename app/src/main/kotlin/com/meloda/fast/api/{model/request => network/auth}/AuthRequest.kt (97%) rename app/src/main/kotlin/com/meloda/fast/api/{model/response => network/auth}/AuthResponse.kt (94%) rename app/src/main/kotlin/com/meloda/fast/api/network/{datasource => conversations}/ConversationsDataSource.kt (68%) rename app/src/main/kotlin/com/meloda/fast/api/network/{repo => conversations}/ConversationsRepo.kt (53%) rename app/src/main/kotlin/com/meloda/fast/api/{model/request => network/conversations}/ConversationsRequest.kt (94%) rename app/src/main/kotlin/com/meloda/fast/api/{model/response => network/conversations}/ConversationsResponse.kt (93%) rename app/src/main/kotlin/com/meloda/fast/api/network/{repo => longpoll}/LongPollRepo.kt (90%) rename app/src/main/kotlin/com/meloda/fast/api/network/{datasource => messages}/MessagesDataSource.kt (88%) rename app/src/main/kotlin/com/meloda/fast/api/network/{repo => messages}/MessagesRepo.kt (92%) rename app/src/main/kotlin/com/meloda/fast/api/{model/request => network/messages}/MessagesRequest.kt (98%) rename app/src/main/kotlin/com/meloda/fast/api/{model/response => network/messages}/MessagesResponse.kt (92%) rename app/src/main/kotlin/com/meloda/fast/api/network/{datasource => users}/UsersDataSource.kt (70%) rename app/src/main/kotlin/com/meloda/fast/api/network/{repo => users}/UsersRepo.kt (91%) rename app/src/main/kotlin/com/meloda/fast/api/{model/request => network/users}/UsersRequest.kt (92%) create mode 100644 app/src/main/kotlin/com/meloda/fast/api/network/users/UsersResponse.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/extensions/ContextExtensions.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/extensions/DrawableExtensions.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/extensions/Extensions.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/extensions/FloatExtensions.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/extensions/LiveDataExtensions.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/extensions/StringExtensions.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/io/BytesOutputStream.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/io/Charsets.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/io/EasyStreams.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/io/FileStreams.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/util/ArrayUtils.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/util/ColorUtils.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/util/ImageUtils.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/util/TextUtils.kt delete mode 100644 app/src/main/kotlin/com/meloda/fast/util/Utils.kt delete mode 100644 app/src/main/res/drawable/test.png diff --git a/app/src/main/kotlin/com/meloda/fast/api/VKException.kt b/app/src/main/kotlin/com/meloda/fast/api/VKException.kt index e1eb98a2..353c8520 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/VKException.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/VKException.kt @@ -8,11 +8,9 @@ open class VKException( var code: Int = -1, var description: String = "", var error: String -) : - IOException(description) { +) : IOException(description) { - var captcha: Pair? = null - var validationSid: String? = null + // TODO: 10-Oct-21 remove this var json: JSONObject? = null override fun toString(): String { diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/response/UsersResponse.kt b/app/src/main/kotlin/com/meloda/fast/api/model/response/UsersResponse.kt deleted file mode 100644 index dede65e8..00000000 --- a/app/src/main/kotlin/com/meloda/fast/api/model/response/UsersResponse.kt +++ /dev/null @@ -1,2 +0,0 @@ -package com.meloda.fast.api.model.response - diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/VkUrls.kt b/app/src/main/kotlin/com/meloda/fast/api/network/VkUrls.kt index 25f0d8fa..60f8e3dd 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/VkUrls.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/VkUrls.kt @@ -13,6 +13,9 @@ object VkUrls { object Conversations { const val Get = "$API/messages.getConversations" const val Delete = "$API/messages.deleteConversation" + const val Pin = "$API/messages.pinConversation" + const val Unpin = "$API/messages.unpinConversation" + const val ReorderPinned = "$API/messages.reorderPinnedConversations" } object Users { diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/datasource/AuthDataSource.kt b/app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthDataSource.kt similarity index 62% rename from app/src/main/kotlin/com/meloda/fast/api/network/datasource/AuthDataSource.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthDataSource.kt index 0a1f63b6..49e9daaa 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/datasource/AuthDataSource.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthDataSource.kt @@ -1,7 +1,5 @@ -package com.meloda.fast.api.network.datasource +package com.meloda.fast.api.network.auth -import com.meloda.fast.api.network.repo.AuthRepo -import com.meloda.fast.api.model.request.RequestAuthDirect import javax.inject.Inject class AuthDataSource @Inject constructor( diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/repo/AuthRepo.kt b/app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthRepo.kt similarity index 65% rename from app/src/main/kotlin/com/meloda/fast/api/network/repo/AuthRepo.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthRepo.kt index e0b72cba..26d3c859 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/repo/AuthRepo.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthRepo.kt @@ -1,10 +1,10 @@ -package com.meloda.fast.api.network.repo +package com.meloda.fast.api.network.auth -import com.meloda.fast.api.network.VkUrls -import com.meloda.fast.api.model.response.ResponseAuthDirect import com.meloda.fast.api.network.Answer -import com.meloda.fast.api.model.response.ResponseSendSms -import retrofit2.http.* +import com.meloda.fast.api.network.VkUrls +import retrofit2.http.GET +import retrofit2.http.Query +import retrofit2.http.QueryMap interface AuthRepo { diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/request/AuthRequest.kt b/app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthRequest.kt similarity index 97% rename from app/src/main/kotlin/com/meloda/fast/api/model/request/AuthRequest.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthRequest.kt index 6868f545..2226ba1b 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/model/request/AuthRequest.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthRequest.kt @@ -1,4 +1,4 @@ -package com.meloda.fast.api.model.request +package com.meloda.fast.api.network.auth import android.os.Parcelable import com.google.gson.annotations.SerializedName diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/response/AuthResponse.kt b/app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthResponse.kt similarity index 94% rename from app/src/main/kotlin/com/meloda/fast/api/model/response/AuthResponse.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthResponse.kt index 23e6c81f..2da17dee 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/model/response/AuthResponse.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/auth/AuthResponse.kt @@ -1,4 +1,4 @@ -package com.meloda.fast.api.model.response +package com.meloda.fast.api.network.auth import android.os.Parcelable import com.google.gson.annotations.SerializedName diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/datasource/ConversationsDataSource.kt b/app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsDataSource.kt similarity index 68% rename from app/src/main/kotlin/com/meloda/fast/api/network/datasource/ConversationsDataSource.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsDataSource.kt index 92ad82f7..515dd4b5 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/datasource/ConversationsDataSource.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsDataSource.kt @@ -1,9 +1,6 @@ -package com.meloda.fast.api.network.datasource +package com.meloda.fast.api.network.conversations import com.meloda.fast.api.model.VkConversation -import com.meloda.fast.api.model.request.ConversationsDeleteRequest -import com.meloda.fast.api.model.request.ConversationsGetRequest -import com.meloda.fast.api.network.repo.ConversationsRepo import com.meloda.fast.database.dao.ConversationsDao import javax.inject.Inject @@ -16,6 +13,8 @@ class ConversationsDataSource @Inject constructor( suspend fun delete(params: ConversationsDeleteRequest) = repo.delete(params.map) + + suspend fun store(conversations: List) = dao.insert(conversations) } \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/repo/ConversationsRepo.kt b/app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsRepo.kt similarity index 53% rename from app/src/main/kotlin/com/meloda/fast/api/network/repo/ConversationsRepo.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsRepo.kt index 21a29a29..1561e74d 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/repo/ConversationsRepo.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsRepo.kt @@ -1,7 +1,6 @@ -package com.meloda.fast.api.network.repo +package com.meloda.fast.api.network.conversations import com.meloda.fast.api.base.ApiResponse -import com.meloda.fast.api.model.response.ConversationsGetResponse import com.meloda.fast.api.network.Answer import com.meloda.fast.api.network.VkUrls import retrofit2.http.FieldMap @@ -18,4 +17,16 @@ interface ConversationsRepo { @POST(VkUrls.Conversations.Delete) suspend fun delete(@FieldMap params: Map): Answer> + @FormUrlEncoded + @POST(VkUrls.Conversations.Pin) + suspend fun pin(@FieldMap params: Map): Answer> + + @FormUrlEncoded + @POST(VkUrls.Conversations.Unpin) + suspend fun unpin(@FieldMap params: Map): Answer> + + @FormUrlEncoded + @POST(VkUrls.Conversations.ReorderPinned) + suspend fun reorderPinned(@FieldMap params: Map): Answer> + } \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/request/ConversationsRequest.kt b/app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsRequest.kt similarity index 94% rename from app/src/main/kotlin/com/meloda/fast/api/model/request/ConversationsRequest.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsRequest.kt index 16146454..81fdca5d 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/model/request/ConversationsRequest.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsRequest.kt @@ -1,4 +1,4 @@ -package com.meloda.fast.api.model.request +package com.meloda.fast.api.network.conversations import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/response/ConversationsResponse.kt b/app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsResponse.kt similarity index 93% rename from app/src/main/kotlin/com/meloda/fast/api/model/response/ConversationsResponse.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsResponse.kt index e3e1a821..c49d24e1 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/model/response/ConversationsResponse.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/conversations/ConversationsResponse.kt @@ -1,4 +1,4 @@ -package com.meloda.fast.api.model.response +package com.meloda.fast.api.network.conversations import android.os.Parcelable import com.google.gson.annotations.SerializedName diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/repo/LongPollRepo.kt b/app/src/main/kotlin/com/meloda/fast/api/network/longpoll/LongPollRepo.kt similarity index 90% rename from app/src/main/kotlin/com/meloda/fast/api/network/repo/LongPollRepo.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/longpoll/LongPollRepo.kt index 793f0940..997626d8 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/repo/LongPollRepo.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/longpoll/LongPollRepo.kt @@ -1,4 +1,4 @@ -package com.meloda.fast.api.network.repo +package com.meloda.fast.api.network.longpoll import com.meloda.fast.api.base.ApiResponse import com.meloda.fast.api.network.Answer diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/datasource/MessagesDataSource.kt b/app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesDataSource.kt similarity index 88% rename from app/src/main/kotlin/com/meloda/fast/api/network/datasource/MessagesDataSource.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesDataSource.kt index 8827d0ce..479a9392 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/datasource/MessagesDataSource.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesDataSource.kt @@ -1,8 +1,6 @@ -package com.meloda.fast.api.network.datasource +package com.meloda.fast.api.network.messages import com.meloda.fast.api.model.VkMessage -import com.meloda.fast.api.model.request.* -import com.meloda.fast.api.network.repo.MessagesRepo import com.meloda.fast.database.dao.MessagesDao import javax.inject.Inject diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/repo/MessagesRepo.kt b/app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesRepo.kt similarity index 92% rename from app/src/main/kotlin/com/meloda/fast/api/network/repo/MessagesRepo.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesRepo.kt index 79c96f88..4732ed19 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/repo/MessagesRepo.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesRepo.kt @@ -1,9 +1,8 @@ -package com.meloda.fast.api.network.repo +package com.meloda.fast.api.network.messages import com.meloda.fast.api.base.ApiResponse import com.meloda.fast.api.model.base.BaseVkLongPoll import com.meloda.fast.api.model.base.BaseVkMessage -import com.meloda.fast.api.model.response.MessagesGetHistoryResponse import com.meloda.fast.api.network.Answer import com.meloda.fast.api.network.VkUrls import retrofit2.http.FieldMap diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/request/MessagesRequest.kt b/app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesRequest.kt similarity index 98% rename from app/src/main/kotlin/com/meloda/fast/api/model/request/MessagesRequest.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesRequest.kt index 10d9bc94..a0e46a17 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/model/request/MessagesRequest.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesRequest.kt @@ -1,4 +1,4 @@ -package com.meloda.fast.api.model.request +package com.meloda.fast.api.network.messages import android.os.Parcelable import com.meloda.fast.api.ApiExtensions.intString diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/response/MessagesResponse.kt b/app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesResponse.kt similarity index 92% rename from app/src/main/kotlin/com/meloda/fast/api/model/response/MessagesResponse.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesResponse.kt index 9ddeeb24..1462c031 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/model/response/MessagesResponse.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/messages/MessagesResponse.kt @@ -1,4 +1,4 @@ -package com.meloda.fast.api.model.response +package com.meloda.fast.api.network.messages import android.os.Parcelable import com.meloda.fast.api.model.base.BaseVkConversation diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/datasource/UsersDataSource.kt b/app/src/main/kotlin/com/meloda/fast/api/network/users/UsersDataSource.kt similarity index 70% rename from app/src/main/kotlin/com/meloda/fast/api/network/datasource/UsersDataSource.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/users/UsersDataSource.kt index 7e9939cf..86a7b88a 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/datasource/UsersDataSource.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/users/UsersDataSource.kt @@ -1,8 +1,6 @@ -package com.meloda.fast.api.network.datasource +package com.meloda.fast.api.network.users import com.meloda.fast.api.model.VkUser -import com.meloda.fast.api.network.repo.UsersRepo -import com.meloda.fast.api.model.request.UsersGetRequest import com.meloda.fast.database.dao.UsersDao import javax.inject.Inject diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/repo/UsersRepo.kt b/app/src/main/kotlin/com/meloda/fast/api/network/users/UsersRepo.kt similarity index 91% rename from app/src/main/kotlin/com/meloda/fast/api/network/repo/UsersRepo.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/users/UsersRepo.kt index f11a408d..7db8e122 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/network/repo/UsersRepo.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/users/UsersRepo.kt @@ -1,4 +1,4 @@ -package com.meloda.fast.api.network.repo +package com.meloda.fast.api.network.users import com.meloda.fast.api.base.ApiResponse import com.meloda.fast.api.model.base.BaseVkUser diff --git a/app/src/main/kotlin/com/meloda/fast/api/model/request/UsersRequest.kt b/app/src/main/kotlin/com/meloda/fast/api/network/users/UsersRequest.kt similarity index 92% rename from app/src/main/kotlin/com/meloda/fast/api/model/request/UsersRequest.kt rename to app/src/main/kotlin/com/meloda/fast/api/network/users/UsersRequest.kt index afb9b2ab..5a88dec5 100644 --- a/app/src/main/kotlin/com/meloda/fast/api/model/request/UsersRequest.kt +++ b/app/src/main/kotlin/com/meloda/fast/api/network/users/UsersRequest.kt @@ -1,4 +1,4 @@ -package com.meloda.fast.api.model.request +package com.meloda.fast.api.network.users import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/kotlin/com/meloda/fast/api/network/users/UsersResponse.kt b/app/src/main/kotlin/com/meloda/fast/api/network/users/UsersResponse.kt new file mode 100644 index 00000000..c4084e58 --- /dev/null +++ b/app/src/main/kotlin/com/meloda/fast/api/network/users/UsersResponse.kt @@ -0,0 +1,2 @@ +package com.meloda.fast.api.network.users + diff --git a/app/src/main/kotlin/com/meloda/fast/di/NetworkModule.kt b/app/src/main/kotlin/com/meloda/fast/di/NetworkModule.kt index 3ebaa503..989d3402 100644 --- a/app/src/main/kotlin/com/meloda/fast/di/NetworkModule.kt +++ b/app/src/main/kotlin/com/meloda/fast/di/NetworkModule.kt @@ -4,11 +4,15 @@ import com.google.gson.Gson import com.google.gson.GsonBuilder import com.meloda.fast.api.network.AuthInterceptor import com.meloda.fast.api.network.ResultCallFactory -import com.meloda.fast.api.network.datasource.AuthDataSource -import com.meloda.fast.api.network.datasource.ConversationsDataSource -import com.meloda.fast.api.network.datasource.MessagesDataSource -import com.meloda.fast.api.network.datasource.UsersDataSource -import com.meloda.fast.api.network.repo.* +import com.meloda.fast.api.network.auth.AuthRepo +import com.meloda.fast.api.network.auth.AuthDataSource +import com.meloda.fast.api.network.conversations.ConversationsDataSource +import com.meloda.fast.api.network.conversations.ConversationsRepo +import com.meloda.fast.api.network.longpoll.LongPollRepo +import com.meloda.fast.api.network.messages.MessagesDataSource +import com.meloda.fast.api.network.users.UsersDataSource +import com.meloda.fast.api.network.messages.MessagesRepo +import com.meloda.fast.api.network.users.UsersRepo import com.meloda.fast.database.dao.ConversationsDao import com.meloda.fast.database.dao.MessagesDao import com.meloda.fast.database.dao.UsersDao diff --git a/app/src/main/kotlin/com/meloda/fast/extensions/ContextExtensions.kt b/app/src/main/kotlin/com/meloda/fast/extensions/ContextExtensions.kt deleted file mode 100644 index dcce0bf6..00000000 --- a/app/src/main/kotlin/com/meloda/fast/extensions/ContextExtensions.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.meloda.fast.extensions - -import android.content.Context -import android.graphics.Typeface -import android.graphics.drawable.Drawable -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.annotation.* -import androidx.core.content.ContextCompat -import androidx.core.content.res.ResourcesCompat - -object ContextExtensions { - - fun Context.drawable(@DrawableRes resId: Int): Drawable? { - return ContextCompat.getDrawable(this, resId) - } - - @ColorInt - fun Context.color(@ColorRes resId: Int): Int { - return ContextCompat.getColor(this, resId) - } - - fun Context.font(@FontRes resId: Int): Typeface? { - return ResourcesCompat.getFont(this, resId) - } - - fun Context.string(@StringRes resId: Int): String { - return getString(resId) - } - - fun Context.view(resId: Int, root: ViewGroup? = null, attachToRoot: Boolean = false): View { - return LayoutInflater.from(this).inflate(resId, root, attachToRoot) - } - - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/extensions/DrawableExtensions.kt b/app/src/main/kotlin/com/meloda/fast/extensions/DrawableExtensions.kt deleted file mode 100644 index 579e0442..00000000 --- a/app/src/main/kotlin/com/meloda/fast/extensions/DrawableExtensions.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.meloda.fast.extensions - -import android.graphics.drawable.Drawable -import androidx.annotation.ColorInt - -object DrawableExtensions { - - fun Drawable?.tint(@ColorInt color: Int): Drawable? { - this?.setTint(color) - return this - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/extensions/Extensions.kt b/app/src/main/kotlin/com/meloda/fast/extensions/Extensions.kt deleted file mode 100644 index 05ff43e3..00000000 --- a/app/src/main/kotlin/com/meloda/fast/extensions/Extensions.kt +++ /dev/null @@ -1,77 +0,0 @@ -package com.meloda.fast.extensions - -import android.graphics.* -import android.view.View -import androidx.core.view.isVisible -import kotlin.math.min - -fun Bitmap.borderedCircularBitmap( - borderColor: Int = 0, - borderWidth: Int = 0 -): Bitmap? { - val bitmap = Bitmap.createBitmap( - width, // width in pixels - height, // height in pixels - Bitmap.Config.ARGB_8888 - ) - - // canvas to draw circular bitmap - val canvas = Canvas(bitmap) - - // get the maximum radius - val radius = min(width / 2f, height / 2f) - - // create a path to draw circular bitmap border - val borderPath = Path().apply { - addCircle( - width / 2f, - height / 2f, - radius, - Path.Direction.CCW - ) - } - - // draw border on circular bitmap - canvas.clipPath(borderPath) - canvas.drawColor(borderColor) - - - // create a path for circular bitmap - val bitmapPath = Path().apply { - addCircle( - width / 2f, - height / 2f, - radius - borderWidth, - Path.Direction.CCW - ) - } - - canvas.clipPath(bitmapPath) - val paint = Paint().apply { - xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR) - isAntiAlias = true - } - - // clear the circular bitmap drawing area - // it will keep bitmap transparency - canvas.drawBitmap(this, 0f, 0f, paint) - - // now draw the circular bitmap - canvas.drawBitmap(this, 0f, 0f, null) - - - val diameter = (radius * 2).toInt() - val x = (width - diameter) / 2 - val y = (height - diameter) / 2 - - // return cropped circular bitmap with border - return Bitmap.createBitmap( - bitmap, // source bitmap - x, // x coordinate of the first pixel in source - y, // y coordinate of the first pixel in source - diameter, // width - diameter // height - ) -} - -val View.isNotVisible get() = !isVisible \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/extensions/FloatExtensions.kt b/app/src/main/kotlin/com/meloda/fast/extensions/FloatExtensions.kt deleted file mode 100644 index 42fdca5e..00000000 --- a/app/src/main/kotlin/com/meloda/fast/extensions/FloatExtensions.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.meloda.fast.extensions - -import kotlin.math.roundToInt - -object FloatExtensions { - - fun Float.int(): Int { - return roundToInt() - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/extensions/LiveDataExtensions.kt b/app/src/main/kotlin/com/meloda/fast/extensions/LiveDataExtensions.kt deleted file mode 100644 index 552855be..00000000 --- a/app/src/main/kotlin/com/meloda/fast/extensions/LiveDataExtensions.kt +++ /dev/null @@ -1,116 +0,0 @@ -package com.meloda.fast.extensions - -import androidx.annotation.UiThread -import androidx.lifecycle.MutableLiveData - -object LiveDataExtensions { - - operator fun MutableLiveData>.set(position: Int, v: T) { - val value = (this.value ?: arrayListOf()).apply { this[position] = v } - this.value = value - } - - operator fun MutableLiveData>.get(position: Int): T { - return (value as MutableList)[position] - } - - @JvmOverloads - fun MutableLiveData>.add(v: T, position: Int = -1) { - val value = (this.value ?: arrayListOf()).apply { - if (position == -1) this.add(v) else this.add(position, v) - } - - this.value = value - } - - @JvmOverloads - fun MutableLiveData>.addAll(values: List, position: Int = -1) { - val value = (this.value ?: arrayListOf()).apply { - if (position == -1) this.addAll(values) - else this.addAll(position, values) - } - - this.value = value - } - - @Suppress("TYPE_INFERENCE_ONLY_INPUT_TYPES_WARNING") - fun MutableLiveData>.removeAll(values: List) { - val value = (this.value ?: arrayListOf()).apply { - this.removeAll(values) - } - - this.value = value - } - - fun MutableLiveData>.removeAt(index: Int) { - val value = (this.value ?: arrayListOf()).apply { - this.removeAt(index) - } - - this.value = value - } - - fun MutableLiveData>.remove(item: T) { - val value = (this.value ?: arrayListOf()).apply { - this.remove(item) - } - - this.value = value - } - - operator fun MutableLiveData>.iterator(): Iterator { - return (value as MutableList).iterator() - } - - fun MutableLiveData>.clear() { - value = arrayListOf() - } - - val MutableLiveData>.indices get() = (value as MutableList).indices - - val MutableLiveData>.size get() = (value as MutableList).size - - fun MutableLiveData>.isEmpty(): Boolean { - return (value as MutableList).isEmpty() - } - - fun MutableLiveData>.isNotEmpty(): Boolean { - return !isEmpty() - } - - fun MutableLiveData>.requireValue() = value!! - - @UiThread - operator fun MutableLiveData>.plusAssign(values: List) { - val value = (this.value ?: arrayListOf()).apply { - this.addAll(values) - } - - this.value = value - } - - operator fun MutableLiveData>.plusAssign(v: T) { - val value = (this.value ?: arrayListOf()).apply { - this.add(v) - } - - this.value = value - } - - operator fun MutableLiveData>.minusAssign(values: List) { - val value = (this.value ?: arrayListOf()).apply { - this.removeAll(values) - } - - this.value = value - } - - operator fun MutableLiveData>.minusAssign(v: T) { - val value = (this.value ?: arrayListOf()).apply { - this.remove(v) - } - - this.value = value - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/extensions/StringExtensions.kt b/app/src/main/kotlin/com/meloda/fast/extensions/StringExtensions.kt deleted file mode 100644 index 7d2bde6a..00000000 --- a/app/src/main/kotlin/com/meloda/fast/extensions/StringExtensions.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.meloda.fast.extensions - -import java.util.* - -object StringExtensions { - - fun String.lowerCase(): String { - return toLowerCase(Locale.getDefault()) - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/extensions/TextViewExtensions.kt b/app/src/main/kotlin/com/meloda/fast/extensions/TextViewExtensions.kt index 9d130722..b4a7ce18 100644 --- a/app/src/main/kotlin/com/meloda/fast/extensions/TextViewExtensions.kt +++ b/app/src/main/kotlin/com/meloda/fast/extensions/TextViewExtensions.kt @@ -1,17 +1,11 @@ package com.meloda.fast.extensions import android.widget.TextView -import com.google.android.material.textfield.TextInputLayout object TextViewExtensions { fun TextView.clear() { - text = "" + text = null } - fun TextInputLayout.clear() { - editText?.setText("") - } - - } \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/io/BytesOutputStream.kt b/app/src/main/kotlin/com/meloda/fast/io/BytesOutputStream.kt deleted file mode 100644 index 65892969..00000000 --- a/app/src/main/kotlin/com/meloda/fast/io/BytesOutputStream.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.meloda.fast.io - -import java.io.ByteArrayOutputStream - -class BytesOutputStream : ByteArrayOutputStream { - constructor() : super(8192) - constructor(size: Int) : super(size) - - val byteArray: ByteArray = buf -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/io/Charsets.kt b/app/src/main/kotlin/com/meloda/fast/io/Charsets.kt deleted file mode 100644 index d9de4363..00000000 --- a/app/src/main/kotlin/com/meloda/fast/io/Charsets.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.meloda.fast.io - -import java.nio.charset.Charset -import java.nio.charset.StandardCharsets - -object Charsets { - - val ASCII: Charset = StandardCharsets.US_ASCII - - val UTF_8: Charset = StandardCharsets.UTF_8 - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/io/EasyStreams.kt b/app/src/main/kotlin/com/meloda/fast/io/EasyStreams.kt deleted file mode 100644 index af371aa5..00000000 --- a/app/src/main/kotlin/com/meloda/fast/io/EasyStreams.kt +++ /dev/null @@ -1,174 +0,0 @@ -package com.meloda.fast.io - -import org.jetbrains.annotations.Contract -import java.io.* -import java.nio.charset.Charset -import java.util.zip.GZIPInputStream -import java.util.zip.GZIPOutputStream -import kotlin.math.max - -object EasyStreams { - - const val BUFFER_SIZE = 8192 - const val CHAR_BUFFER_SIZE = 4096 - - @JvmOverloads - @Throws(IOException::class) - fun read(from: InputStream, encoding: Charset? = Charsets.UTF_8): String { - return read(InputStreamReader(from, encoding)) - } - - @JvmStatic - @Throws(IOException::class) - fun read(from: Reader): String { - val builder = StringWriter(CHAR_BUFFER_SIZE) - return try { - copy(from, builder) - builder.toString() - } finally { - close(from) - } - } - - @JvmStatic - @Throws(IOException::class) - fun readBytes(from: InputStream): ByteArray { - val output = ByteArrayOutputStream(max(from.available(), BUFFER_SIZE)) - try { - copy(from, output) - } finally { - close(from) - } - return output.toByteArray() - } - - @Throws(IOException::class) - fun write(from: ByteArray?, to: OutputStream) { - try { - to.write(from) - to.flush() - } finally { - close(to) - } - } - - @Throws(IOException::class) - fun write(from: String?, to: OutputStream?) { - write(from, OutputStreamWriter(to, Charsets.UTF_8)) - } - - @Throws(IOException::class) - fun write(from: CharArray?, to: Writer) { - try { - to.write(from) - to.flush() - } finally { - close(to) - } - } - - @JvmStatic - @Throws(IOException::class) - fun write(from: String?, to: Writer) { - try { - to.write(from) - to.flush() - } finally { - close(to) - } - } - - @Throws(IOException::class) - fun copy(from: Reader, to: Writer): Long { - val buffer = CharArray(CHAR_BUFFER_SIZE) - var read: Int - var total: Long = 0 - while (from.read(buffer).also { read = it } != -1) { - to.write(buffer, 0, read) - total += read.toLong() - } - return total - } - - @Throws(IOException::class) - fun copy(from: InputStream, to: OutputStream): Long { - val buffer = ByteArray(BUFFER_SIZE) - var read: Int - var total: Long = 0 - while (from.read(buffer).also { read = it } != -1) { - to.write(buffer, 0, read) - total += read.toLong() - } - return total - } - - fun buffer(input: InputStream?): BufferedInputStream { - return buffer(input, BUFFER_SIZE) - } - - @Contract("null, _ -> new") - fun buffer(input: InputStream?, size: Int): BufferedInputStream { - return if (input is BufferedInputStream) input else BufferedInputStream(input, size) - } - - fun buffer(output: OutputStream?): BufferedOutputStream { - return buffer(output, BUFFER_SIZE) - } - - @Contract("null, _ -> new") - fun buffer(output: OutputStream?, size: Int): BufferedOutputStream { - return if (output is BufferedOutputStream) output else BufferedOutputStream(output, size) - } - - fun buffer(input: Reader?): BufferedReader { - return buffer(input, CHAR_BUFFER_SIZE) - } - - @Contract("null, _ -> new") - fun buffer(input: Reader?, size: Int): BufferedReader { - return if (input is BufferedReader) input else BufferedReader(input, size) - } - - fun buffer(output: Writer?): BufferedWriter { - return buffer(output, CHAR_BUFFER_SIZE) - } - - @Contract("null, _ -> new") - fun buffer(output: Writer?, size: Int): BufferedWriter { - return if (output is BufferedWriter) output else BufferedWriter(output, size) - } - - @Throws(IOException::class) - fun gzip(input: InputStream?): GZIPInputStream { - return gzip(input, BUFFER_SIZE) - } - - @Contract("null, _ -> new") - @Throws(IOException::class) - fun gzip(input: InputStream?, size: Int): GZIPInputStream { - return if (input is GZIPInputStream) input else GZIPInputStream(input, size) - } - - @Throws(IOException::class) - fun gzip(input: OutputStream?): GZIPOutputStream { - return gzip(input, BUFFER_SIZE) - } - - @Contract("null, _ -> new") - @Throws(IOException::class) - fun gzip(input: OutputStream?, size: Int): GZIPOutputStream { - return if (input is GZIPOutputStream) input else GZIPOutputStream(input, size) - } - - fun close(c: Closeable?): Boolean { - if (c != null) { - try { - c.close() - return true - } catch (e: IOException) { - e.printStackTrace() - } - } - return false - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/io/FileStreams.kt b/app/src/main/kotlin/com/meloda/fast/io/FileStreams.kt deleted file mode 100644 index f02f7e7d..00000000 --- a/app/src/main/kotlin/com/meloda/fast/io/FileStreams.kt +++ /dev/null @@ -1,96 +0,0 @@ -package com.meloda.fast.io - -import org.jetbrains.annotations.Contract -import java.io.* -import java.math.BigInteger - -object FileStreams { - - val lineSeparatorChar = lineSeparator()[0] - - const val ONE_KB = 1024 - const val ONE_MB = ONE_KB * 1024 - const val ONE_GB = ONE_MB * 1024 - const val ONE_TB = ONE_GB * 1024L - const val ONE_PB = ONE_TB * 1024L - const val ONE_EB = ONE_PB * 1024L - - val ONE_ZB: BigInteger = BigInteger.valueOf(ONE_EB).multiply(BigInteger.valueOf(1024L)) - val ONE_YB: BigInteger = ONE_ZB.multiply(BigInteger.valueOf(1024L)) - - @Throws(IOException::class) - fun read(from: File?): String { - return EasyStreams.read(reader(from)) - } - - @Throws(IOException::class) - fun write(from: String?, to: File?) { - EasyStreams.write(from, writer(to)) - } - - @Throws(IOException::class) - fun write(from: ByteArray?, to: File?) { - EasyStreams.write(from, FileOutputStream(to)) - } - - @Throws(IOException::class) - fun append(from: ByteArray?, to: File?) { - EasyStreams.write(from, FileOutputStream(to, true)) - } - - @Throws(IOException::class) - fun append(from: CharArray?, to: File?) { - EasyStreams.write(from, FileWriter(to, true)) - } - - @Throws(IOException::class) - fun append(from: CharSequence, to: File?) { - EasyStreams.write(if (from is String) from else from.toString(), FileWriter(to, true)) - } - - fun delete(dir: File) { - if (dir.isDirectory) { - val files = dir.listFiles() ?: return - for (file in files) { - delete(file) - } - } else { - dir.delete() - } - } - - fun lineSeparator(): String { - return System.lineSeparator() - } - - fun search(dir: File, name: String?): File? { - require(dir.isDirectory) { "dir can't be file." } - - val files = dir.listFiles() ?: return null - - if (files.isEmpty()) { - return null - } - - for (file in files) { - if (file.isDirectory) { - search(file, name) - } else if (file.name.contains(name!!)) { - return file - } - } - return null - } - - @Contract("_ -> new") - @Throws(FileNotFoundException::class) - fun reader(from: File?): Reader { - return InputStreamReader(FileInputStream(from), Charsets.UTF_8) - } - - @Contract("_ -> new") - @Throws(FileNotFoundException::class) - fun writer(to: File?): Writer { - return OutputStreamWriter(FileOutputStream(to), Charsets.UTF_8) - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsFragment.kt b/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsFragment.kt index 358beb6d..a0024f3f 100644 --- a/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsFragment.kt +++ b/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsFragment.kt @@ -6,7 +6,6 @@ import android.view.Gravity import android.view.View import android.viewbinding.library.fragment.viewBinding import androidx.appcompat.widget.PopupMenu -import androidx.core.content.ContextCompat import androidx.core.os.bundleOf import androidx.core.view.isVisible import androidx.core.view.updatePadding @@ -42,10 +41,6 @@ import kotlin.math.roundToInt class ConversationsFragment : BaseViewModelFragment(R.layout.fragment_conversations) { - companion object { - const val TAG = "ConversationsFragment" - } - override val viewModel: ConversationsViewModel by viewModels() private val binding: FragmentConversationsBinding by viewBinding() @@ -80,7 +75,6 @@ class ConversationsFragment : } private var isPaused = false - private var isExpanded = true override fun onPause() { super.onPause() @@ -109,46 +103,24 @@ class ConversationsFragment : binding.appBar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { _, verticalOffset -> if (isPaused) return@OnOffsetChangedListener - -// if (verticalOffset <= -100) { -// binding.avatarContainer.alpha = 0f -// return@OnOffsetChangedListener -// } - - // from 0 to -294 - // from 0 to 29 - - // if -147 - // 30 - value - - var value = 30 - (abs(verticalOffset) * 0.1).roundToInt() - - val bottomPadding = 0 -// if (verticalOffset > -150) AndroidUtils.px(30).roundToInt() -// else (30 + abs(verticalOffset) * 0.1).roundToInt() - - val endPadding = 0 -// if (verticalOffset > 30) 30 -// else (abs(verticalOffset) * 0.1).roundToInt() + val padding = AndroidUtils.px(if (verticalOffset <= -100) 10 else 30).roundToInt() binding.avatarContainer.updatePadding( - bottom = value, - right = endPadding + bottom = padding, + right = padding ) + val minusAlpha = (1 - (abs(verticalOffset) * 0.01)).toFloat() + val plusAlpha = (abs(1 + verticalOffset * 0.01) * 1.01).toFloat() - println("Fast::ConversationsFragment::onOffset verticalOffset = $verticalOffset; bottomPadding = $value; endPadding = $endPadding") + println("Fast::ConversationsFragment::onOffset minusAlpha: $minusAlpha; plusAlpha: $plusAlpha") + val alpha: Float = if (verticalOffset <= -100) plusAlpha else minusAlpha -// binding.avatarContainer.alpha = alpha + binding.avatarContainer.alpha = alpha }) - binding.toolbar.overflowIcon = ContextCompat.getDrawable(requireContext(), R.drawable.test) - - - binding.avatar.setOnClickListener { - avatarPopupMenu.show() - } + binding.avatar.setOnClickListener { avatarPopupMenu.show() } binding.avatar.setOnLongClickListener { lifecycleScope.launch { diff --git a/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsViewModel.kt b/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsViewModel.kt index f3bd08db..866d7f80 100644 --- a/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsViewModel.kt +++ b/app/src/main/kotlin/com/meloda/fast/screens/conversations/ConversationsViewModel.kt @@ -6,11 +6,11 @@ import com.meloda.fast.api.VKConstants import com.meloda.fast.api.model.VkConversation import com.meloda.fast.api.model.VkGroup import com.meloda.fast.api.model.VkUser -import com.meloda.fast.api.model.request.ConversationsDeleteRequest -import com.meloda.fast.api.model.request.ConversationsGetRequest -import com.meloda.fast.api.model.request.UsersGetRequest -import com.meloda.fast.api.network.datasource.ConversationsDataSource -import com.meloda.fast.api.network.datasource.UsersDataSource +import com.meloda.fast.api.network.conversations.ConversationsDataSource +import com.meloda.fast.api.network.conversations.ConversationsDeleteRequest +import com.meloda.fast.api.network.conversations.ConversationsGetRequest +import com.meloda.fast.api.network.users.UsersDataSource +import com.meloda.fast.api.network.users.UsersGetRequest import com.meloda.fast.base.viewmodel.BaseViewModel import com.meloda.fast.base.viewmodel.VkEvent import dagger.hilt.android.lifecycle.HiltViewModel @@ -34,7 +34,7 @@ class ConversationsViewModel @Inject constructor( count = 30, extended = true, offset = offset, - fields = "${VKConstants.USER_FIELDS},${VKConstants.GROUP_FIELDS}" + fields = "${VKConstants.ALL_FIELDS}" ) ) }, diff --git a/app/src/main/kotlin/com/meloda/fast/screens/login/LoginViewModel.kt b/app/src/main/kotlin/com/meloda/fast/screens/login/LoginViewModel.kt index 330344e9..f514ba12 100644 --- a/app/src/main/kotlin/com/meloda/fast/screens/login/LoginViewModel.kt +++ b/app/src/main/kotlin/com/meloda/fast/screens/login/LoginViewModel.kt @@ -4,8 +4,8 @@ import androidx.lifecycle.viewModelScope import com.meloda.fast.api.UserConfig import com.meloda.fast.api.VKConstants import com.meloda.fast.api.VKException -import com.meloda.fast.api.model.request.RequestAuthDirect -import com.meloda.fast.api.network.datasource.AuthDataSource +import com.meloda.fast.api.network.auth.RequestAuthDirect +import com.meloda.fast.api.network.auth.AuthDataSource import com.meloda.fast.base.viewmodel.* import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch diff --git a/app/src/main/kotlin/com/meloda/fast/screens/messages/MessagesHistoryViewModel.kt b/app/src/main/kotlin/com/meloda/fast/screens/messages/MessagesHistoryViewModel.kt index 2295ffcd..6f76f407 100644 --- a/app/src/main/kotlin/com/meloda/fast/screens/messages/MessagesHistoryViewModel.kt +++ b/app/src/main/kotlin/com/meloda/fast/screens/messages/MessagesHistoryViewModel.kt @@ -6,8 +6,7 @@ import com.meloda.fast.api.model.VkConversation import com.meloda.fast.api.model.VkGroup import com.meloda.fast.api.model.VkMessage import com.meloda.fast.api.model.VkUser -import com.meloda.fast.api.model.request.* -import com.meloda.fast.api.network.datasource.MessagesDataSource +import com.meloda.fast.api.network.messages.* import com.meloda.fast.base.viewmodel.BaseViewModel import com.meloda.fast.base.viewmodel.VkEvent import dagger.hilt.android.lifecycle.HiltViewModel @@ -28,7 +27,7 @@ class MessagesHistoryViewModel @Inject constructor( count = 30, peerId = peerId, extended = true, - fields = "${VKConstants.USER_FIELDS},${VKConstants.GROUP_FIELDS}" + fields = VKConstants.ALL_FIELDS ) ) }, diff --git a/app/src/main/kotlin/com/meloda/fast/service/LongPollService.kt b/app/src/main/kotlin/com/meloda/fast/service/LongPollService.kt index 6a99ef8c..45d9e807 100644 --- a/app/src/main/kotlin/com/meloda/fast/service/LongPollService.kt +++ b/app/src/main/kotlin/com/meloda/fast/service/LongPollService.kt @@ -1,9 +1,9 @@ package com.meloda.fast.service import android.util.Log -import com.meloda.fast.api.model.request.MessagesGetLongPollServerRequest -import com.meloda.fast.api.network.datasource.MessagesDataSource -import com.meloda.fast.api.network.repo.LongPollRepo +import com.meloda.fast.api.network.messages.MessagesGetLongPollServerRequest +import com.meloda.fast.api.network.messages.MessagesDataSource +import com.meloda.fast.api.network.longpoll.LongPollRepo import kotlinx.coroutines.* import javax.inject.Inject import kotlin.coroutines.CoroutineContext diff --git a/app/src/main/kotlin/com/meloda/fast/util/ArrayUtils.kt b/app/src/main/kotlin/com/meloda/fast/util/ArrayUtils.kt deleted file mode 100644 index de96a79d..00000000 --- a/app/src/main/kotlin/com/meloda/fast/util/ArrayUtils.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.meloda.fast.util - -import java.util.stream.Collectors - -object ArrayUtils { - - @SafeVarargs - fun asString(vararg array: T): String { - if (array.isEmpty()) { - return "" - } - - val builder = StringBuilder(array.size * 12) - builder.append(array[0]) - for (i in 1 until array.size) { - builder.append(',') - builder.append(array[i]) - } - return builder.toString() - } - - fun asString(array: IntArray): String { - if (array.isEmpty()) { - return "" - } - - val builder = StringBuilder(array.size * 12) - builder.append(array[0]) - for (i in 1 until array.size) { - builder.append(',') - builder.append(array[i]) - } - return builder.toString() - } - - fun asString(arrayList: ArrayList): String { - return ArrayList().apply { - arrayList.forEach { add(it.toString()) } - }.stream().collect(Collectors.joining(",")) - } - - fun asString(list: List): String = asString(list.asArrayList()) - - fun cut(arrayList: ArrayList, offset: Int, count: Int): ArrayList { - if (arrayList.isEmpty()) return arrayListOf() - - var lastPosition = offset + count - if (lastPosition > arrayList.size) lastPosition = arrayList.size - - return ArrayList(arrayList.subList(offset, lastPosition)) - } - - fun ByteArray?.isNullOrEmpty() = this == null || this.isEmpty() - - fun List.asArrayList(): ArrayList { - return ArrayList(this) - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/util/ColorUtils.kt b/app/src/main/kotlin/com/meloda/fast/util/ColorUtils.kt deleted file mode 100644 index 9e038147..00000000 --- a/app/src/main/kotlin/com/meloda/fast/util/ColorUtils.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.meloda.fast.util - -import android.content.Context -import android.graphics.Color -import androidx.annotation.ColorInt -import com.meloda.fast.R - -object ColorUtils { - - @ColorInt - fun getColorAccent(context: Context): Int { - return AndroidUtils.getThemeAttrColor(context, R.attr.colorAccent) - } - - @ColorInt - fun getColorPrimary(context: Context): Int { - return AndroidUtils.getThemeAttrColor(context, R.attr.colorPrimary) - } - - @JvmOverloads - fun darkenColor(color: Int, darkFactor: Float = 0.75f): Int { - var newColor = color - val hsv = FloatArray(3) - Color.colorToHSV(newColor, hsv) - hsv[2] *= darkFactor - newColor = Color.HSVToColor(hsv) - return newColor - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/util/ImageUtils.kt b/app/src/main/kotlin/com/meloda/fast/util/ImageUtils.kt deleted file mode 100644 index c1d2c056..00000000 --- a/app/src/main/kotlin/com/meloda/fast/util/ImageUtils.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.meloda.fast.util - -import android.graphics.Bitmap -import android.graphics.drawable.Drawable -import android.widget.ImageView - -object ImageUtils { - - fun loadImage(image: String, imageView: ImageView, placeholder: Drawable?) { - if (image.isEmpty()) return - -// if (imageView is SimpleDraweeView) { -// imageView.setImageURI(image) -// return -// } -// -// val picasso = Picasso.get() -// .load(image) -// .priority(Picasso.Priority.LOW) - -// if (placeholder != null) picasso.placeholder(placeholder) -// -// picasso.into(imageView) - } - - fun loadImage(image: String?, listener: OnLoadListener?) { - if (image.isNullOrEmpty()) return - -// val picasso = Picasso.get() -// .load(image) -// .priority(Picasso.Priority.LOW) -// -// val target = object : Target { -// override fun onPrepareLoad(placeHolderDrawable: Drawable?) { -// -// } -// -// override fun onBitmapFailed(e: Exception, errorDrawable: Drawable?) { -// listener?.onError(e) -// } -// -// override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) { -// listener?.onLoad(bitmap) -// } -// } - -// picasso.into(target) - } - - - interface OnLoadListener { - fun onLoad(bitmap: Bitmap) - fun onError(e: Exception) - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/util/TextUtils.kt b/app/src/main/kotlin/com/meloda/fast/util/TextUtils.kt deleted file mode 100644 index d8524e37..00000000 --- a/app/src/main/kotlin/com/meloda/fast/util/TextUtils.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.meloda.fast.util - -object TextUtils { - - fun getFirstLetterFromString(string: String): String { - for (i in string.indices) { - val char = string[i] - - if (char.isLetter()) return char.toString() - } - - return "" - } - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/util/Utils.kt b/app/src/main/kotlin/com/meloda/fast/util/Utils.kt deleted file mode 100644 index 32497083..00000000 --- a/app/src/main/kotlin/com/meloda/fast/util/Utils.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.meloda.fast.util - -import android.content.Context -import com.meloda.fast.util.ArrayUtils.isNullOrEmpty -import com.meloda.fast.R -import com.meloda.fast.io.BytesOutputStream -import java.io.ByteArrayInputStream -import java.io.IOException -import java.io.ObjectInputStream -import java.io.ObjectOutputStream - -object Utils { - - fun getLocalizedThrowable(context: Context, t: Throwable): String { - return context.getString(R.string.error, t.message.toString()) - } - - fun serialize(source: Any?): ByteArray? { - try { - val bos = BytesOutputStream() - val out = ObjectOutputStream(bos) - out.writeObject(source) - out.close() - return bos.byteArray - } catch (e: IOException) { - e.printStackTrace() - } - return null - } - - fun deserialize(source: ByteArray?): Any? { - if (source.isNullOrEmpty()) { - return null - } - - try { - val bis = ByteArrayInputStream(source) - val `in` = ObjectInputStream(bis) - val o = `in`.readObject() - `in`.close() - return o - } catch (e: Exception) { - e.printStackTrace() - } - return null - } - - -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/meloda/fast/widget/NoItemsView.kt b/app/src/main/kotlin/com/meloda/fast/widget/NoItemsView.kt index 5c1c9729..f6770643 100644 --- a/app/src/main/kotlin/com/meloda/fast/widget/NoItemsView.kt +++ b/app/src/main/kotlin/com/meloda/fast/widget/NoItemsView.kt @@ -10,12 +10,11 @@ import android.widget.TextView import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.annotation.StringRes +import androidx.appcompat.content.res.AppCompatResources import androidx.core.view.isVisible -import com.meloda.fast.extensions.ContextExtensions.drawable -import com.meloda.fast.extensions.DrawableExtensions.tint -import com.meloda.fast.extensions.FloatExtensions.int import com.meloda.fast.R import com.meloda.fast.util.AndroidUtils +import kotlin.math.roundToInt @Suppress("UNCHECKED_CAST") class NoItemsView @JvmOverloads constructor( @@ -44,7 +43,7 @@ class NoItemsView @JvmOverloads constructor( private fun create() { val a = context.obtainStyledAttributes(attrs, R.styleable.NoItemsView) - minimumWidth = AndroidUtils.px(256).int() + minimumWidth = AndroidUtils.px(256).roundToInt() minimumHeight = minimumWidth orientation = VERTICAL @@ -53,8 +52,8 @@ class NoItemsView @JvmOverloads constructor( noItemsPicture = ImageView(context) val params = imageViewParams - params.height = AndroidUtils.px(64).int() - params.width = AndroidUtils.px(64).int() + params.height = AndroidUtils.px(64).roundToInt() + params.width = AndroidUtils.px(64).roundToInt() noItemsPicture.layoutParams = params @@ -73,10 +72,10 @@ class NoItemsView @JvmOverloads constructor( noItemsTextView = TextView(context) val textParams = textViewParams - textParams.width = AndroidUtils.px(256).int() + textParams.width = AndroidUtils.px(256).roundToInt() if (noItemsDrawable != null) { - textParams.topMargin = AndroidUtils.px(8).int() + textParams.topMargin = AndroidUtils.px(8).roundToInt() } noItemsTextView.layoutParams = textParams @@ -103,7 +102,7 @@ class NoItemsView @JvmOverloads constructor( } fun setNoItemsImage(@DrawableRes resId: Int) { - setNoItemsImage(context.drawable(resId)) + setNoItemsImage(AppCompatResources.getDrawable(context, resId)) } fun setNoItemsImage(drawable: Drawable?) { @@ -111,7 +110,7 @@ class NoItemsView @JvmOverloads constructor( } fun setNoItemsImageTint(@ColorInt color: Int) { - noItemsPicture.drawable.tint(color) + noItemsPicture.drawable?.setTint(color) } fun setNoItemsText(@StringRes resId: Int) { diff --git a/app/src/main/res/drawable/test.png b/app/src/main/res/drawable/test.png deleted file mode 100644 index 6da07119a62140c0a6db945881691edd078ee472..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44277 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 t(AKHz=yu4)c4ET + android:paddingBottom="30dp" + app:layout_collapseMode="none"> - + + + + + + + + + - + + + + + + + + - + + + + + - + diff --git a/app/src/main/res/menu/fragment_conversations.xml b/app/src/main/res/menu/fragment_conversations.xml index aab207c3..e006374c 100644 --- a/app/src/main/res/menu/fragment_conversations.xml +++ b/app/src/main/res/menu/fragment_conversations.xml @@ -2,5 +2,10 @@ + + + + + \ No newline at end of file