Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
### ⬆️ Improved

### ✅ Added
- Add option to hide history before given date when adding members to a channel. [#6020](https://github.com/GetStream/stream-chat-android/pull/6020)

### ⚠️ Changed

Expand Down
20 changes: 11 additions & 9 deletions stream-chat-android-client/api/stream-chat-android-client.api
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ public final class io/getstream/chat/android/client/ChatClient {
public final fun acceptInvite (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lio/getstream/result/call/Call;
public final fun addDevice (Lio/getstream/chat/android/models/Device;)Lio/getstream/result/call/Call;
public final fun addMembers (Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/client/query/AddMembersParams;)Lio/getstream/result/call/Call;
public final fun addMembers (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lio/getstream/result/call/Call;
public static synthetic fun addMembers$default (Lio/getstream/chat/android/client/ChatClient;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/getstream/result/call/Call;
public final fun addMembers (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/util/Date;Ljava/lang/Boolean;)Lio/getstream/result/call/Call;
public static synthetic fun addMembers$default (Lio/getstream/chat/android/client/ChatClient;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/util/Date;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/getstream/result/call/Call;
public final fun addSocketListener (Lio/getstream/chat/android/client/socket/SocketListener;)V
public final fun appSettings ()Lio/getstream/result/call/Call;
public final fun archiveChannel (Ljava/lang/String;Ljava/lang/String;)Lio/getstream/result/call/Call;
Expand Down Expand Up @@ -709,8 +709,8 @@ public final class io/getstream/chat/android/client/audio/WaveformExtractorKt {
public final class io/getstream/chat/android/client/channel/ChannelClient {
public final fun acceptInvite (Ljava/lang/String;)Lio/getstream/result/call/Call;
public final fun addMembers (Lio/getstream/chat/android/client/query/AddMembersParams;)Lio/getstream/result/call/Call;
public final fun addMembers (Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lio/getstream/result/call/Call;
public static synthetic fun addMembers$default (Lio/getstream/chat/android/client/channel/ChannelClient;Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/getstream/result/call/Call;
public final fun addMembers (Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/util/Date;Ljava/lang/Boolean;)Lio/getstream/result/call/Call;
public static synthetic fun addMembers$default (Lio/getstream/chat/android/client/channel/ChannelClient;Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/util/Date;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/getstream/result/call/Call;
public final fun archive ()Lio/getstream/result/call/Call;
public final fun banUser (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;)Lio/getstream/result/call/Call;
public final fun create (Lio/getstream/chat/android/client/query/CreateChannelParams;)Lio/getstream/result/call/Call;
Expand Down Expand Up @@ -3373,16 +3373,18 @@ public final class io/getstream/chat/android/client/plugins/requests/ApiRequests
}

public final class io/getstream/chat/android/client/query/AddMembersParams {
public fun <init> (Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/lang/Boolean;)V
public synthetic fun <init> (Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun <init> (Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/util/Date;Ljava/lang/Boolean;)V
public synthetic fun <init> (Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/util/Date;Ljava/lang/Boolean;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/util/List;
public final fun component2 ()Lio/getstream/chat/android/models/Message;
public final fun component3 ()Ljava/lang/Boolean;
public final fun component4 ()Ljava/lang/Boolean;
public final fun copy (Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lio/getstream/chat/android/client/query/AddMembersParams;
public static synthetic fun copy$default (Lio/getstream/chat/android/client/query/AddMembersParams;Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/getstream/chat/android/client/query/AddMembersParams;
public final fun component4 ()Ljava/util/Date;
public final fun component5 ()Ljava/lang/Boolean;
public final fun copy (Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/util/Date;Ljava/lang/Boolean;)Lio/getstream/chat/android/client/query/AddMembersParams;
public static synthetic fun copy$default (Lio/getstream/chat/android/client/query/AddMembersParams;Ljava/util/List;Lio/getstream/chat/android/models/Message;Ljava/lang/Boolean;Ljava/util/Date;Ljava/lang/Boolean;ILjava/lang/Object;)Lio/getstream/chat/android/client/query/AddMembersParams;
public fun equals (Ljava/lang/Object;)Z
public final fun getHideHistory ()Ljava/lang/Boolean;
public final fun getHideHistoryBefore ()Ljava/util/Date;
public final fun getMembers ()Ljava/util/List;
public final fun getSkipPush ()Ljava/lang/Boolean;
public final fun getSystemMessage ()Lio/getstream/chat/android/models/Message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3617,6 +3617,8 @@ internal constructor(
* @param memberIds The list of the member ids to be added.
* @param systemMessage The system message that will be shown in the channel.
* @param hideHistory Hides the history of the channel to the added member.
* @param hideHistoryBefore Hides the channel history before the provided date from the added members. If
* [hideHistory] and [hideHistoryBefore] are both specified, [hideHistoryBefore] takes precedence.
* @param skipPush If true, skips sending push notifications.
*
* @return Executable async [Call] responsible for adding the members.
Expand All @@ -3628,12 +3630,14 @@ internal constructor(
memberIds: List<String>,
systemMessage: Message? = null,
hideHistory: Boolean? = null,
hideHistoryBefore: Date? = null,
skipPush: Boolean? = null,
): Call<Channel> {
val params = AddMembersParams(
members = memberIds.map(::MemberData),
systemMessage = systemMessage,
hideHistory = hideHistory,
hideHistoryBefore = hideHistoryBefore,
skipPush = skipPush,
)
return addMembers(channelType, channelId, params)
Expand All @@ -3660,6 +3664,7 @@ internal constructor(
members = params.members,
systemMessage = params.systemMessage,
hideHistory = params.hideHistory,
hideHistoryBefore = params.hideHistoryBefore,
skipPush = params.skipPush,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,7 @@ internal interface ChatApi {
members: List<MemberData>,
systemMessage: Message?,
hideHistory: Boolean?,
hideHistoryBefore: Date?,
skipPush: Boolean?,
): Call<Channel>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import io.getstream.chat.android.models.User
import io.getstream.result.Error
import io.getstream.result.call.Call
import kotlinx.coroutines.CoroutineScope
import java.util.Date

/**
* Intercepts [ChatApi] calls and validates [CustomObject.extraData] keys to prevent passing reserved names.
Expand Down Expand Up @@ -94,10 +95,11 @@ internal class ExtraDataValidator(
members: List<MemberData>,
systemMessage: Message?,
hideHistory: Boolean?,
hideHistoryBefore: Date?,
skipPush: Boolean?,
): Call<Channel> {
return delegate
.addMembers(channelType, channelId, members, systemMessage, hideHistory, skipPush)
.addMembers(channelType, channelId, members, systemMessage, hideHistory, hideHistoryBefore, skipPush)
.withExtraDataValidation(systemMessage)
.validateMembersExtraData(members)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1012,6 +1012,7 @@ constructor(
members: List<MemberData>,
systemMessage: Message?,
hideHistory: Boolean?,
hideHistoryBefore: Date?,
skipPush: Boolean?,
): Call<Channel> {
return channelApi.addMembers(
Expand All @@ -1022,6 +1023,7 @@ constructor(
add_members = members.map { it.toDto() },
message = systemMessage?.toDto(),
hide_history = hideHistory,
hide_history_before = hideHistoryBefore,
skip_push = skipPush,
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@
import com.squareup.moshi.JsonClass
import io.getstream.chat.android.client.api2.model.dto.UpstreamMemberDataDto
import io.getstream.chat.android.client.api2.model.dto.UpstreamMessageDto
import java.util.Date

@JsonClass(generateAdapter = true)
internal data class AddMembersRequest(
val add_members: List<UpstreamMemberDataDto>,
val message: UpstreamMessageDto?,
val hide_history: Boolean?,
val hide_history_before: Date?,

Check warning on line 29 in stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/model/requests/AddMembersRequest.kt

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Rename this parameter to match the regular expression ^`?[_a-z][a-zA-Z0-9]*`?$

See more on https://sonarcloud.io/project/issues?id=GetStream_stream-chat-android&issues=AZq8lSkgIp2uJjfQqO3E&open=AZq8lSkgIp2uJjfQqO3E&pullRequest=6020
val skip_push: Boolean?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -728,6 +728,8 @@ public class ChannelClient internal constructor(
* @param memberIds The list of the member ids to be added.
* @param systemMessage The system message object that will be shown in the channel.
* @param hideHistory Hides the history of the channel to the added member.
* @param hideHistoryBefore Hides the channel history before the provided date from the added members. If
* [hideHistory] and [hideHistoryBefore] are both specified, [hideHistoryBefore] takes precedence.
* @param skipPush Skip sending push notifications.
*
* @return Executable async [Call] responsible for adding the members.
Expand All @@ -737,6 +739,7 @@ public class ChannelClient internal constructor(
memberIds: List<String>,
systemMessage: Message? = null,
hideHistory: Boolean? = null,
hideHistoryBefore: Date? = null,
skipPush: Boolean? = null,
): Call<Channel> {
return client.addMembers(
Expand All @@ -745,6 +748,7 @@ public class ChannelClient internal constructor(
memberIds = memberIds,
systemMessage = systemMessage,
hideHistory = hideHistory,
hideHistoryBefore = hideHistoryBefore,
skipPush = skipPush,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,22 @@ package io.getstream.chat.android.client.query

import io.getstream.chat.android.models.MemberData
import io.getstream.chat.android.models.Message
import java.util.Date

/**
* Model holding data required for adding members to a channel.
*
* @param members The list of the members with extra data to be added.
* @param hideHistory Hides the history of the channel to the added members.
* @param skipPush If true, skips sending push notifications.
* @param systemMessage The system message that will be shown in the channel.
* @param hideHistory Hides the history of the channel from the added members.
* @param hideHistoryBefore Hides the channel history before the provided date from the added members. If [hideHistory]
* and [hideHistoryBefore] are both specified, [hideHistoryBefore] takes precedence.
* @param skipPush If true, skips sending push notifications.
*/
public data class AddMembersParams(
val members: List<MemberData>,
val systemMessage: Message? = null,
val hideHistory: Boolean? = null,
val hideHistoryBefore: Date? = null,
val skipPush: Boolean? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import io.getstream.chat.android.client.errors.cause.StreamChannelNotFoundExcept
import io.getstream.chat.android.client.events.ChatEvent
import io.getstream.chat.android.client.parser.EventArguments
import io.getstream.chat.android.client.plugin.Plugin
import io.getstream.chat.android.client.query.AddMembersParams
import io.getstream.chat.android.client.query.CreateChannelParams
import io.getstream.chat.android.client.utils.RetroError
import io.getstream.chat.android.client.utils.RetroSuccess
Expand All @@ -40,6 +41,7 @@ import io.getstream.chat.android.positiveRandomInt
import io.getstream.chat.android.randomBoolean
import io.getstream.chat.android.randomCID
import io.getstream.chat.android.randomChannel
import io.getstream.chat.android.randomDate
import io.getstream.chat.android.randomExtraData
import io.getstream.chat.android.randomInt
import io.getstream.chat.android.randomMember
Expand All @@ -57,6 +59,7 @@ import org.junit.jupiter.api.Test
import org.mockito.Mockito
import org.mockito.Mockito.spy
import org.mockito.kotlin.any
import org.mockito.kotlin.anyOrNull
import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
Expand Down Expand Up @@ -1243,17 +1246,39 @@ internal class ChatClientChannelApiTests : BaseChatClientTest() {
val memberIds = listOf(randomString())
val systemMessage = randomMessage()
val hideHistory = randomBoolean()
val hideHistoryBefore = randomDate()
val skipPush = randomBoolean()
val response = randomChannel()
val sut = Fixture()
.givenAddMembersResult(RetroSuccess(response).toRetrofitCall())
.get()
// when
val result = sut.addMembers(channelType, channelId, memberIds, systemMessage, hideHistory, skipPush).await()
val result = sut
.addMembers(channelType, channelId, memberIds, systemMessage, hideHistory, hideHistoryBefore, skipPush)
.await()
// then
verifySuccess(result, response)
}

@Test
fun addMembersWithDefaultArgumentsSuccess() = runTest {
// given
val channelType = randomString()
val channelId = randomString()
val memberIds = listOf(randomString())
val response = randomChannel()
val sut = spy(
Fixture()
.givenAddMembersResult(RetroSuccess(response).toRetrofitCall())
.get(),
)
// when
val result = sut.addMembers(channelType, channelId, memberIds).await()
// then
verifySuccess(result, response)
verify(sut).addMembers(channelType, channelId, memberIds, null, null, null, null)
}

@Test
fun addMembersError() = runTest {
// given
Expand All @@ -1262,13 +1287,70 @@ internal class ChatClientChannelApiTests : BaseChatClientTest() {
val memberIds = listOf(randomString())
val systemMessage = randomMessage()
val hideHistory = randomBoolean()
val hideHistoryBefore = randomDate()
val skipPush = randomBoolean()
val errorCode = positiveRandomInt()
val sut = Fixture()
.givenAddMembersResult(RetroError<Channel>(errorCode).toRetrofitCall())
.get()
// when
val result = sut.addMembers(channelType, channelId, memberIds, systemMessage, hideHistory, skipPush).await()
val result = sut
.addMembers(channelType, channelId, memberIds, systemMessage, hideHistory, hideHistoryBefore, skipPush)
.await()
// then
verifyNetworkError(result, errorCode)
}

@Test
fun addMembersWithParamsSuccess() = runTest {
// given
val channelType = randomString()
val channelId = randomString()
val memberIds = listOf(randomString())
val systemMessage = randomMessage()
val hideHistory = randomBoolean()
val hideHistoryBefore = randomDate()
val skipPush = randomBoolean()
val params = AddMembersParams(
members = memberIds.map { MemberData(it) },
systemMessage = systemMessage,
hideHistory = hideHistory,
hideHistoryBefore = hideHistoryBefore,
skipPush = skipPush,
)
val response = randomChannel()
val sut = Fixture()
.givenAddMembersResult(RetroSuccess(response).toRetrofitCall())
.get()
// when
val result = sut.addMembers(channelType, channelId, params).await()
// then
verifySuccess(result, response)
}

@Test
fun addMembersWithParamsError() = runTest {
// given
val channelType = randomString()
val channelId = randomString()
val memberIds = listOf(randomString())
val systemMessage = randomMessage()
val hideHistory = randomBoolean()
val hideHistoryBefore = randomDate()
val skipPush = randomBoolean()
val params = AddMembersParams(
members = memberIds.map { MemberData(it) },
systemMessage = systemMessage,
hideHistory = hideHistory,
hideHistoryBefore = hideHistoryBefore,
skipPush = skipPush,
)
val errorCode = positiveRandomInt()
val sut = Fixture()
.givenAddMembersResult(RetroError<Channel>(errorCode).toRetrofitCall())
.get()
// when
val result = sut.addMembers(channelType, channelId, params).await()
// then
verifyNetworkError(result, errorCode)
}
Expand Down Expand Up @@ -1582,7 +1664,17 @@ internal class ChatClientChannelApiTests : BaseChatClientTest() {
}

fun givenAddMembersResult(result: Call<Channel>) = apply {
whenever(api.addMembers(any(), any(), any(), any(), any(), any())).thenReturn(result)
whenever(
api.addMembers(
any(),
any(),
any(),
anyOrNull(),
anyOrNull(),
anyOrNull(),
anyOrNull(),
),
).thenReturn(result)
}

fun givenRemoveMembersResult(result: Call<Channel>) = apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import org.junit.jupiter.api.extension.RegisterExtension
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
import java.util.Date

internal class ExtraDataValidatorTests {

Expand Down Expand Up @@ -191,6 +192,7 @@ internal class ExtraDataValidatorTests {
)
val systemMessage: Message = mock()
val hideHistory = false
val hideHistoryBefore: Date? = null
val skipPush = false

whenever(
Expand All @@ -200,6 +202,7 @@ internal class ExtraDataValidatorTests {
members,
systemMessage,
hideHistory,
hideHistoryBefore,
skipPush,
),
) doReturn channel.asCall()
Expand All @@ -211,6 +214,7 @@ internal class ExtraDataValidatorTests {
members = members,
systemMessage = systemMessage,
hideHistory = hideHistory,
hideHistoryBefore = hideHistoryBefore,
skipPush = skipPush,
).await()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1516,8 +1516,9 @@ internal class MoshiChatApiTest {
val members = listOf(randomMemberData())
val systemMessage = randomMessage()
val hideHistory = randomBoolean()
val hideHistoryBefore = randomDate()
val skipPush = randomBoolean()
val result = sut.addMembers(channelType, channelId, members, systemMessage, hideHistory, skipPush).await()
val result = sut.addMembers(channelType, channelId, members, systemMessage, hideHistory, hideHistoryBefore, skipPush).await()
// then
result `should be instance of` expected
verify(api, times(1)).addMembers(eq(channelType), eq(channelId), any())
Expand Down
Loading
Loading