diff --git a/CHANGELOG.md b/CHANGELOG.md index 65d8acbac24..1bf9edac09a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,21 @@ ### ❌ Removed +## stream-chat-android-core +### 🐞 Fixed + +### ⬆️ Improved + +### ✅ Added + +### ⚠️ Changed +- 🚨Breaking change: The following properties in `User` class are now **nullable**: `banned`, `invisible`. [#5107](https://github.com/GetStream/stream-chat-android/pull/5107) + * Please use `User.isBanned` as non-nullable version. + * Please use `User.isInvisible` as non-nullable version. + * Properties such as `invisible`, `banned`, `teams` and `role` are not being used to establish WS connection flow if not specified. + +### ❌ Removed + ## stream-chat-android-client ### 🐞 Fixed diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/UserMapping.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/UserMapping.kt index 4e810e35c8e..4d44241acf3 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/UserMapping.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/api2/mapping/UserMapping.kt @@ -26,11 +26,11 @@ import io.getstream.chat.android.models.User internal fun User.toDto(): UpstreamUserDto = UpstreamUserDto( - banned = banned, + banned = isBanned, id = id, name = name, image = image, - invisible = invisible, + invisible = isInvisible, language = language, role = role, devices = devices.map(Device::toDto), diff --git a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/socket/SocketFactory.kt b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/socket/SocketFactory.kt index f62aefb7b32..bcd1898de1b 100644 --- a/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/socket/SocketFactory.kt +++ b/stream-chat-android-client/src/main/java/io/getstream/chat/android/client/socket/SocketFactory.kt @@ -85,10 +85,10 @@ internal class SocketFactory( private fun ConnectionConf.reduceUserDetails(): Map = mutableMapOf("id" to id) .apply { if (!isReconnection) { - put("role", user.role) - put("banned", user.banned) - put("invisible", user.invisible) - put("teams", user.teams) + if (user.role.isNotBlank()) put("role", user.role) + user.banned?.also { put("banned", it) } + user.invisible?.also { put("invisible", it) } + if (user.teams.isNotEmpty()) put("teams", user.teams) if (user.language.isNotBlank()) put("language", user.language) if (user.image.isNotBlank()) put("image", user.image) if (user.name.isNotBlank()) put("name", user.name) diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser/EventArguments.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser/EventArguments.kt index a514bfd2b2d..191eb98f8ca 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser/EventArguments.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/parser/EventArguments.kt @@ -133,6 +133,8 @@ internal object EventArguments { private val user = User( id = "bender", role = "user", + invisible = false, + banned = false, online = true, createdAt = date, updatedAt = date, diff --git a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/socket/SocketFactoryTest.kt b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/socket/SocketFactoryTest.kt index c73ba3f41ec..f93db7e19b2 100644 --- a/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/socket/SocketFactoryTest.kt +++ b/stream-chat-android-client/src/test/java/io/getstream/chat/android/client/socket/SocketFactoryTest.kt @@ -105,9 +105,8 @@ internal class SocketFactoryTest { mapOf( "id" to userId, "role" to user.role, - "banned" to user.banned, - "invisible" to user.invisible, - "teams" to user.teams, + "banned" to user.isBanned, + "invisible" to user.isInvisible, "language" to user.language, "image" to user.image, "name" to user.name, diff --git a/stream-chat-android-core/api/stream-chat-android-core.api b/stream-chat-android-core/api/stream-chat-android-core.api index 7a3c5b65307..e2310a44b9e 100644 --- a/stream-chat-android-core/api/stream-chat-android-core.api +++ b/stream-chat-android-core/api/stream-chat-android-core.api @@ -1513,8 +1513,8 @@ public final class io/getstream/chat/android/models/UploadedImage { public final class io/getstream/chat/android/models/User : io/getstream/chat/android/models/CustomObject, io/getstream/chat/android/models/querysort/ComparableFieldProvider { public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;ZLjava/util/List;ZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;IILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/Date;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;ZLjava/util/List;ZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;IILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/Date;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Boolean;Ljava/util/List;ZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;IILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/Date;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Boolean;Ljava/util/List;ZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;IILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/Date;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun component1 ()Ljava/lang/String; public final fun component10 ()Ljava/util/Date; public final fun component11 ()Ljava/util/Date; @@ -1529,15 +1529,15 @@ public final class io/getstream/chat/android/models/User : io/getstream/chat/and public final fun component2 ()Ljava/lang/String; public final fun component3 ()Ljava/lang/String; public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Z + public final fun component5 ()Ljava/lang/Boolean; public final fun component6 ()Ljava/lang/String; - public final fun component7 ()Z + public final fun component7 ()Ljava/lang/Boolean; public final fun component8 ()Ljava/util/List; public final fun component9 ()Z - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;ZLjava/util/List;ZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;IILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/Date;)Lio/getstream/chat/android/models/User; - public static synthetic fun copy$default (Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;ZLjava/util/List;ZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;IILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/Date;ILjava/lang/Object;)Lio/getstream/chat/android/models/User; + public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Boolean;Ljava/util/List;ZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;IILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/Date;)Lio/getstream/chat/android/models/User; + public static synthetic fun copy$default (Lio/getstream/chat/android/models/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Boolean;Ljava/util/List;ZLjava/util/Date;Ljava/util/Date;Ljava/util/Date;IILjava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/Date;ILjava/lang/Object;)Lio/getstream/chat/android/models/User; public fun equals (Ljava/lang/Object;)Z - public final fun getBanned ()Z + public final fun getBanned ()Ljava/lang/Boolean; public final fun getChannelMutes ()Ljava/util/List; public fun getComparableField (Ljava/lang/String;)Ljava/lang/Comparable; public final fun getCreatedAt ()Ljava/util/Date; @@ -1547,7 +1547,7 @@ public final class io/getstream/chat/android/models/User : io/getstream/chat/and public fun getExtraValue (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; public final fun getId ()Ljava/lang/String; public final fun getImage ()Ljava/lang/String; - public final fun getInvisible ()Z + public final fun getInvisible ()Ljava/lang/Boolean; public final fun getLanguage ()Ljava/lang/String; public final fun getLastActive ()Ljava/util/Date; public final fun getMutes ()Ljava/util/List; @@ -1559,6 +1559,8 @@ public final class io/getstream/chat/android/models/User : io/getstream/chat/and public final fun getUnreadChannels ()I public final fun getUpdatedAt ()Ljava/util/Date; public fun hashCode ()I + public final fun isBanned ()Z + public final fun isInvisible ()Z public final fun newBuilder ()Lio/getstream/chat/android/models/User$Builder; public fun toString ()Ljava/lang/String; } @@ -1567,7 +1569,7 @@ public final class io/getstream/chat/android/models/User$Builder { public fun ()V public fun (Lio/getstream/chat/android/models/User;)V public final fun build ()Lio/getstream/chat/android/models/User; - public final fun withBanned (Z)Lio/getstream/chat/android/models/User$Builder; + public final fun withBanned (Ljava/lang/Boolean;)Lio/getstream/chat/android/models/User$Builder; public final fun withChannelMutes (Ljava/util/List;)Lio/getstream/chat/android/models/User$Builder; public final fun withCreatedAt (Ljava/util/Date;)Lio/getstream/chat/android/models/User$Builder; public final fun withDeactivatedAt (Ljava/util/Date;)Lio/getstream/chat/android/models/User$Builder; @@ -1575,7 +1577,7 @@ public final class io/getstream/chat/android/models/User$Builder { public final fun withExtraData (Ljava/util/Map;)Lio/getstream/chat/android/models/User$Builder; public final fun withId (Ljava/lang/String;)Lio/getstream/chat/android/models/User$Builder; public final fun withImage (Ljava/lang/String;)Lio/getstream/chat/android/models/User$Builder; - public final fun withInvisible (Z)Lio/getstream/chat/android/models/User$Builder; + public final fun withInvisible (Ljava/lang/Boolean;)Lio/getstream/chat/android/models/User$Builder; public final fun withLanguage (Ljava/lang/String;)Lio/getstream/chat/android/models/User$Builder; public final fun withLastActive (Ljava/util/Date;)Lio/getstream/chat/android/models/User$Builder; public final fun withMutes (Ljava/util/List;)Lio/getstream/chat/android/models/User$Builder; diff --git a/stream-chat-android-core/src/main/java/io/getstream/chat/android/models/User.kt b/stream-chat-android-core/src/main/java/io/getstream/chat/android/models/User.kt index 39bbdb225d1..78a94b802f6 100644 --- a/stream-chat-android-core/src/main/java/io/getstream/chat/android/models/User.kt +++ b/stream-chat-android-core/src/main/java/io/getstream/chat/android/models/User.kt @@ -49,9 +49,9 @@ public data class User( val role: String = "", val name: String = "", val image: String = "", - val invisible: Boolean = false, + val invisible: Boolean? = null, val language: String = "", - val banned: Boolean = false, + val banned: Boolean? = null, val devices: List = listOf(), val online: Boolean = false, val createdAt: Date? = null, @@ -66,6 +66,16 @@ public data class User( val deactivatedAt: Date? = null, ) : CustomObject, ComparableFieldProvider { + /** + * Determines if the user is banned or not. + */ + val isBanned: Boolean get() = banned == true + + /** + * Determines if the user should share its online status. + */ + val isInvisible: Boolean get() = invisible == true + override fun getComparableField(fieldName: String): Comparable<*>? { return when (fieldName) { "id" -> id @@ -95,9 +105,9 @@ public data class User( private var role: String = "" private var name: String = "" private var image: String = "" - private var invisible: Boolean = false + private var invisible: Boolean? = null private var language: String = "" - private var banned: Boolean = false + private var banned: Boolean? = null private var devices: List = listOf() private var online: Boolean = false private var createdAt: Date? = null @@ -136,9 +146,9 @@ public data class User( public fun withRole(role: String): Builder = apply { this.role = role } public fun withName(name: String): Builder = apply { this.name = name } public fun withImage(image: String): Builder = apply { this.image = image } - public fun withInvisible(invisible: Boolean): Builder = apply { this.invisible = invisible } + public fun withInvisible(invisible: Boolean?): Builder = apply { this.invisible = invisible } public fun withLanguage(language: String): Builder = apply { this.language = language } - public fun withBanned(banned: Boolean): Builder = apply { this.banned = banned } + public fun withBanned(banned: Boolean?): Builder = apply { this.banned = banned } public fun withDevices(devices: List): Builder = apply { this.devices = devices } public fun withOnline(online: Boolean): Builder = apply { this.online = online } public fun withCreatedAt(createdAt: Date?): Builder = apply { this.createdAt = createdAt } diff --git a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/user/internal/DatabaseUserRepository.kt b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/user/internal/DatabaseUserRepository.kt index 8ac253d08a3..7e4792c5cdf 100644 --- a/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/user/internal/DatabaseUserRepository.kt +++ b/stream-chat-android-offline/src/main/java/io/getstream/chat/android/offline/repository/domain/user/internal/DatabaseUserRepository.kt @@ -125,8 +125,8 @@ internal class DatabaseUserRepository( createdAt = createdAt, updatedAt = updatedAt, lastActive = lastActive, - invisible = invisible, - banned = banned, + invisible = isInvisible, + banned = isBanned, extraData = extraData, mutes = mutes.map { mute -> mute.target.id }, ) diff --git a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/EventHandlerSequential.kt b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/EventHandlerSequential.kt index f0e5b941e32..816e113e8b2 100644 --- a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/EventHandlerSequential.kt +++ b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/EventHandlerSequential.kt @@ -325,7 +325,7 @@ internal class EventHandlerSequential( } me?.let { - mutableGlobalState.setBanned(it.banned) + mutableGlobalState.setBanned(it.isBanned) mutableGlobalState.setMutedUsers(it.mutes) mutableGlobalState.setChannelMutes(it.channelMutes) } diff --git a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/utils/SelfUserUtils.kt b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/utils/SelfUserUtils.kt index 26697351a0b..ab540229cb3 100644 --- a/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/utils/SelfUserUtils.kt +++ b/stream-chat-android-state/src/main/java/io/getstream/chat/android/state/event/handler/internal/utils/SelfUserUtils.kt @@ -32,7 +32,7 @@ internal fun MutableGlobalState.updateCurrentUser(currentUser: User?, receivedUs is SelfUserPart -> currentUser?.mergePartially(receivedUser.me) ?: receivedUser.me } - setBanned(me.banned) + setBanned(me.isBanned) setMutedUsers(me.mutes) setChannelMutes(me.channelMutes) setTotalUnreadCount(me.totalUnreadCount)