Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class CustomSettings(private val context: Context) {

var isAdaptiveLayoutEnabled: Boolean by booleanPref(AdaptiveLayout)

var isChannelPinningEnabled: Boolean by booleanPref(ChannelPinning)
var isComposerLinkPreviewEnabled: Boolean by booleanPref(ComposerLinkPreview)
var isComposerFloatingStyleEnabled: Boolean by booleanPref(ComposerFloatingStyle)
var isSystemAttachmentPickerEnabled: Boolean by booleanPref(SystemAttachmentPicker)
Expand All @@ -48,6 +49,7 @@ class CustomSettings(private val context: Context) {
}

private const val AdaptiveLayout = "adaptive_layout"
private const val ChannelPinning = "channel_pinning"
private const val ComposerLinkPreview = "composer_link_preview"
private const val ComposerFloatingStyle = "composer_floating_style"
private const val SystemAttachmentPicker = "system_attachment_picker"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ import io.getstream.chat.android.client.api.models.QueryThreadsRequest
import io.getstream.chat.android.client.api.state.globalStateFlow
import io.getstream.chat.android.compose.sample.ChatHelper
import io.getstream.chat.android.compose.sample.R
import io.getstream.chat.android.compose.sample.data.customSettings
import io.getstream.chat.android.compose.sample.feature.channel.add.AddChannelActivity
import io.getstream.chat.android.compose.sample.feature.channel.add.group.AddGroupChannelActivity
import io.getstream.chat.android.compose.sample.feature.channel.isGroupChannel
Expand All @@ -81,12 +82,15 @@ import io.getstream.chat.android.compose.ui.channels.info.SelectedChannelMenu
import io.getstream.chat.android.compose.ui.channels.list.ChannelItem
import io.getstream.chat.android.compose.ui.channels.list.ChannelList
import io.getstream.chat.android.compose.ui.components.SearchInput
import io.getstream.chat.android.compose.ui.components.channels.ChannelOptionsVisibility
import io.getstream.chat.android.compose.ui.components.channels.buildDefaultChannelActions
import io.getstream.chat.android.compose.ui.mentions.MentionList
import io.getstream.chat.android.compose.ui.theme.ChannelListConfig
import io.getstream.chat.android.compose.ui.theme.ChannelListDividerItemParams
import io.getstream.chat.android.compose.ui.theme.ChannelListItemContentParams
import io.getstream.chat.android.compose.ui.theme.ChatComponentFactory
import io.getstream.chat.android.compose.ui.theme.ChatTheme
import io.getstream.chat.android.compose.ui.theme.ChatUiConfig
import io.getstream.chat.android.compose.ui.threads.ThreadsScreen
import io.getstream.chat.android.compose.viewmodel.channels.ChannelListViewModel
import io.getstream.chat.android.compose.viewmodel.channels.ChannelListViewModelFactory
Expand All @@ -106,6 +110,8 @@ import kotlinx.coroutines.launch
@OptIn(ExperimentalCoroutinesApi::class)
class ChannelsActivity : ComponentActivity() {

private val settings by lazy { customSettings() }

/**
* The provided predefined filter has the following specs:
*
Expand All @@ -120,7 +126,7 @@ class ChannelsActivity : ComponentActivity() {
*
* **Sort:**
* ```
* QuerySortByField.descByName("last_updated")
* QuerySortByField<Channel>().desc("pinned_at").desc("last_updated")
* ```
*/
private val channelsViewModelFactory by lazy {
Expand Down Expand Up @@ -161,7 +167,15 @@ class ChannelsActivity : ComponentActivity() {
val unreadChannelsCount by unreadChannelsCountFlow.collectAsStateWithLifecycle(0)
val unreadThreadsCount by unreadThreadsCountFlow.collectAsStateWithLifecycle(0)

SampleChatTheme {
SampleChatTheme(
config = ChatUiConfig(
channelList = ChannelListConfig(
optionsVisibility = ChannelOptionsVisibility(
isPinChannelVisible = settings.isChannelPinningEnabled,
),
),
),
) {
val user by channelsViewModel.user.collectAsStateWithLifecycle()
val drawerState = rememberDrawerState(DrawerValue.Closed)
val coroutineScope = rememberCoroutineScope()
Expand Down Expand Up @@ -348,7 +362,6 @@ class ChannelsActivity : ComponentActivity() {
if (selectedChannel != null) {
val channelActions = buildDefaultChannelActions(
selectedChannel = selectedChannel,
isMuted = channelsViewModel.isChannelMuted(selectedChannel.cid),
ownCapabilities = selectedChannel.ownCapabilities,
viewModel = channelsViewModel,
onViewInfoAction = ::viewChannelInfo,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ import io.getstream.chat.android.client.api.state.globalStateFlow
import io.getstream.chat.android.compose.sample.ChatHelper
import io.getstream.chat.android.compose.sample.R
import io.getstream.chat.android.compose.sample.data.customSettings
import io.getstream.chat.android.compose.sample.feature.channel.ChannelConstants.CHANNEL_ARG_DRAFT
import io.getstream.chat.android.compose.sample.feature.channel.add.AddChannelActivity
import io.getstream.chat.android.compose.sample.feature.channel.isGroupChannel
import io.getstream.chat.android.compose.sample.feature.channel.list.CustomChatEventHandlerFactory
Expand Down Expand Up @@ -92,9 +91,7 @@ import io.getstream.chat.android.compose.viewmodel.pinned.PinnedMessageListViewM
import io.getstream.chat.android.compose.viewmodel.pinned.PinnedMessageListViewModelFactory
import io.getstream.chat.android.models.AttachmentType
import io.getstream.chat.android.models.Channel
import io.getstream.chat.android.models.Filters
import io.getstream.chat.android.models.Message
import io.getstream.chat.android.models.querysort.QuerySortByField
import io.getstream.chat.android.ui.common.feature.channel.attachments.ChannelAttachmentsViewEvent
import io.getstream.chat.android.ui.common.feature.channel.info.ChannelInfoViewEvent
import io.getstream.chat.android.ui.common.state.channel.info.ChannelInfoViewState
Expand Down Expand Up @@ -131,16 +128,34 @@ class ChatsActivity : ComponentActivity() {
private val messageId by lazy { intent.getStringExtra(KEY_MESSAGE_ID) }
private val parentMessageId by lazy { intent.getStringExtra(KEY_PARENT_MESSAGE_ID) }

private val settings by lazy { customSettings() }

/**
* The provided predefined filter has the following specs:
*
* **Filter:**
* ```
* Filters.and(
* Filters.eq("type", "messaging"),
* Filters.`in`("members", listOf(currentUserId)),
* Filters.or(Filters.notExists("draft"), Filters.eq("draft", false)),
* )
* ```
*
* **Sort:**
* ```
* QuerySortByField<Channel>().desc("pinned_at").desc("last_updated")
* ```
*/
private val channelListViewModelFactory by lazy {
val chatClient = ChatClient.instance()
val currentUserId = chatClient.getCurrentUser()?.id ?: ""
ChannelListViewModelFactory(
chatClient = chatClient,
querySort = QuerySortByField.descByName("last_updated"),
filters = Filters.and(
Filters.eq("type", "messaging"),
Filters.`in`("members", listOf(currentUserId)),
Filters.or(Filters.notExists(CHANNEL_ARG_DRAFT), Filters.eq(CHANNEL_ARG_DRAFT, false)),
predefinedFilterName = "android_sample_filter",
filterValues = mapOf(
"channel_type" to "messaging",
"user_id" to currentUserId,
),
chatEventHandlerFactory = CustomChatEventHandlerFactory(),
)
Expand All @@ -165,6 +180,7 @@ class ChatsActivity : ComponentActivity() {
channelList = ChannelListConfig(
optionsVisibility = ChannelOptionsVisibility(
isViewInfoVisible = AdaptiveLayoutInfo.singlePaneWindow(),
isPinChannelVisible = settings.isChannelPinningEnabled,
),
),
),
Expand Down Expand Up @@ -608,7 +624,7 @@ class ChatsActivity : ComponentActivity() {
) = ChannelViewModelFactory(
context = applicationContext,
channelId = channelId,
composerOptions = ComposerOptions(linkPreviewEnabled = customSettings().isComposerLinkPreviewEnabled),
composerOptions = ComposerOptions(linkPreviewEnabled = settings.isComposerLinkPreviewEnabled),
messageId = messageId,
parentMessageId = parentMessageId,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ class CustomLoginActivity : AppCompatActivity() {
var userTokenText by remember { mutableStateOf("") }
var userNameText by remember { mutableStateOf("") }
var isAdaptiveLayoutEnabled by remember { mutableStateOf(settings.isAdaptiveLayoutEnabled) }
var isChannelPinningEnabled by remember {
mutableStateOf(settings.isChannelPinningEnabled)
}
var isComposerLinkPreviewEnabled by remember {
mutableStateOf(settings.isComposerLinkPreviewEnabled)
}
Expand All @@ -150,6 +153,15 @@ class CustomLoginActivity : AppCompatActivity() {
settings.isAdaptiveLayoutEnabled = it
},
),
FeatureFlag(
label = stringResource(R.string.custom_login_flag_channel_pinning_label),
description = stringResource(R.string.custom_login_flag_channel_pinning_description),
value = isChannelPinningEnabled,
onValueChange = {
isChannelPinningEnabled = it
settings.isChannelPinningEnabled = it
},
),
FeatureFlag(
label = stringResource(R.string.custom_login_flag_composer_link_preview_label),
description = stringResource(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@
<string name="custom_login_flag_composer_link_preview_description">Show link previews in the message composer</string>
<string name="custom_login_flag_system_attachment_picker_label">System attachment picker</string>
<string name="custom_login_flag_system_attachment_picker_description">Use the system\'s native file/media picker</string>
<string name="custom_login_flag_channel_pinning_label">Channel pinning</string>
<string name="custom_login_flag_channel_pinning_description">Show the Pin/Unpin Chat action in the channel options menu</string>

<!-- Pinned Messages -->
<string name="pinned_messages_title">Pinned Messages</string>
Expand Down
33 changes: 27 additions & 6 deletions stream-chat-android-compose/api/stream-chat-android-compose.api
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,7 @@ public final class io/getstream/chat/android/compose/ui/channels/header/Composab
public final class io/getstream/chat/android/compose/ui/channels/info/ComposableSingletons$SelectedChannelMenuKt {
public static final field INSTANCE Lio/getstream/chat/android/compose/ui/channels/info/ComposableSingletons$SelectedChannelMenuKt;
public fun <init> ()V
public final fun getLambda$1458176636$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$1837108307$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$835101941$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
}
Expand All @@ -902,14 +903,23 @@ public final class io/getstream/chat/android/compose/ui/channels/list/Composable
public static final field INSTANCE Lio/getstream/chat/android/compose/ui/channels/list/ComposableSingletons$ChannelItemKt;
public fun <init> ()V
public final fun getLambda$-1095060318$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$-1232665624$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$-262212850$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$-781924446$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$-851243681$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$1003502438$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$112526037$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$1228594335$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$1334723625$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$1340453964$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$1561934893$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$1593816240$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$1946891593$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$2130050484$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$2144537814$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$230028639$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$468999837$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$481395312$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$633588870$stream_chat_android_compose_release ()Lkotlin/jvm/functions/Function2;
}

Expand Down Expand Up @@ -1210,6 +1220,7 @@ public final class io/getstream/chat/android/compose/ui/components/channels/Chan

public final class io/getstream/chat/android/compose/ui/components/channels/ChannelOptionsKt {
public static final fun ChannelOptions (Ljava/util/List;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/Composer;II)V
public static final fun buildDefaultChannelActions (Lio/getstream/chat/android/models/Channel;Ljava/util/Set;Lio/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)Ljava/util/List;
public static final fun buildDefaultChannelActions (Lio/getstream/chat/android/models/Channel;ZLjava/util/Set;Lio/getstream/chat/android/compose/viewmodel/channels/ChannelListViewModel;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)Ljava/util/List;
}

Expand Down Expand Up @@ -2895,16 +2906,18 @@ public final class io/getstream/chat/android/compose/ui/theme/ChannelItemUnreadC
public final class io/getstream/chat/android/compose/ui/theme/ChannelListConfig {
public static final field $stable I
public fun <init> ()V
public fun <init> (Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;ZLio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;)V
public synthetic fun <init> (Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;ZLio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;ZLio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;)V
public synthetic fun <init> (Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;ZLio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;
public final fun component2 ()Z
public final fun component3 ()Lio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;
public final fun copy (Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;ZLio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;)Lio/getstream/chat/android/compose/ui/theme/ChannelListConfig;
public static synthetic fun copy$default (Lio/getstream/chat/android/compose/ui/theme/ChannelListConfig;Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;ZLio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;ILjava/lang/Object;)Lio/getstream/chat/android/compose/ui/theme/ChannelListConfig;
public final fun component2 ()Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;
public final fun component3 ()Z
public final fun component4 ()Lio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;
public final fun copy (Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;ZLio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;)Lio/getstream/chat/android/compose/ui/theme/ChannelListConfig;
public static synthetic fun copy$default (Lio/getstream/chat/android/compose/ui/theme/ChannelListConfig;Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;ZLio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;ILjava/lang/Object;)Lio/getstream/chat/android/compose/ui/theme/ChannelListConfig;
public fun equals (Ljava/lang/Object;)Z
public final fun getMuteIndicatorPosition ()Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;
public final fun getOptionsVisibility ()Lio/getstream/chat/android/compose/ui/components/channels/ChannelOptionsVisibility;
public final fun getPinIndicatorPosition ()Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;
Comment thread
andremion marked this conversation as resolved.
public final fun getSwipeActionsEnabled ()Z
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
Expand Down Expand Up @@ -5523,6 +5536,14 @@ public final class io/getstream/chat/android/compose/ui/theme/MuteIndicatorPosit
public static fun values ()[Lio/getstream/chat/android/compose/ui/theme/MuteIndicatorPosition;
}

public final class io/getstream/chat/android/compose/ui/theme/PinIndicatorPosition : java/lang/Enum {
public static final field InlineTitle Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;
public static final field TrailingBottom Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;
public static fun values ()[Lio/getstream/chat/android/compose/ui/theme/PinIndicatorPosition;
}

public final class io/getstream/chat/android/compose/ui/theme/PinnedMessageListEmptyContentParams {
public static final field $stable I
public fun <init> ()V
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,6 @@ public fun ChannelsScreen(
val channel = lastChannel.value
val channelActions = buildDefaultChannelActions(
selectedChannel = channel,
isMuted = listViewModel.isChannelMuted(channel.cid),
ownCapabilities = channel.ownCapabilities,
viewModel = listViewModel,
onViewInfoAction = { ch ->
Expand Down
Loading
Loading