From e0524a4459dbfa0af3444d5303772d6415eb2a3c Mon Sep 17 00:00:00 2001 From: "sha.sdk_deployment" Date: Thu, 4 Jan 2024 05:20:45 +0000 Subject: [PATCH] Added v3.12.0 --- CHANGELOG.md | 24 ++++ gradle.properties | 2 +- .../aichatbot/AIChatBotHomeActivity.kt | 21 ++- .../uikit/samples/basic/BasicHomeActivity.kt | 19 ++- .../livestream/LiveStreamActivity.kt | 12 +- .../uikit/samples/common/SplashActivity.kt | 9 +- .../uikit/samples/common/ThemeHomeActivity.kt | 37 +++++ .../samples/common/widgets/EntryButton.kt | 28 +++- .../customization/channel/MessageUISample.kt | 2 +- .../channel/NewMessageTypeSample.kt | 2 +- .../notification/NotificationHomeActivity.kt | 19 ++- .../res/drawable-hdpi/img_groupchannel.png | Bin 4113 -> 0 bytes .../res/drawable-hdpi/img_openchannel.png | Bin 4772 -> 0 bytes .../res/drawable-mdpi/img_groupchannel.png | Bin 2474 -> 0 bytes .../res/drawable-mdpi/img_openchannel.png | Bin 3071 -> 0 bytes .../res/drawable-xhdpi/img_groupchannel.png | Bin 5576 -> 0 bytes .../res/drawable-xhdpi/img_openchannel.png | Bin 6305 -> 0 bytes .../res/drawable-xxhdpi/img_groupchannel.png | Bin 8756 -> 0 bytes .../res/drawable-xxhdpi/img_openchannel.png | Bin 10031 -> 0 bytes .../res/drawable-xxxhdpi/img_groupchannel.png | Bin 12124 -> 0 bytes .../res/drawable-xxxhdpi/img_openchannel.png | Bin 13728 -> 0 bytes ...selector_home_channel_type_button_dark.xml | 16 +++ .../selector_home_signout_button_dark.xml | 19 +++ .../res/layout-land/activity_live_stream.xml | 16 +-- .../res/layout/activity_ai_chatbot_home.xml | 2 +- .../layout/activity_customization_home.xml | 8 +- .../src/main/res/layout/activity_home.xml | 6 +- .../main/res/layout/activity_live_stream.xml | 14 +- .../src/main/res/layout/activity_login.xml | 14 +- .../res/layout/activity_notification_home.xml | 6 +- .../src/main/res/layout/activity_splash.xml | 2 +- .../res/layout/fragment_sample_settings.xml | 22 +-- .../layout/view_channel_list_item_preview.xml | 22 +-- .../main/res/layout/view_custom_header.xml | 4 +- .../layout/view_custom_menu_icon_button.xml | 4 +- .../res/layout/view_custom_message_me.xml | 4 +- .../res/layout/view_custom_message_others.xml | 76 ---------- .../src/main/res/layout/view_custom_tab.xml | 6 +- .../layout/view_customization_list_header.xml | 2 +- .../src/main/res/layout/view_entry_button.xml | 12 +- .../res/layout/view_live_stream_list_item.xml | 16 +-- .../src/main/res/layout/view_select_user.xml | 6 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - .../res/mipmap-hdpi/ic_launcher_round.png | Bin 3318 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 2063 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 4468 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 7285 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 11168 -> 0 bytes uikit-samples/src/main/res/values/attrs.xml | 9 ++ uikit-samples/src/main/res/values/styles.xml | 22 +++ .../src/main/res/values/styles_dark.xml | 32 +++++ .../adapter/BaseMessageListAdapter.java | 13 +- .../OpenChannelMessageListAdapter.java | 1 - .../activities/adapter/ThreadListAdapter.java | 1 - .../GroupChannelMessageViewHolder.java | 3 +- .../viewholder/MyMessageViewHolder.kt | 77 ++++++++++ .../viewholder/OtherMessageViewHolder.kt | 77 ++++++++++ .../sendbird/uikit/annotation/Experimental.kt | 6 + .../FeedNotificationChannelFragment.java | 1 + .../uikit/interfaces/EmojiReactionHandler.kt | 13 ++ .../MessageListAdapterExtensions.kt | 1 + .../MessageListComponentExtensions.kt | 1 + .../uikit/internal/extensions/Utils.kt | 6 + .../OnImpressionDetectedListener.kt | 9 ++ .../internal/ui/messages/MyMessageView.kt | 104 ++++++++++++++ .../ui/messages/MyQuotedMessageView.kt | 6 +- .../internal/ui/messages/OtherMessageView.kt | 116 +++++++++++++++ .../ui/messages/OtherQuotedMessageView.kt | 6 +- .../FeedNotificationListComponent.kt | 24 +++- .../MyImageFileMessageViewHolder.kt | 2 +- .../MyVideoFileMessageViewHolder.kt | 2 +- .../OpenChannelImageFileMessageViewHolder.kt | 2 +- .../OpenChannelVideoFileMessageViewHolder.kt | 2 +- .../OtherImageFileMessageViewHolder.kt | 2 +- .../OtherVideoFileMessageViewHolder.kt | 2 +- .../ui/widgets/NotificationRecyclerView.kt | 23 +++ .../utils/NotificationImpressionTracker.kt | 110 ++++++++++++++ .../com/sendbird/uikit/model/TextUIConfig.kt | 12 +- .../model/configurations/ChannelConfig.kt | 2 - .../uikit/vm/BaseMessageListViewModel.java | 31 +++- .../sendbird/uikit/vm/ChannelViewModel.java | 42 ++++-- .../vm/FeedNotificationChannelViewModel.java | 14 ++ .../uikit/vm/MessageThreadViewModel.java | 41 ++++-- uikit/src/main/res/anim/no_animation.xml | 11 -- uikit/src/main/res/layout/sb_activity.xml | 5 +- .../res/layout/sb_fragment_photo_view.xml | 20 +-- .../sb_view_admin_message_component.xml | 4 +- .../res/layout/sb_view_channel_list_item.xml | 24 ++-- .../layout/sb_view_channel_profile_input.xml | 18 ++- .../layout/sb_view_channel_push_setting.xml | 10 +- .../layout/sb_view_channel_settings_info.xml | 4 +- .../sb_view_chat_notification_component.xml | 7 +- ...b_view_chat_notification_recycler_view.xml | 2 +- uikit/src/main/res/layout/sb_view_dialog.xml | 9 +- .../res/layout/sb_view_dialog_list_item.xml | 7 +- .../res/layout/sb_view_emoji_component.xml | 5 +- .../sb_view_emoji_reaction_component.xml | 7 +- ...sb_view_emoji_reaction_count_component.xml | 9 +- .../sb_view_emoji_reaction_user_component.xml | 4 +- .../sb_view_feed_notification_component.xml | 7 +- .../layout/sb_view_form_field_component.xml | 19 +-- .../layout/sb_view_form_message_component.xml | 11 +- uikit/src/main/res/layout/sb_view_header.xml | 12 +- .../layout/sb_view_image_file_component.xml | 6 +- .../res/layout/sb_view_member_list_item.xml | 16 ++- .../layout/sb_view_mention_limit_alert.xml | 10 +- .../main/res/layout/sb_view_message_input.xml | 28 ++-- .../res/layout/sb_view_message_preview.xml | 20 +-- .../layout/sb_view_message_recycler_view.xml | 12 +- ...b_view_my_file_image_message_component.xml | 18 +-- .../sb_view_my_file_message_component.xml | 12 +- ...b_view_my_file_video_message_component.xml | 14 +- .../main/res/layout/sb_view_my_message.xml | 6 + .../layout/sb_view_my_message_component.xml | 127 +++++++++++++++++ .../res/layout/sb_view_my_message_status.xml | 3 +- ...ew_my_multiple_files_message_component.xml | 10 +- .../res/layout/sb_view_my_quoted_message.xml | 31 ++-- .../sb_view_my_user_message_component.xml | 6 +- .../sb_view_my_voice_message_component.xml | 6 +- uikit/src/main/res/layout/sb_view_ogtag.xml | 16 ++- ...w_open_channel_admin_message_component.xml | 4 +- ...n_channel_file_image_message_component.xml | 20 +-- ...ew_open_channel_file_message_component.xml | 18 ++- ...n_channel_file_video_message_component.xml | 19 ++- .../res/layout/sb_view_open_channel_list.xml | 5 - .../layout/sb_view_open_channel_list_item.xml | 21 +-- .../res/layout/sb_view_open_channel_ogtag.xml | 6 +- .../sb_view_open_channel_settings_info.xml | 6 +- ...ew_open_channel_user_message_component.xml | 15 +- ...iew_other_file_image_message_component.xml | 22 ++- .../sb_view_other_file_message_component.xml | 20 ++- ...iew_other_file_video_message_component.xml | 22 ++- .../main/res/layout/sb_view_other_message.xml | 6 + .../sb_view_other_message_component.xml | 134 ++++++++++++++++++ ...other_multiple_files_message_component.xml | 14 +- .../layout/sb_view_other_quoted_message.xml | 31 ++-- .../sb_view_other_user_message_component.xml | 11 +- .../sb_view_other_voice_message_component.xml | 12 +- .../layout/sb_view_parent_message_info.xml | 29 ++-- .../main/res/layout/sb_view_search_bar.xml | 31 ++-- .../layout/sb_view_select_channel_type.xml | 13 +- .../res/layout/sb_view_single_menu_item.xml | 12 +- .../main/res/layout/sb_view_state_header.xml | 9 +- .../main/res/layout/sb_view_status_frame.xml | 10 +- .../sb_view_suggested_mention_list_item.xml | 9 +- .../sb_view_suggested_reply_component.xml | 2 +- .../main/res/layout/sb_view_thread_info.xml | 2 +- .../sb_view_time_line_message_component.xml | 2 +- uikit/src/main/res/layout/sb_view_toast.xml | 16 ++- .../res/layout/sb_view_user_list_item.xml | 6 +- .../main/res/layout/sb_view_user_profile.xml | 15 +- .../main/res/layout/sb_view_voice_message.xml | 8 +- .../layout/sb_view_voice_message_input.xml | 30 ++-- .../main/res/values/content_descriptions.xml | 49 +++++++ 154 files changed, 1781 insertions(+), 656 deletions(-) create mode 100644 uikit-samples/src/main/java/com/sendbird/uikit/samples/common/ThemeHomeActivity.kt delete mode 100644 uikit-samples/src/main/res/drawable-hdpi/img_groupchannel.png delete mode 100644 uikit-samples/src/main/res/drawable-hdpi/img_openchannel.png delete mode 100644 uikit-samples/src/main/res/drawable-mdpi/img_groupchannel.png delete mode 100644 uikit-samples/src/main/res/drawable-mdpi/img_openchannel.png delete mode 100644 uikit-samples/src/main/res/drawable-xhdpi/img_groupchannel.png delete mode 100644 uikit-samples/src/main/res/drawable-xhdpi/img_openchannel.png delete mode 100644 uikit-samples/src/main/res/drawable-xxhdpi/img_groupchannel.png delete mode 100644 uikit-samples/src/main/res/drawable-xxhdpi/img_openchannel.png delete mode 100644 uikit-samples/src/main/res/drawable-xxxhdpi/img_groupchannel.png delete mode 100644 uikit-samples/src/main/res/drawable-xxxhdpi/img_openchannel.png create mode 100644 uikit-samples/src/main/res/drawable/selector_home_channel_type_button_dark.xml create mode 100644 uikit-samples/src/main/res/drawable/selector_home_signout_button_dark.xml delete mode 100644 uikit-samples/src/main/res/layout/view_custom_message_others.xml delete mode 100644 uikit-samples/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 uikit-samples/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 uikit-samples/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 uikit-samples/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 uikit-samples/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 uikit-samples/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 uikit-samples/src/main/res/values/styles_dark.xml create mode 100644 uikit/src/main/java/com/sendbird/uikit/activities/viewholder/MyMessageViewHolder.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/activities/viewholder/OtherMessageViewHolder.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/annotation/Experimental.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/interfaces/EmojiReactionHandler.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/internal/interfaces/OnImpressionDetectedListener.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyMessageView.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherMessageView.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/internal/utils/NotificationImpressionTracker.kt delete mode 100644 uikit/src/main/res/anim/no_animation.xml create mode 100644 uikit/src/main/res/layout/sb_view_my_message.xml create mode 100644 uikit/src/main/res/layout/sb_view_my_message_component.xml delete mode 100644 uikit/src/main/res/layout/sb_view_open_channel_list.xml create mode 100644 uikit/src/main/res/layout/sb_view_other_message.xml create mode 100644 uikit/src/main/res/layout/sb_view_other_message_component.xml create mode 100644 uikit/src/main/res/values/content_descriptions.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index e9889068..f73a965e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,28 @@ # Changelog +### v3.12.0 (Jan, 2024) with Chat SDK `v4.13.0` +* Added `sendLogImpression(List)` in `FeedNotificationChannelViewModel`. +* Improved performance of scrolling in Message List. + +**MyMessageViewHolder** and **OtherMessageViewHolder**: +* Added `MyMessageViewHolder` and `OtherMessageViewHolder` to provide a basic UI frame for single message. +* These ViewHolders include UI elements such as 'message sent time,' 'nickname,' 'profile,' and 'sending status,' excluding the content area. +* Customers can now customize only the content area. Note: This feature is currently experimental. + +**BaseMessageListViewModel.buildMessageList()**: +* Added `BaseMessageListViewModel.buildMessageList()` to allow customers to customize the message list before delivering it to the view. + +```kotlin +class CustomChannelViewModel( + channelUrl: String +) : ChannelViewModel(channelUrl, null) { + override fun buildMessageList(): List { + return super.buildMessageList().map { message -> + // Customize the message here + message + } + } +} +``` ### v3.11.0 (Nov 29, 2023) with Chat SDK `v4.13.0` * `VIEW_TYPE_TYPING_INDICATOR` is a new typing indicator UI that can be turned on through `typingIndicatorTypes` option. When turned on, it will be displayed in `ChannelFragment` upon receiving typing event in real time. * Added `typingIndicatorTypes` in `ChannelConfig`. diff --git a/gradle.properties b/gradle.properties index bcae3b09..1807ad16 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,5 +16,5 @@ org.gradle.jvmargs=-Xmx1536m # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true -UIKIT_VERSION = 3.11.0 +UIKIT_VERSION = 3.12.0 UIKIT_VERSION_CODE = 1 diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/aichatbot/AIChatBotHomeActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/aichatbot/AIChatBotHomeActivity.kt index 663eb58a..5e679e0b 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/aichatbot/AIChatBotHomeActivity.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/aichatbot/AIChatBotHomeActivity.kt @@ -1,21 +1,28 @@ package com.sendbird.uikit.samples.aichatbot import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity import com.sendbird.uikit.SendbirdUIKit +import com.sendbird.uikit.samples.R +import com.sendbird.uikit.samples.common.ThemeHomeActivity import com.sendbird.uikit.samples.common.extensions.logout import com.sendbird.uikit.samples.common.widgets.WaitingDialog import com.sendbird.uikit.samples.databinding.ActivityAiChatbotHomeBinding import com.sendbird.uikit.utils.ContextUtils -class AIChatBotHomeActivity : AppCompatActivity() { +class AIChatBotHomeActivity : ThemeHomeActivity() { + override val binding by lazy { ActivityAiChatbotHomeBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - ActivityAiChatbotHomeBinding.inflate(layoutInflater).apply { - setContentView(root) - chatbotButton.setOnClickListener { startChatWithAiBot() } - btSignOut.setOnClickListener { logout() } - } + binding.chatbotButton.setOnClickListener { startChatWithAiBot() } + binding.btSignOut.setOnClickListener { logout() } + } + + override fun applyTheme() { + super.applyTheme() + binding.btSignOut.setBackgroundResource( + if (isDarkTheme) R.drawable.selector_home_signout_button_dark + else R.drawable.selector_home_signout_button + ) } private fun startChatWithAiBot() { diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/BasicHomeActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/BasicHomeActivity.kt index 55fe5114..bff20306 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/BasicHomeActivity.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/BasicHomeActivity.kt @@ -10,7 +10,6 @@ import android.provider.Settings import android.view.View import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog -import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat import androidx.core.content.PermissionChecker @@ -23,13 +22,15 @@ import com.sendbird.android.user.UnreadMessageCount import com.sendbird.android.user.User import com.sendbird.uikit.samples.R import com.sendbird.uikit.samples.basic.openchannel.OpenChannelMainActivity +import com.sendbird.uikit.samples.common.ThemeHomeActivity import com.sendbird.uikit.samples.common.extensions.logout +import com.sendbird.uikit.samples.common.extensions.setTextColorResource import com.sendbird.uikit.samples.databinding.ActivityHomeBinding import com.sendbird.uikit.utils.ContextUtils import java.util.Locale -class BasicHomeActivity : AppCompatActivity() { - private lateinit var binding: ActivityHomeBinding +class BasicHomeActivity : ThemeHomeActivity() { + override val binding by lazy { ActivityHomeBinding.inflate(layoutInflater) } private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { } private val appSettingLauncher = @@ -37,7 +38,7 @@ class BasicHomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - this.binding = ActivityHomeBinding.inflate(layoutInflater).apply { + binding.apply { groupChannelButton.setOnClickListener { startActivity(Intent(this@BasicHomeActivity, GroupChannelMainActivity::class.java)) } @@ -61,7 +62,15 @@ class BasicHomeActivity : AppCompatActivity() { requestPermissionLauncher.launch(permission) } } - setContentView(binding.root) + } + + override fun applyTheme() { + super.applyTheme() + binding.mainTitle.setTextColorResource(if (isDarkTheme) R.color.ondark_01 else R.color.onlight_01) + binding.btSignOut.setBackgroundResource( + if (isDarkTheme) R.drawable.selector_home_signout_button_dark + else R.drawable.selector_home_signout_button + ) } override fun onResume() { diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/livestream/LiveStreamActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/livestream/LiveStreamActivity.kt index a8c86b7c..d8a187ce 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/livestream/LiveStreamActivity.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/livestream/LiveStreamActivity.kt @@ -79,7 +79,7 @@ class LiveStreamActivity : AppCompatActivity() { } addChannelHandler() ivLive.visibility = View.VISIBLE - ivLive.setOnClickListener {groupLiveControl.toggleVisibility() } + ivLive.setOnClickListener { groupLiveControl.toggleVisibility() } ivClose.setOnClickListener { finish() } ivChatToggle?.setOnClickListener { if (sbFragmentContainer.visibility == View.GONE) { @@ -189,11 +189,11 @@ class LiveStreamActivity : AppCompatActivity() { private fun hideSystemUI() { if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or - View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or - View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or - View.SYSTEM_UI_FLAG_FULLSCREEN or - View.SYSTEM_UI_FLAG_LOW_PROFILE or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_FULLSCREEN or + View.SYSTEM_UI_FLAG_LOW_PROFILE or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY } } diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/SplashActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/SplashActivity.kt index cc998fe2..45c5094c 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/SplashActivity.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/SplashActivity.kt @@ -9,9 +9,11 @@ import com.sendbird.uikit.samples.BaseApplication.Companion.initStateChanges import com.sendbird.uikit.samples.R import com.sendbird.uikit.samples.common.consts.InitState import com.sendbird.uikit.samples.common.extensions.authenticate +import com.sendbird.uikit.samples.common.extensions.isUsingDarkTheme import com.sendbird.uikit.samples.common.extensions.startingIntent import com.sendbird.uikit.samples.common.preferences.PreferenceUtils import com.sendbird.uikit.samples.common.widgets.WaitingDialog +import com.sendbird.uikit.samples.databinding.ActivitySplashBinding /** * Displays a splash screen. @@ -20,7 +22,12 @@ import com.sendbird.uikit.samples.common.widgets.WaitingDialog class SplashActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_splash) + ActivitySplashBinding.inflate(layoutInflater).apply { + setContentView(root) + val isDarkTheme = PreferenceUtils.themeMode.isUsingDarkTheme() + val backgroundRedId = if (isDarkTheme) R.color.background_600 else R.color.background_50 + root.setBackgroundResource(backgroundRedId) + } initStateChanges().observe(this) { initState: InitState -> Logger.i("++ init state : %s", initState) WaitingDialog.dismiss() diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/ThemeHomeActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/ThemeHomeActivity.kt new file mode 100644 index 00000000..50a9466e --- /dev/null +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/ThemeHomeActivity.kt @@ -0,0 +1,37 @@ +package com.sendbird.uikit.samples.common + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding +import com.sendbird.uikit.samples.R +import com.sendbird.uikit.samples.common.extensions.isUsingDarkTheme +import com.sendbird.uikit.samples.common.preferences.PreferenceUtils + +abstract class ThemeHomeActivity : AppCompatActivity() { + abstract val binding: ViewBinding + val isDarkTheme: Boolean + get() = PreferenceUtils.themeMode.isUsingDarkTheme() + private var currentThemeMode = PreferenceUtils.themeMode + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setTheme(if (PreferenceUtils.themeMode.isUsingDarkTheme()) R.style.AppTheme_Dark else R.style.AppTheme) + setContentView(binding.root) + applyTheme() + } + + override fun onResume() { + super.onResume() + if (currentThemeMode != PreferenceUtils.themeMode) { + currentThemeMode = PreferenceUtils.themeMode + recreate() + } + } + + open fun applyTheme() { + val backgroundRedId = if (isDarkTheme) R.color.background_600 else R.color.background_50 + binding.apply { + root.setBackgroundResource(backgroundRedId) + } + } +} diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/widgets/EntryButton.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/widgets/EntryButton.kt index 191269e8..2380ed25 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/widgets/EntryButton.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/widgets/EntryButton.kt @@ -8,11 +8,15 @@ import android.view.View import android.view.ViewOutlineProvider import android.widget.FrameLayout import com.sendbird.uikit.samples.R +import com.sendbird.uikit.samples.common.extensions.setAppearance import com.sendbird.uikit.samples.databinding.ViewEntryButtonBinding import com.sendbird.uikit.samples.utils.toDp +import com.sendbird.uikit.utils.DrawableUtils class EntryButton @JvmOverloads constructor( - context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = R.attr.widget_entry_button ) : FrameLayout(context, attrs, defStyleAttr) { private val binding: ViewEntryButtonBinding var unreadCountVisibility: Int @@ -42,6 +46,28 @@ class EntryButton @JvmOverloads constructor( binding.description.visibility = View.GONE } } + + a.getResourceId( + R.styleable.EntryButton_background_color, + R.drawable.selector_home_channel_type_button + ).apply { binding.root.setBackgroundResource(this) } + a.getColorStateList(R.styleable.EntryButton_icon_tint).apply { + binding.chevron.setImageDrawable( + DrawableUtils.setTintList( + getContext(), + R.drawable.icon_chevron_right, + this + ) + ) + } + a.getResourceId( + R.styleable.EntryButton_title_text_appearance, + R.style.EntryButtonTitle + ).apply { binding.title.setAppearance(context, this) } + a.getResourceId( + R.styleable.EntryButton_description_text_appearance, + R.style.EntryButtonDescription + ).apply { binding.description.setAppearance(context, this) } } finally { a.recycle() } diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channel/MessageUISample.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channel/MessageUISample.kt index 0f4e5c71..baadc009 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channel/MessageUISample.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channel/MessageUISample.kt @@ -127,7 +127,7 @@ class MessageUISampleAdapter( val binding: ViewCustomMessageMeBinding ) : GroupChannelMessageViewHolder(binding.root) { override fun setEmojiReaction( - reactionList: MutableList, + reactionList: List, emojiReactionClickListener: OnItemClickListener?, emojiReactionLongClickListener: OnItemLongClickListener?, moreButtonClickListener: View.OnClickListener? diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channel/NewMessageTypeSample.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channel/NewMessageTypeSample.kt index 314d6771..27b4c7a9 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channel/NewMessageTypeSample.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channel/NewMessageTypeSample.kt @@ -94,7 +94,7 @@ class NewMessageTypeSampleAdapter( val binding: ViewCustomMessageMeBinding ) : GroupChannelMessageViewHolder(binding.root) { override fun setEmojiReaction( - reactionList: MutableList, + reactionList: List, emojiReactionClickListener: OnItemClickListener?, emojiReactionLongClickListener: OnItemLongClickListener?, moreButtonClickListener: View.OnClickListener? diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/notification/NotificationHomeActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/notification/NotificationHomeActivity.kt index bcf15e07..79dd1b85 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/notification/NotificationHomeActivity.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/notification/NotificationHomeActivity.kt @@ -4,17 +4,21 @@ import android.content.Intent import android.os.Bundle import android.view.View import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding import com.sendbird.uikit.activities.FeedNotificationChannelActivity +import com.sendbird.uikit.samples.R +import com.sendbird.uikit.samples.common.ThemeHomeActivity import com.sendbird.uikit.samples.common.extensions.getFeedChannelUrl import com.sendbird.uikit.samples.common.extensions.logout +import com.sendbird.uikit.samples.common.extensions.setTextColorResource import com.sendbird.uikit.samples.common.preferences.PreferenceUtils import com.sendbird.uikit.samples.databinding.ActivityNotificationHomeBinding -class NotificationHomeActivity : AppCompatActivity() { +class NotificationHomeActivity : ThemeHomeActivity() { + override val binding: ActivityNotificationHomeBinding by lazy { ActivityNotificationHomeBinding.inflate(layoutInflater) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - ActivityNotificationHomeBinding.inflate(layoutInflater).apply { - setContentView(root) + binding.apply { chatAndFeedButton.visibility = if (PreferenceUtils.isUsingFeedChannelOnly) View.GONE else View.VISIBLE chatAndFeedButton.setOnClickListener { startActivity(Intent(this@NotificationHomeActivity, NotificationMainActivity::class.java)) @@ -31,4 +35,13 @@ class NotificationHomeActivity : AppCompatActivity() { btSignOut.setOnClickListener { logout() } } } + + override fun applyTheme() { + super.applyTheme() + binding.mainTitle.setTextColorResource(if (isDarkTheme) R.color.ondark_01 else R.color.onlight_01) + binding.btSignOut.setBackgroundResource( + if (isDarkTheme) R.drawable.selector_home_signout_button_dark + else R.drawable.selector_home_signout_button + ) + } } diff --git a/uikit-samples/src/main/res/drawable-hdpi/img_groupchannel.png b/uikit-samples/src/main/res/drawable-hdpi/img_groupchannel.png deleted file mode 100644 index bfc290ef07415216b1660ad79f7a9da83600eca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4113 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 P00000NkvXXu0mjfvFWaT diff --git a/uikit-samples/src/main/res/drawable-hdpi/img_openchannel.png b/uikit-samples/src/main/res/drawable-hdpi/img_openchannel.png deleted file mode 100644 index eba504a98895e83a612d730da15051882fd787b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4772 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 diff --git a/uikit-samples/src/main/res/drawable-mdpi/img_openchannel.png b/uikit-samples/src/main/res/drawable-mdpi/img_openchannel.png deleted file mode 100644 index 3344e7c04c8bc59af548d2761557acf7ee8b4693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3071 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 AwEzGB diff --git a/uikit-samples/src/main/res/drawable-xhdpi/img_openchannel.png b/uikit-samples/src/main/res/drawable-xhdpi/img_openchannel.png deleted file mode 100644 index 0e3016ab1e972828e2eff4d0259ded595b29af3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6305 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 W$UGRG;Qrt50R46 diff --git a/uikit-samples/src/main/res/drawable-xxhdpi/img_groupchannel.png b/uikit-samples/src/main/res/drawable-xxhdpi/img_groupchannel.png deleted file mode 100644 index 1eb6acd45f8548811ebd37c412db26cba3ed0800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8756 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 z 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 C{(7G6lJv#5Dovp1C+9Uo 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 + + + + + + + + + + + + + + + diff --git a/uikit-samples/src/main/res/drawable/selector_home_signout_button_dark.xml b/uikit-samples/src/main/res/drawable/selector_home_signout_button_dark.xml new file mode 100644 index 00000000..328f550e --- /dev/null +++ b/uikit-samples/src/main/res/drawable/selector_home_signout_button_dark.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/uikit-samples/src/main/res/layout-land/activity_live_stream.xml b/uikit-samples/src/main/res/layout-land/activity_live_stream.xml index 3cc43770..dcce1648 100644 --- a/uikit-samples/src/main/res/layout-land/activity_live_stream.xml +++ b/uikit-samples/src/main/res/layout-land/activity_live_stream.xml @@ -5,7 +5,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - - - \ No newline at end of file + diff --git a/uikit-samples/src/main/res/layout/activity_ai_chatbot_home.xml b/uikit-samples/src/main/res/layout/activity_ai_chatbot_home.xml index faa0ca20..9149bab6 100644 --- a/uikit-samples/src/main/res/layout/activity_ai_chatbot_home.xml +++ b/uikit-samples/src/main/res/layout/activity_ai_chatbot_home.xml @@ -35,7 +35,7 @@ android:layout_marginEnd="@dimen/sb_size_24" android:layout_marginBottom="@dimen/sb_size_32"/> - + android:layout_height="match_parent"> - - + android:paddingTop="@dimen/sb_size_24"> - - - - - - - - \ No newline at end of file + diff --git a/uikit-samples/src/main/res/layout/activity_login.xml b/uikit-samples/src/main/res/layout/activity_login.xml index 25b08c83..f0837977 100644 --- a/uikit-samples/src/main/res/layout/activity_login.xml +++ b/uikit-samples/src/main/res/layout/activity_login.xml @@ -13,7 +13,7 @@ android:paddingLeft="@dimen/sb_size_24" android:paddingRight="@dimen/sb_size_24"> - - - - - - - + android:paddingTop="@dimen/sb_size_24"> - - - - - - - - - - - - - \ No newline at end of file + diff --git a/uikit-samples/src/main/res/layout/view_channel_list_item_preview.xml b/uikit-samples/src/main/res/layout/view_channel_list_item_preview.xml index adfb35e8..56a27b5d 100644 --- a/uikit-samples/src/main/res/layout/view_channel_list_item_preview.xml +++ b/uikit-samples/src/main/res/layout/view_channel_list_item_preview.xml @@ -9,7 +9,7 @@ android:paddingRight="@dimen/sb_size_16" android:paddingBottom="@dimen/sb_size_10"> - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/uikit-samples/src/main/res/layout/view_custom_message_me.xml b/uikit-samples/src/main/res/layout/view_custom_message_me.xml index 4a3eb7f8..af3a3875 100644 --- a/uikit-samples/src/main/res/layout/view_custom_message_me.xml +++ b/uikit-samples/src/main/res/layout/view_custom_message_me.xml @@ -10,7 +10,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - - - - - - - - - - diff --git a/uikit-samples/src/main/res/layout/view_custom_tab.xml b/uikit-samples/src/main/res/layout/view_custom_tab.xml index d0e02c6b..2a7ad73f 100644 --- a/uikit-samples/src/main/res/layout/view_custom_tab.xml +++ b/uikit-samples/src/main/res/layout/view_custom_tab.xml @@ -11,13 +11,13 @@ android:layout_width="wrap_content" android:layout_height="match_parent"> - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/uikit-samples/src/main/res/layout/view_select_user.xml b/uikit-samples/src/main/res/layout/view_select_user.xml index f80e0a07..fea0df78 100644 --- a/uikit-samples/src/main/res/layout/view_select_user.xml +++ b/uikit-samples/src/main/res/layout/view_select_user.xml @@ -10,14 +10,14 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - - \ No newline at end of file diff --git a/uikit-samples/src/main/res/mipmap-hdpi/ic_launcher_round.png b/uikit-samples/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 003f0ffa5f452f4bcb2c0e0678e129bade8756d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3318 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 AtN;K2 diff --git a/uikit-samples/src/main/res/mipmap-mdpi/ic_launcher_round.png b/uikit-samples/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 10662c82c80afebf05961ff77dc3956592e597e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2063 zcmV+q2=MobP)=wuxda&G2n@IuxdY|KWmILlNXMtVZnRhsQ_|Eq|@B2RQ z<@?SqSTM&AV@yM`h$I?+Ll_?zi)R-+tPd@|kR(dxe=#JnBx|_fI!0z}6y|!U!0G#X zlI@R^MtZZ>ZBhD;|Ik*MSy8X9^-u}(;NPg*xi0#KvP_|>f5(Kyb2PBJQj z4kjrd=-7qRW@a3jP|Z%D65(Rxg*`#3Bx*!|my-3nCAnF4Vwcm)ny%Q{$zA#xgBRuK zdpeeVc$5wFxCLV<)d?7tywFooQL+31FNhl1?e;{8^%X4-@Zas2J$R`gPKNv4YQ2+> zVuAJb_3fDA1!-z>xm=Z@a38dpi{*pKxo<|9!|GLy1)WZJO%e;5K!MQf_3LPmO-x}* z0XrMchaxp)Hmbn#X_c^|F4!6x8sY-QO-xI~uN|B|ekJN4+e899jDYu@9)n;b(Xdl8i&JCuciQslve(*V2nrF^t`^(a9cmeVOECosS4I99>+5u}f^@TN zaciz}C@MhlYQA{!;)Z|%wY9bDLQwz(C#c)^7?{=M5wa8jiW%j@3ZSbDw&1btI#!-NCZyOOJ~K}CI+&n>1+LxY+E&6SRbE0D3@zzo9^ifMFUV4#^WFO@cOQIuPA)fB*H zc>#`+ zw$m}xkyfj<)BRdkWUNowM@zvgx3Lj1b$55y64uA3Yz4$PsH>~n3yvw#2xUIp;E{%} zoL6k({Djd@?G7s|D+7I^rfe(4?b((sTb?5q^~h~0$p);h+#YuD<-d+GyYgm6*iusV z>D{zx)9Robd#=%=)z#GpaTX)&q^EhoLhW?+x1(XD4J@w&9vCFnKMagP&xa%$#SRY- zw+4%a$^vUp5I=rtWT*BTW|VCZuv(ddCByw&gzZ@XEGa2jq;x8`I3pt?o;LVyeykXv z60CKa3Qfj7gU}b1Wm#C~O{Y+JhG-{swb;tCs6|MpZW9fj*l|KhR9F-#vp84Nyx6l&f zBo1j8y$#v}Jm;AR{g4-H(?*MxmX@Xglj_l;n3@t265yhzo0^&mum`2jyqru=1MhGG3qy<|-&CNTIo3#u`{FB0odm zIT)0BYURq6n{#q<4z{(m)fx;23oM8V&QH+T^pE(G5MxkPi7FOq;cGDm=E9sI<@s=U zgD%qanUZP(!#$YU-p=USnIhJ6~ zBS(%rl;2E1ndKY^0&in%Z0svrw{CqiK0f{}2(EDt|Knp;@n@pv{l^}`Jc3No+1dFB tj}y^5`2E9UT$b^B(VXAWcqSY?{~uV+?$XlqS-}7R002ovPDHLkV1mbD)5QP) diff --git a/uikit-samples/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/uikit-samples/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 7a8b3a119aa113092c59554f9de2b92bcb131e61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4468 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 P00000NkvXXu0mjfNT&t_ diff --git a/uikit-samples/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/uikit-samples/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 081618e4a35f8b43aeb79bc440767f7c5a815cd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11168 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 diff --git a/uikit-samples/src/main/res/values/attrs.xml b/uikit-samples/src/main/res/values/attrs.xml index ca5de23c..5f76902a 100644 --- a/uikit-samples/src/main/res/values/attrs.xml +++ b/uikit-samples/src/main/res/values/attrs.xml @@ -1,7 +1,16 @@ + + + + + + + + + diff --git a/uikit-samples/src/main/res/values/styles.xml b/uikit-samples/src/main/res/values/styles.xml index 519251e7..b19d6c56 100644 --- a/uikit-samples/src/main/res/values/styles.xml +++ b/uikit-samples/src/main/res/values/styles.xml @@ -6,6 +6,14 @@ @color/primary_300 @color/primary_500 @color/secondary_300 + @style/Widget.EntryButton + + + + + + diff --git a/uikit-samples/src/main/res/values/styles_dark.xml b/uikit-samples/src/main/res/values/styles_dark.xml new file mode 100644 index 00000000..d33afb48 --- /dev/null +++ b/uikit-samples/src/main/res/values/styles_dark.xml @@ -0,0 +1,32 @@ + + + + + + + + + + diff --git a/uikit/src/main/java/com/sendbird/uikit/activities/adapter/BaseMessageListAdapter.java b/uikit/src/main/java/com/sendbird/uikit/activities/adapter/BaseMessageListAdapter.java index e3aa6584..25194ea5 100644 --- a/uikit/src/main/java/com/sendbird/uikit/activities/adapter/BaseMessageListAdapter.java +++ b/uikit/src/main/java/com/sendbird/uikit/activities/adapter/BaseMessageListAdapter.java @@ -20,10 +20,10 @@ import com.sendbird.android.message.Reaction; import com.sendbird.android.user.User; import com.sendbird.uikit.R; -import com.sendbird.uikit.activities.viewholder.GroupChannelMessageViewHolder; import com.sendbird.uikit.activities.viewholder.MessageType; import com.sendbird.uikit.activities.viewholder.MessageViewHolder; import com.sendbird.uikit.activities.viewholder.MessageViewHolderFactory; +import com.sendbird.uikit.interfaces.EmojiReactionHandler; import com.sendbird.uikit.interfaces.MessageDisplayDataProvider; import com.sendbird.uikit.interfaces.OnEmojiReactionClickListener; import com.sendbird.uikit.interfaces.OnEmojiReactionLongClickListener; @@ -233,10 +233,10 @@ public void onBindViewHolder(@NonNull MessageViewHolder holder, final int positi next = getItem(position - 1); } - if (ChannelConfig.getEnableReactions(messageListUIParams.getChannelConfig(), channel) && holder instanceof GroupChannelMessageViewHolder) { - GroupChannelMessageViewHolder groupChannelHolder = (GroupChannelMessageViewHolder) holder; + if (ChannelConfig.getEnableReactions(messageListUIParams.getChannelConfig(), channel) && holder instanceof EmojiReactionHandler) { + EmojiReactionHandler emojiReactionHandler = (EmojiReactionHandler) holder; List reactionList = current.getReactions(); - groupChannelHolder.setEmojiReaction(reactionList, (view, reactionPosition, reactionKey) -> { + emojiReactionHandler.setEmojiReaction(reactionList, (view, reactionPosition, reactionKey) -> { int messagePosition = holder.getBindingAdapterPosition(); if (messagePosition != NO_POSITION && emojiReactionClickListener != null) { emojiReactionClickListener.onEmojiReactionClick( @@ -247,7 +247,7 @@ public void onBindViewHolder(@NonNull MessageViewHolder holder, final int positi ); } }, (view, reactionPosition, reactionKey) -> { - int messagePosition = groupChannelHolder.getBindingAdapterPosition(); + int messagePosition = holder.getBindingAdapterPosition(); if (messagePosition != NO_POSITION && emojiReactionLongClickListener != null) { emojiReactionLongClickListener.onEmojiReactionLongClick( view, @@ -257,7 +257,7 @@ public void onBindViewHolder(@NonNull MessageViewHolder holder, final int positi ); } }, v -> { - int messagePosition = groupChannelHolder.getBindingAdapterPosition(); + int messagePosition = holder.getBindingAdapterPosition(); if (messagePosition != NO_POSITION && emojiReactionMoreButtonClickListener != null) { emojiReactionMoreButtonClickListener.onItemClick( v, @@ -602,7 +602,6 @@ MessageListUIParams getMessageListUIParams() { return messageListUIParams; } - @TestOnly @NonNull MessageViewHolder createViewHolder(@NonNull ViewGroup parent, int viewType, LayoutInflater inflater) { return MessageViewHolderFactory.createViewHolder(inflater, diff --git a/uikit/src/main/java/com/sendbird/uikit/activities/adapter/OpenChannelMessageListAdapter.java b/uikit/src/main/java/com/sendbird/uikit/activities/adapter/OpenChannelMessageListAdapter.java index 39296dd8..2a5698d6 100644 --- a/uikit/src/main/java/com/sendbird/uikit/activities/adapter/OpenChannelMessageListAdapter.java +++ b/uikit/src/main/java/com/sendbird/uikit/activities/adapter/OpenChannelMessageListAdapter.java @@ -28,7 +28,6 @@ import com.sendbird.uikit.interfaces.OnMessageListUpdateHandler; import com.sendbird.uikit.model.MessageListUIParams; import com.sendbird.uikit.model.MessageUIConfig; -import com.sendbird.uikit.utils.TextUtils; import java.util.ArrayList; import java.util.Collections; diff --git a/uikit/src/main/java/com/sendbird/uikit/activities/adapter/ThreadListAdapter.java b/uikit/src/main/java/com/sendbird/uikit/activities/adapter/ThreadListAdapter.java index e2a706d5..369b0cad 100644 --- a/uikit/src/main/java/com/sendbird/uikit/activities/adapter/ThreadListAdapter.java +++ b/uikit/src/main/java/com/sendbird/uikit/activities/adapter/ThreadListAdapter.java @@ -10,7 +10,6 @@ import com.sendbird.android.channel.GroupChannel; import com.sendbird.android.message.BaseFileMessage; import com.sendbird.android.message.BaseMessage; -import com.sendbird.android.message.FileMessage; import com.sendbird.android.message.UserMessage; import com.sendbird.uikit.activities.viewholder.MessageType; import com.sendbird.uikit.activities.viewholder.MessageViewHolder; diff --git a/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/GroupChannelMessageViewHolder.java b/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/GroupChannelMessageViewHolder.java index e39df49a..b036bc1e 100644 --- a/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/GroupChannelMessageViewHolder.java +++ b/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/GroupChannelMessageViewHolder.java @@ -6,6 +6,7 @@ import androidx.annotation.Nullable; import com.sendbird.android.message.Reaction; +import com.sendbird.uikit.interfaces.EmojiReactionHandler; import com.sendbird.uikit.interfaces.OnItemClickListener; import com.sendbird.uikit.interfaces.OnItemLongClickListener; import com.sendbird.uikit.model.MessageListUIParams; @@ -15,7 +16,7 @@ /** * A ViewHolder describes an item view and Message about its place within the RecyclerView. */ -public abstract class GroupChannelMessageViewHolder extends MessageViewHolder { +public abstract class GroupChannelMessageViewHolder extends MessageViewHolder implements EmojiReactionHandler { public GroupChannelMessageViewHolder(@NonNull View view) { super(view); } diff --git a/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/MyMessageViewHolder.kt b/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/MyMessageViewHolder.kt new file mode 100644 index 00000000..e27df60f --- /dev/null +++ b/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/MyMessageViewHolder.kt @@ -0,0 +1,77 @@ +package com.sendbird.uikit.activities.viewholder + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.CallSuper +import com.sendbird.android.channel.BaseChannel +import com.sendbird.android.message.BaseMessage +import com.sendbird.android.message.Reaction +import com.sendbird.uikit.annotation.MessageViewHolderExperimental +import com.sendbird.uikit.consts.ClickableViewIdentifier +import com.sendbird.uikit.databinding.SbViewMyMessageBinding +import com.sendbird.uikit.interfaces.EmojiReactionHandler +import com.sendbird.uikit.interfaces.OnItemClickListener +import com.sendbird.uikit.interfaces.OnItemLongClickListener +import com.sendbird.uikit.internal.extensions.toComponentListContextThemeWrapper +import com.sendbird.uikit.model.MessageListUIParams + +/** + * This ViewHolder has a basic message template for 'My message.' + * To use it, inherit from this ViewHolder, inflate the view corresponding to the content, and pass it to the constructor. + * + * @see [com.sendbird.uikit.activities.adapter.MessageListAdapter] + * @see [com.sendbird.uikit.providers.AdapterProviders.messageList] + * @since 3.12.0 + */ +@MessageViewHolderExperimental +open class MyMessageViewHolder( + parent: ViewGroup, + open val contentView: View, + messageListUIParams: MessageListUIParams, + private val binding: SbViewMyMessageBinding = SbViewMyMessageBinding.inflate( + LayoutInflater.from(parent.context.toComponentListContextThemeWrapper()), + ) +) : MessageViewHolder(binding.root, messageListUIParams), EmojiReactionHandler { + + init { + binding.root.attachContentView(contentView) + } + + @CallSuper + override fun bind(channel: BaseChannel, message: BaseMessage, params: MessageListUIParams) { + binding.root.drawMessage(channel, message, params) + } + + @CallSuper + override fun getClickableViewMap(): Map { + return mapOf( + ClickableViewIdentifier.Chat.name to binding.root.binding.contentPanel, + ClickableViewIdentifier.QuoteReply.name to binding.root.binding.quoteReplyPanel, + ClickableViewIdentifier.ThreadInfo.name to binding.root.binding.threadInfo + ) + } + + /** + * Sets message reaction data. + * + * @param reactionList List of reactions which the message has. + * @param emojiReactionClickListener The callback to be invoked when the emoji reaction is clicked and held. + * @param emojiReactionLongClickListener The callback to be invoked when the emoji reaction is long clicked and held. + * @param moreButtonClickListener The callback to be invoked when the emoji reaction more button is clicked and held. + * @since 3.12.0 + */ + final override fun setEmojiReaction( + reactionList: List, + emojiReactionClickListener: OnItemClickListener?, + emojiReactionLongClickListener: OnItemLongClickListener?, + moreButtonClickListener: View.OnClickListener? + ) { + binding.root.binding.rvEmojiReactionList.apply { + setReactionList(reactionList) + setEmojiReactionClickListener(emojiReactionClickListener) + setEmojiReactionLongClickListener(emojiReactionLongClickListener) + setMoreButtonClickListener(moreButtonClickListener) + } + } +} diff --git a/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/OtherMessageViewHolder.kt b/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/OtherMessageViewHolder.kt new file mode 100644 index 00000000..4ee3ebfd --- /dev/null +++ b/uikit/src/main/java/com/sendbird/uikit/activities/viewholder/OtherMessageViewHolder.kt @@ -0,0 +1,77 @@ +package com.sendbird.uikit.activities.viewholder + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.CallSuper +import com.sendbird.android.channel.BaseChannel +import com.sendbird.android.message.BaseMessage +import com.sendbird.android.message.Reaction +import com.sendbird.uikit.annotation.MessageViewHolderExperimental +import com.sendbird.uikit.consts.ClickableViewIdentifier +import com.sendbird.uikit.databinding.SbViewOtherMessageBinding +import com.sendbird.uikit.interfaces.EmojiReactionHandler +import com.sendbird.uikit.interfaces.OnItemClickListener +import com.sendbird.uikit.interfaces.OnItemLongClickListener +import com.sendbird.uikit.internal.extensions.toComponentListContextThemeWrapper +import com.sendbird.uikit.model.MessageListUIParams + +/** + * This ViewHolder has a basic message template for 'Other message.' + * To use it, inherit from this ViewHolder, inflate the view corresponding to the content, and pass it to the constructor. + * + * @see [com.sendbird.uikit.activities.adapter.MessageListAdapter] + * @see [com.sendbird.uikit.providers.AdapterProviders.messageList] + * @since 3.12.0 + */ +@MessageViewHolderExperimental +open class OtherMessageViewHolder( + parent: ViewGroup, + open val contentView: View, + messageListUIParams: MessageListUIParams, + private val binding: SbViewOtherMessageBinding = SbViewOtherMessageBinding.inflate( + LayoutInflater.from(parent.context.toComponentListContextThemeWrapper()) + ) +) : MessageViewHolder(binding.root, messageListUIParams), EmojiReactionHandler { + + init { + binding.root.attachContentView(contentView) + } + + @CallSuper + override fun bind(channel: BaseChannel, message: BaseMessage, params: MessageListUIParams) { + binding.root.drawMessage(channel, message, params) + } + + @CallSuper + override fun getClickableViewMap(): Map { + return mapOf( + ClickableViewIdentifier.Chat.name to binding.root.binding.contentPanel, + ClickableViewIdentifier.QuoteReply.name to binding.root.binding.quoteReplyPanel, + ClickableViewIdentifier.ThreadInfo.name to binding.root.binding.threadInfo + ) + } + + /** + * Sets message reaction data. + * + * @param reactionList List of reactions which the message has. + * @param emojiReactionClickListener The callback to be invoked when the emoji reaction is clicked and held. + * @param emojiReactionLongClickListener The callback to be invoked when the emoji reaction is long clicked and held. + * @param moreButtonClickListener The callback to be invoked when the emoji reaction more button is clicked and held. + * @since 3.12.0 + */ + final override fun setEmojiReaction( + reactionList: List, + emojiReactionClickListener: OnItemClickListener?, + emojiReactionLongClickListener: OnItemLongClickListener?, + moreButtonClickListener: View.OnClickListener? + ) { + binding.root.binding.rvEmojiReactionList.apply { + setReactionList(reactionList) + setEmojiReactionClickListener(emojiReactionClickListener) + setEmojiReactionLongClickListener(emojiReactionLongClickListener) + setMoreButtonClickListener(moreButtonClickListener) + } + } +} diff --git a/uikit/src/main/java/com/sendbird/uikit/annotation/Experimental.kt b/uikit/src/main/java/com/sendbird/uikit/annotation/Experimental.kt new file mode 100644 index 00000000..b48761e3 --- /dev/null +++ b/uikit/src/main/java/com/sendbird/uikit/annotation/Experimental.kt @@ -0,0 +1,6 @@ +package com.sendbird.uikit.annotation + +@RequiresOptIn(message = "This ViewHolder is experimental. It may be changed in the future without notice.") +@Retention(AnnotationRetention.BINARY) +@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION) +annotation class MessageViewHolderExperimental diff --git a/uikit/src/main/java/com/sendbird/uikit/fragments/FeedNotificationChannelFragment.java b/uikit/src/main/java/com/sendbird/uikit/fragments/FeedNotificationChannelFragment.java index 569de5b5..40c4f0fc 100644 --- a/uikit/src/main/java/com/sendbird/uikit/fragments/FeedNotificationChannelFragment.java +++ b/uikit/src/main/java/com/sendbird/uikit/fragments/FeedNotificationChannelFragment.java @@ -123,6 +123,7 @@ protected void onBindNotificationListComponent(@NonNull FeedNotificationListComp Logger.d(">> FeedNotificationChannelFragment::onBindFeedNotificationListComponent()"); listComponent.setOnMessageTemplateActionHandler(actionHandler != null ? actionHandler : this::handleAction); listComponent.setOnTooltipClickListener(v -> listComponent.scrollToFirst()); + listComponent.setOnImpressionDetectedListener(viewModel::sendLogImpression); listComponent.setOnNotificationCategorySelectListener(category -> { Logger.d("++ selected category = %s", category); listComponent.clearData(); diff --git a/uikit/src/main/java/com/sendbird/uikit/interfaces/EmojiReactionHandler.kt b/uikit/src/main/java/com/sendbird/uikit/interfaces/EmojiReactionHandler.kt new file mode 100644 index 00000000..893eae1c --- /dev/null +++ b/uikit/src/main/java/com/sendbird/uikit/interfaces/EmojiReactionHandler.kt @@ -0,0 +1,13 @@ +package com.sendbird.uikit.interfaces + +import android.view.View +import com.sendbird.android.message.Reaction + +internal fun interface EmojiReactionHandler { + fun setEmojiReaction( + reactionList: List, + emojiReactionClickListener: OnItemClickListener?, + emojiReactionLongClickListener: OnItemLongClickListener?, + moreButtonClickListener: View.OnClickListener? + ) +} diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/extensions/MessageListAdapterExtensions.kt b/uikit/src/main/java/com/sendbird/uikit/internal/extensions/MessageListAdapterExtensions.kt index 00ef18c4..7ae284bc 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/extensions/MessageListAdapterExtensions.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/extensions/MessageListAdapterExtensions.kt @@ -2,6 +2,7 @@ package com.sendbird.uikit.internal.extensions import com.sendbird.uikit.activities.adapter.MessageListAdapter import com.sendbird.uikit.internal.interfaces.OnSubmitButtonClickListener + private var submitButtonClickListener: OnSubmitButtonClickListener? = null internal var MessageListAdapter.submitButtonClickListener: OnSubmitButtonClickListener? get() = com.sendbird.uikit.internal.extensions.submitButtonClickListener diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/extensions/MessageListComponentExtensions.kt b/uikit/src/main/java/com/sendbird/uikit/internal/extensions/MessageListComponentExtensions.kt index 8a56bd1d..cbff5644 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/extensions/MessageListComponentExtensions.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/extensions/MessageListComponentExtensions.kt @@ -1,4 +1,5 @@ package com.sendbird.uikit.internal.extensions + import com.sendbird.uikit.internal.interfaces.OnSubmitButtonClickListener import com.sendbird.uikit.modules.components.MessageListComponent diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/extensions/Utils.kt b/uikit/src/main/java/com/sendbird/uikit/internal/extensions/Utils.kt index b8186454..422ad111 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/extensions/Utils.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/extensions/Utils.kt @@ -5,6 +5,7 @@ import android.os.Handler import android.os.Looper import android.util.TypedValue import androidx.appcompat.view.ContextThemeWrapper +import com.sendbird.uikit.R private val uiThreadHandler by lazy { Handler(Looper.getMainLooper()) } @@ -15,6 +16,11 @@ internal fun T?.runOnUiThread(block: (T) -> Unit) { } // Returns Theme Context from defStyle + +internal fun Context.toComponentListContextThemeWrapper(): Context { + return this.toContextThemeWrapper(R.attr.sb_component_list) +} + internal fun Context.toContextThemeWrapper(defStyle: Int): Context { val values = TypedValue() this.theme.resolveAttribute(defStyle, values, true) diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/interfaces/OnImpressionDetectedListener.kt b/uikit/src/main/java/com/sendbird/uikit/internal/interfaces/OnImpressionDetectedListener.kt new file mode 100644 index 00000000..e0f1891c --- /dev/null +++ b/uikit/src/main/java/com/sendbird/uikit/internal/interfaces/OnImpressionDetectedListener.kt @@ -0,0 +1,9 @@ +package com.sendbird.uikit.internal.interfaces + +/** + * On visible item detect listener + */ +@JvmSuppressWildcards +internal fun interface OnImpressionDetectedListener { + fun onImpressionDetected(items: List) +} diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyMessageView.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyMessageView.kt new file mode 100644 index 00000000..55daef4a --- /dev/null +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyMessageView.kt @@ -0,0 +1,104 @@ +package com.sendbird.uikit.internal.ui.messages + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import com.sendbird.android.channel.BaseChannel +import com.sendbird.android.channel.GroupChannel +import com.sendbird.android.message.BaseMessage +import com.sendbird.android.message.SendingStatus +import com.sendbird.uikit.R +import com.sendbird.uikit.consts.MessageGroupType +import com.sendbird.uikit.databinding.SbViewMyMessageComponentBinding +import com.sendbird.uikit.internal.extensions.toContextThemeWrapper +import com.sendbird.uikit.model.MessageListUIParams +import com.sendbird.uikit.model.configurations.ChannelConfig +import com.sendbird.uikit.utils.DrawableUtils +import com.sendbird.uikit.utils.ViewUtils + +internal class MyMessageView @JvmOverloads internal constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 +) : BaseMessageView(context, attrs, defStyle) { + override val binding: SbViewMyMessageComponentBinding + override val layout: View + get() = binding.root + private val sentAtAppearance: Int + + init { + binding = SbViewMyMessageComponentBinding.inflate( + LayoutInflater.from(context.toContextThemeWrapper(defStyle)), this, true + ) + val a = context.theme.obtainStyledAttributes(attrs, R.styleable.MessageView, defStyle, 0) + try { + sentAtAppearance = a.getResourceId( + R.styleable.MessageView_sb_message_time_text_appearance, + R.style.SendbirdCaption4OnLight03 + ) + val messageBackground = + a.getResourceId( + R.styleable.MessageView_sb_message_me_background, + R.drawable.sb_shape_chat_bubble + ) + val messageBackgroundTint = + a.getColorStateList(R.styleable.MessageView_sb_message_me_background_tint) + val emojiReactionListBackground = a.getResourceId( + R.styleable.MessageView_sb_message_emoji_reaction_list_background, + R.drawable.sb_shape_chat_bubble_reactions_light + ) + binding.contentPanel.background = + DrawableUtils.setTintList(context, messageBackground, messageBackgroundTint) + binding.emojiReactionListBackground.setBackgroundResource(emojiReactionListBackground) + } finally { + a.recycle() + } + } + + fun drawMessage(channel: BaseChannel, message: BaseMessage, params: MessageListUIParams) { + val isSent = message.sendingStatus == SendingStatus.SUCCEEDED + val enableReactions = message.reactions.isNotEmpty() && + ChannelConfig.getEnableReactions(params.channelConfig, channel) + val messageGroupType = params.messageGroupType + binding.emojiReactionListBackground.visibility = if (enableReactions) VISIBLE else GONE + binding.rvEmojiReactionList.visibility = if (enableReactions) VISIBLE else GONE + binding.tvSentAt.visibility = + if (isSent && (messageGroupType == MessageGroupType.GROUPING_TYPE_TAIL || messageGroupType == MessageGroupType.GROUPING_TYPE_SINGLE)) VISIBLE else GONE + binding.ivStatus.drawStatus(message, channel, params.shouldUseMessageReceipt()) + + messageUIConfig?.let { + it.mySentAtTextUIConfig.mergeFromTextAppearance(context, sentAtAppearance) + val background = it.myMessageBackground + val reactionBackground = it.myReactionListBackground + background?.let { binding.contentPanel.background = background } + reactionBackground?.let { binding.emojiReactionListBackground.background = reactionBackground } + } + + ViewUtils.drawSentAt(binding.tvSentAt, message, messageUIConfig) + ViewUtils.drawReactionEnabled(binding.rvEmojiReactionList, channel, params.channelConfig) + + val paddingTop = + resources.getDimensionPixelSize(if (messageGroupType == MessageGroupType.GROUPING_TYPE_TAIL || messageGroupType == MessageGroupType.GROUPING_TYPE_BODY) R.dimen.sb_size_1 else R.dimen.sb_size_8) + val paddingBottom = + resources.getDimensionPixelSize(if (messageGroupType == MessageGroupType.GROUPING_TYPE_HEAD || messageGroupType == MessageGroupType.GROUPING_TYPE_BODY) R.dimen.sb_size_1 else R.dimen.sb_size_8) + binding.root.setPadding(binding.root.paddingLeft, paddingTop, binding.root.paddingRight, paddingBottom) + + if (params.shouldUseQuotedView() && channel is GroupChannel) { + ViewUtils.drawQuotedMessage( + binding.quoteReplyPanel, + channel, + message, + messageUIConfig?.repliedMessageTextUIConfig, + params + ) + } else { + binding.quoteReplyPanel.visibility = GONE + } + ViewUtils.drawThreadInfo(binding.threadInfo, message, params) + } + + fun attachContentView(view: View) { + binding.customContentPanel.addView(view) + } +} diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyQuotedMessageView.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyQuotedMessageView.kt index fc3e6b96..748e3c3b 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyQuotedMessageView.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyQuotedMessageView.kt @@ -101,7 +101,7 @@ internal class MyQuotedMessageView @JvmOverloads constructor( context.getString(R.string.sb_text_you), UserUtils.getDisplayName(context, parentMessage?.sender, true) ) - binding.ivQuoteReplyThumbnailOveray.visibility = GONE + binding.ivQuoteReplyThumbnailOverlay.visibility = GONE when (parentMessage) { is UserMessage -> { binding.quoteReplyMessagePanel.visibility = VISIBLE @@ -120,7 +120,7 @@ internal class MyQuotedMessageView @JvmOverloads constructor( target: Target, isFirstResource: Boolean ): Boolean { - binding.ivQuoteReplyThumbnailOveray.visibility = GONE + binding.ivQuoteReplyThumbnailOverlay.visibility = GONE return false } @@ -131,7 +131,7 @@ internal class MyQuotedMessageView @JvmOverloads constructor( dataSource: DataSource, isFirstResource: Boolean ): Boolean { - binding.ivQuoteReplyThumbnailOveray.visibility = VISIBLE + binding.ivQuoteReplyThumbnailOverlay.visibility = VISIBLE return false } } diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherMessageView.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherMessageView.kt new file mode 100644 index 00000000..6a2b6a1e --- /dev/null +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherMessageView.kt @@ -0,0 +1,116 @@ +package com.sendbird.uikit.internal.ui.messages + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import com.sendbird.android.channel.BaseChannel +import com.sendbird.android.channel.GroupChannel +import com.sendbird.android.message.BaseMessage +import com.sendbird.android.message.SendingStatus +import com.sendbird.uikit.R +import com.sendbird.uikit.consts.MessageGroupType +import com.sendbird.uikit.databinding.SbViewOtherMessageComponentBinding +import com.sendbird.uikit.internal.extensions.toContextThemeWrapper +import com.sendbird.uikit.model.MessageListUIParams +import com.sendbird.uikit.model.configurations.ChannelConfig +import com.sendbird.uikit.utils.DrawableUtils +import com.sendbird.uikit.utils.MessageUtils +import com.sendbird.uikit.utils.ViewUtils + +internal class OtherMessageView @JvmOverloads internal constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 +) : BaseMessageView(context, attrs, defStyle) { + override val binding: SbViewOtherMessageComponentBinding + override val layout: View + get() = binding.root + private val sentAtAppearance: Int + private val nicknameAppearance: Int + + init { + val a = context.theme.obtainStyledAttributes(attrs, R.styleable.MessageView, defStyle, 0) + try { + binding = SbViewOtherMessageComponentBinding.inflate( + LayoutInflater.from(context.toContextThemeWrapper(defStyle)), this, true + ) + sentAtAppearance = a.getResourceId( + R.styleable.MessageView_sb_message_time_text_appearance, + R.style.SendbirdCaption4OnLight03 + ) + nicknameAppearance = a.getResourceId( + R.styleable.MessageView_sb_message_sender_name_text_appearance, + R.style.SendbirdCaption1OnLight02 + ) + val messageBackground = a.getResourceId( + R.styleable.MessageView_sb_message_other_background, + R.drawable.sb_shape_chat_bubble + ) + val messageBackgroundTint = + a.getColorStateList(R.styleable.MessageView_sb_message_other_background_tint) + val emojiReactionListBackground = a.getResourceId( + R.styleable.MessageView_sb_message_emoji_reaction_list_background, + R.drawable.sb_shape_chat_bubble_reactions_light + ) + binding.contentPanel.background = + DrawableUtils.setTintList(context, messageBackground, messageBackgroundTint) + binding.emojiReactionListBackground.setBackgroundResource(emojiReactionListBackground) + } finally { + a.recycle() + } + } + + fun drawMessage(channel: BaseChannel, message: BaseMessage, params: MessageListUIParams) { + val messageGroupType = params.messageGroupType + val isSent = message.sendingStatus == SendingStatus.SUCCEEDED + val enableReactions = + message.reactions.isNotEmpty() && ChannelConfig.getEnableReactions(params.channelConfig, channel) + val showProfile = + messageGroupType == MessageGroupType.GROUPING_TYPE_SINGLE || messageGroupType == MessageGroupType.GROUPING_TYPE_TAIL + val showNickname = + (messageGroupType == MessageGroupType.GROUPING_TYPE_SINGLE || messageGroupType == MessageGroupType.GROUPING_TYPE_HEAD) && + (!params.shouldUseQuotedView() || !MessageUtils.hasParentMessage(message)) + + binding.ivProfileView.visibility = if (showProfile) VISIBLE else INVISIBLE + binding.tvNickname.visibility = if (showNickname) VISIBLE else GONE + binding.emojiReactionListBackground.visibility = + if (enableReactions) VISIBLE else GONE + binding.rvEmojiReactionList.visibility = if (enableReactions) VISIBLE else GONE + binding.tvSentAt.visibility = + if (isSent && (messageGroupType == MessageGroupType.GROUPING_TYPE_TAIL || messageGroupType == MessageGroupType.GROUPING_TYPE_SINGLE)) VISIBLE else INVISIBLE + messageUIConfig?.let { + it.otherSentAtTextUIConfig.mergeFromTextAppearance(context, sentAtAppearance) + it.otherNicknameTextUIConfig.mergeFromTextAppearance(context, nicknameAppearance) + val background = it.otherMessageBackground + val reactionBackground = it.otherReactionListBackground + if (background != null) binding.contentPanel.background = background + if (reactionBackground != null) binding.emojiReactionListBackground.background = reactionBackground + } + ViewUtils.drawNickname(binding.tvNickname, message, messageUIConfig, false) + ViewUtils.drawReactionEnabled(binding.rvEmojiReactionList, channel, params.channelConfig) + ViewUtils.drawProfile(binding.ivProfileView, message) + ViewUtils.drawSentAt(binding.tvSentAt, message, messageUIConfig) + val paddingTop = + resources.getDimensionPixelSize(if (messageGroupType == MessageGroupType.GROUPING_TYPE_TAIL || messageGroupType == MessageGroupType.GROUPING_TYPE_BODY) R.dimen.sb_size_1 else R.dimen.sb_size_8) + val paddingBottom = + resources.getDimensionPixelSize(if (messageGroupType == MessageGroupType.GROUPING_TYPE_HEAD || messageGroupType == MessageGroupType.GROUPING_TYPE_BODY) R.dimen.sb_size_1 else R.dimen.sb_size_8) + binding.root.setPadding(binding.root.paddingLeft, paddingTop, binding.root.paddingRight, paddingBottom) + if (params.shouldUseQuotedView() && channel is GroupChannel) { + ViewUtils.drawQuotedMessage( + binding.quoteReplyPanel, + channel, + message, + messageUIConfig?.repliedMessageTextUIConfig, + params + ) + } else { + binding.quoteReplyPanel.visibility = GONE + } + ViewUtils.drawThreadInfo(binding.threadInfo, message, params) + } + + fun attachContentView(view: View) { + binding.customContentPanel.addView(view) + } +} diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherQuotedMessageView.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherQuotedMessageView.kt index dda4f8bd..4cdd7cb9 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherQuotedMessageView.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherQuotedMessageView.kt @@ -99,7 +99,7 @@ internal class OtherQuotedMessageView @JvmOverloads constructor( binding.quoteReplyMessagePanel.visibility = GONE binding.ivQuoteReplyMessageIcon.visibility = GONE binding.quoteReplyThumbnailPanel.visibility = GONE - binding.ivQuoteReplyThumbnailOveray.visibility = GONE + binding.ivQuoteReplyThumbnailOverlay.visibility = GONE parentMessage?.let { val replyType = messageListUIParams.channelConfig.replyType @@ -143,7 +143,7 @@ internal class OtherQuotedMessageView @JvmOverloads constructor( target: Target, isFirstResource: Boolean ): Boolean { - binding.ivQuoteReplyThumbnailOveray.visibility = GONE + binding.ivQuoteReplyThumbnailOverlay.visibility = GONE return false } @@ -154,7 +154,7 @@ internal class OtherQuotedMessageView @JvmOverloads constructor( dataSource: DataSource, isFirstResource: Boolean ): Boolean { - binding.ivQuoteReplyThumbnailOveray.visibility = VISIBLE + binding.ivQuoteReplyThumbnailOverlay.visibility = VISIBLE return false } } diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/notifications/FeedNotificationListComponent.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/notifications/FeedNotificationListComponent.kt index e03f0138..649d741b 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/notifications/FeedNotificationListComponent.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/notifications/FeedNotificationListComponent.kt @@ -14,6 +14,7 @@ import com.sendbird.uikit.interfaces.OnNotificationCategorySelectListener import com.sendbird.uikit.interfaces.OnNotificationTemplateActionHandler import com.sendbird.uikit.internal.extensions.intToDp import com.sendbird.uikit.internal.extensions.setTypeface +import com.sendbird.uikit.internal.interfaces.OnImpressionDetectedListener import com.sendbird.uikit.internal.model.notifications.NotificationConfig import com.sendbird.uikit.internal.ui.widgets.InnerLinearLayoutManager import com.sendbird.uikit.log.Logger @@ -31,6 +32,9 @@ internal open class FeedNotificationListComponent @JvmOverloads constructor( params: Params = Params(), uiConfig: NotificationConfig? = null ) : NotificationListComponent(params, uiConfig) { + + var onImpressionDetectedListener: OnImpressionDetectedListener? = null + /** * Returns the feed notification list adapter. * @@ -71,11 +75,27 @@ internal open class FeedNotificationListComponent @JvmOverloads constructor( args: Bundle? ): View { val layout = super.onCreateView(context, inflater, parent, args) - val layoutManager = InnerLinearLayoutManager(context).apply { reverseLayout = false } - notificationListView?.recyclerView?.layoutManager = layoutManager + notificationListView?.let { + it.recyclerView.layoutManager = InnerLinearLayoutManager(context).apply { reverseLayout = false } + it.onImpressionDetectedListener = { firstVisibleItemPosition, lastVisibleItemPosition -> + onVisibleItemDetected(firstVisibleItemPosition, lastVisibleItemPosition) + } + } return layout } + private fun onVisibleItemDetected(firstVisibleItem: Int, lastVisibleItem: Int) { + Logger.d(">> onVisibleItemDetected(), firstVisibleItem: $firstVisibleItem, lastVisibleItem: $lastVisibleItem") + if (adapter == null) return + if (firstVisibleItem < 0 || lastVisibleItem < 0) return + + onImpressionDetectedListener?.let { + val range = if (firstVisibleItem <= lastVisibleItem) firstVisibleItem..lastVisibleItem else lastVisibleItem..firstVisibleItem + val items = range.mapNotNull { i -> adapter?.getItem(i) } + it.onImpressionDetected(items) + } + } + /** * Sets the last seen timestamp to update new badge UI. * This value is used to compare whether a message has been newly received. diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/MyImageFileMessageViewHolder.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/MyImageFileMessageViewHolder.kt index f193cdf8..e2d2550f 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/MyImageFileMessageViewHolder.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/MyImageFileMessageViewHolder.kt @@ -40,7 +40,7 @@ internal class MyImageFileMessageViewHolder internal constructor( override fun getClickableViewMap(): Map { return mapOf( - ClickableViewIdentifier.Chat.name to binding.myImageFileMessageView.binding.ivThumbnailOveray, + ClickableViewIdentifier.Chat.name to binding.myImageFileMessageView.binding.ivThumbnailOverlay, ClickableViewIdentifier.QuoteReply.name to binding.myImageFileMessageView.binding.quoteReplyPanel, ClickableViewIdentifier.ThreadInfo.name to binding.myImageFileMessageView.binding.threadInfo ) diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/MyVideoFileMessageViewHolder.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/MyVideoFileMessageViewHolder.kt index 07cbb4f0..d93fda79 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/MyVideoFileMessageViewHolder.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/MyVideoFileMessageViewHolder.kt @@ -40,7 +40,7 @@ internal class MyVideoFileMessageViewHolder internal constructor( override fun getClickableViewMap(): Map { return mapOf( - ClickableViewIdentifier.Chat.name to binding.myVideoFileMessageView.binding.ivThumbnailOveray, + ClickableViewIdentifier.Chat.name to binding.myVideoFileMessageView.binding.ivThumbnailOverlay, ClickableViewIdentifier.QuoteReply.name to binding.myVideoFileMessageView.binding.quoteReplyPanel, ClickableViewIdentifier.ThreadInfo.name to binding.myVideoFileMessageView.binding.threadInfo ) diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OpenChannelImageFileMessageViewHolder.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OpenChannelImageFileMessageViewHolder.kt index d74aff92..36fbfaa5 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OpenChannelImageFileMessageViewHolder.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OpenChannelImageFileMessageViewHolder.kt @@ -23,7 +23,7 @@ internal class OpenChannelImageFileMessageViewHolder internal constructor( override fun getClickableViewMap(): Map { return mapOf( - ClickableViewIdentifier.Chat.name to binding.openChannelImageFileMessageView.binding.ivThumbnailOveray, + ClickableViewIdentifier.Chat.name to binding.openChannelImageFileMessageView.binding.ivThumbnailOverlay, ClickableViewIdentifier.Profile.name to binding.openChannelImageFileMessageView.binding.ivProfileView ) } diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OpenChannelVideoFileMessageViewHolder.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OpenChannelVideoFileMessageViewHolder.kt index 1d5fca56..3252690e 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OpenChannelVideoFileMessageViewHolder.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OpenChannelVideoFileMessageViewHolder.kt @@ -23,7 +23,7 @@ internal class OpenChannelVideoFileMessageViewHolder internal constructor( override fun getClickableViewMap(): Map { return mapOf( - ClickableViewIdentifier.Chat.name to binding.openChannelVideoFileMessageView.binding.ivThumbnailOveray, + ClickableViewIdentifier.Chat.name to binding.openChannelVideoFileMessageView.binding.ivThumbnailOverlay, ClickableViewIdentifier.Profile.name to binding.openChannelVideoFileMessageView.binding.ivProfileView ) } diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OtherImageFileMessageViewHolder.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OtherImageFileMessageViewHolder.kt index 7340f4db..45639d79 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OtherImageFileMessageViewHolder.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OtherImageFileMessageViewHolder.kt @@ -40,7 +40,7 @@ internal class OtherImageFileMessageViewHolder internal constructor( override fun getClickableViewMap(): Map { return mapOf( - ClickableViewIdentifier.Chat.name to binding.otherImageFileMessageView.binding.ivThumbnailOveray, + ClickableViewIdentifier.Chat.name to binding.otherImageFileMessageView.binding.ivThumbnailOverlay, ClickableViewIdentifier.Profile.name to binding.otherImageFileMessageView.binding.ivProfileView, ClickableViewIdentifier.QuoteReply.name to binding.otherImageFileMessageView.binding.quoteReplyPanel, ClickableViewIdentifier.ThreadInfo.name to binding.otherImageFileMessageView.binding.threadInfo diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OtherVideoFileMessageViewHolder.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OtherVideoFileMessageViewHolder.kt index e32916e1..dfdce91f 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OtherVideoFileMessageViewHolder.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/viewholders/OtherVideoFileMessageViewHolder.kt @@ -40,7 +40,7 @@ internal class OtherVideoFileMessageViewHolder internal constructor( override fun getClickableViewMap(): Map { return mapOf( - ClickableViewIdentifier.Chat.name to binding.otherVideoFileMessageView.binding.ivThumbnailOveray, + ClickableViewIdentifier.Chat.name to binding.otherVideoFileMessageView.binding.ivThumbnailOverlay, ClickableViewIdentifier.Profile.name to binding.otherVideoFileMessageView.binding.ivProfileView, ClickableViewIdentifier.QuoteReply.name to binding.otherVideoFileMessageView.binding.quoteReplyPanel, ClickableViewIdentifier.ThreadInfo.name to binding.otherVideoFileMessageView.binding.threadInfo diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/widgets/NotificationRecyclerView.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/widgets/NotificationRecyclerView.kt index 811106ca..992de6a6 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/widgets/NotificationRecyclerView.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/widgets/NotificationRecyclerView.kt @@ -21,6 +21,7 @@ import com.sendbird.uikit.internal.extensions.addRipple import com.sendbird.uikit.internal.extensions.intToDp import com.sendbird.uikit.internal.extensions.setAppearance import com.sendbird.uikit.internal.extensions.setTypeface +import com.sendbird.uikit.internal.utils.NotificationImpressionTracker import com.sendbird.uikit.utils.SoftInputUtils internal class NotificationRecyclerView @JvmOverloads constructor( @@ -32,6 +33,18 @@ internal class NotificationRecyclerView @JvmOverloads constructor( private var categoryMenuTextAppearance: Int private var categoryMenuBackground: Int private val binding: SbViewChatNotificationRecyclerViewBinding + private val notificationScrollImpressionTracker by lazy { + NotificationImpressionTracker(recyclerView).apply { + onImpressionDetected = { + recyclerView.layoutManager?.let { + val firstVisibleItemPosition = it.findFirstVisibleItemPosition() + val lastVisibleItemPosition = it.findLastVisibleItemPosition() + onImpressionDetectedListener?.invoke(firstVisibleItemPosition, lastVisibleItemPosition) + } + } + } + } + var onImpressionDetectedListener: ((firstVisibleItemPosition: Int, lastVisibleItemPosition: Int) -> Unit)? = null val recyclerView: PagerRecyclerView get() = binding.rvMessageList val isReverseLayout @@ -128,6 +141,16 @@ internal class NotificationRecyclerView @JvmOverloads constructor( set.applyTo(rootView) } + override fun onAttachedToWindow() { + super.onAttachedToWindow() + notificationScrollImpressionTracker.start() + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + notificationScrollImpressionTracker.stop() + } + init { val a = context.theme.obtainStyledAttributes( attrs, diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/utils/NotificationImpressionTracker.kt b/uikit/src/main/java/com/sendbird/uikit/internal/utils/NotificationImpressionTracker.kt new file mode 100644 index 00000000..664860b6 --- /dev/null +++ b/uikit/src/main/java/com/sendbird/uikit/internal/utils/NotificationImpressionTracker.kt @@ -0,0 +1,110 @@ +package com.sendbird.uikit.internal.utils + +import android.graphics.Rect +import android.view.ViewTreeObserver.OnGlobalLayoutListener +import androidx.recyclerview.widget.RecyclerView +import com.sendbird.uikit.internal.extensions.runOnUiThread +import com.sendbird.uikit.log.Logger +import com.sendbird.uikit.utils.ClearableScheduledExecutorService +import java.util.concurrent.TimeUnit + +/** + * Notification Impression Tracker fires events in two cases + * 1. when an item is initially added to the recycler view.(Track only once for the first time.) + * 2. when scrolling stops. + * + * The first time an item is added, the event is fired immediately with no delay, and if the scroll stops, the event is fired after the time value of [debounce]. + */ +internal class NotificationImpressionTracker( + private val recyclerView: RecyclerView, + private val debounce: Long = 500L +) : RecyclerView.OnScrollListener(), OnGlobalLayoutListener { + private val scheduler by lazy { ClearableScheduledExecutorService() } + private var initialDataLoaded = false + private var isRunning = false + var onImpressionDetected: (() -> Unit)? = null + + override fun onScrollStateChanged(view: RecyclerView, scrollState: Int) { + if (view.childCount <= 0) return + if (scrollState == RecyclerView.SCROLL_STATE_IDLE) { + startSchedule(debounce) + } else { + cancelSchedule() + } + } + + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + if (initialDataLoaded) return + if (recyclerView.childCount <= 0) return + + // Make sure the current view is drawn on the screen + if (!recyclerView.getGlobalVisibleRect(Rect())) return + if (dx == 0 && dy == 0) { + // This is the case when the item is initially loaded. + startSchedule() + initialDataLoaded = true + } + } + + override fun onGlobalLayout() { + if (initialDataLoaded) return + if (recyclerView.childCount <= 0) return + + // Once the layout has been drawn, it will continue to return true. But that's not a problem because we only need to catch it the first time. + if (!recyclerView.getGlobalVisibleRect(Rect())) return + startSchedule() + initialDataLoaded = true + recyclerView.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + + @Synchronized + fun start() { + Logger.d(">> NotificationScrollImpressionTracker::start()") + if (isRunning) return + recyclerView.addOnScrollListener(this) + + /** + * If it is organized in tabs, the View's Visibility is View.Visible, but it may not actually be visible on the screen. + * In this case, we need to watch for events that change the layout, + * because we want the Impression to act the moment it is actually visible. + */ + recyclerView.viewTreeObserver.addOnGlobalLayoutListener(this) + isRunning = true + } + + @Synchronized + fun stop() { + Logger.d(">> NotificationScrollImpressionTracker stop()") + isRunning = false + recyclerView.removeOnScrollListener(this) + recyclerView.viewTreeObserver.removeOnGlobalLayoutListener(this) + cancelSchedule() + } + + @Synchronized + private fun startSchedule(initialDelay: Long = 300L) { + Logger.d(">> NotificationScrollImpressionTracker::startSchedule(), initialDelay: $initialDelay") + + if (initialDelay > 0L) { + scheduler.schedule({ + notifyImpressions() + }, debounce, TimeUnit.MILLISECONDS) + return + } else { + notifyImpressions() + } + } + + @Synchronized + private fun cancelSchedule() { + Logger.d(">> NotificationScrollImpressionTracker cancelSchedule()") + scheduler.cancelAllJobs(true) + } + + private fun notifyImpressions() { + runOnUiThread { + Logger.i(">> impression detected") + onImpressionDetected?.invoke() + } + } +} diff --git a/uikit/src/main/java/com/sendbird/uikit/model/TextUIConfig.kt b/uikit/src/main/java/com/sendbird/uikit/model/TextUIConfig.kt index 923526c4..9080ad7a 100644 --- a/uikit/src/main/java/com/sendbird/uikit/model/TextUIConfig.kt +++ b/uikit/src/main/java/com/sendbird/uikit/model/TextUIConfig.kt @@ -219,18 +219,18 @@ open class TextUIConfig private constructor( class Builder { @ColorInt - private var textBackgroundColor = -1 + private var textBackgroundColor = UNDEFINED_RESOURCE_ID @ColorInt - private var textColor = -1 - private var textStyle = -1 + private var textColor = UNDEFINED_RESOURCE_ID + private var textStyle = UNDEFINED_RESOURCE_ID // pixel size - private var textSize = -1 + private var textSize = UNDEFINED_RESOURCE_ID private var familyName: String? = null @FontRes - private var customFontRes = 0 + private var customFontRes = UNDEFINED_RESOURCE_ID /** * Constructor @@ -327,7 +327,7 @@ open class TextUIConfig private constructor( * @return This Builder object to allow for chaining of calls to set methods. * @since 3.2.1 */ - fun setCustomFontRes(customFontRes: Int): Builder { + fun setCustomFontRes(@FontRes customFontRes: Int): Builder { this.customFontRes = customFontRes return this } diff --git a/uikit/src/main/java/com/sendbird/uikit/model/configurations/ChannelConfig.kt b/uikit/src/main/java/com/sendbird/uikit/model/configurations/ChannelConfig.kt index 484728b1..cd333f3f 100644 --- a/uikit/src/main/java/com/sendbird/uikit/model/configurations/ChannelConfig.kt +++ b/uikit/src/main/java/com/sendbird/uikit/model/configurations/ChannelConfig.kt @@ -326,7 +326,6 @@ data class ChannelConfig internal constructor( * @since 3.10.0 */ get() = enableSuggestedRepliesMutable ?: _enableSuggestedReplies - /** * Sets whether to use the suggested replies or not. * @@ -347,7 +346,6 @@ data class ChannelConfig internal constructor( * @since 3.10.0 */ get() = enableFormTypeMessageMutable ?: _enableFormTypeMessage - /** * Sets whether to use the form type message or not. * diff --git a/uikit/src/main/java/com/sendbird/uikit/vm/BaseMessageListViewModel.java b/uikit/src/main/java/com/sendbird/uikit/vm/BaseMessageListViewModel.java index 4ddc516f..accead3b 100644 --- a/uikit/src/main/java/com/sendbird/uikit/vm/BaseMessageListViewModel.java +++ b/uikit/src/main/java/com/sendbird/uikit/vm/BaseMessageListViewModel.java @@ -41,6 +41,7 @@ import org.jetbrains.annotations.TestOnly; import java.io.File; +import java.util.Collections; import java.util.List; abstract public class BaseMessageListViewModel extends BaseViewModel implements OnPagedDataLoader> { @@ -397,7 +398,35 @@ synchronized void notifyDataSetChanged(@NonNull Traceable trace) { } @UiThread - synchronized void notifyDataSetChanged(@NonNull String traceName) {} + synchronized void notifyDataSetChanged(@NonNull String traceName) { + } + + /** + * Processes a list of messages to be passed to the view. The return value of this function is delivered to the view through {@link LiveData}. + * If you want to customize the message list to be delivered to the view, you can override this function as shown below. + * + *
+     * class CustomChannelViewModel(
+     *     channelUrl: String
+     * ) : ChannelViewModel(channelUrl, null) {
+     *     override fun buildMessageList(): List<BaseMessage> {
+     *         return super.buildMessageList().map { message ->
+     *             // customize the message here
+     *             message
+     *         }
+     *     }
+     * }
+     * 
+ * To provide custom {@link ChannelViewModel} to Sendbird UIKit, Check out here for more details. + * + * @return List of messages to be passed to the view through LiveData. + * since 3.12.0 + */ + @UiThread + @NonNull + public List buildMessageList() { + return Collections.emptyList(); + } @TestOnly @Nullable diff --git a/uikit/src/main/java/com/sendbird/uikit/vm/ChannelViewModel.java b/uikit/src/main/java/com/sendbird/uikit/vm/ChannelViewModel.java index 66d7fd2f..70c4a273 100644 --- a/uikit/src/main/java/com/sendbird/uikit/vm/ChannelViewModel.java +++ b/uikit/src/main/java/com/sendbird/uikit/vm/ChannelViewModel.java @@ -494,8 +494,22 @@ private synchronized void notifyChannelDataChanged() { @Override synchronized void notifyDataSetChanged(@NonNull String traceName) { Logger.d(">> ChannelViewModel::notifyDataSetChanged(), size = %s, action=%s, hasNext=%s", cachedMessages.size(), traceName, hasNext()); - if (collection == null) return; + if (shouldIgnoreEvent(traceName)) { + Logger.d("-- ChannelViewModel::notifyDataSetChanged() event is ignored. traceName=%s", traceName); + return; + } + final List finalMessageList = buildMessageList(); + if (finalMessageList.size() == 0) { + statusFrame.setValue(StatusFrameView.Status.EMPTY); + } else { + statusFrame.setValue(StatusFrameView.Status.NONE); + } + messageList.setValue(new ChannelMessageData(traceName, finalMessageList)); + } + + boolean shouldIgnoreEvent(@NonNull String traceName) { + if (collection == null) return true; // even though a pending message is added, if the message is sent from the Thread page it shouldn't scroll to the first. final List pendingMessages = new ArrayList<>(collection.getPendingMessages()); final List failedMessages = new ArrayList<>(collection.getFailedMessages()); @@ -515,9 +529,23 @@ synchronized void notifyDataSetChanged(@NonNull String traceName) { isThreadMessage = lastFailedMessage != null && lastFailedMessage.isReplyToChannel(); } - if (shouldCheckEvents && isThreadMessage) return; + return shouldCheckEvents && isThreadMessage; + } + + return false; + } - // even though it is not a pending message event, it has to remove pending message from the thread page for the other events. + @UiThread + @NonNull + @Override + public List buildMessageList() { + MessageCollectionWrapper collection = this.collection; + if (collection == null) return Collections.emptyList(); + + final List pendingMessages = new ArrayList<>(collection.getPendingMessages()); + final List failedMessages = new ArrayList<>(collection.getFailedMessages()); + + if (channelConfig.getReplyType() == ReplyType.THREAD) { removeThreadMessages(pendingMessages); removeThreadMessages(failedMessages); } @@ -538,13 +566,7 @@ synchronized void notifyDataSetChanged(@NonNull String traceName) { } } - if (copiedList.size() == 0) { - statusFrame.setValue(StatusFrameView.Status.EMPTY); - } else { - statusFrame.setValue(StatusFrameView.Status.NONE); - } - - messageList.setValue(new ChannelMessageData(traceName, copiedList)); + return copiedList; } private void removeThreadMessages(@NonNull List src) { diff --git a/uikit/src/main/java/com/sendbird/uikit/vm/FeedNotificationChannelViewModel.java b/uikit/src/main/java/com/sendbird/uikit/vm/FeedNotificationChannelViewModel.java index 2735487c..79294315 100644 --- a/uikit/src/main/java/com/sendbird/uikit/vm/FeedNotificationChannelViewModel.java +++ b/uikit/src/main/java/com/sendbird/uikit/vm/FeedNotificationChannelViewModel.java @@ -438,4 +438,18 @@ public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Ev break; } } + + /** + * Sends the log impression to Sendbird server. + * It is working only when the channel is visible. + * + * @param messages The list of messages to be sent + * since 3.12.0 + */ + public void sendLogImpression(@NonNull List messages) { + Logger.d(">> FeedNotificationChannelViewModel::sendLogImpression(), size=%s, isVisible", messages.size(), isVisible); + if (channel == null || !isVisible) return; + final boolean result = channel.logImpression(messages); + Logger.d("++ logImpression result=%s", result); + } } diff --git a/uikit/src/main/java/com/sendbird/uikit/vm/MessageThreadViewModel.java b/uikit/src/main/java/com/sendbird/uikit/vm/MessageThreadViewModel.java index b85f7028..56ba55ab 100644 --- a/uikit/src/main/java/com/sendbird/uikit/vm/MessageThreadViewModel.java +++ b/uikit/src/main/java/com/sendbird/uikit/vm/MessageThreadViewModel.java @@ -397,15 +397,38 @@ private void notifyDataSetChangedOnUiThread(@NonNull String traceName) { synchronized void notifyDataSetChanged(@NonNull String traceName) { Logger.i(">> MessageThreadViewModel::notifyDataSetChanged(), skipEvent=%s traceName=%s ", skipEvent, traceName); if (skipEvent) return; - final List currentList = this.cachedMessages.toList(); + if (shouldIgnoreEvent(traceName)) { + Logger.d("-- MessageThreadViewModel::notifyDataSetChanged() event is ignored. traceName=%s", traceName); + return; + } + final List finalMessageList = buildMessageList(); + statusFrame.setValue(StatusFrameView.Status.NONE); + messageList.setValue(new ChannelViewModel.ChannelMessageData(traceName, finalMessageList)); + } - final List pendingMessages = new ArrayList<>(); - if (collection != null) pendingMessages.addAll(filterThreadMessages(collection.getPendingMessages())); - if (traceName.equals(StringSet.ACTION_PENDING_MESSAGE_ADDED) && pendingMessages.size() == 0) return; + boolean shouldIgnoreEvent(@NonNull String traceName) { + MessageCollection collection = this.collection; + if (collection == null) return true; - final List failedMessages = new ArrayList<>(); - if (collection != null) failedMessages.addAll(filterThreadMessages(collection.getFailedMessages())); - if (traceName.equals(StringSet.ACTION_FAILED_MESSAGE_ADDED) && failedMessages.size() == 0) return; + final List pendingMessages = new ArrayList<>(filterThreadMessages(collection.getPendingMessages())); + if (traceName.equals(StringSet.ACTION_PENDING_MESSAGE_ADDED) && pendingMessages.size() == 0) return true; + + final List failedMessages = new ArrayList<>(filterThreadMessages(collection.getFailedMessages())); + if (traceName.equals(StringSet.ACTION_FAILED_MESSAGE_ADDED) && failedMessages.size() == 0) return true; + + return false; + } + + @UiThread + @NonNull + @Override + public List buildMessageList() { + MessageCollection collection = this.collection; + if (collection == null) return Collections.emptyList(); + + final List currentList = this.cachedMessages.toList(); + final List pendingMessages = new ArrayList<>(filterThreadMessages(collection.getPendingMessages())); + final List failedMessages = new ArrayList<>(filterThreadMessages(collection.getFailedMessages())); // parent message should be added regardless of pending, failed messages. if (!hasPrevious() || currentList.size() == 0) { @@ -416,9 +439,7 @@ synchronized void notifyDataSetChanged(@NonNull String traceName) { currentList.addAll(0, pendingMessages); currentList.addAll(0, failedMessages); } - - statusFrame.setValue(StatusFrameView.Status.NONE); - messageList.setValue(new ChannelViewModel.ChannelMessageData(traceName, currentList)); + return currentList; } private synchronized void disposeMessageCollection() { diff --git a/uikit/src/main/res/anim/no_animation.xml b/uikit/src/main/res/anim/no_animation.xml deleted file mode 100644 index 561cd3ef..00000000 --- a/uikit/src/main/res/anim/no_animation.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - diff --git a/uikit/src/main/res/layout/sb_activity.xml b/uikit/src/main/res/layout/sb_activity.xml index 3d286c3a..1a231d84 100644 --- a/uikit/src/main/res/layout/sb_activity.xml +++ b/uikit/src/main/res/layout/sb_activity.xml @@ -7,11 +7,12 @@ + android:layout_height="match_parent" + android:importantForAccessibility="no"/> - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_fragment_photo_view.xml b/uikit/src/main/res/layout/sb_fragment_photo_view.xml index 1b721c34..93d1d3a0 100644 --- a/uikit/src/main/res/layout/sb_fragment_photo_view.xml +++ b/uikit/src/main/res/layout/sb_fragment_photo_view.xml @@ -1,7 +1,7 @@ - @@ -54,14 +54,15 @@ android:singleLine="true" /> - + android:contentDescription="@string/sb_fragment_photo_view_close_description" + app:tint="@color/ondark_01" /> - + android:contentDescription="@string/sb_fragment_photo_view_save_description" + app:tint="@color/ondark_01" /> - + android:contentDescription="@string/sb_fragment_photo_view_delete_description" + app:tint="@color/ondark_01" /> - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_channel_list_item.xml b/uikit/src/main/res/layout/sb_view_channel_list_item.xml index 3bc871ac..78ce7730 100644 --- a/uikit/src/main/res/layout/sb_view_channel_list_item.xml +++ b/uikit/src/main/res/layout/sb_view_channel_list_item.xml @@ -9,7 +9,7 @@ android:paddingRight="@dimen/sb_size_16" android:paddingBottom="@dimen/sb_size_10"> - - - - - - - - - - - - - - + - diff --git a/uikit/src/main/res/layout/sb_view_channel_push_setting.xml b/uikit/src/main/res/layout/sb_view_channel_push_setting.xml index a0ad04a2..0abf49b8 100644 --- a/uikit/src/main/res/layout/sb_view_channel_push_setting.xml +++ b/uikit/src/main/res/layout/sb_view_channel_push_setting.xml @@ -15,7 +15,7 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content"> - - - - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_channel_settings_info.xml b/uikit/src/main/res/layout/sb_view_channel_settings_info.xml index 1e6c091c..84fb86ea 100644 --- a/uikit/src/main/res/layout/sb_view_channel_settings_info.xml +++ b/uikit/src/main/res/layout/sb_view_channel_settings_info.xml @@ -19,7 +19,7 @@ android:layout_height="@dimen/sb_size_64" android:layout_margin="@dimen/sb_size_8"/> - @@ -32,4 +32,4 @@ android:layout_height="@dimen/sb_size_1" android:layout_marginLeft="@dimen/sb_size_16" android:layout_marginRight="@dimen/sb_size_16"/> - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_chat_notification_component.xml b/uikit/src/main/res/layout/sb_view_chat_notification_component.xml index dccffd2f..9d6ef97e 100644 --- a/uikit/src/main/res/layout/sb_view_chat_notification_component.xml +++ b/uikit/src/main/res/layout/sb_view_chat_notification_component.xml @@ -8,17 +8,18 @@ android:paddingBottom="@dimen/sb_size_8" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - + android:inputType="text" + android:hint="@string/sb_edittext_hint_default_description" + android:visibility="gone" + tools:ignore="Autofill" /> @@ -15,6 +16,7 @@ android:layout_height="@dimen/sb_size_24" android:layout_marginRight="@dimen/sb_size_16" android:layout_marginLeft="@dimen/sb_size_16" + android:importantForAccessibility="no" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -24,7 +26,7 @@ android:id="@+id/name" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/sb_size_24" + android:layout_marginStart="@dimen/sb_size_24" android:gravity="start|center_vertical" android:maxLines="1" android:ellipsize="end" @@ -37,6 +39,7 @@ android:id="@+id/iconRight" android:layout_width="@dimen/sb_size_24" android:layout_height="@dimen/sb_size_24" + android:importantForAccessibility="no" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/uikit/src/main/res/layout/sb_view_emoji_component.xml b/uikit/src/main/res/layout/sb_view_emoji_component.xml index f6e92c8b..4de9bc66 100644 --- a/uikit/src/main/res/layout/sb_view_emoji_component.xml +++ b/uikit/src/main/res/layout/sb_view_emoji_component.xml @@ -10,15 +10,16 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_emoji_reaction_component.xml b/uikit/src/main/res/layout/sb_view_emoji_reaction_component.xml index b69b8fb1..5bb9f336 100644 --- a/uikit/src/main/res/layout/sb_view_emoji_reaction_component.xml +++ b/uikit/src/main/res/layout/sb_view_emoji_reaction_component.xml @@ -11,12 +11,13 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_emoji_reaction_count_component.xml b/uikit/src/main/res/layout/sb_view_emoji_reaction_count_component.xml index d75fb763..6b93ccb3 100644 --- a/uikit/src/main/res/layout/sb_view_emoji_reaction_count_component.xml +++ b/uikit/src/main/res/layout/sb_view_emoji_reaction_count_component.xml @@ -6,19 +6,20 @@ android:gravity="center" xmlns:android="http://schemas.android.com/apk/res/android"> - + android:src="@drawable/icon_emoji_more" + android:contentDescription="@string/sb_emoji_default_description"/> - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_emoji_reaction_user_component.xml b/uikit/src/main/res/layout/sb_view_emoji_reaction_user_component.xml index 9343f03c..ab4afa11 100644 --- a/uikit/src/main/res/layout/sb_view_emoji_reaction_user_component.xml +++ b/uikit/src/main/res/layout/sb_view_emoji_reaction_user_component.xml @@ -17,7 +17,7 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_feed_notification_component.xml b/uikit/src/main/res/layout/sb_view_feed_notification_component.xml index 4cab434e..88de482f 100644 --- a/uikit/src/main/res/layout/sb_view_feed_notification_component.xml +++ b/uikit/src/main/res/layout/sb_view_feed_notification_component.xml @@ -8,7 +8,7 @@ android:paddingBottom="@dimen/sb_size_8" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - - - + - - diff --git a/uikit/src/main/res/layout/sb_view_form_message_component.xml b/uikit/src/main/res/layout/sb_view_form_message_component.xml index f61d2cb6..fb49e0d4 100644 --- a/uikit/src/main/res/layout/sb_view_form_message_component.xml +++ b/uikit/src/main/res/layout/sb_view_form_message_component.xml @@ -9,7 +9,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - + - - - - - - - - - - - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_mention_limit_alert.xml b/uikit/src/main/res/layout/sb_view_mention_limit_alert.xml index 0d0ac8a9..fbb4b7f3 100644 --- a/uikit/src/main/res/layout/sb_view_mention_limit_alert.xml +++ b/uikit/src/main/res/layout/sb_view_mention_limit_alert.xml @@ -5,16 +5,17 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - - - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_message_input.xml b/uikit/src/main/res/layout/sb_view_message_input.xml index f83149cb..f46f3f91 100644 --- a/uikit/src/main/res/layout/sb_view_message_input.xml +++ b/uikit/src/main/res/layout/sb_view_message_input.xml @@ -7,11 +7,12 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - @@ -30,7 +31,6 @@ android:id="@+id/ivQuoteReplyMessageImage" android:layout_width="@dimen/sb_size_32" android:layout_height="@dimen/sb_size_32" - android:layout_marginRight="@dimen/sb_size_8" android:layout_marginEnd="@dimen/sb_size_8" android:background="@drawable/sb_shape_image_message_background" android:scaleType="centerInside" @@ -40,17 +40,18 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"/> - - - - - - - - - - @@ -34,7 +35,7 @@ app:layout_constraintGuide_end="@dimen/sb_size_16" /> - - - - - - - - - - - - - - - - - - + diff --git a/uikit/src/main/res/layout/sb_view_my_message_component.xml b/uikit/src/main/res/layout/sb_view_my_message_component.xml new file mode 100644 index 00000000..f4e64801 --- /dev/null +++ b/uikit/src/main/res/layout/sb_view_my_message_component.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uikit/src/main/res/layout/sb_view_my_message_status.xml b/uikit/src/main/res/layout/sb_view_my_message_status.xml index 1cbbbd76..46db5b39 100644 --- a/uikit/src/main/res/layout/sb_view_my_message_status.xml +++ b/uikit/src/main/res/layout/sb_view_my_message_status.xml @@ -4,10 +4,11 @@ android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"> - - - - - + tools:ignore="UseCompoundDrawables"> - - - + android:layout_height="match_parent" + android:contentDescription="@string/sb_view_my_quoted_file_message_description"/> - + android:layout_height="@dimen/sb_size_24" + android:importantForAccessibility="no"/> diff --git a/uikit/src/main/res/layout/sb_view_my_user_message_component.xml b/uikit/src/main/res/layout/sb_view_my_user_message_component.xml index 9f0db9d8..2eb67e9e 100644 --- a/uikit/src/main/res/layout/sb_view_my_user_message_component.xml +++ b/uikit/src/main/res/layout/sb_view_my_user_message_component.xml @@ -19,9 +19,7 @@ android:id="@+id/ivStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="@dimen/sb_size_0" android:layout_marginStart="@dimen/sb_size_0" - android:layout_marginRight="@dimen/sb_size_4" android:layout_marginEnd="@dimen/sb_size_4" app:layout_constraintHorizontal_bias="1" app:layout_constraintHorizontal_chainStyle="packed" @@ -29,13 +27,11 @@ app:layout_constraintBottom_toBottomOf="@+id/tvSentAt" app:layout_constraintStart_toStartOf="@id/contentLeftView"/> - - - - - - - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_open_channel_admin_message_component.xml b/uikit/src/main/res/layout/sb_view_open_channel_admin_message_component.xml index 2a277718..93fa3c20 100644 --- a/uikit/src/main/res/layout/sb_view_open_channel_admin_message_component.xml +++ b/uikit/src/main/res/layout/sb_view_open_channel_admin_message_component.xml @@ -9,7 +9,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_open_channel_file_image_message_component.xml b/uikit/src/main/res/layout/sb_view_open_channel_file_image_message_component.xml index 747868ae..690f29fa 100644 --- a/uikit/src/main/res/layout/sb_view_open_channel_file_image_message_component.xml +++ b/uikit/src/main/res/layout/sb_view_open_channel_file_image_message_component.xml @@ -12,22 +12,21 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - diff --git a/uikit/src/main/res/layout/sb_view_open_channel_file_message_component.xml b/uikit/src/main/res/layout/sb_view_open_channel_file_message_component.xml index 6384aa46..13b4b4a8 100644 --- a/uikit/src/main/res/layout/sb_view_open_channel_file_message_component.xml +++ b/uikit/src/main/res/layout/sb_view_open_channel_file_message_component.xml @@ -12,22 +12,21 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - diff --git a/uikit/src/main/res/layout/sb_view_open_channel_file_video_message_component.xml b/uikit/src/main/res/layout/sb_view_open_channel_file_video_message_component.xml index 2d5e9d0e..3bffa4bb 100644 --- a/uikit/src/main/res/layout/sb_view_open_channel_file_video_message_component.xml +++ b/uikit/src/main/res/layout/sb_view_open_channel_file_video_message_component.xml @@ -12,22 +12,21 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - diff --git a/uikit/src/main/res/layout/sb_view_open_channel_list.xml b/uikit/src/main/res/layout/sb_view_open_channel_list.xml deleted file mode 100644 index 53ce6489..00000000 --- a/uikit/src/main/res/layout/sb_view_open_channel_list.xml +++ /dev/null @@ -1,5 +0,0 @@ - - diff --git a/uikit/src/main/res/layout/sb_view_open_channel_list_item.xml b/uikit/src/main/res/layout/sb_view_open_channel_list_item.xml index 1af2ed57..015477a1 100644 --- a/uikit/src/main/res/layout/sb_view_open_channel_list_item.xml +++ b/uikit/src/main/res/layout/sb_view_open_channel_list_item.xml @@ -6,26 +6,28 @@ android:layout_height="wrap_content" > - - - - - - - - - - - @@ -42,7 +42,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - - - - - diff --git a/uikit/src/main/res/layout/sb_view_other_file_image_message_component.xml b/uikit/src/main/res/layout/sb_view_other_file_image_message_component.xml index 1e66ac2e..991a5ff1 100644 --- a/uikit/src/main/res/layout/sb_view_other_file_image_message_component.xml +++ b/uikit/src/main/res/layout/sb_view_other_file_image_message_component.xml @@ -8,18 +8,19 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - - - + android:layout_marginEnd="@dimen/sb_size_8" + android:importantForAccessibility="no" /> - - - - - - - + diff --git a/uikit/src/main/res/layout/sb_view_other_message_component.xml b/uikit/src/main/res/layout/sb_view_other_message_component.xml new file mode 100644 index 00000000..15540d63 --- /dev/null +++ b/uikit/src/main/res/layout/sb_view_other_message_component.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uikit/src/main/res/layout/sb_view_other_multiple_files_message_component.xml b/uikit/src/main/res/layout/sb_view_other_multiple_files_message_component.xml index 6d5b4162..9bae5a71 100644 --- a/uikit/src/main/res/layout/sb_view_other_multiple_files_message_component.xml +++ b/uikit/src/main/res/layout/sb_view_other_multiple_files_message_component.xml @@ -8,18 +8,19 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - + tools:ignore="UseCompoundDrawables"> - - - + android:layout_height="match_parent" + android:contentDescription="@string/sb_view_other_quoted_file_message_description"/> - + android:layout_height="@dimen/sb_size_24" + android:importantForAccessibility="no"/> diff --git a/uikit/src/main/res/layout/sb_view_other_user_message_component.xml b/uikit/src/main/res/layout/sb_view_other_user_message_component.xml index a266b06b..6bf8532e 100644 --- a/uikit/src/main/res/layout/sb_view_other_user_message_component.xml +++ b/uikit/src/main/res/layout/sb_view_other_user_message_component.xml @@ -15,18 +15,19 @@ app:barrierDirection="bottom" app:constraint_referenced_ids="ivProfileView,contentPanel,tvSentAt" /> - - - - - - - - - - + app:layout_constraintRight_toRightOf="@id/guidelineEnd" + android:contentDescription="@string/sb_view_parent_message_info_menu_icon_description"/> - - - - - - - - + - - - diff --git a/uikit/src/main/res/layout/sb_view_select_channel_type.xml b/uikit/src/main/res/layout/sb_view_select_channel_type.xml index f75c5fc4..564e1b77 100644 --- a/uikit/src/main/res/layout/sb_view_select_channel_type.xml +++ b/uikit/src/main/res/layout/sb_view_select_channel_type.xml @@ -8,8 +8,6 @@ + android:scaleType="centerCrop" + android:importantForAccessibility="no"/> + android:scaleType="centerCrop" + android:importantForAccessibility="no"/> + android:scaleType="centerCrop" + android:importantForAccessibility="no"/> - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_single_menu_item.xml b/uikit/src/main/res/layout/sb_view_single_menu_item.xml index 0a0f6d00..1ec6d97f 100644 --- a/uikit/src/main/res/layout/sb_view_single_menu_item.xml +++ b/uikit/src/main/res/layout/sb_view_single_menu_item.xml @@ -29,7 +29,7 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - - - - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_state_header.xml b/uikit/src/main/res/layout/sb_view_state_header.xml index e1609865..5deed3b7 100644 --- a/uikit/src/main/res/layout/sb_view_state_header.xml +++ b/uikit/src/main/res/layout/sb_view_state_header.xml @@ -13,27 +13,26 @@ android:layout_height="@dimen/sb_size_56" android:padding="@dimen/sb_size_8"> - - - - - - @@ -47,7 +49,7 @@ android:layout_width="@dimen/sb_size_12" android:layout_height="@dimen/sb_size_0"/> - - - - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_suggested_reply_component.xml b/uikit/src/main/res/layout/sb_view_suggested_reply_component.xml index 489922c3..7438c0ab 100644 --- a/uikit/src/main/res/layout/sb_view_suggested_reply_component.xml +++ b/uikit/src/main/res/layout/sb_view_suggested_reply_component.xml @@ -5,7 +5,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - + android:src="@drawable/icon_done" + android:contentDescription="@string/sb_view_toast_success_description"/> - + android:src="@drawable/icon_error" + android:contentDescription="@string/sb_view_toast_error_description"/> - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_user_list_item.xml b/uikit/src/main/res/layout/sb_view_user_list_item.xml index 7daac6b4..c1d7f5be 100644 --- a/uikit/src/main/res/layout/sb_view_user_list_item.xml +++ b/uikit/src/main/res/layout/sb_view_user_list_item.xml @@ -17,7 +17,7 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_user_profile.xml b/uikit/src/main/res/layout/sb_view_user_profile.xml index 61bb4f22..85d5ba6c 100644 --- a/uikit/src/main/res/layout/sb_view_user_profile.xml +++ b/uikit/src/main/res/layout/sb_view_user_profile.xml @@ -18,7 +18,7 @@ android:layout_width="@dimen/sb_size_80" android:layout_height="@dimen/sb_size_80"/> - - - + android:layout_height="@dimen/sb_size_1" + android:importantForAccessibility="no"/> - - - \ No newline at end of file + diff --git a/uikit/src/main/res/layout/sb_view_voice_message.xml b/uikit/src/main/res/layout/sb_view_voice_message.xml index cdf23eef..f548ddde 100644 --- a/uikit/src/main/res/layout/sb_view_voice_message.xml +++ b/uikit/src/main/res/layout/sb_view_voice_message.xml @@ -17,20 +17,22 @@ app:layout_constraintBottom_toBottomOf="parent" /> - - - - + - - - + + - - - - - - diff --git a/uikit/src/main/res/values/content_descriptions.xml b/uikit/src/main/res/values/content_descriptions.xml new file mode 100644 index 00000000..41663ba2 --- /dev/null +++ b/uikit/src/main/res/values/content_descriptions.xml @@ -0,0 +1,49 @@ + + + close + save + delete + broadcast channel + frozen channel + select channel cover + clear channel name + unread message + back + menu + image file + member profile + action + close reply + add + send message + send voice message + scroll to bottom + my image message + my video message + my replied file message + ogtag + image message + video message + other image message + other video message + other replied file message + parent message menu + clear text + suggested mention profile + success + error + play + pause + record + play + stop + pause + send + + + enter text + emoji + sender profile + channel cover + +