diff --git a/.gitignore b/.gitignore index 4544f87..92c9f86 100644 --- a/.gitignore +++ b/.gitignore @@ -95,6 +95,7 @@ publish.properties /.idea/compiler.xml /.idea/jarRepositories.xml /.idea/misc.xml +/.idea/shelf # general **/.DS_Store diff --git a/chat-android/src/main/java/com/ably/chat/ConnectionStatus.kt b/chat-android/src/main/java/com/ably/chat/ConnectionStatus.kt index 6858f50..2822f10 100644 --- a/chat-android/src/main/java/com/ably/chat/ConnectionStatus.kt +++ b/chat-android/src/main/java/com/ably/chat/ConnectionStatus.kt @@ -25,13 +25,7 @@ interface ConnectionStatus { * Registers a listener that will be called whenever the connection status changes. * @param listener The function to call when the status changes. */ - fun on(listener: Listener) - - /** - * Unregisters a listener - * @param listener The function to call when the status changes. - */ - fun off(listener: Listener) + fun on(listener: Listener): Subscription /** * An interface for listening to changes for the connection status diff --git a/chat-android/src/main/java/com/ably/chat/EmitsDiscontinuities.kt b/chat-android/src/main/java/com/ably/chat/EmitsDiscontinuities.kt index 10ffac6..07412f4 100644 --- a/chat-android/src/main/java/com/ably/chat/EmitsDiscontinuities.kt +++ b/chat-android/src/main/java/com/ably/chat/EmitsDiscontinuities.kt @@ -10,13 +10,7 @@ interface EmitsDiscontinuities { * Register a listener to be called when a discontinuity is detected. * @param listener The listener to be called when a discontinuity is detected. */ - fun onDiscontinuity(listener: Listener) - - /** - * Unregister a listener to be called when a discontinuity is detected. - * @param listener The listener - */ - fun offDiscontinuity(listener: Listener) + fun onDiscontinuity(listener: Listener): Subscription /** * An interface for listening when discontinuity happens diff --git a/chat-android/src/main/java/com/ably/chat/Messages.kt b/chat-android/src/main/java/com/ably/chat/Messages.kt index 854b147..eb9600f 100644 --- a/chat-android/src/main/java/com/ably/chat/Messages.kt +++ b/chat-android/src/main/java/com/ably/chat/Messages.kt @@ -3,7 +3,6 @@ package com.ably.chat import io.ably.lib.realtime.Channel -import io.ably.lib.types.PaginatedResult /** * This interface is used to interact with messages in a chat room: subscribing @@ -24,13 +23,7 @@ interface Messages : EmitsDiscontinuities { * @param listener callback that will be called * @returns A response object that allows you to control the subscription. */ - fun subscribe(listener: Listener) - - /** - * Unsubscribe listener - * @param listener callback that will be unsubscribed - */ - fun unsubscribe(listener: Listener) + fun subscribe(listener: Listener): MessagesSubscription /** * Get messages that have been previously sent to the chat room, based on the provided options. @@ -176,6 +169,10 @@ data class SendMessageParams( val headers: MessageHeaders? = null, ) +interface MessagesSubscription : Subscription { + suspend fun getPreviousMessages(queryOptions: QueryOptions): PaginatedResult +} + class DefaultMessages( private val roomId: String, private val realtimeClient: RealtimeClient, @@ -190,25 +187,15 @@ class DefaultMessages( override val channel: Channel get() = realtimeClient.channels.get(messagesChannelName, ChatChannelOptions()) - override fun subscribe(listener: Messages.Listener) { + override fun subscribe(listener: Messages.Listener): MessagesSubscription { TODO("Not yet implemented") } - override fun unsubscribe(listener: Messages.Listener) { - TODO("Not yet implemented") - } - - override suspend fun get(options: QueryOptions): PaginatedResult { - TODO("Not yet implemented") - } + override suspend fun get(options: QueryOptions): PaginatedResult = chatApi.getMessages(roomId, options) override suspend fun send(params: SendMessageParams): Message = chatApi.sendMessage(roomId, params) - override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) { - TODO("Not yet implemented") - } - - override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) { + override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Subscription { TODO("Not yet implemented") } } diff --git a/chat-android/src/main/java/com/ably/chat/Occupancy.kt b/chat-android/src/main/java/com/ably/chat/Occupancy.kt index 62a6bb0..a9e18ed 100644 --- a/chat-android/src/main/java/com/ably/chat/Occupancy.kt +++ b/chat-android/src/main/java/com/ably/chat/Occupancy.kt @@ -23,14 +23,7 @@ interface Occupancy : EmitsDiscontinuities { * * @param listener A listener to be called when the occupancy of the room changes. */ - fun subscribe(listener: Listener) - - /** - * Unsubscribe a given listener to occupancy updates of the chat room. - * - * @param listener A listener to be unsubscribed. - */ - fun unsubscribe(listener: Listener) + fun subscribe(listener: Listener): Subscription /** * Get the current occupancy of the chat room. @@ -72,11 +65,7 @@ internal class DefaultOccupancy( override val channel: Channel get() = messages.channel - override fun subscribe(listener: Occupancy.Listener) { - TODO("Not yet implemented") - } - - override fun unsubscribe(listener: Occupancy.Listener) { + override fun subscribe(listener: Occupancy.Listener): Subscription { TODO("Not yet implemented") } @@ -84,11 +73,7 @@ internal class DefaultOccupancy( TODO("Not yet implemented") } - override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) { - TODO("Not yet implemented") - } - - override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) { + override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Subscription { TODO("Not yet implemented") } } diff --git a/chat-android/src/main/java/com/ably/chat/Presence.kt b/chat-android/src/main/java/com/ably/chat/Presence.kt index ba49296..2973e48 100644 --- a/chat-android/src/main/java/com/ably/chat/Presence.kt +++ b/chat-android/src/main/java/com/ably/chat/Presence.kt @@ -60,13 +60,7 @@ interface Presence : EmitsDiscontinuities { * Subscribe the given listener to all presence events. * @param listener listener to subscribe */ - fun subscribe(listener: Listener) - - /** - * Unsubscribe the given listener to all presence events. - * @param listener listener to unsubscribe - */ - fun unsubscribe(listener: Listener) + fun subscribe(listener: Listener): Subscription /** * An interface for listening to new presence event @@ -162,19 +156,11 @@ internal class DefaultPresence( TODO("Not yet implemented") } - override fun subscribe(listener: Presence.Listener) { - TODO("Not yet implemented") - } - - override fun unsubscribe(listener: Presence.Listener) { - TODO("Not yet implemented") - } - - override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) { + override fun subscribe(listener: Presence.Listener): Subscription { TODO("Not yet implemented") } - override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) { + override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Subscription { TODO("Not yet implemented") } } diff --git a/chat-android/src/main/java/com/ably/chat/RoomReactions.kt b/chat-android/src/main/java/com/ably/chat/RoomReactions.kt index f3a2d58..06b214c 100644 --- a/chat-android/src/main/java/com/ably/chat/RoomReactions.kt +++ b/chat-android/src/main/java/com/ably/chat/RoomReactions.kt @@ -38,12 +38,7 @@ interface RoomReactions : EmitsDiscontinuities { * @param listener The listener function to be called when a reaction is received. * @returns A response object that allows you to control the subscription. */ - fun subscribe(listener: Listener) - - /** - * Unsubscribe all listeners from receiving room-level reaction events. - */ - fun unsubscribe(listener: Listener) + fun subscribe(listener: Listener): Subscription /** * An interface for listening to new reaction events @@ -116,19 +111,11 @@ internal class DefaultRoomReactions( TODO("Not yet implemented") } - override fun subscribe(listener: RoomReactions.Listener) { - TODO("Not yet implemented") - } - - override fun unsubscribe(listener: RoomReactions.Listener) { - TODO("Not yet implemented") - } - - override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) { + override fun subscribe(listener: RoomReactions.Listener): Subscription { TODO("Not yet implemented") } - override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) { + override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Subscription { TODO("Not yet implemented") } } diff --git a/chat-android/src/main/java/com/ably/chat/RoomStatus.kt b/chat-android/src/main/java/com/ably/chat/RoomStatus.kt index 09f5b7a..05e54e4 100644 --- a/chat-android/src/main/java/com/ably/chat/RoomStatus.kt +++ b/chat-android/src/main/java/com/ably/chat/RoomStatus.kt @@ -21,12 +21,7 @@ interface RoomStatus { * @param listener The function to call when the status changes. * @returns An object that can be used to unregister the listener. */ - fun on(listener: Listener) - - /** - * Removes all listeners that were added by the `onChange` method. - */ - fun off(listener: Listener) + fun on(listener: Listener): Subscription /** * An interface for listening to changes for the room status diff --git a/chat-android/src/main/java/com/ably/chat/Subscription.kt b/chat-android/src/main/java/com/ably/chat/Subscription.kt new file mode 100644 index 0000000..e2990a8 --- /dev/null +++ b/chat-android/src/main/java/com/ably/chat/Subscription.kt @@ -0,0 +1,12 @@ +package com.ably.chat + +/** + * An unsubscription handle, returned by various functions (mostly subscriptions) + * where unsubscription is required. + */ +fun interface Subscription { + /** + * Handle unsubscription (unsubscribe listeners, clean up) + */ + fun unsubscribe() +} diff --git a/chat-android/src/main/java/com/ably/chat/Typing.kt b/chat-android/src/main/java/com/ably/chat/Typing.kt index fa75bc2..6add59f 100644 --- a/chat-android/src/main/java/com/ably/chat/Typing.kt +++ b/chat-android/src/main/java/com/ably/chat/Typing.kt @@ -37,12 +37,7 @@ interface Typing : EmitsDiscontinuities { * * @param listener A listener to be called when the typing state of a user in the room changes. */ - fun subscribe(listener: Listener) - - /** - * Unsubscribe listeners from receiving typing events. - */ - fun unsubscribe(listener: Listener) + fun subscribe(listener: Listener): Subscription /** * Get the current typers, a set of clientIds. @@ -89,11 +84,7 @@ internal class DefaultTyping( override val channel: Channel get() = realtimeClient.channels.get(typingIndicatorsChannelName, ChatChannelOptions()) - override fun subscribe(listener: Typing.Listener) { - TODO("Not yet implemented") - } - - override fun unsubscribe(listener: Typing.Listener) { + override fun subscribe(listener: Typing.Listener): Subscription { TODO("Not yet implemented") } @@ -109,11 +100,7 @@ internal class DefaultTyping( TODO("Not yet implemented") } - override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) { - TODO("Not yet implemented") - } - - override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) { + override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Subscription { TODO("Not yet implemented") } }