diff --git a/CHANGELOG.md b/CHANGELOG.md index a8ce0850..c46270f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,38 @@ # Changelog +### v3.16.0 (Apr 25, 2024) with Chat SDK `v4.16.2` +Support a way to customise the menu items in the `ChannelSettingsMenuComponent` and `OpenChannelSettingsMenuComponent`. +- Added `createMenuView(Context, String, String, SingleMenuType, int, int)` in `ChannelSettingsMenuComponent` +- Added `setMenuList(List, MenuViewProvider) in `ChannelSettingsMenuComponent.Params` +- Added `MenuViewProvider` to ChannelSettings that allows you to create and make custom menus. + +* Simple example for creating custom menu. +```kotlin +ModuleProviders.channelSettings = ChannelSettingsModuleProvider { context, _ -> + ChannelSettingsModule(context).apply { + val customMenuList = ChannelSettingsMenuComponent.defaultMenuSet.toMutableList().apply { + add(ChannelSettingsMenuComponent.Menu.CUSTOM) + } + val component = ChannelSettingsMenuComponent().apply { + // set the custom menu list. + params.setMenuList(customMenuList) { context, _ -> // create custom menu view. + createMenuView( + context, + "Go to Chat", + null, + SingleMenuType.NONE, + R.drawable.icon_chat, + 0 + ) + } + } + setChannelSettingsMenuComponent(component) + } +} +``` + +- Added `getActionContextMenuTitle(Member, GroupChannel)`, `makeActionContextMenu(Member, GroupChannel)`, and `onActionContextMenuItemClicked(Member, DialogListItem, GroupChannel)` in `MemberListFragment` +- Added `getActionContextMenuTitle(User, OpenChannel)`, `makeActionContextMenu(User, OpenChannel)`, and `onActionContextMenuItemClicked(User, DialogListItem, OpenChannel)` in `MemberListFragment` +- Added `Message template` feature for `GroupChannel`. ### v3.15.0 (Mar 28, 2024) with Chat SDK `v4.16.0` * Added `sendLogViewed(List)` in `FeedNotificationChannelViewModel`. * Deprecated `sendLogImpression(List)` in `FeedNotificationChannelViewModel`. diff --git a/gradle.properties b/gradle.properties index 55f3e3a4..f38ee443 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.15.0 +UIKIT_VERSION = 3.16.0 UIKIT_VERSION_CODE = 1 diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/UIKitExtensions.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/UIKitExtensions.kt index 49083c6c..021697d2 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/UIKitExtensions.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/common/extensions/UIKitExtensions.kt @@ -40,7 +40,7 @@ internal fun SampleType?.getLogoDrawable(context: Context): Drawable? { return when (this) { null -> R.drawable.logo_sendbird SampleType.Basic -> R.drawable.logo_sendbird - SampleType.Notification -> R.drawable.logo_notifications + SampleType.Notification -> R.drawable.logo_business_messaging SampleType.Customization -> R.drawable.logo_sendbird SampleType.AiChatBot -> R.drawable.logo_sendbird }.let { ContextCompat.getDrawable(context, it) } diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/CustomizationHomeActivity.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/CustomizationHomeActivity.kt index 2959ea3d..d332713b 100644 --- a/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/CustomizationHomeActivity.kt +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/CustomizationHomeActivity.kt @@ -22,10 +22,14 @@ import com.sendbird.uikit.samples.customization.channel.showNewMessageTypeSample import com.sendbird.uikit.samples.customization.channellist.showChannelItemFilteringSample import com.sendbird.uikit.samples.customization.channellist.showChannelItemUISample import com.sendbird.uikit.samples.customization.channellist.showNewChannelItemTypeSample +import com.sendbird.uikit.samples.customization.channelsettings.showAppendNewCustomGroupChannelSettingsMenuSample +import com.sendbird.uikit.samples.customization.channelsettings.showCustomGroupChannelSettingsMenuSample +import com.sendbird.uikit.samples.customization.channelsettings.showHidingChannelSettingsMenuSample import com.sendbird.uikit.samples.customization.global.showAdapterProvidersSample import com.sendbird.uikit.samples.customization.global.showFragmentProvidersSample import com.sendbird.uikit.samples.customization.global.showModuleProvidersSample import com.sendbird.uikit.samples.customization.global.showViewModelProvidersSample +import com.sendbird.uikit.samples.customization.userlist.showCustomMemberContextMenuSample import com.sendbird.uikit.samples.customization.userlist.showUserItemDataSourceSample import com.sendbird.uikit.samples.customization.userlist.showUserItemFilteringSample import com.sendbird.uikit.samples.customization.userlist.showUserItemSelectSample @@ -130,6 +134,25 @@ class CustomizationHomeActivity : ComponentActivity() { ) { showChannelItemFilteringSample(this) }, // endregion + // region channel settings customization + CustomizationItem( + isHeader = true, + title = getString(R.string.text_list_title_channel_settings) + ), + CustomizationItem( + title = getString(R.string.text_title_custom_channel_settings_menu_sample), + description = getString(R.string.text_desc_custom_channel_settings_menu_sample) + ) { showCustomGroupChannelSettingsMenuSample(this) }, + CustomizationItem( + title = getString(R.string.text_title_append_new_channel_settings_menu_sample), + description = getString(R.string.text_desc_append_new_channel_settings_menu_sample) + ) { showAppendNewCustomGroupChannelSettingsMenuSample(this) }, + CustomizationItem( + title = getString(R.string.text_title_hide_channel_settings_menu_sample), + description = getString(R.string.text_desc_hide_channel_settings_menu_sample) + ) { showHidingChannelSettingsMenuSample(this) }, + // endregion + // region user list customization CustomizationItem( isHeader = true, @@ -150,7 +173,11 @@ class CustomizationHomeActivity : ComponentActivity() { CustomizationItem( title = getString(R.string.text_title_user_item_custom_datasource), description = getString(R.string.text_desc_user_item_custom_datasource), - ) { showUserItemDataSourceSample(this) } + ) { showUserItemDataSourceSample(this) }, + CustomizationItem( + title = getString(R.string.text_title_custom_member_context_menu), + description = getString(R.string.text_desc_custom_member_context_menu), + ) { showCustomMemberContextMenuSample(this) } // endregion ) diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channelsettings/GroupChannelSettingSample.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channelsettings/GroupChannelSettingSample.kt new file mode 100644 index 00000000..7d0adc1b --- /dev/null +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/channelsettings/GroupChannelSettingSample.kt @@ -0,0 +1,109 @@ +package com.sendbird.uikit.samples.customization.channelsettings + +import android.app.Activity +import com.sendbird.uikit.activities.ChannelSettingsActivity +import com.sendbird.uikit.consts.SingleMenuType +import com.sendbird.uikit.interfaces.providers.ChannelSettingsModuleProvider +import com.sendbird.uikit.modules.ChannelSettingsModule +import com.sendbird.uikit.modules.components.ChannelSettingsMenuComponent +import com.sendbird.uikit.providers.ModuleProviders +import com.sendbird.uikit.samples.R +import com.sendbird.uikit.samples.customization.GroupChannelRepository + +fun showAppendNewCustomGroupChannelSettingsMenuSample(activity: Activity) { + // You can customize the Group Channel settings menu using the following code. + // The following code is an example of how to customize the Group Channel settings menu. + // If you want to handle the CUSTOM menu click event, you should handle it yourself after creating a custom menu view. + ModuleProviders.channelSettings = ChannelSettingsModuleProvider { context, _ -> + val module = ChannelSettingsModule(context).apply { + val customMenuList = ChannelSettingsMenuComponent.defaultMenuSet.toMutableList().apply { + add(ChannelSettingsMenuComponent.Menu.CUSTOM) + } + val component = ChannelSettingsMenuComponent().apply { + // set the custom menu list. + params.setMenuList(customMenuList) { context, _ -> // create custom menu view. + createMenuView( + context, + "Go to Chat", + null, + SingleMenuType.NEXT, + R.drawable.icon_chat, + 0 + ).apply { + // set the click event listener here. + setOnClickListener { + println(">>>>>> Go to Chat") + } + } + } + } + setChannelSettingsMenuComponent(component) + } + module + } + + GroupChannelRepository.getRandomChannel(activity) { channel -> + activity.startActivity(ChannelSettingsActivity.newIntent(activity, channel.url)) + } +} + +fun showCustomGroupChannelSettingsMenuSample(activity: Activity) { + // You can customize the Group Channel settings menu using the following code. + // It shows how to make custom menu items in the Group Channel settings menu. + // If you want to handle the CUSTOM menu click event, you should handle it yourself after creating a custom menu view. + ModuleProviders.channelSettings = ChannelSettingsModuleProvider { context, _ -> + val module = ChannelSettingsModule(context).apply { + val component = ChannelSettingsMenuComponent().apply { + // set the custom menu list. + params.setMenuList( + listOf( + ChannelSettingsMenuComponent.Menu.CUSTOM, + ChannelSettingsMenuComponent.Menu.MEMBERS, + ChannelSettingsMenuComponent.Menu.LEAVE_CHANNEL, + ) + ) { context, _ -> // create custom menu view. + createMenuView( + context, + "Go to Chat", + null, + SingleMenuType.NEXT, + R.drawable.icon_chat, + 0 + ).apply { + // set the click event listener here. + setOnClickListener { + println(">>>>>> Go to Chat") + } + } + } + } + setChannelSettingsMenuComponent(component) + } + module + } + + GroupChannelRepository.getRandomChannel(activity) { channel -> + activity.startActivity(ChannelSettingsActivity.newIntent(activity, channel.url)) + } +} + +fun showHidingChannelSettingsMenuSample(activity: Activity) { + // It shows how to hide the default menu items in the Group Channel settings menu. + ModuleProviders.channelSettings = ChannelSettingsModuleProvider { context, _ -> + val module = ChannelSettingsModule(context).apply { + val customMenuList = ChannelSettingsMenuComponent.defaultMenuSet.toMutableList().apply { + remove(ChannelSettingsMenuComponent.Menu.LEAVE_CHANNEL) + } + val component = ChannelSettingsMenuComponent().apply { + // hide LEAVE_CHANNEL menu. + params.setMenuList(customMenuList, null) + } + setChannelSettingsMenuComponent(component) + } + module + } + + GroupChannelRepository.getRandomChannel(activity) { channel -> + activity.startActivity(ChannelSettingsActivity.newIntent(activity, channel.url)) + } +} diff --git a/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/userlist/MemberContextMenuSample.kt b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/userlist/MemberContextMenuSample.kt new file mode 100644 index 00000000..f44b046a --- /dev/null +++ b/uikit-samples/src/main/java/com/sendbird/uikit/samples/customization/userlist/MemberContextMenuSample.kt @@ -0,0 +1,50 @@ +package com.sendbird.uikit.samples.customization.userlist + +import android.app.Activity +import com.sendbird.android.channel.GroupChannel +import com.sendbird.android.user.Member +import com.sendbird.uikit.activities.MemberListActivity +import com.sendbird.uikit.fragments.MemberListFragment +import com.sendbird.uikit.interfaces.providers.MemberListFragmentProvider +import com.sendbird.uikit.model.DialogListItem +import com.sendbird.uikit.providers.FragmentProviders +import com.sendbird.uikit.samples.R +import com.sendbird.uikit.samples.customization.GroupChannelRepository + +fun showCustomMemberContextMenuSample(activity: Activity) { + GroupChannelRepository.getRandomChannel(activity) { channel -> + FragmentProviders.memberList = MemberListFragmentProvider { channelUrl, _ -> + MemberListFragment.Builder(channelUrl) + .setCustomFragment(CustomMemberListFragment()) + .build() + } + activity.startActivity(MemberListActivity.newIntent(activity, channel.url)) + } +} + +class CustomMemberListFragment : MemberListFragment() { + override fun getActionContextMenuTitle(member: Member, channel: GroupChannel?): String { + return "Custom Context Menu" + } + + override fun makeActionContextMenu(member: Member, channel: GroupChannel?): MutableList { + return super.makeActionContextMenu(member, channel).apply { + add(DialogListItem(R.string.text_menu_thumbs_up, R.drawable.icon_good)) + add(DialogListItem(R.string.text_menu_thumbs_down, R.drawable.icon_bad)) + } + } + + override fun onActionContextMenuItemClicked(member: Member, item: DialogListItem, channel: GroupChannel?): Boolean { + return when (item.key) { + R.string.text_menu_thumbs_up -> { + println(">>>>>> Thumbs Up") + true + } + R.string.text_menu_thumbs_down -> { + println(">>>>>> Thumbs Down") + true + } + else -> super.onActionContextMenuItemClicked(member, item, channel) + } + } +} 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 a6247fe5..f3b9d8e0 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 @@ -44,7 +44,6 @@ class NotificationHomeActivity : ThemeHomeActivity() { getFeedChannelUrl() ) ) - } btSignOut.setOnClickListener { logout() } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { diff --git a/uikit-samples/src/main/res/drawable-hdpi/logo_business_messaging.png b/uikit-samples/src/main/res/drawable-hdpi/logo_business_messaging.png new file mode 100644 index 00000000..896253ae Binary files /dev/null and b/uikit-samples/src/main/res/drawable-hdpi/logo_business_messaging.png differ diff --git a/uikit-samples/src/main/res/drawable-hdpi/logo_sendbird_full.png b/uikit-samples/src/main/res/drawable-hdpi/logo_sendbird_full.png index b72e745d..8eed7c18 100644 Binary files a/uikit-samples/src/main/res/drawable-hdpi/logo_sendbird_full.png and b/uikit-samples/src/main/res/drawable-hdpi/logo_sendbird_full.png differ diff --git a/uikit-samples/src/main/res/drawable-mdpi/logo_business_messaging.png b/uikit-samples/src/main/res/drawable-mdpi/logo_business_messaging.png new file mode 100644 index 00000000..5d647f02 Binary files /dev/null and b/uikit-samples/src/main/res/drawable-mdpi/logo_business_messaging.png differ diff --git a/uikit-samples/src/main/res/drawable-mdpi/logo_sendbird_full.png b/uikit-samples/src/main/res/drawable-mdpi/logo_sendbird_full.png index c9296976..d0637a3c 100644 Binary files a/uikit-samples/src/main/res/drawable-mdpi/logo_sendbird_full.png and b/uikit-samples/src/main/res/drawable-mdpi/logo_sendbird_full.png differ diff --git a/uikit-samples/src/main/res/drawable-xhdpi/logo_business_messaging.png b/uikit-samples/src/main/res/drawable-xhdpi/logo_business_messaging.png new file mode 100644 index 00000000..6a2eca36 Binary files /dev/null and b/uikit-samples/src/main/res/drawable-xhdpi/logo_business_messaging.png differ diff --git a/uikit-samples/src/main/res/drawable-xhdpi/logo_sendbird_full.png b/uikit-samples/src/main/res/drawable-xhdpi/logo_sendbird_full.png index e93da43f..5ca72688 100644 Binary files a/uikit-samples/src/main/res/drawable-xhdpi/logo_sendbird_full.png and b/uikit-samples/src/main/res/drawable-xhdpi/logo_sendbird_full.png differ diff --git a/uikit-samples/src/main/res/drawable-xxhdpi/logo_business_messaging.png b/uikit-samples/src/main/res/drawable-xxhdpi/logo_business_messaging.png new file mode 100644 index 00000000..b2ca27c9 Binary files /dev/null and b/uikit-samples/src/main/res/drawable-xxhdpi/logo_business_messaging.png differ diff --git a/uikit-samples/src/main/res/drawable-xxhdpi/logo_sendbird_full.png b/uikit-samples/src/main/res/drawable-xxhdpi/logo_sendbird_full.png index 7404501a..89b1818e 100644 Binary files a/uikit-samples/src/main/res/drawable-xxhdpi/logo_sendbird_full.png and b/uikit-samples/src/main/res/drawable-xxhdpi/logo_sendbird_full.png differ diff --git a/uikit-samples/src/main/res/drawable-xxxhdpi/logo_business_messaging.png b/uikit-samples/src/main/res/drawable-xxxhdpi/logo_business_messaging.png new file mode 100644 index 00000000..36749215 Binary files /dev/null and b/uikit-samples/src/main/res/drawable-xxxhdpi/logo_business_messaging.png differ diff --git a/uikit-samples/src/main/res/drawable-xxxhdpi/logo_sendbird_full.png b/uikit-samples/src/main/res/drawable-xxxhdpi/logo_sendbird_full.png index 9454a4ab..7c4a5357 100644 Binary files a/uikit-samples/src/main/res/drawable-xxxhdpi/logo_sendbird_full.png and b/uikit-samples/src/main/res/drawable-xxxhdpi/logo_sendbird_full.png differ diff --git a/uikit-samples/src/main/res/layout/activity_login.xml b/uikit-samples/src/main/res/layout/activity_login.xml index f0837977..f131f689 100644 --- a/uikit-samples/src/main/res/layout/activity_login.xml +++ b/uikit-samples/src/main/res/layout/activity_login.xml @@ -18,7 +18,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="@dimen/sb_size_56" - android:background="@drawable/logo_notifications" + android:background="@drawable/logo_business_messaging" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> @@ -32,7 +32,7 @@ android:textSize="@dimen/sb_text_size_24" android:textStyle="bold" android:textColor="@color/onlight_01" - android:text="@string/text_title_login_activity" + android:text="@string/text_title_uikit_sample_app" app:layout_constraintTop_toBottomOf="@id/logoImageView" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -168,12 +168,10 @@ android:layout_height="wrap_content" android:text="@string/text_use_feed_channel_only" android:buttonTint="@color/primary_300" - android:paddingStart="@dimen/sb_size_8" android:layout_marginTop="@dimen/sb_size_24" app:layout_constraintTop_toBottomOf="@id/nicknameLayout" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toTopOf="@id/signInButton" - style="@android:style/Widget.DeviceDefault.Light.CompoundButton.RadioButton" />