DataSource wrapping

Some refactoring
This commit is contained in:
2021-09-10 22:50:57 +03:00
parent 9e8d9247dc
commit 465b492328
65 changed files with 534 additions and 266 deletions
@@ -1,10 +1,20 @@
package com.meloda.fast.api.network
package com.meloda.fast.api
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.meloda.fast.api.datasource.AuthDataSource
import com.meloda.fast.api.datasource.ConversationsDataSource
import com.meloda.fast.api.datasource.MessagesDataSource
import com.meloda.fast.api.datasource.UsersDataSource
import com.meloda.fast.api.network.AuthInterceptor
import com.meloda.fast.api.network.ResultCallFactory
import com.meloda.fast.api.network.repo.AuthRepo
import com.meloda.fast.api.network.repo.ConversationsRepo
import com.meloda.fast.api.network.repo.MessagesRepo
import com.meloda.fast.api.network.repo.UsersRepo
import com.meloda.fast.database.dao.ConversationsDao
import com.meloda.fast.database.dao.MessagesDao
import com.meloda.fast.database.dao.UsersDao
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@@ -67,4 +77,30 @@ class VKModules {
fun provideUsersRepo(retrofit: Retrofit): UsersRepo =
retrofit.create(UsersRepo::class.java)
@Provides
@Singleton
fun provideAuthDataSource(
repo: AuthRepo
): AuthDataSource = AuthDataSource(repo)
@Provides
@Singleton
fun provideUsersDataSource(
repo: UsersRepo,
dao: UsersDao
): UsersDataSource = UsersDataSource(repo, dao)
@Provides
@Singleton
fun provideConversationsDataSource(
repo: ConversationsRepo,
dao: ConversationsDao
): ConversationsDataSource = ConversationsDataSource(repo, dao)
@Provides
@Singleton
fun provideMessagesDataSource(
repo: MessagesRepo,
dao: MessagesDao
): MessagesDataSource = MessagesDataSource(repo, dao)
}
@@ -2,6 +2,7 @@ package com.meloda.fast.api
import androidx.annotation.WorkerThread
import com.meloda.fast.api.model.*
import com.meloda.fast.api.model.old.*
import com.meloda.fast.api.network.VKErrors
import org.json.JSONArray
import org.json.JSONObject
@@ -0,0 +1,15 @@
package com.meloda.fast.api.datasource
import com.meloda.fast.api.network.repo.AuthRepo
import com.meloda.fast.api.network.request.RequestAuthDirect
import javax.inject.Inject
class AuthDataSource @Inject constructor(
private val repo: AuthRepo
) {
suspend fun auth(params: RequestAuthDirect) = repo.auth(params.map)
suspend fun sendSms(validationSid: String) = repo.sendSms(validationSid)
}
@@ -0,0 +1,18 @@
package com.meloda.fast.api.datasource
import com.meloda.fast.api.model.VkConversation
import com.meloda.fast.api.network.repo.ConversationsRepo
import com.meloda.fast.api.network.request.ConversationsGetRequest
import com.meloda.fast.database.dao.ConversationsDao
import javax.inject.Inject
class ConversationsDataSource @Inject constructor(
private val repo: ConversationsRepo,
private val dao: ConversationsDao
) {
suspend fun getAllChats(params: ConversationsGetRequest) = repo.getAllChats(params)
suspend fun storeConversations(conversations: List<VkConversation>) = dao.insert(conversations)
}
@@ -0,0 +1,12 @@
package com.meloda.fast.api.datasource
import com.meloda.fast.api.network.repo.MessagesRepo
import com.meloda.fast.database.dao.MessagesDao
import javax.inject.Inject
class MessagesDataSource @Inject constructor(
private val repo: MessagesRepo,
private val dao: MessagesDao
) {
}
@@ -0,0 +1,18 @@
package com.meloda.fast.api.datasource
import com.meloda.fast.api.model.VkUser
import com.meloda.fast.api.network.repo.UsersRepo
import com.meloda.fast.api.network.request.UsersGetRequest
import com.meloda.fast.database.dao.UsersDao
import javax.inject.Inject
class UsersDataSource @Inject constructor(
private val repo: UsersRepo,
private val dao: UsersDao
) {
suspend fun getById(params: UsersGetRequest) = repo.getById(params.map)
suspend fun storeUsers(users: List<VkUser>) = dao.insert(users)
}
@@ -1,15 +1,9 @@
package com.meloda.fast.api.loader
import com.meloda.fast.api.model.VkUser
import com.meloda.fast.api.network.repo.UsersRepo
import com.meloda.fast.api.network.request.UsersGetRequest
import javax.inject.Inject
class UsersLoader : Loader<VkUser>() {
@Inject
lateinit var repo: UsersRepo
suspend fun load(
usersIds: List<Int>,
fields: String = ""
@@ -24,12 +18,12 @@ class UsersLoader : Loader<VkUser>() {
val usersIds: String = params["usersIds"] as String
val fields: String = params["fields"] as String
val users = repo.getById(
UsersGetRequest(
usersIds = usersIds.split(",").map { it.toInt() },
fields = fields
)
)
// val users = repo.getById(
// UsersGetRequest(
// usersIds = usersIds.split(",").map { it.toInt() },
// fields = fields
// )
// )
return emptyList()
}
@@ -1,7 +1,15 @@
package com.meloda.fast.api.model
import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey
@Entity(tableName = "conversations")
data class VkConversation(
@PrimaryKey(autoGenerate = false)
val id: Int,
val title: String?,
val lastMessage: VkMessage
)
) {
@Ignore
var lastMessage: VkMessage? = null
}
@@ -1,10 +1,19 @@
package com.meloda.fast.api.model
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "messages")
data class VkMessage(
@PrimaryKey(autoGenerate = false)
val id: Int,
val text: String?,
val isOut: Boolean,
val peerId: Int,
val fromId: Int,
val date: Int
)
) {
}
@@ -1,6 +1,11 @@
package com.meloda.fast.api.model
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "users")
data class VkUser(
@PrimaryKey(autoGenerate = false)
val id: Int,
val firstName: String,
val lastName: String
@@ -2,6 +2,8 @@ package com.meloda.fast.api.model.base
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import com.meloda.fast.api.model.VkConversation
import com.meloda.fast.api.model.VkMessage
import kotlinx.parcelize.Parcelize
@Parcelize
@@ -32,6 +34,11 @@ data class BaseVkConversation(
val chatSettings: ChatSettings?
) : Parcelable {
fun asVkConversation(lastMessage: VkMessage? = null) = VkConversation(
id = peer.id,
title = chatSettings?.title,
).apply { this.lastMessage = lastMessage }
@Parcelize
data class Peer(
val id: Int,
@@ -2,6 +2,7 @@ package com.meloda.fast.api.model.base
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import com.meloda.fast.api.model.VkMessage
import kotlinx.parcelize.Parcelize
import kotlinx.parcelize.RawValue
@@ -29,6 +30,15 @@ data class BaseVkMessage(
val geo: Geo?
) : Parcelable {
fun asVkMessage() = VkMessage(
id = id,
text = text,
isOut = out == 1,
peerId = peerId,
fromId = fromId,
date = date
)
@Parcelize
data class Geo(
val type: String,
@@ -2,6 +2,7 @@ package com.meloda.fast.api.model.base
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import com.meloda.fast.api.model.VkUser
import kotlinx.parcelize.Parcelize
@Parcelize
@@ -46,4 +47,10 @@ data class BaseVkUser(
val appId: Int?
) : Parcelable
fun asVkUser() = VkUser(
id = id,
firstName = firstName,
lastName = lastName
)
}
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONArray
import java.util.*
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
import java.io.Serializable
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONArray
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
import java.io.Serializable
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import java.util.*
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,5 +1,6 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import com.meloda.fast.api.model.old.VKAttachments
import com.meloda.fast.base.adapter.BaseItem
import java.io.Serializable
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
import java.util.*
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
import java.util.*
@@ -1,5 +1,7 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import com.meloda.fast.api.model.old.VKAttachments
import com.meloda.fast.api.model.old.VKModel
import org.json.JSONObject
class VKVideo() : VKModel() {
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONObject
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import android.util.ArrayMap
import com.meloda.fast.api.VKUtil
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model
package com.meloda.fast.api.model.old
import org.json.JSONArray
import org.json.JSONObject
@@ -3,14 +3,14 @@ package com.meloda.fast.api.network.repo
import com.meloda.fast.api.base.ApiResponse
import com.meloda.fast.api.network.Answer
import com.meloda.fast.api.network.VKUrls
import com.meloda.fast.api.network.response.ConversationsGetResponse
import com.meloda.fast.api.network.request.ConversationsGetRequest
import com.meloda.fast.api.network.response.ConversationsGetResponse
import retrofit2.http.Body
import retrofit2.http.POST
interface ConversationsRepo {
@POST(VKUrls.Conversations.get)
suspend fun getAllChats(@Body param: ConversationsGetRequest): Answer<ApiResponse<ConversationsGetResponse>>
suspend fun getAllChats(@Body params: ConversationsGetRequest): Answer<ApiResponse<ConversationsGetResponse>>
}
@@ -0,0 +1,4 @@
package com.meloda.fast.api.network.repo
interface MessagesRepo {
}
@@ -4,14 +4,12 @@ import com.meloda.fast.api.base.ApiResponse
import com.meloda.fast.api.model.base.BaseVkUser
import com.meloda.fast.api.network.Answer
import com.meloda.fast.api.network.VKUrls
import com.meloda.fast.api.network.request.UsersGetRequest
import dagger.Component
import retrofit2.http.Body
import retrofit2.http.POST
import retrofit2.http.GET
import retrofit2.http.QueryMap
interface UsersRepo {
@POST(VKUrls.Users.getById)
suspend fun getById(@Body param: UsersGetRequest): Answer<ApiResponse<List<BaseVkUser>>>
@GET(VKUrls.Users.getById)
suspend fun getById(@QueryMap params: Map<String, String>): Answer<ApiResponse<List<BaseVkUser>>>
}
@@ -1,14 +1,21 @@
package com.meloda.fast.api.network.request
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.parcelize.Parcelize
@Parcelize
data class UsersGetRequest(
@SerializedName("user_ids")
val usersIds: List<Int>,
val fields: String? = null,
@SerializedName("nom_case")
val nomCase: String? = null
) : Parcelable
) : Parcelable {
val map
get() = mutableMapOf(
"user_ids" to usersIds.joinToString { it.toString() }
).apply {
fields?.let { this["fields"] = it }
nomCase?.let { this["nom_case"] = it }
}
}
@@ -13,9 +13,11 @@ import android.os.Handler
import android.view.inputmethod.InputMethodManager
import androidx.core.content.pm.PackageInfoCompat
import androidx.preference.PreferenceManager
import androidx.room.Room
import com.meloda.fast.BuildConfig
import com.meloda.fast.R
import com.meloda.fast.database.DatabaseHelper
import com.meloda.fast.database.AppDatabase
import com.meloda.fast.database.old.DatabaseHelper
import com.meloda.fast.util.AndroidUtils
import dagger.hilt.android.HiltAndroidApp
import org.acra.ACRA
@@ -49,8 +51,10 @@ class AppGlobal : Application() {
lateinit var packageName: String
lateinit var instance: AppGlobal
lateinit var appDatabase: AppDatabase
lateinit var dbHelper: DatabaseHelper
lateinit var database: SQLiteDatabase
lateinit var oldDatabase: SQLiteDatabase
lateinit var packageManager: PackageManager
@@ -73,12 +77,18 @@ class AppGlobal : Application() {
ACRA.init(this)
}
appDatabase = Room.databaseBuilder(
this, AppDatabase::class.java, "cache"
)
.fallbackToDestructiveMigration()
.build()
preferences = PreferenceManager.getDefaultSharedPreferences(this)
handler = Handler(mainLooper)
locale = Locale.getDefault()
dbHelper = DatabaseHelper(this)
database = dbHelper.writableDatabase
oldDatabase = dbHelper.writableDatabase
val info = packageManager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES)
versionName = info.versionName
@@ -88,7 +98,6 @@ class AppGlobal : Application() {
Companion.packageName = packageName
Companion.packageManager = packageManager
screenWidth = AndroidUtils.getDisplayWidth()
screenHeight = AndroidUtils.getDisplayHeight()
@@ -0,0 +1,27 @@
package com.meloda.fast.database
import androidx.room.Database
import androidx.room.RoomDatabase
import com.meloda.fast.api.model.VkConversation
import com.meloda.fast.api.model.VkMessage
import com.meloda.fast.api.model.VkUser
import com.meloda.fast.database.dao.ConversationsDao
import com.meloda.fast.database.dao.MessagesDao
import com.meloda.fast.database.dao.UsersDao
@Database(
entities = [
VkConversation::class,
VkMessage::class,
VkUser::class
],
version = 1,
exportSchema = false
)
abstract class AppDatabase : RoomDatabase() {
abstract fun conversationsDao(): ConversationsDao
abstract fun messagesDao(): MessagesDao
abstract fun usersDao(): UsersDao
}
@@ -0,0 +1,8 @@
package com.meloda.fast.database.dao
import androidx.room.Dao
import com.meloda.fast.api.model.VkConversation
@Dao
interface ConversationsDao : KindaDao<VkConversation> {
}
@@ -0,0 +1,7 @@
package com.meloda.fast.database.dao
import androidx.room.Dao
@Dao
interface MessagesDao {
}
@@ -0,0 +1,33 @@
package com.meloda.fast.database.dao
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.meloda.fast.api.model.VkUser
@Dao
interface UsersDao : KindaDao<VkUser> {
// @Insert(onConflict = OnConflictStrategy.REPLACE)
// suspend fun insert(values: List<VkUser>)
// override suspend fun insert(values: List<VkUser>) {
// TODO("Not yet implemented")
// }
@Query("SELECT * FROM users")
suspend fun getAll(): List<VkUser>
suspend fun insert(values: Array<out VkUser>) = insert(values.toList())
}
interface KindaDao<T> {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(values: List<T>)
}
@@ -1,20 +1,20 @@
package com.meloda.fast.database
package com.meloda.fast.database.old
import android.content.ContentValues
import android.database.Cursor
import android.os.Bundle
import com.meloda.fast.common.AppGlobal.Companion.database
import com.meloda.fast.database.DatabaseUtils.TABLE_CHATS
import com.meloda.fast.database.DatabaseUtils.TABLE_FRIENDS
import com.meloda.fast.database.DatabaseUtils.TABLE_MESSAGES
import com.meloda.fast.database.DatabaseUtils.TABLE_USERS
import com.meloda.fast.database.storage.ChatsStorage
import com.meloda.fast.database.storage.GroupsStorage
import com.meloda.fast.database.storage.MessagesStorage
import com.meloda.fast.database.storage.UsersStorage
import com.meloda.fast.api.model.oldVKConversation
import com.meloda.fast.api.model.oldVKMessage
import com.meloda.fast.api.model.oldVKUser
import com.meloda.fast.common.AppGlobal.Companion.oldDatabase
import com.meloda.fast.database.old.DatabaseUtils.TABLE_CHATS
import com.meloda.fast.database.old.DatabaseUtils.TABLE_FRIENDS
import com.meloda.fast.database.old.DatabaseUtils.TABLE_MESSAGES
import com.meloda.fast.database.old.DatabaseUtils.TABLE_USERS
import com.meloda.fast.database.old.storage.ChatsStorage
import com.meloda.fast.database.old.storage.GroupsStorage
import com.meloda.fast.database.old.storage.MessagesStorage
import com.meloda.fast.database.old.storage.UsersStorage
import com.meloda.fast.api.model.old.oldVKConversation
import com.meloda.fast.api.model.old.oldVKMessage
import com.meloda.fast.api.model.old.oldVKUser
import java.util.*
object CacheStorage {
@@ -27,21 +27,21 @@ object CacheStorage {
fun selectCursor(tableName: String): Cursor {
return QueryBuilder.query()
.select("*").from(tableName)
.asCursor(database)
.asCursor(oldDatabase)
}
fun selectCursor(tableName: String, where: String): Cursor {
return QueryBuilder.query()
.select("*").from(tableName)
.where(where)
.asCursor(database)
.asCursor(oldDatabase)
}
fun selectCursor(tableName: String, columnName: String, value: Any): Cursor {
return QueryBuilder.query()
.select("*").from(tableName)
.where("$columnName=$value")
.asCursor(database)
.asCursor(oldDatabase)
}
fun selectCursor(tableName: String, columnName: String, ids: IntArray): Cursor {
@@ -67,7 +67,7 @@ object CacheStorage {
cursor.getBlob(cursor.getColumnIndexOrThrow(columnName))
fun <T> insert(tableName: String, values: ArrayList<T>) {
database.beginTransaction()
oldDatabase.beginTransaction()
val contentValues = ContentValues()
@@ -94,20 +94,20 @@ object CacheStorage {
}
}
database.insert(tableName, null, contentValues)
oldDatabase.insert(tableName, null, contentValues)
contentValues.clear()
}
database.setTransactionSuccessful()
database.endTransaction()
oldDatabase.setTransactionSuccessful()
oldDatabase.endTransaction()
}
fun delete(tableName: String, whereClause: String, vararg whereArgs: String) {
database.delete(tableName, whereClause, whereArgs)
oldDatabase.delete(tableName, whereClause, whereArgs)
}
fun delete(tableName: String) {
database.delete(tableName, null, null)
oldDatabase.delete(tableName, null, null)
}
@@ -1,4 +1,4 @@
package com.meloda.fast.database
package com.meloda.fast.database.old
import android.content.Context
import android.database.sqlite.SQLiteDatabase
@@ -1,4 +1,4 @@
package com.meloda.fast.database
package com.meloda.fast.database.old
object DatabaseKeys {
@@ -1,49 +1,49 @@
package com.meloda.fast.database
package com.meloda.fast.database.old
import com.meloda.fast.database.DatabaseKeys.ACTION
import com.meloda.fast.database.DatabaseKeys.ATTACHMENTS
import com.meloda.fast.database.DatabaseKeys.CHAT_STATE
import com.meloda.fast.database.DatabaseKeys.CONVERSATION_ID
import com.meloda.fast.database.DatabaseKeys.CONVERSATION_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.DATE
import com.meloda.fast.database.DatabaseKeys.DEACTIVATED
import com.meloda.fast.database.DatabaseKeys.EDIT_TIME
import com.meloda.fast.database.DatabaseKeys.FIRST_NAME
import com.meloda.fast.database.DatabaseKeys.FRIEND_ID
import com.meloda.fast.database.DatabaseKeys.FROM_ID
import com.meloda.fast.database.DatabaseKeys.FWD_MESSAGES
import com.meloda.fast.database.DatabaseKeys.GENDER
import com.meloda.fast.database.DatabaseKeys.GROUP_ID
import com.meloda.fast.database.DatabaseKeys.IN_READ_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.IS_ALLOWED
import com.meloda.fast.database.DatabaseKeys.IS_CLOSED
import com.meloda.fast.database.DatabaseKeys.IS_GROUP_CHANNEL
import com.meloda.fast.database.DatabaseKeys.IS_NOTIFICATIONS_DISABLED
import com.meloda.fast.database.DatabaseKeys.IS_ONLINE
import com.meloda.fast.database.DatabaseKeys.IS_ONLINE_MOBILE
import com.meloda.fast.database.DatabaseKeys.IS_OUT
import com.meloda.fast.database.DatabaseKeys.LAST_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.LAST_NAME
import com.meloda.fast.database.DatabaseKeys.LAST_SEEN
import com.meloda.fast.database.DatabaseKeys.LOCAL_ID
import com.meloda.fast.database.DatabaseKeys.MEMBERS_COUNT
import com.meloda.fast.database.DatabaseKeys.MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.NAME
import com.meloda.fast.database.DatabaseKeys.NOT_ALLOWED_REASON
import com.meloda.fast.database.DatabaseKeys.OUT_READ_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.PEER_ID
import com.meloda.fast.database.DatabaseKeys.PHOTOS
import com.meloda.fast.database.DatabaseKeys.PINNED_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.RANDOM_ID
import com.meloda.fast.database.DatabaseKeys.REPLY_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.SCREEN_NAME
import com.meloda.fast.database.DatabaseKeys.SORT_ID
import com.meloda.fast.database.DatabaseKeys.STATUS
import com.meloda.fast.database.DatabaseKeys.TEXT
import com.meloda.fast.database.DatabaseKeys.TITLE
import com.meloda.fast.database.DatabaseKeys.TYPE
import com.meloda.fast.database.DatabaseKeys.UNREAD_COUNT
import com.meloda.fast.database.DatabaseKeys.USER_ID
import com.meloda.fast.database.old.DatabaseKeys.ACTION
import com.meloda.fast.database.old.DatabaseKeys.ATTACHMENTS
import com.meloda.fast.database.old.DatabaseKeys.CHAT_STATE
import com.meloda.fast.database.old.DatabaseKeys.CONVERSATION_ID
import com.meloda.fast.database.old.DatabaseKeys.CONVERSATION_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.DATE
import com.meloda.fast.database.old.DatabaseKeys.DEACTIVATED
import com.meloda.fast.database.old.DatabaseKeys.EDIT_TIME
import com.meloda.fast.database.old.DatabaseKeys.FIRST_NAME
import com.meloda.fast.database.old.DatabaseKeys.FRIEND_ID
import com.meloda.fast.database.old.DatabaseKeys.FROM_ID
import com.meloda.fast.database.old.DatabaseKeys.FWD_MESSAGES
import com.meloda.fast.database.old.DatabaseKeys.GENDER
import com.meloda.fast.database.old.DatabaseKeys.GROUP_ID
import com.meloda.fast.database.old.DatabaseKeys.IN_READ_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.IS_ALLOWED
import com.meloda.fast.database.old.DatabaseKeys.IS_CLOSED
import com.meloda.fast.database.old.DatabaseKeys.IS_GROUP_CHANNEL
import com.meloda.fast.database.old.DatabaseKeys.IS_NOTIFICATIONS_DISABLED
import com.meloda.fast.database.old.DatabaseKeys.IS_ONLINE
import com.meloda.fast.database.old.DatabaseKeys.IS_ONLINE_MOBILE
import com.meloda.fast.database.old.DatabaseKeys.IS_OUT
import com.meloda.fast.database.old.DatabaseKeys.LAST_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.LAST_NAME
import com.meloda.fast.database.old.DatabaseKeys.LAST_SEEN
import com.meloda.fast.database.old.DatabaseKeys.LOCAL_ID
import com.meloda.fast.database.old.DatabaseKeys.MEMBERS_COUNT
import com.meloda.fast.database.old.DatabaseKeys.MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.NAME
import com.meloda.fast.database.old.DatabaseKeys.NOT_ALLOWED_REASON
import com.meloda.fast.database.old.DatabaseKeys.OUT_READ_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.PEER_ID
import com.meloda.fast.database.old.DatabaseKeys.PHOTOS
import com.meloda.fast.database.old.DatabaseKeys.PINNED_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.RANDOM_ID
import com.meloda.fast.database.old.DatabaseKeys.REPLY_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.SCREEN_NAME
import com.meloda.fast.database.old.DatabaseKeys.SORT_ID
import com.meloda.fast.database.old.DatabaseKeys.STATUS
import com.meloda.fast.database.old.DatabaseKeys.TEXT
import com.meloda.fast.database.old.DatabaseKeys.TITLE
import com.meloda.fast.database.old.DatabaseKeys.TYPE
import com.meloda.fast.database.old.DatabaseKeys.UNREAD_COUNT
import com.meloda.fast.database.old.DatabaseKeys.USER_ID
object DatabaseUtils {
@@ -1,4 +1,4 @@
package com.meloda.fast.database
package com.meloda.fast.database.old
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
@@ -1,4 +1,4 @@
package com.meloda.fast.database.base
package com.meloda.fast.database.old.base
import android.content.ContentValues
import android.database.Cursor
@@ -10,7 +10,7 @@ abstract class Storage<T> {
abstract val tag: String
protected var database = AppGlobal.database
protected var database = AppGlobal.oldDatabase
@WorkerThread
abstract fun getAllValues(): ArrayList<T>
@@ -1,31 +1,31 @@
package com.meloda.fast.database.storage
package com.meloda.fast.database.old.storage
import android.content.ContentValues
import android.database.Cursor
import android.os.Bundle
import android.util.Log
import androidx.annotation.WorkerThread
import com.meloda.fast.database.CacheStorage
import com.meloda.fast.database.CacheStorage.messagesStorage
import com.meloda.fast.database.DatabaseKeys.CHAT_STATE
import com.meloda.fast.database.DatabaseKeys.CONVERSATION_ID
import com.meloda.fast.database.DatabaseKeys.IN_READ_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.IS_ALLOWED
import com.meloda.fast.database.DatabaseKeys.IS_GROUP_CHANNEL
import com.meloda.fast.database.DatabaseKeys.IS_NOTIFICATIONS_DISABLED
import com.meloda.fast.database.DatabaseKeys.LAST_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.LOCAL_ID
import com.meloda.fast.database.DatabaseKeys.MEMBERS_COUNT
import com.meloda.fast.database.DatabaseKeys.NOT_ALLOWED_REASON
import com.meloda.fast.database.DatabaseKeys.OUT_READ_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.PHOTOS
import com.meloda.fast.database.DatabaseKeys.PINNED_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.TITLE
import com.meloda.fast.database.DatabaseKeys.TYPE
import com.meloda.fast.database.DatabaseKeys.UNREAD_COUNT
import com.meloda.fast.database.DatabaseUtils.TABLE_CHATS
import com.meloda.fast.database.base.Storage
import com.meloda.fast.api.model.oldVKConversation
import com.meloda.fast.database.old.CacheStorage
import com.meloda.fast.database.old.CacheStorage.messagesStorage
import com.meloda.fast.database.old.DatabaseKeys.CHAT_STATE
import com.meloda.fast.database.old.DatabaseKeys.CONVERSATION_ID
import com.meloda.fast.database.old.DatabaseKeys.IN_READ_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.IS_ALLOWED
import com.meloda.fast.database.old.DatabaseKeys.IS_GROUP_CHANNEL
import com.meloda.fast.database.old.DatabaseKeys.IS_NOTIFICATIONS_DISABLED
import com.meloda.fast.database.old.DatabaseKeys.LAST_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.LOCAL_ID
import com.meloda.fast.database.old.DatabaseKeys.MEMBERS_COUNT
import com.meloda.fast.database.old.DatabaseKeys.NOT_ALLOWED_REASON
import com.meloda.fast.database.old.DatabaseKeys.OUT_READ_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.PHOTOS
import com.meloda.fast.database.old.DatabaseKeys.PINNED_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.TITLE
import com.meloda.fast.database.old.DatabaseKeys.TYPE
import com.meloda.fast.database.old.DatabaseKeys.UNREAD_COUNT
import com.meloda.fast.database.old.DatabaseUtils.TABLE_CHATS
import com.meloda.fast.database.old.base.Storage
import com.meloda.fast.api.model.old.oldVKConversation
import com.meloda.fast.api.VKUtil
import org.json.JSONObject
@@ -1,23 +1,23 @@
package com.meloda.fast.database.storage
package com.meloda.fast.database.old.storage
import android.content.ContentValues
import android.database.Cursor
import android.os.Bundle
import android.util.Log
import androidx.annotation.WorkerThread
import com.meloda.fast.database.CacheStorage
import com.meloda.fast.database.CacheStorage.getInt
import com.meloda.fast.database.CacheStorage.getString
import com.meloda.fast.database.DatabaseKeys.DEACTIVATED
import com.meloda.fast.database.DatabaseKeys.GROUP_ID
import com.meloda.fast.database.DatabaseKeys.IS_CLOSED
import com.meloda.fast.database.DatabaseKeys.NAME
import com.meloda.fast.database.DatabaseKeys.PHOTOS
import com.meloda.fast.database.DatabaseKeys.SCREEN_NAME
import com.meloda.fast.database.DatabaseKeys.TYPE
import com.meloda.fast.database.DatabaseUtils.TABLE_GROUPS
import com.meloda.fast.database.base.Storage
import com.meloda.fast.api.model.VKGroup
import com.meloda.fast.database.old.CacheStorage
import com.meloda.fast.database.old.CacheStorage.getInt
import com.meloda.fast.database.old.CacheStorage.getString
import com.meloda.fast.database.old.DatabaseKeys.DEACTIVATED
import com.meloda.fast.database.old.DatabaseKeys.GROUP_ID
import com.meloda.fast.database.old.DatabaseKeys.IS_CLOSED
import com.meloda.fast.database.old.DatabaseKeys.NAME
import com.meloda.fast.database.old.DatabaseKeys.PHOTOS
import com.meloda.fast.database.old.DatabaseKeys.SCREEN_NAME
import com.meloda.fast.database.old.DatabaseKeys.TYPE
import com.meloda.fast.database.old.DatabaseUtils.TABLE_GROUPS
import com.meloda.fast.database.old.base.Storage
import com.meloda.fast.api.model.old.VKGroup
import com.meloda.fast.api.VKUtil
import org.json.JSONObject
@@ -1,31 +1,31 @@
package com.meloda.fast.database.storage
package com.meloda.fast.database.old.storage
import android.content.ContentValues
import android.database.Cursor
import android.os.Bundle
import android.util.Log
import androidx.annotation.WorkerThread
import com.meloda.fast.database.CacheStorage
import com.meloda.fast.database.CacheStorage.selectCursor
import com.meloda.fast.database.DatabaseKeys.ACTION
import com.meloda.fast.database.DatabaseKeys.ATTACHMENTS
import com.meloda.fast.database.DatabaseKeys.CONVERSATION_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.DATE
import com.meloda.fast.database.DatabaseKeys.EDIT_TIME
import com.meloda.fast.database.DatabaseKeys.FROM_ID
import com.meloda.fast.database.DatabaseKeys.FWD_MESSAGES
import com.meloda.fast.database.DatabaseKeys.IS_OUT
import com.meloda.fast.database.DatabaseKeys.MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.PEER_ID
import com.meloda.fast.database.DatabaseKeys.RANDOM_ID
import com.meloda.fast.database.DatabaseKeys.REPLY_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.TEXT
import com.meloda.fast.database.DatabaseUtils.TABLE_MESSAGES
import com.meloda.fast.database.base.Storage
import com.meloda.fast.database.old.CacheStorage
import com.meloda.fast.database.old.CacheStorage.selectCursor
import com.meloda.fast.database.old.DatabaseKeys.ACTION
import com.meloda.fast.database.old.DatabaseKeys.ATTACHMENTS
import com.meloda.fast.database.old.DatabaseKeys.CONVERSATION_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.DATE
import com.meloda.fast.database.old.DatabaseKeys.EDIT_TIME
import com.meloda.fast.database.old.DatabaseKeys.FROM_ID
import com.meloda.fast.database.old.DatabaseKeys.FWD_MESSAGES
import com.meloda.fast.database.old.DatabaseKeys.IS_OUT
import com.meloda.fast.database.old.DatabaseKeys.MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.PEER_ID
import com.meloda.fast.database.old.DatabaseKeys.RANDOM_ID
import com.meloda.fast.database.old.DatabaseKeys.REPLY_MESSAGE_ID
import com.meloda.fast.database.old.DatabaseKeys.TEXT
import com.meloda.fast.database.old.DatabaseUtils.TABLE_MESSAGES
import com.meloda.fast.database.old.base.Storage
import com.meloda.fast.util.Utils
import com.meloda.fast.api.model.oldVKMessage
import com.meloda.fast.api.model.VKMessageAction
import com.meloda.fast.api.model.VKModel
import com.meloda.fast.api.model.old.oldVKMessage
import com.meloda.fast.api.model.old.VKMessageAction
import com.meloda.fast.api.model.old.VKModel
import java.util.stream.Collectors
@WorkerThread
@@ -1,4 +1,4 @@
package com.meloda.fast.database.storage
package com.meloda.fast.database.old.storage
import android.content.ContentValues
import android.database.Cursor
@@ -7,25 +7,25 @@ import android.util.Log
import androidx.annotation.WorkerThread
import com.meloda.fast.api.UserConfig
import com.meloda.fast.api.VKUtil
import com.meloda.fast.api.model.oldVKUser
import com.meloda.fast.database.CacheStorage
import com.meloda.fast.database.DatabaseKeys.DEACTIVATED
import com.meloda.fast.database.DatabaseKeys.FIRST_NAME
import com.meloda.fast.database.DatabaseKeys.FRIEND_ID
import com.meloda.fast.database.DatabaseKeys.GENDER
import com.meloda.fast.database.DatabaseKeys.IS_ONLINE
import com.meloda.fast.database.DatabaseKeys.IS_ONLINE_MOBILE
import com.meloda.fast.database.DatabaseKeys.LAST_NAME
import com.meloda.fast.database.DatabaseKeys.LAST_SEEN
import com.meloda.fast.database.DatabaseKeys.PHOTOS
import com.meloda.fast.database.DatabaseKeys.SCREEN_NAME
import com.meloda.fast.database.DatabaseKeys.SORT_ID
import com.meloda.fast.database.DatabaseKeys.STATUS
import com.meloda.fast.database.DatabaseKeys.USER_ID
import com.meloda.fast.database.DatabaseUtils.TABLE_FRIENDS
import com.meloda.fast.database.DatabaseUtils.TABLE_USERS
import com.meloda.fast.database.QueryBuilder
import com.meloda.fast.database.base.Storage
import com.meloda.fast.api.model.old.oldVKUser
import com.meloda.fast.database.old.CacheStorage
import com.meloda.fast.database.old.DatabaseKeys.DEACTIVATED
import com.meloda.fast.database.old.DatabaseKeys.FIRST_NAME
import com.meloda.fast.database.old.DatabaseKeys.FRIEND_ID
import com.meloda.fast.database.old.DatabaseKeys.GENDER
import com.meloda.fast.database.old.DatabaseKeys.IS_ONLINE
import com.meloda.fast.database.old.DatabaseKeys.IS_ONLINE_MOBILE
import com.meloda.fast.database.old.DatabaseKeys.LAST_NAME
import com.meloda.fast.database.old.DatabaseKeys.LAST_SEEN
import com.meloda.fast.database.old.DatabaseKeys.PHOTOS
import com.meloda.fast.database.old.DatabaseKeys.SCREEN_NAME
import com.meloda.fast.database.old.DatabaseKeys.SORT_ID
import com.meloda.fast.database.old.DatabaseKeys.STATUS
import com.meloda.fast.database.old.DatabaseKeys.USER_ID
import com.meloda.fast.database.old.DatabaseUtils.TABLE_FRIENDS
import com.meloda.fast.database.old.DatabaseUtils.TABLE_USERS
import com.meloda.fast.database.old.QueryBuilder
import com.meloda.fast.database.old.base.Storage
import org.json.JSONObject
@WorkerThread
@@ -0,0 +1,38 @@
package com.meloda.fast.di
import com.meloda.fast.common.AppGlobal
import com.meloda.fast.database.AppDatabase
import com.meloda.fast.database.dao.ConversationsDao
import com.meloda.fast.database.dao.MessagesDao
import com.meloda.fast.database.dao.UsersDao
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
@Module
object DatabaseModule {
@Provides
@Singleton
fun provideAppDatabase(): AppDatabase =
AppGlobal.appDatabase
@Provides
@Singleton
fun provideUsersDao(appDatabase: AppDatabase): UsersDao =
appDatabase.usersDao()
@Provides
@Singleton
fun provideConversationsDao(appDatabase: AppDatabase): ConversationsDao =
appDatabase.conversationsDao()
@Provides
@Singleton
fun provideMessagesDao(appDatabase: AppDatabase): MessagesDao =
appDatabase.messagesDao()
}
@@ -1 +0,0 @@
package com.meloda.fast.di
@@ -6,7 +6,7 @@ import com.meloda.fast.api.UserConfig
import com.meloda.fast.api.VKConstants
import com.meloda.fast.api.VKException
import com.meloda.fast.api.VKUtil
import com.meloda.fast.api.network.repo.AuthRepo
import com.meloda.fast.api.datasource.AuthDataSource
import com.meloda.fast.api.network.request.RequestAuthDirect
import com.meloda.fast.base.viewmodel.BaseViewModel
import com.meloda.fast.base.viewmodel.StartProgressEvent
@@ -18,7 +18,7 @@ import javax.inject.Inject
@HiltViewModel
class LoginViewModel @Inject constructor(
private val repo: AuthRepo
private val dataSource: AuthDataSource
) : BaseViewModel() {
fun login(
@@ -29,7 +29,7 @@ class LoginViewModel @Inject constructor(
) = viewModelScope.launch {
makeJob(
{
repo.auth(
dataSource.auth(
RequestAuthDirect(
grantType = VKConstants.Auth.GrantType.PASSWORD,
clientId = VKConstants.VK_APP_ID,
@@ -41,7 +41,7 @@ class LoginViewModel @Inject constructor(
twoFaCode = twoFaCode,
captchaSid = captcha?.first,
captchaKey = captcha?.second
).map
)
)
},
onAnswer = {
@@ -79,7 +79,7 @@ class LoginViewModel @Inject constructor(
}
fun sendSms(validationSid: String) = viewModelScope.launch {
makeJob({ repo.sendSms(validationSid) },
makeJob({ dataSource.sendSms(validationSid) },
onAnswer = { sendEvent(CodeSent) },
onError = {},
onStart = {},
@@ -1,16 +1,12 @@
package com.meloda.fast.screens.messages
import android.os.Bundle
import android.util.Log
import android.view.View
import android.viewbinding.library.fragment.viewBinding
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.meloda.fast.R
import com.meloda.fast.api.LoadManager
import com.meloda.fast.api.model.VkConversation
import com.meloda.fast.api.model.VkMessage
import com.meloda.fast.base.BaseViewModelFragment
import com.meloda.fast.base.viewmodel.StartProgressEvent
import com.meloda.fast.base.viewmodel.StopProgressEvent
@@ -18,9 +14,7 @@ import com.meloda.fast.base.viewmodel.VKEvent
import com.meloda.fast.databinding.FragmentConversationsBinding
import com.meloda.fast.util.AndroidUtils
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import kotlin.math.roundToInt
import kotlin.system.measureTimeMillis
@AndroidEntryPoint
class ConversationsFragment :
@@ -30,9 +24,6 @@ class ConversationsFragment :
val TAG: String = ConversationsFragment::class.java.name
}
// @Inject
// lateinit var loadManager: LoadManager
override val viewModel: ConversationsViewModel by viewModels()
private val binding: FragmentConversationsBinding by viewBinding()
@@ -52,7 +43,7 @@ class ConversationsFragment :
override fun onEvent(event: VKEvent) {
super.onEvent(event)
when (event) {
is ConversationsLoaded -> prepareData(event)
is ConversationsLoaded -> refreshConversations(event.conversations)
is StartProgressEvent -> onProgressStarted()
is StopProgressEvent -> onProgressStopped()
}
@@ -74,7 +65,7 @@ class ConversationsFragment :
}
private fun prepareRecyclerView() {
binding.recyclerView.itemAnimator = null
}
private fun prepareRefreshLayout() {
@@ -100,42 +91,16 @@ class ConversationsFragment :
}
}
private fun prepareData(event: ConversationsLoaded) {
val conversations = mutableListOf<VkConversation>()
val timeInMillis = measureTimeMillis {
for (i in event.conversations.indices) {
val baseConversation = event.conversations[i]
val baseMessage = event.messages[i]
conversations += VkConversation(
id = baseConversation.peer.id,
title = baseConversation.chatSettings?.title,
lastMessage = VkMessage(
id = baseMessage.id,
text = baseMessage.text,
isOut = baseMessage.out == 1,
peerId = baseMessage.peerId,
fromId = baseMessage.fromId,
date = baseMessage.date
)
)
}
}
Log.d(TAG, "prepareData: $timeInMillis ms")
private fun refreshConversations(conversations: List<VkConversation>) {
fillRecyclerView(conversations)
lifecycleScope.launch {
LoadManager.users.load(listOf(1, 2, 3))
}
viewModel.loadSomeUsers(listOf(1, 2, 3, 362877006))
}
private fun fillRecyclerView(values: List<VkConversation>) {
adapter.values.clear()
adapter.values += values
adapter.notifyDataSetChanged()
adapter.notifyItemRangeChanged(0, adapter.itemCount)
}
}
@@ -2,10 +2,11 @@ package com.meloda.fast.screens.messages
import androidx.lifecycle.viewModelScope
import com.meloda.fast.api.VKConstants
import com.meloda.fast.api.model.base.BaseVkConversation
import com.meloda.fast.api.model.base.BaseVkMessage
import com.meloda.fast.api.network.repo.ConversationsRepo
import com.meloda.fast.api.datasource.ConversationsDataSource
import com.meloda.fast.api.datasource.UsersDataSource
import com.meloda.fast.api.model.VkConversation
import com.meloda.fast.api.network.request.ConversationsGetRequest
import com.meloda.fast.api.network.request.UsersGetRequest
import com.meloda.fast.base.viewmodel.BaseViewModel
import com.meloda.fast.base.viewmodel.StartProgressEvent
import com.meloda.fast.base.viewmodel.StopProgressEvent
@@ -17,12 +18,13 @@ import javax.inject.Inject
@HiltViewModel
class ConversationsViewModel @Inject constructor(
private val repo: ConversationsRepo
private val dataSource: ConversationsDataSource,
private val usersDataSource: UsersDataSource
) : BaseViewModel() {
fun loadConversations() = viewModelScope.launch(Dispatchers.Default) {
makeJob({
repo.getAllChats(
dataSource.getAllChats(
ConversationsGetRequest(
count = 30,
fields = "${VKConstants.USER_FIELDS},${VKConstants.GROUP_FIELDS}"
@@ -35,8 +37,11 @@ class ConversationsViewModel @Inject constructor(
ConversationsLoaded(
count = response.count,
unreadCount = response.unreadCount ?: 0,
messages = response.items.map { items -> items.lastMessage },
conversations = response.items.map { items -> items.conversation }
conversations = response.items.map { items ->
items.conversation.asVkConversation(
items.lastMessage.asVkMessage()
)
}
)
)
}
@@ -52,11 +57,35 @@ class ConversationsViewModel @Inject constructor(
sendEvent(StopProgressEvent)
})
}
fun loadSomeUsers(usersIds: List<Int>) = viewModelScope.launch {
makeJob({
usersDataSource.getById(
UsersGetRequest(
usersIds = usersIds,
fields = "sex"
)
)
},
onAnswer = {
val argh = it
val i = 0
it.response?.let { r ->
val users = r.map { user -> user.asVkUser() }
usersDataSource.storeUsers(users)
}
},
onError = {
val e = it
val i = 0
})
}
}
data class ConversationsLoaded(
val count: Int,
val unreadCount: Int,
val messages: List<BaseVkMessage>,
val conversations: List<BaseVkConversation>
val conversations: List<VkConversation>
) : VKEvent()
@@ -6,7 +6,7 @@ import android.os.IBinder
import android.util.Log
import androidx.annotation.WorkerThread
import com.meloda.fast.api.UserConfig
import com.meloda.fast.api.model.VKLongPollServer
import com.meloda.fast.api.model.old.VKLongPollServer
import com.meloda.fast.util.AndroidUtils
import org.json.JSONArray
import org.json.JSONObject
@@ -5,7 +5,7 @@ import android.graphics.drawable.Drawable
import androidx.core.content.ContextCompat
import com.meloda.fast.R
import com.meloda.fast.api.VKUtil
import com.meloda.fast.api.model.*
import com.meloda.fast.api.model.old.*
import com.meloda.fast.common.AppGlobal
import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.extensions.ContextExtensions.drawable
@@ -10,7 +10,7 @@ import com.google.android.material.snackbar.Snackbar
import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.R
import com.meloda.fast.widget.CircleImageView
import com.meloda.fast.api.model.oldVKUser
import com.meloda.fast.api.model.old.oldVKUser
object ViewUtils {