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
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
### ⬆️ Improved

### ✅ Added
- Add support for deleting messages only for the current user. [#5967](https://github.com/GetStream/stream-chat-android/pull/5967)

### ⚠️ Changed

Expand All @@ -27,6 +28,7 @@
### ⬆️ Improved

### ✅ Added
- Add support for deleting messages only for the current user. [#5967](https://github.com/GetStream/stream-chat-android/pull/5967)

### ⚠️ Changed

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,7 @@ public class TestDataHelper {
message = message1Deleted,
hardDelete = false,
channelMessageCount = 1,
deletedForMe = false,
)
}

Expand All @@ -400,6 +401,7 @@ public class TestDataHelper {
message = message1Deleted,
hardDelete = true,
channelMessageCount = 1,
deletedForMe = false,
)
}

Expand Down
20 changes: 16 additions & 4 deletions stream-chat-android-client/api/stream-chat-android-client.api
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public final class io/getstream/chat/android/client/ChatClient {
public final fun deleteMessage (Ljava/lang/String;)Lio/getstream/result/call/Call;
public final fun deleteMessage (Ljava/lang/String;Z)Lio/getstream/result/call/Call;
public static synthetic fun deleteMessage$default (Lio/getstream/chat/android/client/ChatClient;Ljava/lang/String;ZILjava/lang/Object;)Lio/getstream/result/call/Call;
public final fun deleteMessageForMe (Ljava/lang/String;)Lio/getstream/result/call/Call;
public final fun deletePoll (Ljava/lang/String;)Lio/getstream/result/call/Call;
public final fun deleteReaction (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lio/getstream/result/call/Call;
public static synthetic fun deleteReaction$default (Lio/getstream/chat/android/client/ChatClient;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lio/getstream/result/call/Call;
Expand Down Expand Up @@ -1583,9 +1584,10 @@ public final class io/getstream/chat/android/client/events/MemberUpdatedEvent :
}

public final class io/getstream/chat/android/client/events/MessageDeletedEvent : io/getstream/chat/android/client/events/CidEvent, io/getstream/chat/android/client/events/HasMessage {
public fun <init> (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLjava/lang/Integer;)V
public fun <init> (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLjava/lang/Integer;Z)V
public final fun component1 ()Ljava/lang/String;
public final fun component10 ()Ljava/lang/Integer;
public final fun component11 ()Z
public final fun component2 ()Ljava/util/Date;
public final fun component3 ()Ljava/lang/String;
public final fun component4 ()Ljava/lang/String;
Expand All @@ -1594,14 +1596,15 @@ public final class io/getstream/chat/android/client/events/MessageDeletedEvent :
public final fun component7 ()Lio/getstream/chat/android/models/Message;
public final fun component8 ()Lio/getstream/chat/android/models/User;
public final fun component9 ()Z
public final fun copy (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLjava/lang/Integer;)Lio/getstream/chat/android/client/events/MessageDeletedEvent;
public static synthetic fun copy$default (Lio/getstream/chat/android/client/events/MessageDeletedEvent;Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLjava/lang/Integer;ILjava/lang/Object;)Lio/getstream/chat/android/client/events/MessageDeletedEvent;
public final fun copy (Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLjava/lang/Integer;Z)Lio/getstream/chat/android/client/events/MessageDeletedEvent;
public static synthetic fun copy$default (Lio/getstream/chat/android/client/events/MessageDeletedEvent;Ljava/lang/String;Ljava/util/Date;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Message;Lio/getstream/chat/android/models/User;ZLjava/lang/Integer;ZILjava/lang/Object;)Lio/getstream/chat/android/client/events/MessageDeletedEvent;
public fun equals (Ljava/lang/Object;)Z
public fun getChannelId ()Ljava/lang/String;
public final fun getChannelMessageCount ()Ljava/lang/Integer;
public fun getChannelType ()Ljava/lang/String;
public fun getCid ()Ljava/lang/String;
public fun getCreatedAt ()Ljava/util/Date;
public final fun getDeletedForMe ()Z
public final fun getHardDelete ()Z
public fun getMessage ()Lio/getstream/chat/android/models/Message;
public fun getRawCreatedAt ()Ljava/lang/String;
Expand Down Expand Up @@ -2962,7 +2965,7 @@ public abstract interface class io/getstream/chat/android/client/persistance/rep
public abstract fun createRepositoryFactory (Lio/getstream/chat/android/models/User;)Lio/getstream/chat/android/client/persistance/repository/factory/RepositoryFactory;
}

public abstract interface class io/getstream/chat/android/client/plugin/Plugin : io/getstream/chat/android/client/plugin/DependencyResolver, io/getstream/chat/android/client/plugin/listeners/BlockUserListener, io/getstream/chat/android/client/plugin/listeners/ChannelMarkReadListener, io/getstream/chat/android/client/plugin/listeners/CreateChannelListener, io/getstream/chat/android/client/plugin/listeners/DeleteChannelListener, io/getstream/chat/android/client/plugin/listeners/DeleteMessageListener, io/getstream/chat/android/client/plugin/listeners/DeleteReactionListener, io/getstream/chat/android/client/plugin/listeners/DraftMessageListener, io/getstream/chat/android/client/plugin/listeners/EditMessageListener, io/getstream/chat/android/client/plugin/listeners/FetchCurrentUserListener, io/getstream/chat/android/client/plugin/listeners/GetMessageListener, io/getstream/chat/android/client/plugin/listeners/HideChannelListener, io/getstream/chat/android/client/plugin/listeners/LiveLocationListener, io/getstream/chat/android/client/plugin/listeners/MarkAllReadListener, io/getstream/chat/android/client/plugin/listeners/PushPreferencesListener, io/getstream/chat/android/client/plugin/listeners/QueryBlockedUsersListener, io/getstream/chat/android/client/plugin/listeners/QueryChannelListener, io/getstream/chat/android/client/plugin/listeners/QueryChannelsListener, io/getstream/chat/android/client/plugin/listeners/QueryMembersListener, io/getstream/chat/android/client/plugin/listeners/QueryThreadsListener, io/getstream/chat/android/client/plugin/listeners/SendAttachmentListener, io/getstream/chat/android/client/plugin/listeners/SendGiphyListener, io/getstream/chat/android/client/plugin/listeners/SendMessageListener, io/getstream/chat/android/client/plugin/listeners/SendReactionListener, io/getstream/chat/android/client/plugin/listeners/ShuffleGiphyListener, io/getstream/chat/android/client/plugin/listeners/ThreadQueryListener, io/getstream/chat/android/client/plugin/listeners/TypingEventListener, io/getstream/chat/android/client/plugin/listeners/UnblockUserListener {
public abstract interface class io/getstream/chat/android/client/plugin/Plugin : io/getstream/chat/android/client/plugin/DependencyResolver, io/getstream/chat/android/client/plugin/listeners/BlockUserListener, io/getstream/chat/android/client/plugin/listeners/ChannelMarkReadListener, io/getstream/chat/android/client/plugin/listeners/CreateChannelListener, io/getstream/chat/android/client/plugin/listeners/DeleteChannelListener, io/getstream/chat/android/client/plugin/listeners/DeleteMessageForMeListener, io/getstream/chat/android/client/plugin/listeners/DeleteMessageListener, io/getstream/chat/android/client/plugin/listeners/DeleteReactionListener, io/getstream/chat/android/client/plugin/listeners/DraftMessageListener, io/getstream/chat/android/client/plugin/listeners/EditMessageListener, io/getstream/chat/android/client/plugin/listeners/FetchCurrentUserListener, io/getstream/chat/android/client/plugin/listeners/GetMessageListener, io/getstream/chat/android/client/plugin/listeners/HideChannelListener, io/getstream/chat/android/client/plugin/listeners/LiveLocationListener, io/getstream/chat/android/client/plugin/listeners/MarkAllReadListener, io/getstream/chat/android/client/plugin/listeners/PushPreferencesListener, io/getstream/chat/android/client/plugin/listeners/QueryBlockedUsersListener, io/getstream/chat/android/client/plugin/listeners/QueryChannelListener, io/getstream/chat/android/client/plugin/listeners/QueryChannelsListener, io/getstream/chat/android/client/plugin/listeners/QueryMembersListener, io/getstream/chat/android/client/plugin/listeners/QueryThreadsListener, io/getstream/chat/android/client/plugin/listeners/SendAttachmentListener, io/getstream/chat/android/client/plugin/listeners/SendGiphyListener, io/getstream/chat/android/client/plugin/listeners/SendMessageListener, io/getstream/chat/android/client/plugin/listeners/SendReactionListener, io/getstream/chat/android/client/plugin/listeners/ShuffleGiphyListener, io/getstream/chat/android/client/plugin/listeners/ThreadQueryListener, io/getstream/chat/android/client/plugin/listeners/TypingEventListener, io/getstream/chat/android/client/plugin/listeners/UnblockUserListener {
public fun getErrorHandler ()Lio/getstream/chat/android/client/errorhandler/ErrorHandler;
public fun onAttachmentSendRequest (Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static synthetic fun onAttachmentSendRequest$suspendImpl (Lio/getstream/chat/android/client/plugin/Plugin;Ljava/lang/String;Ljava/lang/String;Lio/getstream/chat/android/models/Message;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
Expand Down Expand Up @@ -3108,6 +3111,15 @@ public abstract interface class io/getstream/chat/android/client/plugin/listener
public abstract fun onDeleteChannelResult (Ljava/lang/String;Ljava/lang/String;Lio/getstream/result/Result;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}

public abstract interface class io/getstream/chat/android/client/plugin/listeners/DeleteMessageForMeListener {
public fun onDeleteMessageForMePrecondition (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static synthetic fun onDeleteMessageForMePrecondition$suspendImpl (Lio/getstream/chat/android/client/plugin/listeners/DeleteMessageForMeListener;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun onDeleteMessageForMeRequest (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static synthetic fun onDeleteMessageForMeRequest$suspendImpl (Lio/getstream/chat/android/client/plugin/listeners/DeleteMessageForMeListener;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public fun onDeleteMessageForMeResult (Ljava/lang/String;Lio/getstream/result/Result;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static synthetic fun onDeleteMessageForMeResult$suspendImpl (Lio/getstream/chat/android/client/plugin/listeners/DeleteMessageForMeListener;Ljava/lang/String;Lio/getstream/result/Result;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
}

public abstract interface class io/getstream/chat/android/client/plugin/listeners/DeleteMessageListener {
public abstract fun onMessageDeletePrecondition (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public abstract fun onMessageDeleteRequest (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import io.getstream.chat.android.client.api.models.SendActionRequest
import io.getstream.chat.android.client.api.models.identifier.AddDeviceIdentifier
import io.getstream.chat.android.client.api.models.identifier.ConnectUserIdentifier
import io.getstream.chat.android.client.api.models.identifier.DeleteDeviceIdentifier
import io.getstream.chat.android.client.api.models.identifier.DeleteMessageForMeIdentifier
import io.getstream.chat.android.client.api.models.identifier.DeleteMessageIdentifier
import io.getstream.chat.android.client.api.models.identifier.DeleteReactionIdentifier
import io.getstream.chat.android.client.api.models.identifier.GetDevicesIdentifier
Expand Down Expand Up @@ -2186,8 +2187,7 @@ internal constructor(
@JvmOverloads
public fun deleteMessage(messageId: String, hard: Boolean = false): Call<Message> {
logger.d { "[deleteMessage] messageId: $messageId, hard: $hard" }

return api.deleteMessage(messageId, hard)
return api.deleteMessage(messageId, hard, deleteForMe = false)
.doOnStart(userScope) {
plugins.forEach { listener ->
logger.v { "[deleteMessage] #doOnStart; plugin: ${listener::class.qualifiedName}" }
Expand All @@ -2206,6 +2206,33 @@ internal constructor(
.share(userScope) { DeleteMessageIdentifier(messageId, hard) }
}

/**
* Deletes a message for the current user only, making it invisible for them while keeping it visible for others.
*
* @param messageId The ID of the message to be deleted.
*/
@CheckResult
public fun deleteMessageForMe(messageId: String): Call<Message> {
logger.d { "[deleteMessageForMe] messageId: $messageId" }
return api.deleteMessage(messageId, hard = false, deleteForMe = true)
.doOnStart(userScope) {
plugins.forEach { listener ->
logger.v { "[deleteMessageForMe] #doOnStart; plugin: ${listener::class.qualifiedName}" }
listener.onDeleteMessageForMeRequest(messageId)
}
}
.doOnResult(userScope) { result ->
plugins.forEach { listener ->
logger.v { "[deleteMessageForMe] #doOnResult; plugin: ${listener::class.qualifiedName}" }
listener.onDeleteMessageForMeResult(messageId, result)
}
}
.precondition(plugins) {
onDeleteMessageForMePrecondition(messageId)
}
.share(userScope) { DeleteMessageForMeIdentifier(messageId) }
}

/**
* Fetches a single message from the backend.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,11 @@ internal interface ChatApi {
fun deleteReaction(messageId: String, reactionType: String): Call<Message>

@CheckResult
fun deleteMessage(messageId: String, hard: Boolean = false): Call<Message>
fun deleteMessage(
messageId: String,
hard: Boolean,
deleteForMe: Boolean,
): Call<Message>

@CheckResult
fun sendAction(request: SendActionRequest): Call<Message>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,5 @@ package io.getstream.chat.android.client.api

internal object QueryParams {
internal const val CONNECTION_ID = "connection_id"
internal const val HARD_DELETE = "hard"
internal const val URL = "url"
}
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,18 @@ internal fun DeleteMessageIdentifier(
return result
}

/**
* Identifier for a [ChatClient.deleteMessageForMe] call.
*/
@Suppress("FunctionName", "MagicNumber")
internal fun DeleteMessageForMeIdentifier(
messageId: String,
): Int {
var result = "DeleteMessageForMe".hashCode()
result = 31 * result + messageId.hashCode()
return result
}

/**
* Identifier for [ChatClient.keystroke] and [ChatClient.stopTyping] calls.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,10 +370,15 @@ constructor(
return messageApi.getMessage(messageId).mapDomain { it.toDomain() }
}

override fun deleteMessage(messageId: String, hard: Boolean): Call<Message> {
override fun deleteMessage(
messageId: String,
hard: Boolean,
deleteForMe: Boolean,
): Call<Message> {
return messageApi.deleteMessage(
messageId = messageId,
hard = if (hard) true else null,
deleteForMe = if (deleteForMe) true else null,
).mapDomain { response ->
response.message.toDomain()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package io.getstream.chat.android.client.api2.endpoint

import io.getstream.chat.android.client.api.AuthenticatedApi
import io.getstream.chat.android.client.api.QueryParams
import io.getstream.chat.android.client.api2.model.requests.PartialUpdateMessageRequest
import io.getstream.chat.android.client.api2.model.requests.QueryDraftMessagesRequest
import io.getstream.chat.android.client.api2.model.requests.QueryDraftsRequest
Expand Down Expand Up @@ -105,7 +104,8 @@ internal interface MessageApi {
@DELETE("/messages/{id}")
fun deleteMessage(
@Path("id") messageId: String,
@Query(QueryParams.HARD_DELETE) hard: Boolean?,
@Query("hard") hard: Boolean?,
@Query("delete_for_me") deleteForMe: Boolean?,
): RetrofitCall<MessageResponse>

@POST("/messages/{id}/action")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ internal class DomainMapping(
reminder = reminder?.toDomain(),
sharedLocation = shared_location?.toDomain(),
channelRole = member?.channel_role,
deletedForMe = deleted_for_me ?: false,
extraData = extraData.toMutableMap(),
).let(messageTransformer::transform)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,7 @@ internal class EventMapping(
message = message.toDomain(),
hardDelete = hard_delete ?: false,
channelMessageCount = channel_message_count,
deletedForMe = deleted_for_me ?: false,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ internal data class MessageDeletedEventDto(
val message: DownstreamMessageDto,
val hard_delete: Boolean?,
val channel_message_count: Int? = null,
val deleted_for_me: Boolean? = null,
) : ChatEventDto()

@JsonClass(generateAdapter = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ internal data class DownstreamMessageDto(
val reminder: DownstreamReminderInfoDto? = null,
val shared_location: DownstreamLocationDto? = null,
val member: DownstreamMemberInfoDto? = null,
val deleted_for_me: Boolean?,
val extraData: Map<String, Any>,
) : ExtraDataDto

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ public data class MessageDeletedEvent(
val user: User?,
val hardDelete: Boolean,
val channelMessageCount: Int?,
val deletedForMe: Boolean,
) : CidEvent(), HasMessage

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import io.getstream.chat.android.client.plugin.listeners.BlockUserListener
import io.getstream.chat.android.client.plugin.listeners.ChannelMarkReadListener
import io.getstream.chat.android.client.plugin.listeners.CreateChannelListener
import io.getstream.chat.android.client.plugin.listeners.DeleteChannelListener
import io.getstream.chat.android.client.plugin.listeners.DeleteMessageForMeListener
import io.getstream.chat.android.client.plugin.listeners.DeleteMessageListener
import io.getstream.chat.android.client.plugin.listeners.DeleteReactionListener
import io.getstream.chat.android.client.plugin.listeners.DraftMessageListener
Expand Down Expand Up @@ -100,7 +101,8 @@ public interface Plugin :
UnblockUserListener,
QueryBlockedUsersListener,
LiveLocationListener,
PushPreferencesListener {
PushPreferencesListener,
DeleteMessageForMeListener {

public fun getErrorHandler(): ErrorHandler? = null

Expand Down
Loading
Loading