From 202a0bef5f060a1eb4f9042af223459189212fd0 Mon Sep 17 00:00:00 2001 From: VitaliyDovbnya Date: Tue, 14 Jan 2025 19:13:35 +0100 Subject: [PATCH] 0.10.1 --- README.md | 2 +- ui-kit/build.gradle | 2 +- .../source/remote/RemoteDataSourceImpl.kt | 27 ++++++++++++++----- .../dialogs/DialogsComponentImpl.kt | 1 + .../dialogs/LinearLayoutManagerWrapper.kt | 27 +++++++++++++++++++ .../screens/dialogs/DialogsFragment.kt | 9 +++++++ .../screens/dialogs/DialogsViewModel.kt | 4 ++- .../src/main/res/layout/dialogs_component.xml | 1 - 8 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/components/dialogs/LinearLayoutManagerWrapper.kt diff --git a/README.md b/README.md index 72c7fa0..2692d42 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Then need to add implementation of QuickBlox UIKit and QuickBlox SDK to dependen ``` dependencies { - implementation "com.quickblox:android-ui-kit:0.10.0" + implementation "com.quickblox:android-ui-kit:0.10.1" implementation 'com.quickblox:quickblox-android-sdk-messages:4.2.2' implementation 'com.quickblox:quickblox-android-sdk-chat:4.2.2' diff --git a/ui-kit/build.gradle b/ui-kit/build.gradle index 6bf2216..9ca01a6 100644 --- a/ui-kit/build.gradle +++ b/ui-kit/build.gradle @@ -10,7 +10,7 @@ ext { qbSdkVersion = '4.2.2' uiKitVersionCode = 1 - uiKitVersionName = "0.10.0" + uiKitVersionName = "0.10.1" } android { diff --git a/ui-kit/src/main/java/com/quickblox/android_ui_kit/data/source/remote/RemoteDataSourceImpl.kt b/ui-kit/src/main/java/com/quickblox/android_ui_kit/data/source/remote/RemoteDataSourceImpl.kt index 82c19c5..e709bb4 100644 --- a/ui-kit/src/main/java/com/quickblox/android_ui_kit/data/source/remote/RemoteDataSourceImpl.kt +++ b/ui-kit/src/main/java/com/quickblox/android_ui_kit/data/source/remote/RemoteDataSourceImpl.kt @@ -35,6 +35,7 @@ import com.quickblox.chat.JIDHelper import com.quickblox.chat.QBAbstractChat import com.quickblox.chat.QBChatService import com.quickblox.chat.QBGroupChat +import com.quickblox.chat.QBGroupChatManager import com.quickblox.chat.QBRestChatService import com.quickblox.chat.model.QBChatDialog import com.quickblox.chat.model.QBChatMessage @@ -1052,20 +1053,32 @@ open class RemoteDataSourceImpl : RemoteDataSource { val groupChatManager = QBChatService.getInstance().groupChatManager val fields = groupChatManager.javaClass.declaredFields - val dialogsField: Field = fields[1] - dialogsField.isAccessible = true + for (field in fields) { + if (isGroupChatField(groupChatManager, field)) { + field.isAccessible = true - val dialogsFieldValue = dialogsField.get(groupChatManager) + val dialogsFieldValue = field.get(groupChatManager) - if (dialogsFieldValue is Map<*, *>) { - val dialogs = dialogsFieldValue as Map - for ((jid, groupChat) in dialogs) { - joinGroupDialog(groupChat) + val dialogs = dialogsFieldValue as Map + for ((jid, groupChat) in dialogs) { + joinGroupDialog(groupChat) + } + break } } } } + private fun isGroupChatField(groupChatManager: QBGroupChatManager, field: Field): Boolean { + try { + val dialogsFieldValue = field.get(groupChatManager) as Map + val isFirstKeyString = dialogsFieldValue.keys.toList().get(0) is String + return isFirstKeyString + } catch (e: Exception) { + return false + } + } + private fun joinGroupDialog(groupChat: QBGroupChat) { // TODO: Need to add Exception handling try { diff --git a/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/components/dialogs/DialogsComponentImpl.kt b/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/components/dialogs/DialogsComponentImpl.kt index b93396d..0229ebc 100644 --- a/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/components/dialogs/DialogsComponentImpl.kt +++ b/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/components/dialogs/DialogsComponentImpl.kt @@ -50,6 +50,7 @@ class DialogsComponentImpl : LinearLayoutCompat, DialogsComponent { binding?.rvDialogs?.background = ColorDrawable(theme.getMainBackgroundColor()) binding?.rvDialogs?.itemAnimator = null binding?.rvDialogs?.adapter = adapter as Adapter<*> + binding?.rvDialogs?.layoutManager = LinearLayoutManagerWrapper(context) adapter?.setTheme(theme) adapter?.setDialogAdapterListener(DialogAdapterListenerImpl()) diff --git a/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/components/dialogs/LinearLayoutManagerWrapper.kt b/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/components/dialogs/LinearLayoutManagerWrapper.kt new file mode 100644 index 0000000..c40bf2b --- /dev/null +++ b/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/components/dialogs/LinearLayoutManagerWrapper.kt @@ -0,0 +1,27 @@ +/* + * Created by Injoit on 9.1.2025. + * Copyright © 2025 Quickblox. All rights reserved. + */ + +package com.quickblox.android_ui_kit.presentation.components.dialogs + +import android.content.Context +import android.util.Log +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.quickblox.android_ui_kit.BuildConfig + +class LinearLayoutManagerWrapper( + context: Context, orientation: Int = RecyclerView.VERTICAL, reverseLayout: Boolean = false, +) : LinearLayoutManager(context, orientation, reverseLayout) { + + override fun onLayoutChildren(recycler: RecyclerView.Recycler, state: RecyclerView.State) { + try { + super.onLayoutChildren(recycler, state) + } catch (e: IndexOutOfBoundsException) { + if (BuildConfig.DEBUG) { + Log.d("LinearLayoutManager", "IndexOutOfBoundsException in onLayoutChildren", e) + } + } + } +} \ No newline at end of file diff --git a/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/screens/dialogs/DialogsFragment.kt b/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/screens/dialogs/DialogsFragment.kt index 8357e26..576dcc5 100644 --- a/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/screens/dialogs/DialogsFragment.kt +++ b/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/screens/dialogs/DialogsFragment.kt @@ -137,15 +137,22 @@ open class DialogsFragment : BaseFragment() { DialogsViewModel.DialogChangeType.UPDATED_RANGE -> { adapter.notifyItemRangeChanged(0, index) } + DialogsViewModel.DialogChangeType.UPDATED -> { adapter.notifyItemChanged(index) } + DialogsViewModel.DialogChangeType.ADDED -> { adapter.notifyItemInserted(index) } + DialogsViewModel.DialogChangeType.DELETED -> { adapter.notifyItemRemoved(index) } + + DialogsViewModel.DialogChangeType.CLEARED -> { + adapter.notifyItemRangeRemoved(0, index) + } } } } @@ -209,9 +216,11 @@ open class DialogsFragment : BaseFragment() { DialogEntity.Types.GROUP -> { startGroupChatActivity(dialogEntity) } + DialogEntity.Types.PRIVATE -> { startPrivateChatActivity(dialogEntity) } + else -> { showToast(getString(R.string.wrong_dialog_type)) } diff --git a/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/screens/dialogs/DialogsViewModel.kt b/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/screens/dialogs/DialogsViewModel.kt index f4ae019..932f112 100644 --- a/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/screens/dialogs/DialogsViewModel.kt +++ b/ui-kit/src/main/java/com/quickblox/android_ui_kit/presentation/screens/dialogs/DialogsViewModel.kt @@ -28,7 +28,7 @@ class DialogsViewModel : BaseViewModel() { private val TAG: String = DialogsViewModel::class.java.simpleName enum class DialogChangeType { - ADDED, UPDATED, UPDATED_RANGE, DELETED + ADDED, UPDATED, UPDATED_RANGE, DELETED, CLEARED } private var connectionRepository = QuickBloxUiKit.getDependency().getConnectionRepository() @@ -117,7 +117,9 @@ class DialogsViewModel : BaseViewModel() { getDialogsJob?.cancel() foundDialogs?.let { + val lastIndex = dialogs.lastIndex dialogs.clear() + _updatedDialogs.postValue(Pair(DialogChangeType.CLEARED, lastIndex)) for (dialog in it) { dialogs.add(dialog) diff --git a/ui-kit/src/main/res/layout/dialogs_component.xml b/ui-kit/src/main/res/layout/dialogs_component.xml index 6452ad2..4727487 100644 --- a/ui-kit/src/main/res/layout/dialogs_component.xml +++ b/ui-kit/src/main/res/layout/dialogs_component.xml @@ -59,7 +59,6 @@ android:clipToPadding="false" android:orientation="vertical" android:paddingBottom="8dp" - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:listitem="@layout/dialog_group_item" />