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
+4 -3
View File
@@ -81,16 +81,17 @@ dependencies {
implementation("androidx.appcompat:appcompat:1.4.0-alpha03") implementation("androidx.appcompat:appcompat:1.4.0-alpha03")
implementation("com.google.android.material:material:1.4.0") implementation("com.google.android.material:material:1.4.0")
implementation("androidx.core:core-ktx:1.7.0-alpha01") implementation("androidx.core:core-ktx:1.7.0-alpha02")
implementation("androidx.preference:preference-ktx:1.1.1") implementation("androidx.preference:preference-ktx:1.1.1")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01") implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01")
implementation("androidx.recyclerview:recyclerview:1.2.1") implementation("androidx.recyclerview:recyclerview:1.2.1")
implementation("androidx.cardview:cardview:1.0.0") implementation("androidx.cardview:cardview:1.0.0")
implementation("androidx.fragment:fragment-ktx:1.3.6") implementation("androidx.fragment:fragment-ktx:1.3.6")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2-native-mt")
implementation("androidx.room:room-ktx:2.3.0")
implementation("androidx.room:room-runtime:2.3.0") implementation("androidx.room:room-runtime:2.3.0")
kapt("androidx.room:room-compiler:2.3.0") kapt("androidx.room:room-compiler:2.3.0")
@@ -1,10 +1,20 @@
package com.meloda.fast.api.network package com.meloda.fast.api
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.GsonBuilder 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.AuthRepo
import com.meloda.fast.api.network.repo.ConversationsRepo 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.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.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
@@ -67,4 +77,30 @@ class VKModules {
fun provideUsersRepo(retrofit: Retrofit): UsersRepo = fun provideUsersRepo(retrofit: Retrofit): UsersRepo =
retrofit.create(UsersRepo::class.java) 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 androidx.annotation.WorkerThread
import com.meloda.fast.api.model.* import com.meloda.fast.api.model.*
import com.meloda.fast.api.model.old.*
import com.meloda.fast.api.network.VKErrors import com.meloda.fast.api.network.VKErrors
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject 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 package com.meloda.fast.api.loader
import com.meloda.fast.api.model.VkUser 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>() { class UsersLoader : Loader<VkUser>() {
@Inject
lateinit var repo: UsersRepo
suspend fun load( suspend fun load(
usersIds: List<Int>, usersIds: List<Int>,
fields: String = "" fields: String = ""
@@ -24,12 +18,12 @@ class UsersLoader : Loader<VkUser>() {
val usersIds: String = params["usersIds"] as String val usersIds: String = params["usersIds"] as String
val fields: String = params["fields"] as String val fields: String = params["fields"] as String
val users = repo.getById( // val users = repo.getById(
UsersGetRequest( // UsersGetRequest(
usersIds = usersIds.split(",").map { it.toInt() }, // usersIds = usersIds.split(",").map { it.toInt() },
fields = fields // fields = fields
) // )
) // )
return emptyList() return emptyList()
} }
@@ -1,7 +1,15 @@
package com.meloda.fast.api.model package com.meloda.fast.api.model
import androidx.room.Entity
import androidx.room.Ignore
import androidx.room.PrimaryKey
@Entity(tableName = "conversations")
data class VkConversation( data class VkConversation(
@PrimaryKey(autoGenerate = false)
val id: Int, val id: Int,
val title: String?, val title: String?,
val lastMessage: VkMessage ) {
) @Ignore
var lastMessage: VkMessage? = null
}
@@ -1,10 +1,19 @@
package com.meloda.fast.api.model package com.meloda.fast.api.model
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "messages")
data class VkMessage( data class VkMessage(
@PrimaryKey(autoGenerate = false)
val id: Int, val id: Int,
val text: String?, val text: String?,
val isOut: Boolean, val isOut: Boolean,
val peerId: Int, val peerId: Int,
val fromId: Int, val fromId: Int,
val date: Int val date: Int
) ) {
}
@@ -1,6 +1,11 @@
package com.meloda.fast.api.model package com.meloda.fast.api.model
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "users")
data class VkUser( data class VkUser(
@PrimaryKey(autoGenerate = false)
val id: Int, val id: Int,
val firstName: String, val firstName: String,
val lastName: String val lastName: String
@@ -2,6 +2,8 @@ package com.meloda.fast.api.model.base
import android.os.Parcelable import android.os.Parcelable
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.meloda.fast.api.model.VkConversation
import com.meloda.fast.api.model.VkMessage
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
@@ -32,6 +34,11 @@ data class BaseVkConversation(
val chatSettings: ChatSettings? val chatSettings: ChatSettings?
) : Parcelable { ) : Parcelable {
fun asVkConversation(lastMessage: VkMessage? = null) = VkConversation(
id = peer.id,
title = chatSettings?.title,
).apply { this.lastMessage = lastMessage }
@Parcelize @Parcelize
data class Peer( data class Peer(
val id: Int, val id: Int,
@@ -2,6 +2,7 @@ package com.meloda.fast.api.model.base
import android.os.Parcelable import android.os.Parcelable
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.meloda.fast.api.model.VkMessage
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import kotlinx.parcelize.RawValue import kotlinx.parcelize.RawValue
@@ -29,6 +30,15 @@ data class BaseVkMessage(
val geo: Geo? val geo: Geo?
) : Parcelable { ) : Parcelable {
fun asVkMessage() = VkMessage(
id = id,
text = text,
isOut = out == 1,
peerId = peerId,
fromId = fromId,
date = date
)
@Parcelize @Parcelize
data class Geo( data class Geo(
val type: String, val type: String,
@@ -2,6 +2,7 @@ package com.meloda.fast.api.model.base
import android.os.Parcelable import android.os.Parcelable
import com.google.gson.annotations.SerializedName import com.google.gson.annotations.SerializedName
import com.meloda.fast.api.model.VkUser
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
@@ -46,4 +47,10 @@ data class BaseVkUser(
val appId: Int? val appId: Int?
) : Parcelable ) : 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 org.json.JSONArray
import java.util.* import java.util.*
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model package com.meloda.fast.api.model.old
import org.json.JSONObject 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 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 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 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 org.json.JSONObject
import java.io.Serializable 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 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 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 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.JSONArray
import org.json.JSONObject 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 org.json.JSONObject
import java.io.Serializable import java.io.Serializable
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model package com.meloda.fast.api.model.old
import java.util.* import java.util.*
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model package com.meloda.fast.api.model.old
import org.json.JSONObject 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 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 com.meloda.fast.base.adapter.BaseItem
import java.io.Serializable 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 org.json.JSONObject
import java.util.* import java.util.*
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model package com.meloda.fast.api.model.old
import org.json.JSONObject 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 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 org.json.JSONObject
import java.util.* 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 import org.json.JSONObject
class VKVideo() : VKModel() { class VKVideo() : VKModel() {
@@ -1,4 +1,4 @@
package com.meloda.fast.api.model package com.meloda.fast.api.model.old
import org.json.JSONObject 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 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 android.util.ArrayMap
import com.meloda.fast.api.VKUtil 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.JSONArray
import org.json.JSONObject 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.base.ApiResponse
import com.meloda.fast.api.network.Answer import com.meloda.fast.api.network.Answer
import com.meloda.fast.api.network.VKUrls 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.request.ConversationsGetRequest
import com.meloda.fast.api.network.response.ConversationsGetResponse
import retrofit2.http.Body import retrofit2.http.Body
import retrofit2.http.POST import retrofit2.http.POST
interface ConversationsRepo { interface ConversationsRepo {
@POST(VKUrls.Conversations.get) @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.model.base.BaseVkUser
import com.meloda.fast.api.network.Answer import com.meloda.fast.api.network.Answer
import com.meloda.fast.api.network.VKUrls import com.meloda.fast.api.network.VKUrls
import com.meloda.fast.api.network.request.UsersGetRequest import retrofit2.http.GET
import dagger.Component import retrofit2.http.QueryMap
import retrofit2.http.Body
import retrofit2.http.POST
interface UsersRepo { interface UsersRepo {
@POST(VKUrls.Users.getById) @GET(VKUrls.Users.getById)
suspend fun getById(@Body param: UsersGetRequest): Answer<ApiResponse<List<BaseVkUser>>> suspend fun getById(@QueryMap params: Map<String, String>): Answer<ApiResponse<List<BaseVkUser>>>
} }
@@ -1,14 +1,21 @@
package com.meloda.fast.api.network.request package com.meloda.fast.api.network.request
import android.os.Parcelable import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
@Parcelize @Parcelize
data class UsersGetRequest( data class UsersGetRequest(
@SerializedName("user_ids")
val usersIds: List<Int>, val usersIds: List<Int>,
val fields: String? = null, val fields: String? = null,
@SerializedName("nom_case")
val nomCase: String? = null 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 android.view.inputmethod.InputMethodManager
import androidx.core.content.pm.PackageInfoCompat import androidx.core.content.pm.PackageInfoCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import androidx.room.Room
import com.meloda.fast.BuildConfig import com.meloda.fast.BuildConfig
import com.meloda.fast.R 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 com.meloda.fast.util.AndroidUtils
import dagger.hilt.android.HiltAndroidApp import dagger.hilt.android.HiltAndroidApp
import org.acra.ACRA import org.acra.ACRA
@@ -49,8 +51,10 @@ class AppGlobal : Application() {
lateinit var packageName: String lateinit var packageName: String
lateinit var instance: AppGlobal lateinit var instance: AppGlobal
lateinit var appDatabase: AppDatabase
lateinit var dbHelper: DatabaseHelper lateinit var dbHelper: DatabaseHelper
lateinit var database: SQLiteDatabase lateinit var oldDatabase: SQLiteDatabase
lateinit var packageManager: PackageManager lateinit var packageManager: PackageManager
@@ -73,12 +77,18 @@ class AppGlobal : Application() {
ACRA.init(this) ACRA.init(this)
} }
appDatabase = Room.databaseBuilder(
this, AppDatabase::class.java, "cache"
)
.fallbackToDestructiveMigration()
.build()
preferences = PreferenceManager.getDefaultSharedPreferences(this) preferences = PreferenceManager.getDefaultSharedPreferences(this)
handler = Handler(mainLooper) handler = Handler(mainLooper)
locale = Locale.getDefault() locale = Locale.getDefault()
dbHelper = DatabaseHelper(this) dbHelper = DatabaseHelper(this)
database = dbHelper.writableDatabase oldDatabase = dbHelper.writableDatabase
val info = packageManager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES) val info = packageManager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES)
versionName = info.versionName versionName = info.versionName
@@ -88,7 +98,6 @@ class AppGlobal : Application() {
Companion.packageName = packageName Companion.packageName = packageName
Companion.packageManager = packageManager Companion.packageManager = packageManager
screenWidth = AndroidUtils.getDisplayWidth() screenWidth = AndroidUtils.getDisplayWidth()
screenHeight = AndroidUtils.getDisplayHeight() 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.content.ContentValues
import android.database.Cursor import android.database.Cursor
import android.os.Bundle import android.os.Bundle
import com.meloda.fast.common.AppGlobal.Companion.database import com.meloda.fast.common.AppGlobal.Companion.oldDatabase
import com.meloda.fast.database.DatabaseUtils.TABLE_CHATS import com.meloda.fast.database.old.DatabaseUtils.TABLE_CHATS
import com.meloda.fast.database.DatabaseUtils.TABLE_FRIENDS import com.meloda.fast.database.old.DatabaseUtils.TABLE_FRIENDS
import com.meloda.fast.database.DatabaseUtils.TABLE_MESSAGES import com.meloda.fast.database.old.DatabaseUtils.TABLE_MESSAGES
import com.meloda.fast.database.DatabaseUtils.TABLE_USERS import com.meloda.fast.database.old.DatabaseUtils.TABLE_USERS
import com.meloda.fast.database.storage.ChatsStorage import com.meloda.fast.database.old.storage.ChatsStorage
import com.meloda.fast.database.storage.GroupsStorage import com.meloda.fast.database.old.storage.GroupsStorage
import com.meloda.fast.database.storage.MessagesStorage import com.meloda.fast.database.old.storage.MessagesStorage
import com.meloda.fast.database.storage.UsersStorage import com.meloda.fast.database.old.storage.UsersStorage
import com.meloda.fast.api.model.oldVKConversation import com.meloda.fast.api.model.old.oldVKConversation
import com.meloda.fast.api.model.oldVKMessage import com.meloda.fast.api.model.old.oldVKMessage
import com.meloda.fast.api.model.oldVKUser import com.meloda.fast.api.model.old.oldVKUser
import java.util.* import java.util.*
object CacheStorage { object CacheStorage {
@@ -27,21 +27,21 @@ object CacheStorage {
fun selectCursor(tableName: String): Cursor { fun selectCursor(tableName: String): Cursor {
return QueryBuilder.query() return QueryBuilder.query()
.select("*").from(tableName) .select("*").from(tableName)
.asCursor(database) .asCursor(oldDatabase)
} }
fun selectCursor(tableName: String, where: String): Cursor { fun selectCursor(tableName: String, where: String): Cursor {
return QueryBuilder.query() return QueryBuilder.query()
.select("*").from(tableName) .select("*").from(tableName)
.where(where) .where(where)
.asCursor(database) .asCursor(oldDatabase)
} }
fun selectCursor(tableName: String, columnName: String, value: Any): Cursor { fun selectCursor(tableName: String, columnName: String, value: Any): Cursor {
return QueryBuilder.query() return QueryBuilder.query()
.select("*").from(tableName) .select("*").from(tableName)
.where("$columnName=$value") .where("$columnName=$value")
.asCursor(database) .asCursor(oldDatabase)
} }
fun selectCursor(tableName: String, columnName: String, ids: IntArray): Cursor { fun selectCursor(tableName: String, columnName: String, ids: IntArray): Cursor {
@@ -67,7 +67,7 @@ object CacheStorage {
cursor.getBlob(cursor.getColumnIndexOrThrow(columnName)) cursor.getBlob(cursor.getColumnIndexOrThrow(columnName))
fun <T> insert(tableName: String, values: ArrayList<T>) { fun <T> insert(tableName: String, values: ArrayList<T>) {
database.beginTransaction() oldDatabase.beginTransaction()
val contentValues = ContentValues() val contentValues = ContentValues()
@@ -94,20 +94,20 @@ object CacheStorage {
} }
} }
database.insert(tableName, null, contentValues) oldDatabase.insert(tableName, null, contentValues)
contentValues.clear() contentValues.clear()
} }
database.setTransactionSuccessful() oldDatabase.setTransactionSuccessful()
database.endTransaction() oldDatabase.endTransaction()
} }
fun delete(tableName: String, whereClause: String, vararg whereArgs: String) { fun delete(tableName: String, whereClause: String, vararg whereArgs: String) {
database.delete(tableName, whereClause, whereArgs) oldDatabase.delete(tableName, whereClause, whereArgs)
} }
fun delete(tableName: String) { 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.content.Context
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
@@ -1,4 +1,4 @@
package com.meloda.fast.database package com.meloda.fast.database.old
object DatabaseKeys { 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.old.DatabaseKeys.ACTION
import com.meloda.fast.database.DatabaseKeys.ATTACHMENTS import com.meloda.fast.database.old.DatabaseKeys.ATTACHMENTS
import com.meloda.fast.database.DatabaseKeys.CHAT_STATE import com.meloda.fast.database.old.DatabaseKeys.CHAT_STATE
import com.meloda.fast.database.DatabaseKeys.CONVERSATION_ID import com.meloda.fast.database.old.DatabaseKeys.CONVERSATION_ID
import com.meloda.fast.database.DatabaseKeys.CONVERSATION_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.CONVERSATION_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.DATE import com.meloda.fast.database.old.DatabaseKeys.DATE
import com.meloda.fast.database.DatabaseKeys.DEACTIVATED import com.meloda.fast.database.old.DatabaseKeys.DEACTIVATED
import com.meloda.fast.database.DatabaseKeys.EDIT_TIME import com.meloda.fast.database.old.DatabaseKeys.EDIT_TIME
import com.meloda.fast.database.DatabaseKeys.FIRST_NAME import com.meloda.fast.database.old.DatabaseKeys.FIRST_NAME
import com.meloda.fast.database.DatabaseKeys.FRIEND_ID import com.meloda.fast.database.old.DatabaseKeys.FRIEND_ID
import com.meloda.fast.database.DatabaseKeys.FROM_ID import com.meloda.fast.database.old.DatabaseKeys.FROM_ID
import com.meloda.fast.database.DatabaseKeys.FWD_MESSAGES import com.meloda.fast.database.old.DatabaseKeys.FWD_MESSAGES
import com.meloda.fast.database.DatabaseKeys.GENDER import com.meloda.fast.database.old.DatabaseKeys.GENDER
import com.meloda.fast.database.DatabaseKeys.GROUP_ID import com.meloda.fast.database.old.DatabaseKeys.GROUP_ID
import com.meloda.fast.database.DatabaseKeys.IN_READ_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.IN_READ_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.IS_ALLOWED import com.meloda.fast.database.old.DatabaseKeys.IS_ALLOWED
import com.meloda.fast.database.DatabaseKeys.IS_CLOSED import com.meloda.fast.database.old.DatabaseKeys.IS_CLOSED
import com.meloda.fast.database.DatabaseKeys.IS_GROUP_CHANNEL import com.meloda.fast.database.old.DatabaseKeys.IS_GROUP_CHANNEL
import com.meloda.fast.database.DatabaseKeys.IS_NOTIFICATIONS_DISABLED import com.meloda.fast.database.old.DatabaseKeys.IS_NOTIFICATIONS_DISABLED
import com.meloda.fast.database.DatabaseKeys.IS_ONLINE import com.meloda.fast.database.old.DatabaseKeys.IS_ONLINE
import com.meloda.fast.database.DatabaseKeys.IS_ONLINE_MOBILE import com.meloda.fast.database.old.DatabaseKeys.IS_ONLINE_MOBILE
import com.meloda.fast.database.DatabaseKeys.IS_OUT import com.meloda.fast.database.old.DatabaseKeys.IS_OUT
import com.meloda.fast.database.DatabaseKeys.LAST_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.LAST_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.LAST_NAME import com.meloda.fast.database.old.DatabaseKeys.LAST_NAME
import com.meloda.fast.database.DatabaseKeys.LAST_SEEN import com.meloda.fast.database.old.DatabaseKeys.LAST_SEEN
import com.meloda.fast.database.DatabaseKeys.LOCAL_ID import com.meloda.fast.database.old.DatabaseKeys.LOCAL_ID
import com.meloda.fast.database.DatabaseKeys.MEMBERS_COUNT import com.meloda.fast.database.old.DatabaseKeys.MEMBERS_COUNT
import com.meloda.fast.database.DatabaseKeys.MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.NAME import com.meloda.fast.database.old.DatabaseKeys.NAME
import com.meloda.fast.database.DatabaseKeys.NOT_ALLOWED_REASON import com.meloda.fast.database.old.DatabaseKeys.NOT_ALLOWED_REASON
import com.meloda.fast.database.DatabaseKeys.OUT_READ_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.OUT_READ_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.PEER_ID import com.meloda.fast.database.old.DatabaseKeys.PEER_ID
import com.meloda.fast.database.DatabaseKeys.PHOTOS import com.meloda.fast.database.old.DatabaseKeys.PHOTOS
import com.meloda.fast.database.DatabaseKeys.PINNED_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.PINNED_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.RANDOM_ID import com.meloda.fast.database.old.DatabaseKeys.RANDOM_ID
import com.meloda.fast.database.DatabaseKeys.REPLY_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.REPLY_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.SCREEN_NAME import com.meloda.fast.database.old.DatabaseKeys.SCREEN_NAME
import com.meloda.fast.database.DatabaseKeys.SORT_ID import com.meloda.fast.database.old.DatabaseKeys.SORT_ID
import com.meloda.fast.database.DatabaseKeys.STATUS import com.meloda.fast.database.old.DatabaseKeys.STATUS
import com.meloda.fast.database.DatabaseKeys.TEXT import com.meloda.fast.database.old.DatabaseKeys.TEXT
import com.meloda.fast.database.DatabaseKeys.TITLE import com.meloda.fast.database.old.DatabaseKeys.TITLE
import com.meloda.fast.database.DatabaseKeys.TYPE import com.meloda.fast.database.old.DatabaseKeys.TYPE
import com.meloda.fast.database.DatabaseKeys.UNREAD_COUNT import com.meloda.fast.database.old.DatabaseKeys.UNREAD_COUNT
import com.meloda.fast.database.DatabaseKeys.USER_ID import com.meloda.fast.database.old.DatabaseKeys.USER_ID
object DatabaseUtils { object DatabaseUtils {
@@ -1,4 +1,4 @@
package com.meloda.fast.database package com.meloda.fast.database.old
import android.database.Cursor import android.database.Cursor
import android.database.sqlite.SQLiteDatabase 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.content.ContentValues
import android.database.Cursor import android.database.Cursor
@@ -10,7 +10,7 @@ abstract class Storage<T> {
abstract val tag: String abstract val tag: String
protected var database = AppGlobal.database protected var database = AppGlobal.oldDatabase
@WorkerThread @WorkerThread
abstract fun getAllValues(): ArrayList<T> 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.content.ContentValues
import android.database.Cursor import android.database.Cursor
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import com.meloda.fast.database.CacheStorage import com.meloda.fast.database.old.CacheStorage
import com.meloda.fast.database.CacheStorage.messagesStorage import com.meloda.fast.database.old.CacheStorage.messagesStorage
import com.meloda.fast.database.DatabaseKeys.CHAT_STATE import com.meloda.fast.database.old.DatabaseKeys.CHAT_STATE
import com.meloda.fast.database.DatabaseKeys.CONVERSATION_ID import com.meloda.fast.database.old.DatabaseKeys.CONVERSATION_ID
import com.meloda.fast.database.DatabaseKeys.IN_READ_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.IN_READ_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.IS_ALLOWED import com.meloda.fast.database.old.DatabaseKeys.IS_ALLOWED
import com.meloda.fast.database.DatabaseKeys.IS_GROUP_CHANNEL import com.meloda.fast.database.old.DatabaseKeys.IS_GROUP_CHANNEL
import com.meloda.fast.database.DatabaseKeys.IS_NOTIFICATIONS_DISABLED import com.meloda.fast.database.old.DatabaseKeys.IS_NOTIFICATIONS_DISABLED
import com.meloda.fast.database.DatabaseKeys.LAST_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.LAST_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.LOCAL_ID import com.meloda.fast.database.old.DatabaseKeys.LOCAL_ID
import com.meloda.fast.database.DatabaseKeys.MEMBERS_COUNT import com.meloda.fast.database.old.DatabaseKeys.MEMBERS_COUNT
import com.meloda.fast.database.DatabaseKeys.NOT_ALLOWED_REASON import com.meloda.fast.database.old.DatabaseKeys.NOT_ALLOWED_REASON
import com.meloda.fast.database.DatabaseKeys.OUT_READ_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.OUT_READ_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.PHOTOS import com.meloda.fast.database.old.DatabaseKeys.PHOTOS
import com.meloda.fast.database.DatabaseKeys.PINNED_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.PINNED_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.TITLE import com.meloda.fast.database.old.DatabaseKeys.TITLE
import com.meloda.fast.database.DatabaseKeys.TYPE import com.meloda.fast.database.old.DatabaseKeys.TYPE
import com.meloda.fast.database.DatabaseKeys.UNREAD_COUNT import com.meloda.fast.database.old.DatabaseKeys.UNREAD_COUNT
import com.meloda.fast.database.DatabaseUtils.TABLE_CHATS import com.meloda.fast.database.old.DatabaseUtils.TABLE_CHATS
import com.meloda.fast.database.base.Storage import com.meloda.fast.database.old.base.Storage
import com.meloda.fast.api.model.oldVKConversation import com.meloda.fast.api.model.old.oldVKConversation
import com.meloda.fast.api.VKUtil import com.meloda.fast.api.VKUtil
import org.json.JSONObject 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.content.ContentValues
import android.database.Cursor import android.database.Cursor
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import com.meloda.fast.database.CacheStorage import com.meloda.fast.database.old.CacheStorage
import com.meloda.fast.database.CacheStorage.getInt import com.meloda.fast.database.old.CacheStorage.getInt
import com.meloda.fast.database.CacheStorage.getString import com.meloda.fast.database.old.CacheStorage.getString
import com.meloda.fast.database.DatabaseKeys.DEACTIVATED import com.meloda.fast.database.old.DatabaseKeys.DEACTIVATED
import com.meloda.fast.database.DatabaseKeys.GROUP_ID import com.meloda.fast.database.old.DatabaseKeys.GROUP_ID
import com.meloda.fast.database.DatabaseKeys.IS_CLOSED import com.meloda.fast.database.old.DatabaseKeys.IS_CLOSED
import com.meloda.fast.database.DatabaseKeys.NAME import com.meloda.fast.database.old.DatabaseKeys.NAME
import com.meloda.fast.database.DatabaseKeys.PHOTOS import com.meloda.fast.database.old.DatabaseKeys.PHOTOS
import com.meloda.fast.database.DatabaseKeys.SCREEN_NAME import com.meloda.fast.database.old.DatabaseKeys.SCREEN_NAME
import com.meloda.fast.database.DatabaseKeys.TYPE import com.meloda.fast.database.old.DatabaseKeys.TYPE
import com.meloda.fast.database.DatabaseUtils.TABLE_GROUPS import com.meloda.fast.database.old.DatabaseUtils.TABLE_GROUPS
import com.meloda.fast.database.base.Storage import com.meloda.fast.database.old.base.Storage
import com.meloda.fast.api.model.VKGroup import com.meloda.fast.api.model.old.VKGroup
import com.meloda.fast.api.VKUtil import com.meloda.fast.api.VKUtil
import org.json.JSONObject 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.content.ContentValues
import android.database.Cursor import android.database.Cursor
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import com.meloda.fast.database.CacheStorage import com.meloda.fast.database.old.CacheStorage
import com.meloda.fast.database.CacheStorage.selectCursor import com.meloda.fast.database.old.CacheStorage.selectCursor
import com.meloda.fast.database.DatabaseKeys.ACTION import com.meloda.fast.database.old.DatabaseKeys.ACTION
import com.meloda.fast.database.DatabaseKeys.ATTACHMENTS import com.meloda.fast.database.old.DatabaseKeys.ATTACHMENTS
import com.meloda.fast.database.DatabaseKeys.CONVERSATION_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.CONVERSATION_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.DATE import com.meloda.fast.database.old.DatabaseKeys.DATE
import com.meloda.fast.database.DatabaseKeys.EDIT_TIME import com.meloda.fast.database.old.DatabaseKeys.EDIT_TIME
import com.meloda.fast.database.DatabaseKeys.FROM_ID import com.meloda.fast.database.old.DatabaseKeys.FROM_ID
import com.meloda.fast.database.DatabaseKeys.FWD_MESSAGES import com.meloda.fast.database.old.DatabaseKeys.FWD_MESSAGES
import com.meloda.fast.database.DatabaseKeys.IS_OUT import com.meloda.fast.database.old.DatabaseKeys.IS_OUT
import com.meloda.fast.database.DatabaseKeys.MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.PEER_ID import com.meloda.fast.database.old.DatabaseKeys.PEER_ID
import com.meloda.fast.database.DatabaseKeys.RANDOM_ID import com.meloda.fast.database.old.DatabaseKeys.RANDOM_ID
import com.meloda.fast.database.DatabaseKeys.REPLY_MESSAGE_ID import com.meloda.fast.database.old.DatabaseKeys.REPLY_MESSAGE_ID
import com.meloda.fast.database.DatabaseKeys.TEXT import com.meloda.fast.database.old.DatabaseKeys.TEXT
import com.meloda.fast.database.DatabaseUtils.TABLE_MESSAGES import com.meloda.fast.database.old.DatabaseUtils.TABLE_MESSAGES
import com.meloda.fast.database.base.Storage import com.meloda.fast.database.old.base.Storage
import com.meloda.fast.util.Utils import com.meloda.fast.util.Utils
import com.meloda.fast.api.model.oldVKMessage import com.meloda.fast.api.model.old.oldVKMessage
import com.meloda.fast.api.model.VKMessageAction import com.meloda.fast.api.model.old.VKMessageAction
import com.meloda.fast.api.model.VKModel import com.meloda.fast.api.model.old.VKModel
import java.util.stream.Collectors import java.util.stream.Collectors
@WorkerThread @WorkerThread
@@ -1,4 +1,4 @@
package com.meloda.fast.database.storage package com.meloda.fast.database.old.storage
import android.content.ContentValues import android.content.ContentValues
import android.database.Cursor import android.database.Cursor
@@ -7,25 +7,25 @@ import android.util.Log
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import com.meloda.fast.api.UserConfig import com.meloda.fast.api.UserConfig
import com.meloda.fast.api.VKUtil import com.meloda.fast.api.VKUtil
import com.meloda.fast.api.model.oldVKUser import com.meloda.fast.api.model.old.oldVKUser
import com.meloda.fast.database.CacheStorage import com.meloda.fast.database.old.CacheStorage
import com.meloda.fast.database.DatabaseKeys.DEACTIVATED import com.meloda.fast.database.old.DatabaseKeys.DEACTIVATED
import com.meloda.fast.database.DatabaseKeys.FIRST_NAME import com.meloda.fast.database.old.DatabaseKeys.FIRST_NAME
import com.meloda.fast.database.DatabaseKeys.FRIEND_ID import com.meloda.fast.database.old.DatabaseKeys.FRIEND_ID
import com.meloda.fast.database.DatabaseKeys.GENDER import com.meloda.fast.database.old.DatabaseKeys.GENDER
import com.meloda.fast.database.DatabaseKeys.IS_ONLINE import com.meloda.fast.database.old.DatabaseKeys.IS_ONLINE
import com.meloda.fast.database.DatabaseKeys.IS_ONLINE_MOBILE import com.meloda.fast.database.old.DatabaseKeys.IS_ONLINE_MOBILE
import com.meloda.fast.database.DatabaseKeys.LAST_NAME import com.meloda.fast.database.old.DatabaseKeys.LAST_NAME
import com.meloda.fast.database.DatabaseKeys.LAST_SEEN import com.meloda.fast.database.old.DatabaseKeys.LAST_SEEN
import com.meloda.fast.database.DatabaseKeys.PHOTOS import com.meloda.fast.database.old.DatabaseKeys.PHOTOS
import com.meloda.fast.database.DatabaseKeys.SCREEN_NAME import com.meloda.fast.database.old.DatabaseKeys.SCREEN_NAME
import com.meloda.fast.database.DatabaseKeys.SORT_ID import com.meloda.fast.database.old.DatabaseKeys.SORT_ID
import com.meloda.fast.database.DatabaseKeys.STATUS import com.meloda.fast.database.old.DatabaseKeys.STATUS
import com.meloda.fast.database.DatabaseKeys.USER_ID import com.meloda.fast.database.old.DatabaseKeys.USER_ID
import com.meloda.fast.database.DatabaseUtils.TABLE_FRIENDS import com.meloda.fast.database.old.DatabaseUtils.TABLE_FRIENDS
import com.meloda.fast.database.DatabaseUtils.TABLE_USERS import com.meloda.fast.database.old.DatabaseUtils.TABLE_USERS
import com.meloda.fast.database.QueryBuilder import com.meloda.fast.database.old.QueryBuilder
import com.meloda.fast.database.base.Storage import com.meloda.fast.database.old.base.Storage
import org.json.JSONObject import org.json.JSONObject
@WorkerThread @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.VKConstants
import com.meloda.fast.api.VKException import com.meloda.fast.api.VKException
import com.meloda.fast.api.VKUtil 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.api.network.request.RequestAuthDirect
import com.meloda.fast.base.viewmodel.BaseViewModel import com.meloda.fast.base.viewmodel.BaseViewModel
import com.meloda.fast.base.viewmodel.StartProgressEvent import com.meloda.fast.base.viewmodel.StartProgressEvent
@@ -18,7 +18,7 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class LoginViewModel @Inject constructor( class LoginViewModel @Inject constructor(
private val repo: AuthRepo private val dataSource: AuthDataSource
) : BaseViewModel() { ) : BaseViewModel() {
fun login( fun login(
@@ -29,7 +29,7 @@ class LoginViewModel @Inject constructor(
) = viewModelScope.launch { ) = viewModelScope.launch {
makeJob( makeJob(
{ {
repo.auth( dataSource.auth(
RequestAuthDirect( RequestAuthDirect(
grantType = VKConstants.Auth.GrantType.PASSWORD, grantType = VKConstants.Auth.GrantType.PASSWORD,
clientId = VKConstants.VK_APP_ID, clientId = VKConstants.VK_APP_ID,
@@ -41,7 +41,7 @@ class LoginViewModel @Inject constructor(
twoFaCode = twoFaCode, twoFaCode = twoFaCode,
captchaSid = captcha?.first, captchaSid = captcha?.first,
captchaKey = captcha?.second captchaKey = captcha?.second
).map )
) )
}, },
onAnswer = { onAnswer = {
@@ -79,7 +79,7 @@ class LoginViewModel @Inject constructor(
} }
fun sendSms(validationSid: String) = viewModelScope.launch { fun sendSms(validationSid: String) = viewModelScope.launch {
makeJob({ repo.sendSms(validationSid) }, makeJob({ dataSource.sendSms(validationSid) },
onAnswer = { sendEvent(CodeSent) }, onAnswer = { sendEvent(CodeSent) },
onError = {}, onError = {},
onStart = {}, onStart = {},
@@ -1,16 +1,12 @@
package com.meloda.fast.screens.messages package com.meloda.fast.screens.messages
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.View import android.view.View
import android.viewbinding.library.fragment.viewBinding import android.viewbinding.library.fragment.viewBinding
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import com.meloda.fast.R import com.meloda.fast.R
import com.meloda.fast.api.LoadManager
import com.meloda.fast.api.model.VkConversation 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.BaseViewModelFragment
import com.meloda.fast.base.viewmodel.StartProgressEvent import com.meloda.fast.base.viewmodel.StartProgressEvent
import com.meloda.fast.base.viewmodel.StopProgressEvent 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.databinding.FragmentConversationsBinding
import com.meloda.fast.util.AndroidUtils import com.meloda.fast.util.AndroidUtils
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import kotlin.math.roundToInt import kotlin.math.roundToInt
import kotlin.system.measureTimeMillis
@AndroidEntryPoint @AndroidEntryPoint
class ConversationsFragment : class ConversationsFragment :
@@ -30,9 +24,6 @@ class ConversationsFragment :
val TAG: String = ConversationsFragment::class.java.name val TAG: String = ConversationsFragment::class.java.name
} }
// @Inject
// lateinit var loadManager: LoadManager
override val viewModel: ConversationsViewModel by viewModels() override val viewModel: ConversationsViewModel by viewModels()
private val binding: FragmentConversationsBinding by viewBinding() private val binding: FragmentConversationsBinding by viewBinding()
@@ -52,7 +43,7 @@ class ConversationsFragment :
override fun onEvent(event: VKEvent) { override fun onEvent(event: VKEvent) {
super.onEvent(event) super.onEvent(event)
when (event) { when (event) {
is ConversationsLoaded -> prepareData(event) is ConversationsLoaded -> refreshConversations(event.conversations)
is StartProgressEvent -> onProgressStarted() is StartProgressEvent -> onProgressStarted()
is StopProgressEvent -> onProgressStopped() is StopProgressEvent -> onProgressStopped()
} }
@@ -74,7 +65,7 @@ class ConversationsFragment :
} }
private fun prepareRecyclerView() { private fun prepareRecyclerView() {
binding.recyclerView.itemAnimator = null
} }
private fun prepareRefreshLayout() { private fun prepareRefreshLayout() {
@@ -100,42 +91,16 @@ class ConversationsFragment :
} }
} }
private fun prepareData(event: ConversationsLoaded) { private fun refreshConversations(conversations: List<VkConversation>) {
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")
fillRecyclerView(conversations) fillRecyclerView(conversations)
lifecycleScope.launch { viewModel.loadSomeUsers(listOf(1, 2, 3, 362877006))
LoadManager.users.load(listOf(1, 2, 3))
}
} }
private fun fillRecyclerView(values: List<VkConversation>) { private fun fillRecyclerView(values: List<VkConversation>) {
adapter.values.clear() adapter.values.clear()
adapter.values += values 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 androidx.lifecycle.viewModelScope
import com.meloda.fast.api.VKConstants import com.meloda.fast.api.VKConstants
import com.meloda.fast.api.model.base.BaseVkConversation import com.meloda.fast.api.datasource.ConversationsDataSource
import com.meloda.fast.api.model.base.BaseVkMessage import com.meloda.fast.api.datasource.UsersDataSource
import com.meloda.fast.api.network.repo.ConversationsRepo import com.meloda.fast.api.model.VkConversation
import com.meloda.fast.api.network.request.ConversationsGetRequest 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.BaseViewModel
import com.meloda.fast.base.viewmodel.StartProgressEvent import com.meloda.fast.base.viewmodel.StartProgressEvent
import com.meloda.fast.base.viewmodel.StopProgressEvent import com.meloda.fast.base.viewmodel.StopProgressEvent
@@ -17,12 +18,13 @@ import javax.inject.Inject
@HiltViewModel @HiltViewModel
class ConversationsViewModel @Inject constructor( class ConversationsViewModel @Inject constructor(
private val repo: ConversationsRepo private val dataSource: ConversationsDataSource,
private val usersDataSource: UsersDataSource
) : BaseViewModel() { ) : BaseViewModel() {
fun loadConversations() = viewModelScope.launch(Dispatchers.Default) { fun loadConversations() = viewModelScope.launch(Dispatchers.Default) {
makeJob({ makeJob({
repo.getAllChats( dataSource.getAllChats(
ConversationsGetRequest( ConversationsGetRequest(
count = 30, count = 30,
fields = "${VKConstants.USER_FIELDS},${VKConstants.GROUP_FIELDS}" fields = "${VKConstants.USER_FIELDS},${VKConstants.GROUP_FIELDS}"
@@ -35,8 +37,11 @@ class ConversationsViewModel @Inject constructor(
ConversationsLoaded( ConversationsLoaded(
count = response.count, count = response.count,
unreadCount = response.unreadCount ?: 0, unreadCount = response.unreadCount ?: 0,
messages = response.items.map { items -> items.lastMessage }, conversations = response.items.map { items ->
conversations = response.items.map { items -> items.conversation } items.conversation.asVkConversation(
items.lastMessage.asVkMessage()
)
}
) )
) )
} }
@@ -52,11 +57,35 @@ class ConversationsViewModel @Inject constructor(
sendEvent(StopProgressEvent) 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( data class ConversationsLoaded(
val count: Int, val count: Int,
val unreadCount: Int, val unreadCount: Int,
val messages: List<BaseVkMessage>, val conversations: List<VkConversation>
val conversations: List<BaseVkConversation>
) : VKEvent() ) : VKEvent()
@@ -6,7 +6,7 @@ import android.os.IBinder
import android.util.Log import android.util.Log
import androidx.annotation.WorkerThread import androidx.annotation.WorkerThread
import com.meloda.fast.api.UserConfig 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 com.meloda.fast.util.AndroidUtils
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONObject import org.json.JSONObject
@@ -5,7 +5,7 @@ import android.graphics.drawable.Drawable
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import com.meloda.fast.R import com.meloda.fast.R
import com.meloda.fast.api.VKUtil 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.common.AppGlobal
import com.meloda.fast.extensions.ContextExtensions.color import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.extensions.ContextExtensions.drawable 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.extensions.ContextExtensions.color
import com.meloda.fast.R import com.meloda.fast.R
import com.meloda.fast.widget.CircleImageView import com.meloda.fast.widget.CircleImageView
import com.meloda.fast.api.model.oldVKUser import com.meloda.fast.api.model.old.oldVKUser
object ViewUtils { object ViewUtils {