New cache system

Refactoring
Separation into libraries
This commit is contained in:
2021-03-17 19:47:53 +03:00
parent 2004cb7c5e
commit 84d812a6d6
198 changed files with 4892 additions and 3477 deletions
@@ -0,0 +1,115 @@
package com.meloda.fast.fragment
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.ProgressBar
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.meloda.concurrent.TaskManager
import com.meloda.fast.R
import com.meloda.fast.adapter.ConversationsAdapterDeprecated
import com.meloda.fast.base.BaseFragment
import com.meloda.fast.database.CacheStorage
import com.meloda.fast.widget.Toolbar
import com.meloda.vksdk.OnResponseListener
import com.meloda.vksdk.VKApi
import com.meloda.vksdk.VKConstants
import com.meloda.vksdk.model.VKConversation
import com.meloda.vksdk.model.VKMessage
class ChatsFragment : BaseFragment() {
private lateinit var toolbar: Toolbar
private lateinit var progressBar: ProgressBar
private lateinit var recyclerView: RecyclerView
private lateinit var refreshLayout: SwipeRefreshLayout
private lateinit var noItemsView: LinearLayout
private lateinit var noInternetView: LinearLayout
private lateinit var errorView: LinearLayout
private lateinit var adapter: ConversationsAdapterDeprecated
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_conversations, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
initViews()
prepareViews()
createAdapter()
loadConversations()
}
private fun initViews() {
toolbar = requireView().findViewById(R.id.toolbar)
progressBar = requireView().findViewById(R.id.progressBar)
recyclerView = requireView().findViewById(R.id.recyclerView)
refreshLayout = requireView().findViewById(R.id.refreshLayout)
noItemsView = requireView().findViewById(R.id.noItemsView)
noInternetView = requireView().findViewById(R.id.noInternetView)
errorView = requireView().findViewById(R.id.errorView)
}
private fun prepareViews() {
prepareRecyclerView()
}
private fun prepareRecyclerView() {
val manager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false)
recyclerView.layoutManager = manager
}
private fun createAdapter() {
adapter = ConversationsAdapterDeprecated(recyclerView, arrayListOf())
recyclerView.adapter = adapter
}
private fun loadConversations() {
TaskManager.execute {
VKApi.messages()
.getConversations()
.filter("all")
.extended(true)
.fields(VKConstants.USER_FIELDS)
.offset(0)
.count(30)
.executeArray(
VKConversation::class.java,
object : OnResponseListener<ArrayList<VKConversation>> {
override fun onResponse(response: ArrayList<VKConversation>) {
TaskManager.execute {
CacheStorage.chatsStorage.insertValues(response)
val lastMessages = arrayListOf<VKMessage>()
response.forEach { lastMessages.add(it.lastMessage) }
CacheStorage.messagesStorage.insertValues(lastMessages)
CacheStorage.usersStorage.insertValues(VKConversation.profiles)
CacheStorage.groupsStorage.insertValues(VKConversation.groups)
}
adapter.updateValues(response)
adapter.notifyDataSetChanged()
}
override fun onError(t: Throwable) {
}
})
}
}
}
@@ -13,22 +13,18 @@ import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.meloda.concurrent.EventInfo
import com.meloda.concurrent.TaskManager
import com.meloda.fast.R
import com.meloda.fast.UserConfig
import com.meloda.fast.activity.MessagesActivityDeprecated
import com.meloda.fast.api.UserConfig
import com.meloda.fast.api.VKApiKeys
import com.meloda.fast.base.BaseFragment
import com.meloda.fast.common.AppGlobal
import com.meloda.fast.common.TaskManager
import com.meloda.fast.event.EventInfo
import com.meloda.fast.extensions.FragmentExtensions.findViewById
import com.meloda.fast.extensions.FragmentExtensions.runOnUiThread
import com.meloda.fast.fragment.ui.presenter.ConversationsPresenterDeprecated
import com.meloda.fast.fragment.ui.view.ConversationsViewDeprecated
import com.meloda.fast.util.AndroidUtils
import com.meloda.fast.util.ViewUtils
import com.meloda.fast.widget.Toolbar
import com.meloda.vksdk.VKApiKeys
@Suppress("UNCHECKED_CAST")
class FragmentConversationsDeprecated : BaseFragment(), ConversationsViewDeprecated {
@@ -62,14 +58,14 @@ class FragmentConversationsDeprecated : BaseFragment(), ConversationsViewDepreca
}
private fun initViews() {
toolbar = findViewById(R.id.toolbar)
recyclerView = findViewById(R.id.recyclerView)
refreshLayout = findViewById(R.id.refreshLayout)
progressBar = findViewById(R.id.progressBar)
toolbar = requireView().findViewById(R.id.toolbar)
recyclerView = requireView().findViewById(R.id.recyclerView)
refreshLayout = requireView().findViewById(R.id.refreshLayout)
progressBar = requireView().findViewById(R.id.progressBar)
noItemsView = findViewById(R.id.noItemsView)
noInternetView = findViewById(R.id.noInternetView)
errorView = findViewById(R.id.errorView)
noItemsView = requireView().findViewById(R.id.noItemsView)
noInternetView = requireView().findViewById(R.id.noInternetView)
errorView = requireView().findViewById(R.id.errorView)
}
private fun prepareToolbar() {
@@ -79,7 +75,7 @@ class FragmentConversationsDeprecated : BaseFragment(), ConversationsViewDepreca
TaskManager.addOnEventListener(object : TaskManager.OnEventListener {
override fun onNewEvent(info: EventInfo<*>) {
if (info.key == VKApiKeys.UPDATE_USER) {
if (info.key == VKApiKeys.UPDATE_USER.name) {
val userIds = info.data as ArrayList<Int>
if (userIds.contains(UserConfig.userId)) {
@@ -100,7 +96,12 @@ class FragmentConversationsDeprecated : BaseFragment(), ConversationsViewDepreca
val decoration = DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)
decoration.setDrawable(
ColorDrawable(AndroidUtils.getThemeAttrColor(requireContext(), R.attr.dividerHorizontal))
ColorDrawable(
AndroidUtils.getThemeAttrColor(
requireContext(),
R.attr.dividerHorizontal
)
)
)
recyclerView.itemAnimator = null
@@ -111,18 +112,22 @@ class FragmentConversationsDeprecated : BaseFragment(), ConversationsViewDepreca
private fun setProfileAvatar() {
TaskManager.execute {
AppGlobal.database.users.getById(UserConfig.userId)?.let {
if (it.photo100.isNotEmpty()) {
runOnUiThread {
toolbar.getAvatar().setImageURI(it.photo100)
}
}
}
// AppGlobal.database.users.getById(UserConfig.userId)?.let {
// if (it.photo100.isNotEmpty()) {
// runOnUiThread {
// toolbar.getAvatar().setImageURI(it.photo100)
// }
// }
// }
}
}
override fun openChat(extras: Bundle) {
startActivity(Intent(requireContext(), MessagesActivityDeprecated::class.java).putExtras(extras))
startActivity(
Intent(requireContext(), MessagesActivityDeprecated::class.java).putExtras(
extras
)
)
}
override fun showErrorSnackbar(t: Throwable) {
@@ -14,21 +14,20 @@ import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.meloda.concurrent.EventInfo
import com.meloda.concurrent.TaskManager
import com.meloda.fast.R
import com.meloda.fast.UserConfig
import com.meloda.fast.activity.MessagesActivityDeprecated
import com.meloda.fast.api.UserConfig
import com.meloda.fast.api.VKApiKeys
import com.meloda.fast.base.BaseFragment
import com.meloda.fast.common.AppGlobal
import com.meloda.fast.common.TaskManager
import com.meloda.fast.event.EventInfo
import com.meloda.fast.extensions.FragmentExtensions.findViewById
import com.meloda.fast.fragment.ui.presenter.FriendsPresenterDeprecated
import com.meloda.fast.fragment.ui.view.FriendsViewDeprecated
import com.meloda.fast.util.ViewUtils
import com.meloda.fast.widget.Toolbar
import com.meloda.vksdk.VKApiKeys
class FragmentFriendsDeprecated(private val userId: Int = 0) : BaseFragment(), FriendsViewDeprecated {
class FragmentFriendsDeprecated(private val userId: Int = 0) : BaseFragment(),
FriendsViewDeprecated {
private lateinit var presenterDeprecated: FriendsPresenterDeprecated
@@ -61,14 +60,14 @@ class FragmentFriendsDeprecated(private val userId: Int = 0) : BaseFragment(), F
}
private fun initViews() {
toolbar = findViewById(R.id.toolbar)
recyclerView = findViewById(R.id.recyclerView)
refreshLayout = findViewById(R.id.refreshLayout)
progressBar = findViewById(R.id.progressBar)
toolbar = requireView().findViewById(R.id.toolbar)
recyclerView = requireView().findViewById(R.id.recyclerView)
refreshLayout = requireView().findViewById(R.id.refreshLayout)
progressBar = requireView().findViewById(R.id.progressBar)
noItemsView = findViewById(R.id.noItemsView)
noInternetView = findViewById(R.id.noInternetView)
errorView = findViewById(R.id.errorView)
noItemsView = requireView().findViewById(R.id.noItemsView)
noInternetView = requireView().findViewById(R.id.noInternetView)
errorView = requireView().findViewById(R.id.errorView)
}
private fun prepareToolbar() {
@@ -80,7 +79,7 @@ class FragmentFriendsDeprecated(private val userId: Int = 0) : BaseFragment(), F
TaskManager.addOnEventListener(object : TaskManager.OnEventListener {
override fun onNewEvent(info: EventInfo<*>) {
if (info.key == VKApiKeys.UPDATE_USER) {
if (info.key == VKApiKeys.UPDATE_USER.name) {
val userId = info.data as ArrayList<Int>
if (userId[0] == UserConfig.userId) {
@@ -93,13 +92,13 @@ class FragmentFriendsDeprecated(private val userId: Int = 0) : BaseFragment(), F
private fun setProfileAvatar() {
TaskManager.execute {
AppGlobal.database.users.getById(UserConfig.userId)?.let {
if (it.photo100.isNotEmpty()) {
runOnUi {
toolbar.getAvatar().setImageURI(it.photo100)
}
}
}
// AppGlobal.database.users.getById(UserConfig.userId)?.let {
// if (it.photo100.isNotEmpty()) {
// runOnUi {
// toolbar.getAvatar().setImageURI(it.photo100)
// }
// }
// }
}
}
@@ -131,7 +130,11 @@ class FragmentFriendsDeprecated(private val userId: Int = 0) : BaseFragment(), F
}
override fun openChat(extras: Bundle) {
startActivity(Intent(requireContext(), MessagesActivityDeprecated::class.java).putExtras(extras))
startActivity(
Intent(requireContext(), MessagesActivityDeprecated::class.java).putExtras(
extras
)
)
}
override fun showErrorSnackbar(t: Throwable) {
@@ -7,12 +7,12 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceScreen
import com.meloda.concurrent.TaskManager
import com.meloda.extensions.ContextExtensions.color
import com.meloda.fast.R
import com.meloda.fast.activity.DropUserDataActivity
import com.meloda.fast.activity.UpdateActivityDeprecated
import com.meloda.fast.common.AppGlobal
import com.meloda.fast.common.TaskManager
import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.util.AndroidUtils
class SettingsFragment : PreferenceFragmentCompat(),
@@ -162,8 +162,8 @@ class SettingsFragment : PreferenceFragmentCompat(),
builder.setMessage("Clear cache?")
builder.setPositiveButton("Yes") { _, _ ->
TaskManager.execute {
AppGlobal.database.users.clear()
AppGlobal.database.groups.clear()
// AppGlobal.database.users.clear()
// AppGlobal.database.groups.clear()
}
}
builder.setNegativeButton("No", null)
@@ -10,8 +10,8 @@ import android.webkit.CookieManager
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.core.os.bundleOf
import com.meloda.fast.api.VKAuth
import com.meloda.fast.base.BaseFragment
import com.meloda.vksdk.VKAuth
class ValidationFragment : BaseFragment() {
@@ -0,0 +1,85 @@
package com.meloda.fast.fragment.ui.presenter
import android.os.Bundle
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.meloda.fast.adapter.ChatsAdapter
import com.meloda.fast.common.TimeManager
import com.meloda.fast.fragment.ui.repository.ChatsRepository
import com.meloda.fast.fragment.ui.view.ChatsView
import com.meloda.fast.listener.ItemClickListener
import com.meloda.fast.listener.ItemLongClickListener
import com.meloda.fast.util.AndroidUtils
import com.meloda.mvp.MvpOnLoadListener
import com.meloda.mvp.MvpPresenter
import com.meloda.vksdk.model.VKConversation
class ChatsPresenter(viewState: ChatsView) :
MvpPresenter<VKConversation, ChatsRepository, ChatsView>(
viewState, ChatsRepository::class.java.name
),
ItemClickListener,
ItemLongClickListener,
TimeManager.OnMinuteChangeListener {
companion object {
const val DEFAULT_CONVERSATIONS_COUNT = 30
}
private lateinit var adapter: ChatsAdapter
override fun onViewCreated(bundle: Bundle?) {
viewState.initViews()
}
fun setup(recyclerView: RecyclerView, refreshLayout: SwipeRefreshLayout) {
viewState.prepareViews()
createAdapter()
}
private fun createAdapter() {
adapter = ChatsAdapter(requireContext(), arrayListOf()).also {
it.itemClickListener = this
it.itemLongClickListener = this
}
}
private fun fillAdapter(conversations: ArrayList<VKConversation>, offset: Int) {
}
private fun getCachedConversations(
offset: Int = 0,
count: Int = DEFAULT_CONVERSATIONS_COUNT,
listener: MvpOnLoadListener? = null
) {
listener?.onSuccess()
}
private fun loadConversations(
offset: Int = 0,
count: Int = DEFAULT_CONVERSATIONS_COUNT,
listener: MvpOnLoadListener? = null
) {
if (AndroidUtils.hasConnection()) {
} else {
}
}
override fun onItemClick(position: Int) {
TODO("Not yet implemented")
}
override fun onItemLongClick(position: Int) {
TODO("Not yet implemented")
}
override fun onMinuteChange(currentMinute: Int) {
TODO("Not yet implemented")
}
}
@@ -1,27 +1,22 @@
package com.meloda.fast.fragment.ui.presenter
import android.os.Bundle
import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.meloda.arrayutils.ArrayUtils
import com.meloda.fast.BuildConfig
import com.meloda.fast.activity.MessagesActivityDeprecated
import com.meloda.fast.adapter.ConversationsAdapterDeprecated
import com.meloda.fast.adapter.diffutil.ConversationsCallbackDeprecated
import com.meloda.fast.api.model.VKConversation
import com.meloda.fast.api.util.VKUtil
import com.meloda.fast.common.TaskManager
import com.meloda.fast.common.TimeManager
import com.meloda.fast.database.MemoryCache
import com.meloda.fast.fragment.ui.repository.ConversationsRepositoryDeprecated
import com.meloda.fast.fragment.ui.view.ConversationsViewDeprecated
import com.meloda.fast.listener.ItemClickListener
import com.meloda.fast.listener.ItemLongClickListener
import com.meloda.fast.util.AndroidUtils
import com.meloda.fast.util.ArrayUtils
import com.meloda.mvp.MvpOnLoadListener
import com.meloda.mvp.MvpOnResponseListener
import com.meloda.mvp.MvpPresenter
import com.meloda.vksdk.model.VKConversation
import java.util.*
class ConversationsPresenterDeprecated(viewState: ConversationsViewDeprecated) :
@@ -89,7 +84,7 @@ class ConversationsPresenterDeprecated(viewState: ConversationsViewDeprecated) :
setState(ListState.FILLED_LOADING)
if (AndroidUtils.hasConnection()) {
loadConversations(adapter.itemCount, DEFAULT_CONVERSATIONS_COUNT,
object : MvpOnLoadListener<Any?> {
object : MvpOnResponseListener<Any?> {
override fun onResponse(response: Any?) {
recyclerView.scrollToPosition(position)
@@ -102,7 +97,7 @@ class ConversationsPresenterDeprecated(viewState: ConversationsViewDeprecated) :
})
} else {
getCachedConversations(adapter.itemCount, DEFAULT_CONVERSATIONS_COUNT,
object : MvpOnLoadListener<Any?> {
object : MvpOnResponseListener<Any?> {
override fun onResponse(response: Any?) {
recyclerView.scrollToPosition(position)
@@ -130,12 +125,12 @@ class ConversationsPresenterDeprecated(viewState: ConversationsViewDeprecated) :
private fun getCachedConversations(
offset: Int = 0,
count: Int = DEFAULT_CONVERSATIONS_COUNT,
listener: MvpOnLoadListener<Any?>? = null
listener: MvpOnResponseListener<Any?>? = null
) {
setState(if (adapter.isEmpty()) ListState.EMPTY_LOADING else ListState.FILLED_LOADING)
repository.getCachedConversations(offset, count,
object : MvpOnLoadListener<ArrayList<VKConversation>> {
object : MvpOnResponseListener<ArrayList<VKConversation>> {
override fun onResponse(response: ArrayList<VKConversation>) {
conversationsCount = response.size
@@ -159,7 +154,7 @@ class ConversationsPresenterDeprecated(viewState: ConversationsViewDeprecated) :
private fun loadConversations(
offset: Int = 0,
count: Int = DEFAULT_CONVERSATIONS_COUNT,
listener: MvpOnLoadListener<Any?>? = null
listener: MvpOnResponseListener<Any?>? = null
) {
if (!AndroidUtils.hasConnection()) {
setState(if (adapter.isEmpty()) ListState.EMPTY_NO_INTERNET else ListState.FILLED)
@@ -169,7 +164,7 @@ class ConversationsPresenterDeprecated(viewState: ConversationsViewDeprecated) :
}
repository.loadConversations(offset, count,
object : MvpOnLoadListener<ArrayList<VKConversation>> {
object : MvpOnResponseListener<ArrayList<VKConversation>> {
override fun onResponse(response: ArrayList<VKConversation>) {
conversationsCount = VKConversation.conversationsCount
@@ -225,30 +220,36 @@ class ConversationsPresenterDeprecated(viewState: ConversationsViewDeprecated) :
}
override fun onMinuteChange(currentMinute: Int) {
post { adapter.notifyItemRangeChanged(0, adapter.itemCount, ConversationsCallbackDeprecated.DATE) }
post {
adapter.notifyItemRangeChanged(
0,
adapter.itemCount,
ConversationsCallbackDeprecated.DATE
)
}
}
private fun openChat(conversation: VKConversation) {
TaskManager.execute {
val peerUser = MemoryCache.getUserById(conversation.conversationId)
val peerGroup = MemoryCache.getGroupById(conversation.conversationId)
val extras = Bundle().also {
it.putInt(MessagesActivityDeprecated.TAG_EXTRA_ID, conversation.conversationId)
it.putString(
MessagesActivityDeprecated.TAG_EXTRA_TITLE,
VKUtil.getTitle(conversation, peerUser, peerGroup)
)
it.putString(
MessagesActivityDeprecated.TAG_EXTRA_AVATAR,
VKUtil.getAvatar(conversation, peerUser, peerGroup)
)
it.putSerializable(MessagesActivityDeprecated.TAG_EXTRA_USER, peerUser)
it.putSerializable(MessagesActivityDeprecated.TAG_EXTRA_GROUP, peerGroup)
}
post { viewState.openChat(extras) }
}
// TaskManager.execute {
// val peerUser = MemoryCache.getUserById(conversation.conversationId)
// val peerGroup = MemoryCache.getGroupById(conversation.conversationId)
//
// val extras = Bundle().also {
// it.putInt(MessagesActivityDeprecated.TAG_EXTRA_ID, conversation.conversationId)
// it.putString(
// MessagesActivityDeprecated.TAG_EXTRA_TITLE,
// VKUtil.getTitle(conversation, peerUser, peerGroup)
// )
// it.putString(
// MessagesActivityDeprecated.TAG_EXTRA_AVATAR,
// VKUtil.getAvatar(conversation, peerUser, peerGroup)
// )
// it.putSerializable(MessagesActivityDeprecated.TAG_EXTRA_USER, peerUser)
// it.putSerializable(MessagesActivityDeprecated.TAG_EXTRA_GROUP, peerGroup)
// }
//
// post { viewState.openChat(extras) }
// }
}
@@ -5,16 +5,16 @@ import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.meloda.arrayutils.ArrayUtils
import com.meloda.fast.activity.MessagesActivityDeprecated
import com.meloda.fast.adapter.UsersAdapterDeprecated
import com.meloda.fast.api.model.VKUser
import com.meloda.fast.fragment.ui.repository.FriendsRepositoryDeprecated
import com.meloda.fast.fragment.ui.view.FriendsViewDeprecated
import com.meloda.fast.listener.ItemClickListener
import com.meloda.fast.util.AndroidUtils
import com.meloda.fast.util.ArrayUtils
import com.meloda.mvp.MvpOnLoadListener
import com.meloda.mvp.MvpOnResponseListener
import com.meloda.mvp.MvpPresenter
import com.meloda.vksdk.model.VKUser
class FriendsPresenterDeprecated(viewState: FriendsViewDeprecated) :
MvpPresenter<VKUser, FriendsRepositoryDeprecated, FriendsViewDeprecated>(
@@ -48,7 +48,7 @@ class FriendsPresenterDeprecated(viewState: FriendsViewDeprecated) :
createAdapter()
getCachedFriends(userId, 0, DEFAULT_FRIENDS_COUNT, false, object : MvpOnLoadListener<Any?> {
getCachedFriends(userId, 0, DEFAULT_FRIENDS_COUNT, false, object : MvpOnResponseListener<Any?> {
override fun onResponse(response: Any?) {
setState(if (adapter.isEmpty()) MvpPresenter.ListState.EMPTY_LOADING else ListState.FILLED_LOADING)
loadFriends(userId, 0, DEFAULT_FRIENDS_COUNT)
@@ -66,7 +66,7 @@ class FriendsPresenterDeprecated(viewState: FriendsViewDeprecated) :
offset: Int = 0,
count: Int = DEFAULT_FRIENDS_COUNT,
onlyOnline: Boolean = false,
listener: MvpOnLoadListener<Any?>? = null
listener: MvpOnResponseListener<Any?>? = null
) {
setState(if (adapter.isEmpty()) ListState.EMPTY_LOADING else ListState.FILLED_LOADING)
@@ -75,7 +75,7 @@ class FriendsPresenterDeprecated(viewState: FriendsViewDeprecated) :
offset,
count,
onlyOnline,
object : MvpOnLoadListener<ArrayList<VKUser>> {
object : MvpOnResponseListener<ArrayList<VKUser>> {
override fun onResponse(response: ArrayList<VKUser>) {
val friends = ArrayUtils.cut(response, offset, count)
@@ -99,7 +99,7 @@ class FriendsPresenterDeprecated(viewState: FriendsViewDeprecated) :
offset: Int = 0,
count: Int = DEFAULT_FRIENDS_COUNT,
onlyOnline: Boolean = false,
listener: MvpOnLoadListener<Any?>? = null
listener: MvpOnResponseListener<Any?>? = null
) {
if (!AndroidUtils.hasConnection()) {
setState(if (adapter.isEmpty()) ListState.EMPTY_NO_INTERNET else ListState.FILLED)
@@ -112,7 +112,7 @@ class FriendsPresenterDeprecated(viewState: FriendsViewDeprecated) :
userId,
offset,
count,
object : MvpOnLoadListener<ArrayList<VKUser>> {
object : MvpOnResponseListener<ArrayList<VKUser>> {
override fun onResponse(response: ArrayList<VKUser>) {
friendsCount = VKUser.friendsCount
@@ -151,7 +151,7 @@ class FriendsPresenterDeprecated(viewState: FriendsViewDeprecated) :
adapter.itemCount,
DEFAULT_FRIENDS_COUNT,
false,
object : MvpOnLoadListener<Any?> {
object : MvpOnResponseListener<Any?> {
override fun onResponse(response: Any?) {
recyclerView.scrollToPosition(position)
@@ -168,7 +168,7 @@ class FriendsPresenterDeprecated(viewState: FriendsViewDeprecated) :
adapter.itemCount,
DEFAULT_FRIENDS_COUNT,
false,
object : MvpOnLoadListener<Any?> {
object : MvpOnResponseListener<Any?> {
override fun onResponse(response: Any?) {
recyclerView.scrollToPosition(position)
@@ -11,18 +11,20 @@ import androidx.core.view.isVisible
import androidx.fragment.app.setFragmentResultListener
import com.google.android.material.textfield.TextInputEditText
import com.meloda.fast.R
import com.meloda.fast.activity.MainActivityDeprecated
import com.meloda.fast.api.UserConfig
import com.meloda.fast.extensions.FragmentExtensions.runOnUiThread
import com.meloda.fast.fragment.FragmentConversationsDeprecated
import com.meloda.fast.UserConfig
import com.meloda.fast.activity.MainActivity
import com.meloda.fast.common.AppGlobal
import com.meloda.fast.fragment.ChatsFragment
import com.meloda.fast.fragment.LoginFragment
import com.meloda.fast.fragment.ValidationFragment
import com.meloda.fast.fragment.ui.repository.LoginRepository
import com.meloda.fast.fragment.ui.view.LoginView
import com.meloda.mvp.MvpOnLoadListener
import com.meloda.mvp.MvpOnResponseListener
import com.meloda.mvp.MvpPresenter
import com.meloda.vksdk.VKApi
import com.squareup.picasso.Picasso
import org.json.JSONObject
import java.util.*
class LoginPresenter(
@@ -51,19 +53,19 @@ class LoginPresenter(
email: String,
password: String,
captcha: String = "",
onLoadListener: MvpOnLoadListener<Any?>? = null
onResponseListener: MvpOnResponseListener<Any?>? = null
) {
lastEmail = email
lastPassword = password
repository.login(requireContext(), email, password, captcha,
object : MvpOnLoadListener<JSONObject> {
object : MvpOnResponseListener<JSONObject> {
override fun onResponse(response: JSONObject) {
checkResponse(response, onLoadListener)
checkResponse(response, onResponseListener)
}
override fun onError(t: Throwable) {
onLoadListener?.onError(t)
onResponseListener?.onError(t)
}
})
}
@@ -71,7 +73,7 @@ class LoginPresenter(
@Suppress("MoveVariableDeclarationIntoWhen")
private fun checkResponse(
response: JSONObject,
onLoadListener: MvpOnLoadListener<Any?>? = null
onResponseListener: MvpOnResponseListener<Any?>? = null
) {
if (response.has("error")) {
val errorString = response.optString("error")
@@ -113,18 +115,20 @@ class LoginPresenter(
openMainScreen()
onLoadListener?.onResponse(null)
onResponseListener?.onResponse(null)
}
}
private fun openMainScreen() {
fragment.runOnUiThread {
(fragment.requireActivity() as MainActivityDeprecated).bottomBar.isVisible = true
VKApi.init(Locale.getDefault().language, UserConfig.token, AppGlobal.handler)
(fragment.requireActivity() as MainActivity).bottomBar.isVisible = true
fragment.parentFragmentManager.beginTransaction()
.replace(
R.id.fragmentContainer,
FragmentConversationsDeprecated()
ChatsFragment()
).commit()
}
}
@@ -0,0 +1,7 @@
package com.meloda.fast.fragment.ui.repository
import com.meloda.mvp.MvpRepository
import com.meloda.vksdk.model.VKConversation
class ChatsRepository : MvpRepository<VKConversation>() {
}
@@ -1,29 +1,26 @@
package com.meloda.fast.fragment.ui.repository
import com.meloda.fast.api.VKApi
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.api.util.VKUtil
import com.meloda.fast.common.TaskManager
import com.meloda.fast.database.MemoryCache
import com.meloda.fast.extensions.ArrayExtensions.asArrayList
import com.meloda.fast.listener.OnResponseListener
import com.meloda.mvp.MvpOnLoadListener
import com.meloda.concurrent.TaskManager
import com.meloda.mvp.MvpOnResponseListener
import com.meloda.mvp.MvpRepository
import com.meloda.vksdk.OnResponseListener
import com.meloda.vksdk.VKApi
import com.meloda.vksdk.VKConstants
import com.meloda.vksdk.model.VKConversation
import com.meloda.vksdk.model.VKMessage
class ConversationsRepositoryDeprecated : MvpRepository<VKConversation>() {
fun loadConversations(
offset: Int, count: Int,
listener: MvpOnLoadListener<ArrayList<VKConversation>>
listener: MvpOnResponseListener<ArrayList<VKConversation>>
) {
TaskManager.execute {
VKApi.messages()
.getConversations()
.filter("all")
.extended(true)
.fields(VKUser.DEFAULT_FIELDS)
.fields(VKConstants.USER_FIELDS)
.offset(offset)
.count(count)
.executeArray(VKConversation::class.java,
@@ -32,8 +29,8 @@ class ConversationsRepositoryDeprecated : MvpRepository<VKConversation>() {
TaskManager.execute {
cacheLoadedConversations(response)
MemoryCache.putUsers(VKConversation.profiles)
MemoryCache.putGroups(VKConversation.groups)
// MemoryCache.putUsers(VKConversation.profiles)
// MemoryCache.putGroups(VKConversation.groups)
sendResponse(listener, response)
}
@@ -48,18 +45,18 @@ class ConversationsRepositoryDeprecated : MvpRepository<VKConversation>() {
fun getCachedConversations(
offset: Int, count: Int,
listener: MvpOnLoadListener<ArrayList<VKConversation>>
listener: MvpOnResponseListener<ArrayList<VKConversation>>
) {
if (true) {
sendResponse(listener, arrayListOf())
return
}
TaskManager.execute {
val conversations = MemoryCache.getConversations().asArrayList()
// val conversations = MemoryCache.getConversations().asArrayList()
//
// VKUtil.sortConversationsByDate(conversations, true)
VKUtil.sortConversationsByDate(conversations, true)
sendResponse(listener, conversations)
// sendResponse(listener, conversations)
}
}
@@ -68,27 +65,27 @@ class ConversationsRepositoryDeprecated : MvpRepository<VKConversation>() {
val lastMessage = conversation.lastMessage
when (conversation.type) {
VKConversation.TYPE_USER -> {
VKUtil.searchUser(conversation.conversationId)?.let {
conversation.peerUser = it
}
VKConversation.Type.USER -> {
// VKUtil.searchUser(conversation.conversationId)?.let {
// conversation.peerUser = it
// }
}
VKConversation.TYPE_GROUP -> {
VKUtil.searchGroup(conversation.conversationId)?.let {
conversation.peerGroup = it
}
VKConversation.Type.GROUP -> {
// VKUtil.searchGroup(conversation.conversationId)?.let {
// conversation.peerGroup = it
// }
}
}
if (lastMessage.isFromGroup()) {
VKUtil.searchGroup(lastMessage.fromId)?.let {
lastMessage.fromGroup = it
}
// VKUtil.searchGroup(lastMessage.fromId)?.let {
// lastMessage.fromGroup = it
// }
} else {
VKUtil.searchUser(lastMessage.fromId)?.let {
lastMessage.fromUser = it
}
// VKUtil.searchUser(lastMessage.fromId)?.let {
// lastMessage.fromUser = it
// }
}
}
}
@@ -100,7 +97,7 @@ class ConversationsRepositoryDeprecated : MvpRepository<VKConversation>() {
messages.add(conversation.lastMessage)
}
MemoryCache.putMessages(messages)
MemoryCache.putConversations(conversations)
// MemoryCache.putMessages(messages)
// MemoryCache.putConversations(conversations)
}
}
@@ -1,14 +1,13 @@
package com.meloda.fast.fragment.ui.repository
import android.util.Log
import com.meloda.fast.api.VKApi
import com.meloda.fast.api.model.VKFriend
import com.meloda.fast.api.model.VKUser
import com.meloda.fast.common.TaskManager
import com.meloda.fast.database.MemoryCache
import com.meloda.fast.listener.OnResponseListener
import com.meloda.mvp.MvpOnLoadListener
import com.meloda.concurrent.TaskManager
import com.meloda.mvp.MvpOnResponseListener
import com.meloda.mvp.MvpRepository
import com.meloda.vksdk.OnResponseListener
import com.meloda.vksdk.VKApi
import com.meloda.vksdk.VKConstants
import com.meloda.vksdk.model.VKUser
class FriendsRepositoryDeprecated : MvpRepository<VKUser>() {
@@ -16,14 +15,14 @@ class FriendsRepositoryDeprecated : MvpRepository<VKUser>() {
userId: Int,
offset: Int,
count: Int,
listener: MvpOnLoadListener<ArrayList<VKUser>>
listener: MvpOnResponseListener<ArrayList<VKUser>>
) {
TaskManager.execute {
VKApi.friends()
.get()
.order("hints")
.userId(userId)
.fields(VKUser.DEFAULT_FIELDS)
.fields(VKConstants.USER_FIELDS)
.count(count)
.offset(offset)
.executeArray(VKUser::class.java,
@@ -47,43 +46,43 @@ class FriendsRepositoryDeprecated : MvpRepository<VKUser>() {
fun getCachedFriends(
userId: Int, offset: Int, count: Int, onlyOnline: Boolean,
listener: MvpOnLoadListener<ArrayList<VKUser>>
listener: MvpOnResponseListener<ArrayList<VKUser>>
) {
TaskManager.execute {
val friendsArray = MemoryCache.getFriends(userId)
Log.d("FriendsRepository", "get ${friendsArray.size} friends from cache")
if (friendsArray.isEmpty()) {
sendError(listener, NullPointerException("Friends list is empty"))
return@execute
}
val friends = arrayListOf<VKUser>()
for (friend in friendsArray) {
val user = MemoryCache.getUserById(friend.friendId)
user?.let {
if (onlyOnline && user.isOnline || !onlyOnline) {
friends.add(user)
}
}
}
sendResponse(listener, friends)
}
// TaskManager.execute {
// val friendsArray = MemoryCache.getFriends(userId)
//
// Log.d("FriendsRepository", "get ${friendsArray.size} friends from cache")
//
// if (friendsArray.isEmpty()) {
// sendError(listener, NullPointerException("Friends list is empty"))
// return@execute
// }
//
// val friends = arrayListOf<VKUser>()
//
// for (friend in friendsArray) {
// val user = MemoryCache.getUserById(friend.friendId)
//
// user?.let {
// if (onlyOnline && user.isOnline || !onlyOnline) {
// friends.add(user)
// }
// }
// }
//
// sendResponse(listener, friends)
// }
}
private fun cacheLoadedUsers(userId: Int, users: ArrayList<VKUser>) {
MemoryCache.putUsers(users)
// MemoryCache.putUsers(users)
//
// val friends = ArrayList<VKFriend>()
//
// for (user in users) {
// friends.add(VKFriend(user.userId, userId))
// }
val friends = ArrayList<VKFriend>()
for (user in users) {
friends.add(VKFriend(user.userId, userId))
}
MemoryCache.putFriends(friends)
// MemoryCache.putFriends(friends)
}
}
@@ -6,9 +6,9 @@ import android.webkit.CookieManager
import android.webkit.JavascriptInterface
import android.webkit.WebView
import android.webkit.WebViewClient
import com.meloda.fast.api.VKAuth
import com.meloda.mvp.MvpOnLoadListener
import com.meloda.mvp.MvpOnResponseListener
import com.meloda.mvp.MvpRepository
import com.meloda.vksdk.VKAuth
import org.json.JSONObject
import org.jsoup.Jsoup
@@ -19,14 +19,14 @@ class LoginRepository : MvpRepository<Any>() {
email: String,
password: String,
captcha: String,
onLoadListener: MvpOnLoadListener<JSONObject>
onResponseListener: MvpOnResponseListener<JSONObject>
) {
if (email.trim().isEmpty() || password.trim().isEmpty()) return
val loadingUrl = VKAuth.getDirectAuthUrl(email, password, captcha)
val webView = createWebView(context)
webView.addJavascriptInterface(WebViewHandlerInterface(onLoadListener), "HtmlHandler")
webView.addJavascriptInterface(WebViewHandlerInterface(onResponseListener), "HtmlHandler")
webView.webViewClient = object : WebViewClient() {
override fun onPageFinished(view: WebView?, url: String?) {
webView.loadUrl(
@@ -58,7 +58,7 @@ class LoginRepository : MvpRepository<Any>() {
return loginWebView
}
private class WebViewHandlerInterface(private var onLoadListener: MvpOnLoadListener<JSONObject>) {
private class WebViewHandlerInterface(private var onResponseListener: MvpOnResponseListener<JSONObject>) {
@JavascriptInterface
fun handleHtml(html: String?) {
val doc = Jsoup.parse(html)
@@ -68,7 +68,7 @@ class LoginRepository : MvpRepository<Any>() {
.first()
.text()
onLoadListener.onResponse(JSONObject(responseString))
onResponseListener.onResponse(JSONObject(responseString))
}
}
}
@@ -0,0 +1,11 @@
package com.meloda.fast.fragment.ui.view
import com.meloda.mvp.MvpView
interface ChatsView : MvpView {
fun initViews()
fun prepareViews()
}