From 67d055637b1691e0b6bdee4975d4de41a57a7a0d Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 10 Aug 2022 11:40:56 +0200 Subject: [PATCH 01/25] [PIVOT] Group messages within 15 minutes --- README.md | 3 +++ build.gradle | 2 +- .../src/main/java/com/sendbird/uikit/utils/DateUtils.java | 8 ++++++++ .../main/java/com/sendbird/uikit/utils/MessageUtils.java | 5 ++++- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c1f930b1..714342c0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +# !! [PIVOT] Use `pivot-group-ui` branch + + # Sendbird UIKit for Android ![Platform](https://img.shields.io/badge/platform-ANDROID-orange.svg) ![Languages](https://img.shields.io/badge/language-JAVA-orange.svg) diff --git a/build.gradle b/build.gradle index f0348b4e..99b24464 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.7.20' + ext.kotlin_version = '1.6.10' ext.paparazzi_version = '1.3.1' dependencies { diff --git a/uikit/src/main/java/com/sendbird/uikit/utils/DateUtils.java b/uikit/src/main/java/com/sendbird/uikit/utils/DateUtils.java index 9fb108a0..b38bea37 100644 --- a/uikit/src/main/java/com/sendbird/uikit/utils/DateUtils.java +++ b/uikit/src/main/java/com/sendbird/uikit/utils/DateUtils.java @@ -158,6 +158,14 @@ public static boolean hasSameTimeInMinute(long millisFirst, long millisSecond) { return dateFormat.format(millisFirst).equals(dateFormat.format(millisSecond)); } + /** + * Get time difference in minutes + * @since Added by Pivot + */ + public static int getTimeDifferenceInMinutes(long millisFirst, long millisSecond) { + return (int) Math.abs((millisSecond - millisFirst) / 60000); + } + /** * Get time the difference. * Date shows 'date month' format (e.g. '19 Dec'). diff --git a/uikit/src/main/java/com/sendbird/uikit/utils/MessageUtils.java b/uikit/src/main/java/com/sendbird/uikit/utils/MessageUtils.java index 68cd3e3c..6cfc6406 100644 --- a/uikit/src/main/java/com/sendbird/uikit/utils/MessageUtils.java +++ b/uikit/src/main/java/com/sendbird/uikit/utils/MessageUtils.java @@ -28,6 +28,9 @@ import java.util.List; public class MessageUtils { + + private static int NEW_GROUP_UI_DIFFERENCE_IN_MINUTES = 15; + public static boolean isMine(@NonNull BaseMessage message) { if (message.getSender() == null) { return false; @@ -79,7 +82,7 @@ public static boolean isGroupChanged(@Nullable BaseMessage frontMessage, @Nullab !backMessage.getSendingStatus().equals(SendingStatus.SUCCEEDED) || !frontMessage.getSendingStatus().equals(SendingStatus.SUCCEEDED) || !frontMessage.getSender().equals(backMessage.getSender()) || - !DateUtils.hasSameTimeInMinute(frontMessage.getCreatedAt(), backMessage.getCreatedAt()) || + DateUtils.getTimeDifferenceInMinutes(frontMessage.getCreatedAt(), backMessage.getCreatedAt()) > NEW_GROUP_UI_DIFFERENCE_IN_MINUTES || (messageListUIParams.getChannelConfig().getReplyType() == ReplyType.THREAD && ( (!(frontMessage instanceof CustomizableMessage) && frontMessage.getThreadInfo().getReplyCount() > 0) || (!(backMessage instanceof CustomizableMessage) && backMessage.getThreadInfo().getReplyCount() > 0) From fdf3818ae28aa7402ad99e78974bccb77e6ea0b8 Mon Sep 17 00:00:00 2001 From: Simon Date: Thu, 6 Jul 2023 21:10:57 +0200 Subject: [PATCH 02/25] [PIVOT] Mark messages as READ only if chat is visible --- .../sendbird/uikit/fragments/ChannelFragment.java | 13 +++++++++++++ .../com/sendbird/uikit/vm/ChannelViewModel.java | 10 +++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java b/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java index 9cd2221e..89ac928f 100644 --- a/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java +++ b/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java @@ -209,6 +209,19 @@ protected void onReady(@NonNull ReadyStatus status, @NonNull ChannelModule modul loadInitial(startingPoint); } + @Override + public void onResume() { + super.onResume(); + getViewModel().setIsChatScreenVisible(true); + getViewModel().markAsRead(); + } + + @Override + public void onPause() { + super.onPause(); + getViewModel().setIsChatScreenVisible(false); + } + @Override public void onDestroy() { super.onDestroy(); 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 49d3bb22..ebea4e44 100644 --- a/uikit/src/main/java/com/sendbird/uikit/vm/ChannelViewModel.java +++ b/uikit/src/main/java/com/sendbird/uikit/vm/ChannelViewModel.java @@ -106,6 +106,7 @@ public class ChannelViewModel extends BaseMessageListViewModel { @Nullable private MessageCollectionHandler handler; private boolean needToLoadMessageCache = true; + private boolean isChatScreenVisible = false; @NonNull private final SendbirdChatContract sendbirdChatContract; @NonNull @@ -712,11 +713,18 @@ private TypingIndicatorMessage createTypingIndicatorMessage() { return null; } - private void markAsRead() { + public void markAsRead() { + if (!isChatScreenVisible) return; + Logger.dev("markAsRead"); if (channel != null) channel.markAsRead(null); } + public void setIsChatScreenVisible(boolean visible) { + Logger.dev("setIsChatScreenVisible: " + visible); + isChatScreenVisible = visible; + } + @UiThread private synchronized void notifyChannelDeleted(@NonNull String channelUrl) { channelDeleted.setValue(channelUrl); From 43680153d465f80241e6864322e30ff8c6c93a48 Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Wed, 19 Jul 2023 11:12:15 +0200 Subject: [PATCH 03/25] [BRICK-970] Hide "text" part of Sendbird messages containing only `aerobie-api.pivot.co` URL (#2) --- .../src/main/java/com/sendbird/uikit/utils/ViewUtils.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/uikit/src/main/java/com/sendbird/uikit/utils/ViewUtils.java b/uikit/src/main/java/com/sendbird/uikit/utils/ViewUtils.java index d6b2d4c4..023491ff 100644 --- a/uikit/src/main/java/com/sendbird/uikit/utils/ViewUtils.java +++ b/uikit/src/main/java/com/sendbird/uikit/utils/ViewUtils.java @@ -84,6 +84,7 @@ public class ViewUtils { private final static int MINIMUM_THUMBNAIL_WIDTH = 100; private final static int MINIMUM_THUMBNAIL_HEIGHT = 100; public static final Pattern MENTION = Pattern.compile("[" + SendbirdUIKit.getUserMentionConfig().getTrigger() + "][{](.*?)([}])"); + public static final Pattern AEROBIE_URL_ONLY = Pattern.compile("^(http|https):\\/\\/aerobie-api([a-zA-Z0-9-]+)?\\.pivot\\.co\\/og(\\S)+$"); public static void drawUnknownMessage(@NonNull TextView view, boolean isMine) { int unknownHintAppearance; @@ -129,6 +130,12 @@ public static void drawTextMessage( return; } + if (AEROBIE_URL_ONLY.matcher(message.getMessage().trim()).matches()) { + textView.setVisibility(View.GONE); + } else { + textView.setVisibility(View.VISIBLE); + } + if (MessageUtils.isUnknownType(message)) { drawUnknownMessage(textView, MessageUtils.isMine(message)); return; From 8da707979803e14890133275bbb86739ba5dd406 Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Tue, 1 Aug 2023 18:35:27 +0200 Subject: [PATCH 04/25] [PIVOT] [BRICK-1006] disable the user's ability to delete a coach message (#3) --- .../java/com/sendbird/uikit/fragments/ChannelFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java b/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java index 89ac928f..71f53b5a 100644 --- a/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java +++ b/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java @@ -728,9 +728,9 @@ protected List makeMessageContextMenu(@NonNull BaseMessage messa case VIEW_TYPE_USER_MESSAGE_ME: if (status == SendingStatus.SUCCEEDED) { if (replyType == ReplyType.NONE) { - actions = new DialogListItem[]{copy, edit, delete}; + actions = new DialogListItem[]{copy, edit}; } else { - actions = new DialogListItem[]{copy, edit, delete, reply}; + actions = new DialogListItem[]{copy, edit, reply}; } } else if (MessageUtils.isFailed(message)) { actions = new DialogListItem[]{retry, deleteFailed}; From cacd15000efdc25f70e37f2e02288f8d403430ec Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Tue, 1 Aug 2023 20:47:49 +0200 Subject: [PATCH 05/25] [PIVOT] [BRICK-836] users can tap on deep links on coaching tab to launch various parts of the app (#4) --- uikit/src/main/java/com/sendbird/uikit/utils/IntentUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uikit/src/main/java/com/sendbird/uikit/utils/IntentUtils.java b/uikit/src/main/java/com/sendbird/uikit/utils/IntentUtils.java index 23c148bf..6bdcf52d 100644 --- a/uikit/src/main/java/com/sendbird/uikit/utils/IntentUtils.java +++ b/uikit/src/main/java/com/sendbird/uikit/utils/IntentUtils.java @@ -113,7 +113,7 @@ private static void grantWritePermission(@NonNull Context context, @NonNull Inte @NonNull public static Intent getWebViewerIntent(@NonNull String url) { - if (!url.startsWith("http://") && !url.startsWith("https://")) { + if (!url.startsWith("pivotapp://") && !url.startsWith("http://") && !url.startsWith("https://")) { url = "https://" + url; } Uri uri = Uri.parse(url); From fcd470fe2b41111e60f8fc03c55a610afdaebf60 Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Fri, 18 Aug 2023 15:32:25 +0200 Subject: [PATCH 06/25] [PIVOT] [BRICK-1048] Hide the user ID that is displayed if replying (#5) --- .../main/java/com/sendbird/uikit/widgets/MessageInputView.kt | 2 +- uikit/src/main/res/values/strings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/uikit/src/main/java/com/sendbird/uikit/widgets/MessageInputView.kt b/uikit/src/main/java/com/sendbird/uikit/widgets/MessageInputView.kt index 6003f1ce..a22cdf2c 100644 --- a/uikit/src/main/java/com/sendbird/uikit/widgets/MessageInputView.kt +++ b/uikit/src/main/java/com/sendbird/uikit/widgets/MessageInputView.kt @@ -188,7 +188,7 @@ class MessageInputView @JvmOverloads constructor( message.sender?.let { binding.tvQuoteReplyTitle.text = - String.format(context.getString(R.string.sb_text_reply_to), it.nickname) + String.format(context.getString(R.string.sb_text_reply_to)) } binding.tvQuoteReplyMessage.text = displayMessage } diff --git a/uikit/src/main/res/values/strings.xml b/uikit/src/main/res/values/strings.xml index 220f83c1..9804d2ed 100644 --- a/uikit/src/main/res/values/strings.xml +++ b/uikit/src/main/res/values/strings.xml @@ -203,7 +203,7 @@ You - Reply to %s + Reply %s replied to %s Couldn\'t find the original message for this reply. You can have up to %d mentions per message. From c0be2461891c4b1514a6e92ceab599d1514be7c3 Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Fri, 18 Aug 2023 16:07:59 +0200 Subject: [PATCH 07/25] Gradle update to 8.0.2 (#6) * Migrated from Gradle 7.2.2 to 8.1.0 * Downgraded Gradle plugin to 8.0.2 --- uikit/src/main/AndroidManifest.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/uikit/src/main/AndroidManifest.xml b/uikit/src/main/AndroidManifest.xml index 5dab1bd5..74b57fca 100644 --- a/uikit/src/main/AndroidManifest.xml +++ b/uikit/src/main/AndroidManifest.xml @@ -3,8 +3,13 @@ xmlns:tools="http://schemas.android.com/tools"> - - + + From 3ed067fcf85b468a107a8703a092aa46837e7a3d Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Thu, 31 Aug 2023 13:02:24 +0200 Subject: [PATCH 08/25] [BRICK-1196] add mixpanel event property to coaching-send-message event (#8) --- uikit-samples/build.gradle | 2 ++ .../sendbird/uikit/fragments/BaseMessageListFragment.java | 6 ++++++ .../com/sendbird/uikit/interfaces/CustomParamsHandler.java | 2 ++ .../com/sendbird/uikit/vm/BaseMessageListViewModel.java | 7 +++++++ 4 files changed, 17 insertions(+) diff --git a/uikit-samples/build.gradle b/uikit-samples/build.gradle index 5b989d53..a570e2d1 100644 --- a/uikit-samples/build.gradle +++ b/uikit-samples/build.gradle @@ -31,6 +31,8 @@ android { viewBinding true buildConfig = true } + + namespace 'com.sendbird.uikit' } dependencies { diff --git a/uikit/src/main/java/com/sendbird/uikit/fragments/BaseMessageListFragment.java b/uikit/src/main/java/com/sendbird/uikit/fragments/BaseMessageListFragment.java index 17c73db8..913c8947 100644 --- a/uikit/src/main/java/com/sendbird/uikit/fragments/BaseMessageListFragment.java +++ b/uikit/src/main/java/com/sendbird/uikit/fragments/BaseMessageListFragment.java @@ -876,6 +876,12 @@ private MultipleFilesMessageCreateParams getMultipleFilesMessageCreateParams(Lis @NonNull private FileMessageCreateParams getFileMessageCreateParams(@NonNull FileInfo fileInfo) { final FileMessageCreateParams imageParams = fileInfo.toFileParams(); + + if (targetMessage != null && channelConfig.getReplyType() != ReplyType.NONE) { + imageParams.setParentMessageId(targetMessage.getMessageId()); + imageParams.setReplyToChannel(true); + } + final CustomParamsHandler customHandler = SendbirdUIKit.getCustomParamsHandler(); if (customHandler != null) { customHandler.onBeforeSendFileMessage(imageParams); diff --git a/uikit/src/main/java/com/sendbird/uikit/interfaces/CustomParamsHandler.java b/uikit/src/main/java/com/sendbird/uikit/interfaces/CustomParamsHandler.java index 2c602c3c..eda673b7 100644 --- a/uikit/src/main/java/com/sendbird/uikit/interfaces/CustomParamsHandler.java +++ b/uikit/src/main/java/com/sendbird/uikit/interfaces/CustomParamsHandler.java @@ -54,6 +54,8 @@ default void onBeforeSendUserMessage(@NonNull UserMessageCreateParams params) {} */ default void onBeforeSendFileMessage(@NonNull FileMessageCreateParams params) {} + default void onBeforeToggleReaction(@NonNull Boolean isAdded) {} + /** * It will be called before sending multiple files message. * If you want add more data, you can override this and set the data. 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 495b74f7..6e926919 100644 --- a/uikit/src/main/java/com/sendbird/uikit/vm/BaseMessageListViewModel.java +++ b/uikit/src/main/java/com/sendbird/uikit/vm/BaseMessageListViewModel.java @@ -26,6 +26,7 @@ import com.sendbird.uikit.SendbirdUIKit; import com.sendbird.uikit.consts.StringSet; import com.sendbird.uikit.interfaces.AuthenticateHandler; +import com.sendbird.uikit.interfaces.CustomParamsHandler; import com.sendbird.uikit.interfaces.OnCompleteHandler; import com.sendbird.uikit.interfaces.OnPagedDataLoader; import com.sendbird.uikit.internal.contracts.SendbirdUIKitImpl; @@ -275,6 +276,12 @@ public void deleteMessage(@NonNull BaseMessage message, @Nullable OnCompleteHand */ public void toggleReaction(@NonNull View view, @NonNull BaseMessage message, @NonNull String key, @Nullable OnCompleteHandler handler) { if (channel == null) return; + + final CustomParamsHandler customHandler = SendbirdUIKit.getCustomParamsHandler(); + if (customHandler != null) { + customHandler.onBeforeToggleReaction(!view.isSelected()); + } + if (!view.isSelected()) { Logger.i("__ add reaction : %s", key); channel.addReaction(message, key, (reactionEvent, e) -> { From 354c1bf9e97fe943c6f5727f626b860fcebe7ce6 Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Wed, 13 Sep 2023 19:45:28 +0200 Subject: [PATCH 09/25] [BRICK-1256] Block Sendbird from closing our MainActivity (#9) * [BRICK-1256] Block Sendbird from closing our MainActivity * [BRICK-1256] Added failure logs --- .../java/com/sendbird/uikit/fragments/BaseFragment.java | 7 ++++--- .../java/com/sendbird/uikit/fragments/ChannelFragment.java | 1 + .../com/sendbird/uikit/vm/BaseMessageListViewModel.java | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/uikit/src/main/java/com/sendbird/uikit/fragments/BaseFragment.java b/uikit/src/main/java/com/sendbird/uikit/fragments/BaseFragment.java index 2abf930c..ed7da2a2 100644 --- a/uikit/src/main/java/com/sendbird/uikit/fragments/BaseFragment.java +++ b/uikit/src/main/java/com/sendbird/uikit/fragments/BaseFragment.java @@ -105,8 +105,9 @@ protected boolean isFragmentAlive() { * Finishes the activity that has the current fragment. */ protected void shouldActivityFinish() { - if (getActivity() != null) { - getActivity().finish(); - } + // We don't want Sendbird chat to close our MainActivity +// if (getActivity() != null) { +// getActivity().finish(); +// } } } diff --git a/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java b/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java index 71f53b5a..19b085da 100644 --- a/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java +++ b/uikit/src/main/java/com/sendbird/uikit/fragments/ChannelFragment.java @@ -192,6 +192,7 @@ protected void onReady(@NonNull ReadyStatus status, @NonNull ChannelModule modul shouldDismissLoadingDialog(); final GroupChannel channel = viewModel.getChannel(); if (status == ReadyStatus.ERROR || channel == null || channel.isChatNotification()) { + Logger.e("status: " + status + ", channel is null: " + (channel == null) + ", isChatNotification: " + (channel != null ? channel.isChatNotification() : "channel null")); if (isFragmentAlive()) { toastError(R.string.sb_text_error_get_channel); shouldActivityFinish(); 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 6e926919..a92ecb2b 100644 --- a/uikit/src/main/java/com/sendbird/uikit/vm/BaseMessageListViewModel.java +++ b/uikit/src/main/java/com/sendbird/uikit/vm/BaseMessageListViewModel.java @@ -314,6 +314,7 @@ public void authenticate(@NonNull AuthenticateHandler handler) { getChannel(channelUrl, (channel, e1) -> { this.channel = channel; if (e1 != null || channel == null) { + Logger.e("Channel authenticate failed: " + (e1 != null ? e1.getMessage() : "channel null")); handler.onAuthenticationFailed(); } else { this.memberFinder = new MemberFinder(channel, SendbirdUIKit.getUserMentionConfig()); @@ -321,6 +322,7 @@ public void authenticate(@NonNull AuthenticateHandler handler) { } }); } else { + Logger.e("Channel authenticate failed - null user: " + (e != null ? e.getMessage() : "no exception")); handler.onAuthenticationFailed(); } }); From c345f182dd96cc0256e9abe113ff17b2fa4fc302 Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Mon, 27 Nov 2023 17:40:02 +0100 Subject: [PATCH 10/25] [BRICK-1709] add mixpanel event when a user taps on a deeplink within coaching (#11) --- .../uikit/internal/ui/messages/MyUserMessageView.kt | 8 ++++++++ .../uikit/internal/ui/messages/OtherUserMessageView.kt | 8 ++++++++ .../main/java/com/sendbird/uikit/utils/IntentUtils.java | 6 ++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyUserMessageView.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyUserMessageView.kt index 57b2227c..23f82813 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyUserMessageView.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/MyUserMessageView.kt @@ -14,11 +14,13 @@ import com.sendbird.uikit.R import com.sendbird.uikit.consts.MessageGroupType import com.sendbird.uikit.databinding.SbViewMyUserMessageComponentBinding import com.sendbird.uikit.interfaces.OnItemClickListener +import com.sendbird.uikit.internal.ui.widgets.OnLinkClickListener import com.sendbird.uikit.internal.ui.widgets.OnLinkLongClickListener import com.sendbird.uikit.model.MessageListUIParams import com.sendbird.uikit.model.TextUIConfig import com.sendbird.uikit.model.configurations.ChannelConfig import com.sendbird.uikit.utils.DrawableUtils +import com.sendbird.uikit.utils.IntentUtils import com.sendbird.uikit.utils.ViewUtils internal class MyUserMessageView @JvmOverloads internal constructor( @@ -96,6 +98,12 @@ internal class MyUserMessageView @JvmOverloads internal constructor( DrawableUtils.setTintList(context, ogtagBackground, ogtagBackgroundTint) binding.tvMessage.setOnClickListener { binding.contentPanel.performClick() } binding.tvMessage.setOnLongClickListener { binding.contentPanel.performLongClick() } + binding.tvMessage.onLinkClickListener = object : OnLinkClickListener { + override fun onClick(textView: TextView, link: String): Boolean { + context.startActivity(IntentUtils.getWebViewerIntent(link)) + return true + } + } binding.tvMessage.onLinkLongClickListener = object : OnLinkLongClickListener { override fun onLongClick(textView: TextView, link: String): Boolean { return binding.contentPanel.performLongClick() diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherUserMessageView.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherUserMessageView.kt index 2e130917..ec56da80 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherUserMessageView.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/OtherUserMessageView.kt @@ -22,11 +22,13 @@ import com.sendbird.uikit.internal.extensions.isStreamMessage import com.sendbird.uikit.internal.extensions.isSuggestedRepliesVisible import com.sendbird.uikit.internal.extensions.shouldShowSuggestedReplies import com.sendbird.uikit.internal.interfaces.OnFeedbackRatingClickListener +import com.sendbird.uikit.internal.ui.widgets.OnLinkClickListener import com.sendbird.uikit.internal.ui.widgets.OnLinkLongClickListener import com.sendbird.uikit.model.MessageListUIParams import com.sendbird.uikit.model.TextUIConfig import com.sendbird.uikit.model.configurations.ChannelConfig import com.sendbird.uikit.utils.DrawableUtils +import com.sendbird.uikit.utils.IntentUtils import com.sendbird.uikit.utils.MessageUtils import com.sendbird.uikit.utils.ViewUtils @@ -118,6 +120,12 @@ internal class OtherUserMessageView @JvmOverloads internal constructor( DrawableUtils.setTintList(context, ogtagBackground, ogtagBackgroundTint) binding.tvMessage.setOnClickListener { binding.contentPanel.performClick() } binding.tvMessage.setOnLongClickListener { binding.contentPanel.performLongClick() } + binding.tvMessage.onLinkClickListener = object : OnLinkClickListener { + override fun onClick(textView: TextView, link: String): Boolean { + context.startActivity(IntentUtils.getWebViewerIntent(link)) + return true + } + } binding.tvMessage.onLinkLongClickListener = object : OnLinkLongClickListener { override fun onLongClick(textView: TextView, link: String): Boolean { return binding.contentPanel.performLongClick() diff --git a/uikit/src/main/java/com/sendbird/uikit/utils/IntentUtils.java b/uikit/src/main/java/com/sendbird/uikit/utils/IntentUtils.java index 6bdcf52d..ce900365 100644 --- a/uikit/src/main/java/com/sendbird/uikit/utils/IntentUtils.java +++ b/uikit/src/main/java/com/sendbird/uikit/utils/IntentUtils.java @@ -116,8 +116,10 @@ public static Intent getWebViewerIntent(@NonNull String url) { if (!url.startsWith("pivotapp://") && !url.startsWith("http://") && !url.startsWith("https://")) { url = "https://" + url; } - Uri uri = Uri.parse(url); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); + + Intent intent = new Intent(); + intent.setClassName("com.carrot.pivot","com.carrot.pivot.coaching.chat.deeplinks.CoachingDeeplinksReceiverActivity"); + intent.putExtra("URL_KEY", url); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); return intent; } From 4cc9cdb912c471c303ed61ae56793f71059046ac Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Tue, 28 Nov 2023 16:04:00 +0100 Subject: [PATCH 11/25] [BRICK-1849] Update Sendbird UIKit to v3.10.1 (#13) --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 714342c0..3b62917f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,16 @@ -# !! [PIVOT] Use `pivot-group-ui` branch +# PIVOT + +## Sendbird UIKit version: 3.10.1 + +## Updating Sendbird library +Pulling from the Sendbird repository (`sendbird/sendbird-uikit-android`) causes a lot of hard-to-fix conflicts, so it's much easier to rebase our changes on top of the Sendbird latest `main` branch. +``` +git remote add sendbird git@github.com:sendbird/sendbird-uikit-android.git +git fetch sendbird +git checkout main +git rebase sendbird/main +``` +Resolve all conflicts by checking the original commits (https://github.com/carrotsense/sendbird-uikit-android/commits/main) and preserving the implemented functionality. # Sendbird UIKit for Android From d5e2b9e38eea265e3b6516438a438a4df46fabbd Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Wed, 28 Feb 2024 10:33:46 +0100 Subject: [PATCH 12/25] Update UIKIT to v3.13.0 (Feb 1, 2024) (#14) --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3b62917f..4d700365 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,23 @@ # PIVOT -## Sendbird UIKit version: 3.10.1 +## Sendbird UIKit version: v3.13.0 (Feb 1, 2024) ## Updating Sendbird library Pulling from the Sendbird repository (`sendbird/sendbird-uikit-android`) causes a lot of hard-to-fix conflicts, so it's much easier to rebase our changes on top of the Sendbird latest `main` branch. ``` git remote add sendbird git@github.com:sendbird/sendbird-uikit-android.git git fetch sendbird -git checkout main -git rebase sendbird/main +git checkout origin/main +git rebase -i sendbird/main +git checkout -B main +git push origin -f ``` Resolve all conflicts by checking the original commits (https://github.com/carrotsense/sendbird-uikit-android/commits/main) and preserving the implemented functionality. +Next, to store a history of updates: +1. update `Sendbird UIKit version: $UIKIT_VERSION` in this README +2. create PR like: `Update UIKit to v3.10.1 (Nov 9, 2023)` + # Sendbird UIKit for Android ![Platform](https://img.shields.io/badge/platform-ANDROID-orange.svg) From 8cc05d033708084df64eab65affb587877ed129b Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Tue, 5 Mar 2024 18:32:15 +0100 Subject: [PATCH 13/25] [BRICK-2492] Spanish translations (#15) * Spanish translations * Translation fixes --- uikit/src/main/res/values-es/strings.xml | 225 +++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 uikit/src/main/res/values-es/strings.xml diff --git a/uikit/src/main/res/values-es/strings.xml b/uikit/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..365e906b --- /dev/null +++ b/uikit/src/main/res/values-es/strings.xml @@ -0,0 +1,225 @@ + + + + Canales + Información del canal + Miembros + Invitar usuarios + Nuevo canal + Establecer como operadores + Participantes + %s participantes + Hilo + + + (Sin miembros) + (Sin nombre) + Más de 99 + %1$s envió un archivo. + Desconocido + Activar las notificaciones + Desactivar las notificaciones + Salir del canal + Sin canales + + +  (editado) + %d mensaje nuevo + %d mensajes nuevos + Copiar + Guardar + Editar + Borrar + Responder + Responder en el hilo + Reintentar + Introducir mensaje + Responder al mensaje + Responder en el hilo + Responder al hilo + Tomar foto + Hacer video + Galería + Documento + %s está escribiendo… + %s y %s están escribiendo… + Varias personas están escribiendo… + (Tipo de mensaje desconocido)\nNo se puede leer este mensaje. + 99 + Ningún mensaje + Mensaje no disponible + (Error de plantilla) + No se puede leer esta notificación. + Notificaciones + Algo salió mal. + + + Moderaciones + Notificaciones + Miembros + Salir del canal + Eliminar canal + Cambiar nombre + Ingresar nombre + Cambiar imagen del canal + Tomar foto + Elegir foto + Buscar en el canal + + +  (Tú) + Sin usuarios + Sin participantes + + + Ayer + ¿Deseas eliminar este archivo? + ¿Deseas eliminar este mensaje? + ¿Quieres eliminar las %d fotos? + ¿Deseas eliminar el canal? + Una vez eliminado, este canal no se puede restaurar. + Copiado + Subiendo… + Descargando… + Archivo guardado + Editar + Invitar + Cancelar + Crear + Guardar + Borrar + Reintentar + Seleccionado + Agregar + Aceptar + + + + El hilo no existe porque el mensaje principal fue eliminado. + + + + Comprueba tu conexión y vuelve a intentarlo. + + + No se pudo recuperar la lista de canales. + No se pudo recuperar el canal. + No se pudo crear el canal. + No se pudo actualizar el canal. + No se pudo abandonar el canal. + No se pudo eliminar el canal. + No se pudieron activar las notificaciones. + No se pudieron desactivar las notificaciones. + No se pudo establecer la configuración de notificaciones. + No se pudo invitar a los usuarios. + No se pudo recuperar la lista de usuarios. + No se pudo agregar la reacción. + No se pudo registrar como operador. + No se pudo cancelar el registro del operador. + No se pudo eliminar la reacción. + No se pudo recuperar la lista de temas. + + + No se pudo enviar el mensaje. Intentar de nuevo. + No se pudo editar el mensaje. + No se pudo eliminar el mensaje. + No se pudo copiar el mensaje. + No se pudo enviar el mensaje. Intentar de nuevo. + Mensaje filtrado. + No se pudo silenciar al miembro. Intentar de nuevo. + No se pudo silenciar al participante. Intentar de nuevo. + No se pudo bloquear al miembro. Intentar de nuevo. + No se pudo bloquear al participante. Intentar de nuevo. + No se pudo activar el sonido del miembro. Intentar de nuevo. + No se pudo activar el sonido del participante. Intentar de nuevo. + No se pudo desbloquear al miembro. Intentar de nuevo. + No se pudo desbloquear al participante. Intentar de nuevo. + Estás silenciado por el operador. + El canal está caído + + + No se pudo abrir la cámara. + No se pudo abrir la biblioteca de fotos. + No se pudo abrir el archivo. + No se pudo descargar el archivo. + Se pueden adjuntar hasta %d archivos. + El tamaño máximo por archivo es %s. + + Otorgar permiso + Configuración + %s\nnecesita permiso para acceder a tu cámara. Ve a Configuración para permitir el acceso + %s\nnecesita permiso para acceder al almacenamiento de tu dispositivo. Ve a Configuración para permitir el acceso. + %s\nnecesita permiso para acceder a grabación de audio. Ve a Configuración para permitir el acceso. + + El chat no está disponible en este canal. + Estás silenciado + Tipo de canal + Grupo + Supergrupo + Transmisión + Canal caído + Operador + Operadores + Miembros silenciados + Usuarios bloqueados + Congelar canal + Ningún miembro operador + No hay miembros silenciados + No hay usuarios bloqueados + Participantes silenciados + Ningún operador participante + No hay participantes silenciados + + + Registrarse como operador + Silenciar + Silenciar + Bloquear + Bloquear + Operador no registrado + Dejar de silenciar + Desbloquear + Desbloquear + Dejar de silenciar + + Mensaje + Id. de usuario + + URL + No se puede enviar el mensaje. + + + Buscar + No se han encontrado resultados. + Algo salió mal. Intentar de nuevo. + + + + Responder + %s respondió a %s + No se pudo encontrar el mensaje original de esta respuesta. + Puedes tener hasta %d menciones por mensaje. + %d respuesta + %d respuestas + Más de 99 respuestas + + + Encendido + Apagado + Solo menciones + Todos los mensajes nuevos + Actívalo para recibir notificaciones cuando se entreguen mensajes a este canal. + + + Ingresar nombre del canal + Eliminar foto + + + Mensaje de voz + + + Entregar + Verifica el valor + Erro en la entrega + (opcional) + From 37297b85670faf0f4e1a2eb681dcee07ba780741 Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:13:30 +0100 Subject: [PATCH 14/25] [BRICK-2571] Upgrade compileSdkVersion and targetSdkVersion to latest Android 34 (#16) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 99b24464..d12449e7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.6.10' + ext.kotlin_version = '1.9.22' ext.paparazzi_version = '1.3.1' dependencies { From d34f8bc9f931f46895df320d8483769d8faf6f51 Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Thu, 26 Sep 2024 06:22:13 +0200 Subject: [PATCH 15/25] Updated UIKit to v3.21.0 (Sep 12, 2024) with Chat SDK `v4.19.0` (#17) --- README.md | 14 +++----------- uikit/build.gradle | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 4d700365..633493da 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,10 @@ # PIVOT -## Sendbird UIKit version: v3.13.0 (Feb 1, 2024) +## Sendbird UIKit version: v3.21.0 (Sep 12, 2024) with Chat SDK `v4.19.0` ## Updating Sendbird library -Pulling from the Sendbird repository (`sendbird/sendbird-uikit-android`) causes a lot of hard-to-fix conflicts, so it's much easier to rebase our changes on top of the Sendbird latest `main` branch. -``` -git remote add sendbird git@github.com:sendbird/sendbird-uikit-android.git -git fetch sendbird -git checkout origin/main -git rebase -i sendbird/main -git checkout -B main -git push origin -f -``` -Resolve all conflicts by checking the original commits (https://github.com/carrotsense/sendbird-uikit-android/commits/main) and preserving the implemented functionality. +Pull the origin repository. +Don't use rebase because it messes up git history by overriding original PRs/commit. Next, to store a history of updates: 1. update `Sendbird UIKit version: $UIKIT_VERSION` in this README diff --git a/uikit/build.gradle b/uikit/build.gradle index d648af07..95d44e57 100644 --- a/uikit/build.gradle +++ b/uikit/build.gradle @@ -3,7 +3,7 @@ plugins { id 'org.jetbrains.kotlin.android' id 'kotlinx-serialization' id 'kotlin-parcelize' - id 'org.jetbrains.dokka' version "$kotlin_version" + id 'org.jetbrains.dokka' version "1.9.20" } From 5512a3742b6abdf76eb8e18a85bc7d3a159c2e86 Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Thu, 26 Sep 2024 09:37:51 +0200 Subject: [PATCH 16/25] Fixed: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.carrot.pivot. Make sure to call FirebaseApp.initializeApp(Context) first. (#18) --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index d12449e7..91161f40 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ buildscript { } } plugins { - id 'com.android.application' version '8.4.1' apply false - id 'com.android.library' version '8.4.1' apply false + id 'com.android.application' version '8.3.0' apply false + id 'com.android.library' version '8.3.0' apply false id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false id 'com.google.gms.google-services' version '4.3.15' apply false } From 188d12d32dca6601317479ed19baf47679c790b4 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 29 Jan 2025 14:17:18 +0100 Subject: [PATCH 17/25] Update README --- README.md | 122 ++++-------------------------------------------------- 1 file changed, 7 insertions(+), 115 deletions(-) diff --git a/README.md b/README.md index 633493da..24dfb0fc 100644 --- a/README.md +++ b/README.md @@ -1,129 +1,21 @@ # PIVOT -## Sendbird UIKit version: v3.21.0 (Sep 12, 2024) with Chat SDK `v4.19.0` +## Sendbird UIKit version: v3.22.0 (Dec 16, 2024) with Chat SDK v4.21.1 ## Updating Sendbird library Pull the origin repository. Don't use rebase because it messes up git history by overriding original PRs/commit. +`git fetch sendbird` +`git pull sendbird main` + Next, to store a history of updates: 1. update `Sendbird UIKit version: $UIKIT_VERSION` in this README 2. create PR like: `Update UIKit to v3.10.1 (Nov 9, 2023)` # Sendbird UIKit for Android -![Platform](https://img.shields.io/badge/platform-ANDROID-orange.svg) -![Languages](https://img.shields.io/badge/language-JAVA-orange.svg) - -## Introduction - -We are introducing a new version of the Sendbird UIKit. Version 3 features a new modular architecture with more granular components that give you enhanced flexibility to customize your web and mobile apps. Check out our [migration guides](/changelogs/MIGRATIONGUIDE_V3.md) and download [our samples](https://github.com/sendbird/sendbird-uikit-android/tree/main/uikit-samples) - -Sendbird UIKit for Android is a development kit with an user interface that enables an easy and fast integration of standard chat features into new or existing client apps. This repository houses the UIKit source code in addition to two samples as explained below. - -- **uikit** is where you can find the open source code. Check out [UIKit Open Source Guidelines](https://github.com/sendbird/sendbird-uikit-android-sources/blob/main/OPENSOURCE_GUIDELINES.md) for more information regarding our stance on open source. -- **uikit-samples** consists of four use cases of UIKit. -You can navigate to each use case through the four menus that appear when you run it. - * Basic Usage - A sample that contains the basic usage of UIKit. Please check the [README](uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/README.md) for details. - * Customizations - Examples that have applied customization to UIKit. Please check the [README](uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/README.md) for details. - * AI Chatbot: You can chat with the AI Chatbot running on the Sendbird platform. -It is disabled by default, To enable it, please check the [README](uikit-samples/src/main/java/com/sendbird/uikit/samples/aichatbot/README.md) for details. - * Sendbird Notification: You can try out Sendbird's Notification product in this sample. - It is disabled by default. To enable it, please check the [README](uikit-samples/src/main/java/com/sendbird/uikit/samples/notification/README.md) for details. - Caution: This sample is not related to push notifications. It is a demonstration of Sendbird's Notification product. - -### More about Sendbird UIKIT for Android - -Find out more about Sendbird UIKit for Android at [UIKit for Android doc](https://sendbird.com/docs/uikit/v3/android/overview). If you need any help in resolving any issues or have questions, visit [our community](https://community.sendbird.com). - -
- -## Before getting started - -This section shows you the prerequisites you need for testing Sendbird UIKit for Android sample apps. - -### Requirements - -The minimum requirements for UIKit for Android are: - -- Android 5.0 (API level 21) or higher -- Java 8 or higher -- Support androidx only -- Android Gradle plugin 4.0.1 or higher -- Sendbird Chat SDK for Android 4.0.3 and later - -### Try the sample app using your data - -If you would like to try the sample app specifically fit to your usage, you can do so by replacing the default sample app ID with yours, which you can obtain by [creating your Sendbird application from the dashboard](https://sendbird.com/docs/chat/v4/android/quickstart/send-first-message#3-install-and-configure-the-chat-sdk-4-step-1-create-a-sendbird-application-from-your-dashboard). Furthermore, you could also add data of your choice on the dashboard to test. This will allow you to experience the sample app with data from your Sendbird application. - -
- -## Getting started - -This section explains the steps you need to take before testing the sample apps. - -### Create a project - -Go to your `Android Studio` and create a project for UIKit for Android in the **Project window** as follows: - -1. In the **Welcome to Android Studio** window, click **Start a new Android Studio project**. -2. In the **Select a Project Template** window, select **Empty Activity**, and click **Next**. -3. Enter your project name in the **Name** field in the **Configure your project** window. -4. Select your language as either **Java** or **Kotlin** from the **Language** drop-down menu. -5. Enable `Use androidx.*artifacts`. -6. Select minimum API level as 21 or higher. - -### Install UIKit for Android - -UIKit for Android is installed via `Gradle`. Begin by opening the project's top-level `build.gradle` file and adding code blocks as below: - -> Note: Add the code blocks in your root `build.gradle` file, not your module `build.gradle` file. - -```gradle -allprojects { - repositories { - maven { url "https://jitpack.io" } - maven { url "https://repo.sendbird.com/public/maven" } - } -} -``` - -If using Gradle 6.8 or higher, add the following to your `settings.gradle` file: - -```gradle -dependencyResolutionManagement { - repositories { - maven { url "https://jitpack.io" } - maven { url "https://repo.sendbird.com/public/maven" } - } -} -``` - - - -Then, open the `build.gradle` file at the application level. For `Java` and `Kotlin`, add code blocks and dependencies as below: - -> Note: View binding should be enabled in your `build.gradle` file. - -```gradle -apply plugin: 'com.android.application' - -android { - buildFeatures { - viewBinding true - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -} - -dependencies { - implementation 'com.sendbird.sdk:uikit:LATEST_VERSION' -} -``` - -After saving your `build.gradle` file, click the **Sync** button to apply all the changes. +https://github.com/sendbird/sendbird-uikit-android/blob/main/CHANGELOG.md -
+# Sendbird SDK for Android +https://github.com/sendbird/sendbird-chat-sdk-android/blob/main/CHANGELOG.md From efcffb5b3e39c6c63e936e2c494ab8d93d5c6c46 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 9 Aug 2025 16:33:52 +0200 Subject: [PATCH 18/25] Update UIKit to v3.24.0 (Jul 31, 2025) --- CHANGELOG.md | 26 ++ README.md | 3 +- build.gradle | 4 +- gradle.properties | 2 +- .../samples/basic/GroupChannelMainActivity.kt | 2 + .../openchannel/OpenChannelMainActivity.kt | 2 + .../livestream/LiveStreamActivity.kt | 4 +- .../uikit/samples/common/ThemeHomeActivity.kt | 2 + .../common/extensions/ViewExtentions.kt | 21 ++ uikit-samples/src/main/res/values/styles.xml | 2 +- .../src/main/res/values/styles_dark.xml | 2 +- uikit/build.gradle | 2 +- .../com/sendbird/uikit/SendbirdUIKit.java | 25 ++ .../activities/BannedUserListActivity.java | 7 + .../uikit/activities/ChannelActivity.java | 7 + .../uikit/activities/ChannelListActivity.java | 8 +- .../ChannelPushSettingActivity.java | 7 + .../activities/ChannelSettingsActivity.java | 7 + .../ChatNotificationChannelActivity.java | 7 + .../activities/CreateChannelActivity.java | 7 + .../activities/CreateOpenChannelActivity.java | 7 + .../FeedNotificationChannelActivity.java | 7 + .../uikit/activities/InviteUserActivity.java | 7 + .../uikit/activities/MemberListActivity.java | 7 + .../activities/MessageSearchActivity.java | 7 + .../activities/MessageThreadActivity.java | 7 + .../uikit/activities/ModerationActivity.java | 7 + .../activities/MutedMemberListActivity.java | 7 + .../uikit/activities/OpenChannelActivity.java | 7 + .../OpenChannelBannedUserListActivity.java | 7 + .../activities/OpenChannelListActivity.java | 97 +++++-- .../OpenChannelModerationActivity.java | 7 + ...enChannelMutedParticipantListActivity.java | 7 + .../OpenChannelOperatorListActivity.java | 7 + .../OpenChannelRegisterOperatorActivity.java | 7 + .../OpenChannelSettingsActivity.java | 7 + .../activities/OperatorListActivity.java | 7 + .../activities/ParticipantListActivity.java | 7 + .../uikit/activities/PhotoViewActivity.java | 7 + .../activities/RegisterOperatorActivity.java | 7 + .../adapter/MessageDiffCallback.java | 4 +- .../com/sendbird/uikit/consts/StringSet.kt | 1 + .../fragments/BaseMessageListFragment.java | 4 +- .../uikit/fragments/ChannelFragment.java | 131 ++++++++-- .../uikit/fragments/OpenChannelFragment.java | 4 +- .../uikit/fragments/PhotoViewFragment.java | 12 +- .../internal/extensions/MessageExtensions.kt | 13 +- .../internal/extensions/ViewExtensions.kt | 62 +++++ .../uikit/internal/model/ChannelUnreadInfo.kt | 53 ++++ .../model/template_messages/KeySet.kt | 1 + .../internal/ui/messages/AdminMessageView.kt | 2 + .../internal/ui/messages/MyFileMessageView.kt | 2 + .../ui/messages/MyImageFileMessageView.kt | 2 + .../internal/ui/messages/MyMessageView.kt | 2 + .../ui/messages/MyMultipleFilesMessageView.kt | 2 + .../internal/ui/messages/MyUserMessageView.kt | 3 +- .../ui/messages/MyVideoFileMessageView.kt | 2 + .../ui/messages/MyVoiceMessageView.kt | 2 + .../uikit/internal/ui/messages/NewLineView.kt | 30 +++ .../ui/messages/OtherFileMessageView.kt | 2 + .../ui/messages/OtherImageFileMessageView.kt | 2 + .../internal/ui/messages/OtherMessageView.kt | 2 + .../messages/OtherMultipleFilesMessageView.kt | 2 + .../ui/messages/OtherTemplateMessageView.kt | 2 - .../ui/messages/OtherUserMessageView.kt | 4 +- .../ui/messages/OtherVideoFileMessageView.kt | 2 + .../ui/messages/OtherVoiceMessageView.kt | 2 + .../internal/ui/widgets/MentionWatcher.kt | 4 +- .../ui/widgets/MessageRecyclerView.kt | 20 ++ .../sendbird/uikit/model/EdgeToEdgeConfig.kt | 33 +++ .../com/sendbird/uikit/model/MessageList.kt | 25 +- .../com/sendbird/uikit/model/NewLineData.kt | 13 + .../com/sendbird/uikit/model/TextUIConfig.kt | 2 +- .../model/configurations/ChannelConfig.kt | 28 +- .../components/BaseMessageListComponent.java | 108 +++++++- .../com/sendbird/uikit/utils/FileUtils.java | 5 + .../sendbird/uikit/vm/ChannelViewModel.java | 244 +++++++++++++++++- .../com/sendbird/uikit/vm/FileDownloader.java | 6 +- .../res/drawable-hdpi/icon_mark_as_unread.png | Bin 0 -> 836 bytes .../res/drawable-mdpi/icon_mark_as_unread.png | Bin 0 -> 522 bytes .../drawable-xhdpi/icon_mark_as_unread.png | Bin 0 -> 937 bytes .../drawable-xxhdpi/icon_mark_as_unread.png | Bin 0 -> 1442 bytes .../drawable-xxxhdpi/icon_mark_as_unread.png | Bin 0 -> 1979 bytes uikit/src/main/res/layout/sb_activity.xml | 1 + .../sb_view_admin_message_component.xml | 20 +- .../layout/sb_view_message_recycler_view.xml | 49 ++++ ...b_view_my_file_image_message_component.xml | 11 +- .../sb_view_my_file_message_component.xml | 15 +- ...b_view_my_file_video_message_component.xml | 11 +- .../layout/sb_view_my_message_component.xml | 11 +- ...ew_my_multiple_files_message_component.xml | 11 +- .../sb_view_my_user_message_component.xml | 11 +- .../sb_view_my_voice_message_component.xml | 15 +- .../src/main/res/layout/sb_view_new_line.xml | 40 +++ ...iew_other_file_image_message_component.xml | 17 +- .../sb_view_other_file_message_component.xml | 21 +- ...iew_other_file_video_message_component.xml | 17 +- .../sb_view_other_message_component.xml | 21 +- ...other_multiple_files_message_component.xml | 17 +- .../sb_view_other_user_message_component.xml | 15 +- .../sb_view_other_voice_message_component.xml | 21 +- uikit/src/main/res/values/attrs.xml | 7 + uikit/src/main/res/values/strings.xml | 6 +- uikit/src/main/res/values/styles.xml | 9 + uikit/src/main/res/values/styles_dark.xml | 9 + 105 files changed, 1424 insertions(+), 146 deletions(-) create mode 100644 uikit/src/main/java/com/sendbird/uikit/internal/model/ChannelUnreadInfo.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/internal/ui/messages/NewLineView.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/model/EdgeToEdgeConfig.kt create mode 100644 uikit/src/main/java/com/sendbird/uikit/model/NewLineData.kt create mode 100644 uikit/src/main/res/drawable-hdpi/icon_mark_as_unread.png create mode 100644 uikit/src/main/res/drawable-mdpi/icon_mark_as_unread.png create mode 100644 uikit/src/main/res/drawable-xhdpi/icon_mark_as_unread.png create mode 100644 uikit/src/main/res/drawable-xxhdpi/icon_mark_as_unread.png create mode 100644 uikit/src/main/res/drawable-xxxhdpi/icon_mark_as_unread.png create mode 100644 uikit/src/main/res/layout/sb_view_new_line.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ec0742a..a8a50ee3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,30 @@ # Changelog +### v3.24.0 (Jul 31, 2025) with Chat SDK `v4.28.2` +- Support MarkAsUnread in UIKit Android View + - Added new configuration option `enableMarkAsUnread` to enable/disable the feature + - Added new interfaces for using markAsUnread feature to `ChannelFragment` and `ChannelViewModel` + - Added `NewLineView` to indicate the start of unread messages. + - New `markAsUnread` menu item in `ChannelFragment` +- Fixed an issue where messages with same `createdAt` timestamps disappeared from `ChannelFragment` +### v3.23.3 (Jul 17, 2025) with Chat SDK `v4.27.3` +- Added support for setting `isAppearanceLightStatusBars` in edge-to-edge mode. + - Added `useAppearanceLightStatusBars` to `EdgeToEdgeConfig`. +### v3.23.2 (Jun 27, 2025) with Chat SDK `v4.27.3` +- Release with [the latest chat SDK](https://github.com/sendbird/sendbird-chat-sdk-android/releases/tag/4.27.3) to avoid potential issues +### v3.23.1 (Jun 24, 2025) with Chat SDK `v4.27.2` +- Release with [the latest chat SDK](https://github.com/sendbird/sendbird-chat-sdk-android/releases/tag/4.27.2) to avoid potential issues +### v3.23.0 (Apr 1, 2025) with Chat SDK `v4.24.1` +- Added a new interface to set the status bar color in edge-to-edge mode. + - Added `void setEdgeToEdgeConfig(EdgeToEdgeConfig)` + - Added `EdgeToEdgeConfig getEdgeToEdgeConfig()` + - Added `EdgeToEdgeConfig` which defines a configuration for UI styling in edge-to-edge mode +- Fixed an issue where some UIKit components were unresponsive when both the status bar and navigation bar were hidden in edge-to-edge mode. +- Fixed an issue where images, GIFs, and videos could not be downloaded while the network was offline. +### v3.22.2 (Feb 28, 2025) with Chat SDK `v4.24.0` +* Replaced `newIntent` methods, which had a channelUrl parameter, with one that does not include it. in `OpenChannelListActivity` +### v3.22.1 (Feb 20, 2025) with Chat SDK `v4.23.1` +* Fixed suggested replies not disappearing after sending a message. +* Fixed the mention list not showing up when typing a nickname. ### v3.22.0 (Dec 16, 2024) with Chat SDK `v4.21.1` * Templated-related code has been moved to a separate module. ### v3.21.1 (Nov 12, 2024) with Chat SDK `v4.20.0` diff --git a/README.md b/README.md index 24dfb0fc..45afb365 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@ # PIVOT -## Sendbird UIKit version: v3.22.0 (Dec 16, 2024) with Chat SDK v4.21.1 +## Sendbird UIKit version: v3.24.0 (Jul 31, 2025) with Chat SDK v4.28.2 ## Updating Sendbird library Pull the origin repository. Don't use rebase because it messes up git history by overriding original PRs/commit. `git fetch sendbird` + `git pull sendbird main` Next, to store a history of updates: diff --git a/build.gradle b/build.gradle index 91161f40..66c44243 100644 --- a/build.gradle +++ b/build.gradle @@ -14,8 +14,8 @@ buildscript { } } plugins { - id 'com.android.application' version '8.3.0' apply false - id 'com.android.library' version '8.3.0' apply false + id 'com.android.application' version '8.4.0' apply false + id 'com.android.library' version '8.4.0' apply false id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false id 'com.google.gms.google-services' version '4.3.15' apply false } diff --git a/gradle.properties b/gradle.properties index 3eb54b42..38c822aa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,5 +22,5 @@ android.nonTransitiveRClass=false android.nonFinalResIds=false android.enableR8.fullMode=false -UIKIT_VERSION = 3.22.0 +UIKIT_VERSION = 3.24.0 UIKIT_VERSION_CODE = 1 diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/GroupChannelMainActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/GroupChannelMainActivity.kt index 05e9267c..9c4b4cbe 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/GroupChannelMainActivity.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/GroupChannelMainActivity.kt @@ -23,6 +23,7 @@ import com.sendbird.uikit.samples.R import com.sendbird.uikit.samples.common.SampleSettingsFragment import com.sendbird.uikit.samples.common.consts.StringSet import com.sendbird.uikit.samples.common.extensions.isUsingDarkTheme +import com.sendbird.uikit.samples.common.extensions.setInsetMargin import com.sendbird.uikit.samples.common.preferences.PreferenceUtils import com.sendbird.uikit.samples.common.widgets.CustomTabView import com.sendbird.uikit.samples.databinding.ActivityGroupChannelMainBinding @@ -35,6 +36,7 @@ class GroupChannelMainActivity : AppCompatActivity() { setTheme(SendbirdUIKit.getDefaultThemeMode().resId) binding = ActivityGroupChannelMainBinding.inflate(layoutInflater).apply { setContentView(root) + root.setInsetMargin(window) viewPager.adapter = MainAdapter(this@GroupChannelMainActivity) val isDarkMode = PreferenceUtils.themeMode.isUsingDarkTheme() val backgroundRedId = if (isDarkMode) R.color.background_600 else R.color.background_50 diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/OpenChannelMainActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/OpenChannelMainActivity.kt index 64db2fe3..0f6634eb 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/OpenChannelMainActivity.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/basic/openchannel/OpenChannelMainActivity.kt @@ -20,6 +20,7 @@ import com.sendbird.uikit.samples.basic.openchannel.livestream.LiveStreamListFra import com.sendbird.uikit.samples.common.SampleSettingsFragment import com.sendbird.uikit.samples.common.consts.StringSet import com.sendbird.uikit.samples.common.extensions.isUsingDarkTheme +import com.sendbird.uikit.samples.common.extensions.setInsetMargin import com.sendbird.uikit.samples.common.preferences.PreferenceUtils import com.sendbird.uikit.samples.common.widgets.CustomTabView import com.sendbird.uikit.samples.databinding.ActivityOpenChannelMainBinding @@ -46,6 +47,7 @@ class OpenChannelMainActivity : AppCompatActivity() { ) ) setSupportActionBar(titleBar) + root.setInsetMargin(window) viewPager.adapter = MainAdapter(this@OpenChannelMainActivity) val backgroundRedId = if (isDarkMode) R.color.background_600 else R.color.background_50 tabLayout.setBackgroundResource(backgroundRedId) 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 d8a187ce..c6ef98dd 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 @@ -26,14 +26,15 @@ import com.sendbird.uikit.fragments.OpenChannelFragment import com.sendbird.uikit.samples.R import com.sendbird.uikit.samples.common.consts.StringSet import com.sendbird.uikit.samples.common.extensions.isUsingDarkTheme +import com.sendbird.uikit.samples.common.extensions.setInsetMargin import com.sendbird.uikit.samples.common.extensions.toggleVisibility import com.sendbird.uikit.samples.common.preferences.PreferenceUtils import com.sendbird.uikit.samples.databinding.ActivityLiveStreamBinding import com.sendbird.uikit.utils.ContextUtils import org.json.JSONException import org.json.JSONObject -import java.util.Locale import java.lang.ref.WeakReference +import java.util.Locale /** * Displays an open channel screen used for live stream. @@ -71,6 +72,7 @@ class LiveStreamActivity : AppCompatActivity() { super.onCreate(savedInstanceState) binding = ActivityLiveStreamBinding.inflate(layoutInflater).apply { setContentView(root) + root.setInsetMargin(window) if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { sbFragmentContainer.setBackgroundResource(android.R.color.transparent) } else { 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 index 50a9466e..8099ea52 100644 --- 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 @@ -5,6 +5,7 @@ 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.extensions.setInsetMargin import com.sendbird.uikit.samples.common.preferences.PreferenceUtils abstract class ThemeHomeActivity : AppCompatActivity() { @@ -18,6 +19,7 @@ abstract class ThemeHomeActivity : AppCompatActivity() { setTheme(if (PreferenceUtils.themeMode.isUsingDarkTheme()) R.style.AppTheme_Dark else R.style.AppTheme) setContentView(binding.root) applyTheme() + binding.root.setInsetMargin(window) } override fun onResume() { diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/ViewExtentions.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/ViewExtentions.kt index 2d16835a..97c09d81 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/ViewExtentions.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/ViewExtentions.kt @@ -3,8 +3,12 @@ package com.sendbird.uikit.samples.common.extensions import android.content.Context import android.os.Build import android.view.View +import android.view.Window import android.widget.TextView import androidx.annotation.ColorRes +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat @Suppress("DEPRECATION") internal fun TextView.setAppearance(context: Context, res: Int) { @@ -22,3 +26,20 @@ internal fun TextView.setTextColorResource(@ColorRes id: Int) { internal fun View.toggleVisibility() { visibility = if (visibility == View.VISIBLE) View.GONE else View.VISIBLE } + +internal fun View.setInsetMargin(window: Window) { + // For custom edge-to-edge system bar color +// val edgeToEdgeConfig = EdgeToEdgeConfig( +// statusBarColorLight = context.getColorResource(R.color.primary_300), +// statusBarColorDark = context.getColorResource(R.color.primary_100) +// ) +// SendbirdUIKit.setEdgeToEdgeConfig(edgeToEdgeConfig) + + ViewCompat.setOnApplyWindowInsetsListener(this) { v, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.ime()) + v.setPadding(insets.left, insets.top, insets.right, insets.bottom) + WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = true + WindowInsetsCompat.CONSUMED + } +} + diff --git a/uikit-samples/src/main/res/values/styles.xml b/uikit-samples/src/main/res/values/styles.xml index 1b399821..9178c0fc 100644 --- a/uikit-samples/src/main/res/values/styles.xml +++ b/uikit-samples/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ - + + + + From 26b49c7221604d8955a57619b43f39d4c98afd5c Mon Sep 17 00:00:00 2001 From: Simon Cierniewski <793657+SimonCierniewski@users.noreply.github.com> Date: Mon, 18 Aug 2025 12:07:12 +0200 Subject: [PATCH 19/25] Hide image title to fix edge to edge (#21) --- .../com/sendbird/uikit/fragments/PhotoViewFragment.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/uikit/src/main/java/com/sendbird/uikit/fragments/PhotoViewFragment.java b/uikit/src/main/java/com/sendbird/uikit/fragments/PhotoViewFragment.java index 9513843e..c7298fa8 100644 --- a/uikit/src/main/java/com/sendbird/uikit/fragments/PhotoViewFragment.java +++ b/uikit/src/main/java/com/sendbird/uikit/fragments/PhotoViewFragment.java @@ -42,7 +42,6 @@ import com.sendbird.uikit.internal.tasks.JobResultTask; import com.sendbird.uikit.internal.tasks.TaskQueue; import com.sendbird.uikit.log.Logger; -import com.sendbird.uikit.utils.DateUtils; import com.sendbird.uikit.utils.DialogUtils; import com.sendbird.uikit.utils.MessageUtils; import com.sendbird.uikit.utils.TextUtils; @@ -89,7 +88,8 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { Logger.d("PhotoViewFragment::onViewCreated()"); - binding.ivClose.setOnClickListener(v -> shouldActivityFinish()); +// binding.ivClose.setOnClickListener(v -> shouldActivityFinish()); + binding.ivClose.setVisibility(View.GONE); // Hide close button because shouldActivityFinish() is commented out and doesn't work Bundle args = getArguments(); if (args != null) { @@ -179,8 +179,8 @@ protected void onDrawPage() { final String plainUrl = this.plainUrl == null ? "" : this.plainUrl; final String requestId = this.requestId == null ? "" : this.requestId; - tvTitle.setText(senderNickname); - tvCreatedAt.setText(DateUtils.formatTime(requireContext(), this.createdAt)); +// tvTitle.setText(senderNickname); // Text only contains UUID of the user and doesn't support the cutout +// tvCreatedAt.setText(DateUtils.formatTime(requireContext(), this.createdAt)); loading.setVisibility(View.VISIBLE); if (url != null) { From 7c735682b2865e3d9fa13b949902884a6095b936 Mon Sep 17 00:00:00 2001 From: kevinwang Date: Wed, 10 Dec 2025 14:48:00 -0500 Subject: [PATCH 20/25] Played with versions and dependencies to get a working build --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 66c44243..3644f29c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.9.22' + ext.kotlin_version = '2.2.21' ext.paparazzi_version = '1.3.1' dependencies { @@ -14,8 +14,8 @@ buildscript { } } plugins { - id 'com.android.application' version '8.4.0' apply false - id 'com.android.library' version '8.4.0' apply false + id 'com.android.application' version '8.6.0' apply false + id 'com.android.library' version '8.6.0' apply false id 'org.jetbrains.kotlin.android' version "$kotlin_version" apply false id 'com.google.gms.google-services' version '4.3.15' apply false } From 42ae535ee061d50e27ad0346eda8e15d79df1274 Mon Sep 17 00:00:00 2001 From: kevinwang Date: Thu, 11 Dec 2025 14:55:27 -0500 Subject: [PATCH 21/25] Sendbird change --- uikit/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uikit/build.gradle b/uikit/build.gradle index 54dfa118..6fb2f634 100644 --- a/uikit/build.gradle +++ b/uikit/build.gradle @@ -10,12 +10,12 @@ plugins { version = UIKIT_VERSION android { namespace 'com.sendbird.uikit' - compileSdk 34 + compileSdk 35 version = UIKIT_VERSION defaultConfig { minSdkVersion 21 - targetSdkVersion 34 + targetSdkVersion 35 versionCode Integer.parseInt(UIKIT_VERSION_CODE) versionName UIKIT_VERSION From 4eb77a77741e44b65242942b14141e68847dd8d1 Mon Sep 17 00:00:00 2001 From: kevinwang Date: Mon, 15 Dec 2025 10:45:17 -0500 Subject: [PATCH 22/25] Removed deprecated import kotlinx.android.parcel.Parcelize, Reverted back to Kotlin 1.9.22, AGP 8.6.0 and Gradle 8.7 --- build.gradle | 2 +- uikit/build.gradle | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 3644f29c..b4d44b99 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '2.2.21' + ext.kotlin_version = '1.9.22' ext.paparazzi_version = '1.3.1' dependencies { diff --git a/uikit/build.gradle b/uikit/build.gradle index 6fb2f634..a3949234 100644 --- a/uikit/build.gradle +++ b/uikit/build.gradle @@ -50,8 +50,18 @@ android { } compileOptions { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlinOptions { + jvmTarget = '17' + } + + packagingOptions { + resources { + excludes += ['META-INF/DEPENDENCIES', 'META-INF/NOTICE', 'META-INF/NOTICE.txt', 'META-INF/LICENSE', 'META-INF/LICENSE.txt'] + } } kotlinOptions { @@ -83,7 +93,7 @@ dependencies { implementation "androidx.viewpager2:viewpager2:1.1.0" implementation 'com.google.android.material:material:1.5.0' implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - + implementation "androidx.core:core-ktx:1.13.1" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2" } From 5033cf67d606f540dc119c775a66d53bef37aea5 Mon Sep 17 00:00:00 2001 From: kevinwang Date: Tue, 16 Dec 2025 09:57:42 -0500 Subject: [PATCH 23/25] Lint fixes --- .../internal/ui/widgets/ThemeableSnackbar.kt | 2 + uikit/src/main/res/values-es/strings.xml | 52 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/uikit/src/main/java/com/sendbird/uikit/internal/ui/widgets/ThemeableSnackbar.kt b/uikit/src/main/java/com/sendbird/uikit/internal/ui/widgets/ThemeableSnackbar.kt index 6cd9de84..3831e5b8 100644 --- a/uikit/src/main/java/com/sendbird/uikit/internal/ui/widgets/ThemeableSnackbar.kt +++ b/uikit/src/main/java/com/sendbird/uikit/internal/ui/widgets/ThemeableSnackbar.kt @@ -1,5 +1,6 @@ package com.sendbird.uikit.internal.ui.widgets +import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.util.AttributeSet @@ -24,6 +25,7 @@ internal class ThemeableSnackbar @JvmOverloads constructor( private val binding: SbViewMentionLimitAlertBinding private var snackbar: Snackbar? = null + @SuppressLint("RestrictedApi") fun init(anchorView: View) { if (this.parent != null) (this.parent as ViewGroup).removeAllViews() val snackbar = Snackbar.make(anchorView, "", Snackbar.LENGTH_INDEFINITE).apply { diff --git a/uikit/src/main/res/values-es/strings.xml b/uikit/src/main/res/values-es/strings.xml index 365e906b..5149cbfc 100644 --- a/uikit/src/main/res/values-es/strings.xml +++ b/uikit/src/main/res/values-es/strings.xml @@ -54,6 +54,7 @@ Algo salió mal. + Eliminar comentarios Moderaciones Notificaciones Miembros @@ -82,6 +83,7 @@ Subiendo… Descargando… Archivo guardado + No se pudo eliminar. Inténtalo de nuevo. Editar Invitar Cancelar @@ -92,6 +94,7 @@ Seleccionado Agregar Aceptar + Enviar @@ -222,4 +225,53 @@ Verifica el valor Erro en la entrega (opcional) + cerrar + guardar + eliminar + canal de emisión + canal congelado + seleccionar cubierta del canal + nombre del canal claro + mensaje no leído + atrás + menú + archivo de imagen + perfil de miembro + acción + cerrar respuesta + añadir + enviar mensaje + enviar mensaje de voz + desplazarse hasta la parte inferior + mi mensaje con imagen + mi mensaje de vídeo + mi mensaje de respuesta + ogtag + mensaje con imagen + mensaje de vídeo + otro mensaje con imagen + otro mensaje de vídeo + otro mensaje de archivo respondido + menú de mensajes para padres + texto sin cifrar + perfil de mención sugerido + éxito + error + jugar + pausa + registro + jugar + detener + pausa + enviar + introducir texto + emoji + perfil del remitente + cubierta del canal + Proporcione comentarios adicionales (opcional) + Deja un comentario + Editar comentario + Cambios guardados. + No se pudo enviar. Inténtalo de nuevo. + No se pudo guardar. Inténtalo de nuevo. From 65cd9057eb7059cc0fba4ac5d1543712fb942665 Mon Sep 17 00:00:00 2001 From: kevinwang Date: Wed, 17 Dec 2025 10:55:44 -0500 Subject: [PATCH 24/25] Updated gradle version --- gradle/wrapper/gradle-wrapper.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a09cf491..0a87b180 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon May 02 15:36:41 KST 2022 +#Wed Dec 17 10:53:20 EST 2025 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists From 8aedf1708e7ab540f6c1389a796594d45fbc03af Mon Sep 17 00:00:00 2001 From: kevinwang Date: Wed, 17 Dec 2025 11:28:56 -0500 Subject: [PATCH 25/25] Reverted version change --- uikit/build.gradle | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/uikit/build.gradle b/uikit/build.gradle index a3949234..368244f2 100644 --- a/uikit/build.gradle +++ b/uikit/build.gradle @@ -50,18 +50,8 @@ android { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = '17' - } - - packagingOptions { - resources { - excludes += ['META-INF/DEPENDENCIES', 'META-INF/NOTICE', 'META-INF/NOTICE.txt', 'META-INF/LICENSE', 'META-INF/LICENSE.txt'] - } + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions {