Skip to content

Commit 14aecaf

Browse files
committed
feat: use Cancellation object instead of unsubscribe methods
It's proven to be easier to manage to implement when subscription return object that you can use to unsubscribe
1 parent f2b7f81 commit 14aecaf

File tree

10 files changed

+36
-108
lines changed

10 files changed

+36
-108
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ publish.properties
9595
/.idea/compiler.xml
9696
/.idea/jarRepositories.xml
9797
/.idea/misc.xml
98+
/.idea/shelf
9899

99100
# general
100101
**/.DS_Store
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.ably.chat
2+
3+
/**
4+
* A cancellation handle, returned by various functions (mostly subscriptions)
5+
* where cancellation is required.
6+
*/
7+
fun interface Cancellation {
8+
/**
9+
* Handle cancellation (unsubscribe listeners, clean up)
10+
*/
11+
fun cancel()
12+
}

chat-android/src/main/java/com/ably/chat/ConnectionStatus.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,7 @@ interface ConnectionStatus {
2525
* Registers a listener that will be called whenever the connection status changes.
2626
* @param listener The function to call when the status changes.
2727
*/
28-
fun on(listener: Listener)
29-
30-
/**
31-
* Unregisters a listener
32-
* @param listener The function to call when the status changes.
33-
*/
34-
fun off(listener: Listener)
28+
fun on(listener: Listener): Cancellation
3529

3630
/**
3731
* An interface for listening to changes for the connection status

chat-android/src/main/java/com/ably/chat/EmitsDiscontinuities.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,7 @@ interface EmitsDiscontinuities {
1010
* Register a listener to be called when a discontinuity is detected.
1111
* @param listener The listener to be called when a discontinuity is detected.
1212
*/
13-
fun onDiscontinuity(listener: Listener)
14-
15-
/**
16-
* Unregister a listener to be called when a discontinuity is detected.
17-
* @param listener The listener
18-
*/
19-
fun offDiscontinuity(listener: Listener)
13+
fun onDiscontinuity(listener: Listener): Cancellation
2014

2115
/**
2216
* An interface for listening when discontinuity happens

chat-android/src/main/java/com/ably/chat/Messages.kt

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
package com.ably.chat
44

55
import io.ably.lib.realtime.Channel
6-
import io.ably.lib.types.PaginatedResult
76

87
/**
98
* This interface is used to interact with messages in a chat room: subscribing
@@ -24,13 +23,7 @@ interface Messages : EmitsDiscontinuities {
2423
* @param listener callback that will be called
2524
* @returns A response object that allows you to control the subscription.
2625
*/
27-
fun subscribe(listener: Listener)
28-
29-
/**
30-
* Unsubscribe listener
31-
* @param listener callback that will be unsubscribed
32-
*/
33-
fun unsubscribe(listener: Listener)
26+
fun subscribe(listener: Listener): MessagesSubscription
3427

3528
/**
3629
* Get messages that have been previously sent to the chat room, based on the provided options.
@@ -176,6 +169,10 @@ data class SendMessageParams(
176169
val headers: MessageHeaders? = null,
177170
)
178171

172+
interface MessagesSubscription: Cancellation {
173+
suspend fun getPreviousMessages(queryOptions: QueryOptions): PaginatedResult<Message>
174+
}
175+
179176
class DefaultMessages(
180177
private val roomId: String,
181178
private val realtimeClient: RealtimeClient,
@@ -190,25 +187,15 @@ class DefaultMessages(
190187
override val channel: Channel
191188
get() = realtimeClient.channels.get(messagesChannelName, ChatChannelOptions())
192189

193-
override fun subscribe(listener: Messages.Listener) {
190+
override fun subscribe(listener: Messages.Listener): MessagesSubscription {
194191
TODO("Not yet implemented")
195192
}
196193

197-
override fun unsubscribe(listener: Messages.Listener) {
198-
TODO("Not yet implemented")
199-
}
200-
201-
override suspend fun get(options: QueryOptions): PaginatedResult<Message> {
202-
TODO("Not yet implemented")
203-
}
194+
override suspend fun get(options: QueryOptions): PaginatedResult<Message> = chatApi.getMessages(roomId, options)
204195

205196
override suspend fun send(params: SendMessageParams): Message = chatApi.sendMessage(roomId, params)
206197

207-
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) {
208-
TODO("Not yet implemented")
209-
}
210-
211-
override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) {
198+
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Cancellation {
212199
TODO("Not yet implemented")
213200
}
214201
}

chat-android/src/main/java/com/ably/chat/Occupancy.kt

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,7 @@ interface Occupancy : EmitsDiscontinuities {
2323
*
2424
* @param listener A listener to be called when the occupancy of the room changes.
2525
*/
26-
fun subscribe(listener: Listener)
27-
28-
/**
29-
* Unsubscribe a given listener to occupancy updates of the chat room.
30-
*
31-
* @param listener A listener to be unsubscribed.
32-
*/
33-
fun unsubscribe(listener: Listener)
26+
fun subscribe(listener: Listener): Cancellation
3427

3528
/**
3629
* Get the current occupancy of the chat room.
@@ -72,23 +65,15 @@ internal class DefaultOccupancy(
7265
override val channel: Channel
7366
get() = messages.channel
7467

75-
override fun subscribe(listener: Occupancy.Listener) {
76-
TODO("Not yet implemented")
77-
}
78-
79-
override fun unsubscribe(listener: Occupancy.Listener) {
68+
override fun subscribe(listener: Occupancy.Listener): Cancellation {
8069
TODO("Not yet implemented")
8170
}
8271

8372
override suspend fun get(): OccupancyEvent {
8473
TODO("Not yet implemented")
8574
}
8675

87-
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) {
88-
TODO("Not yet implemented")
89-
}
90-
91-
override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) {
76+
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Cancellation {
9277
TODO("Not yet implemented")
9378
}
9479
}

chat-android/src/main/java/com/ably/chat/Presence.kt

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,7 @@ interface Presence : EmitsDiscontinuities {
6060
* Subscribe the given listener to all presence events.
6161
* @param listener listener to subscribe
6262
*/
63-
fun subscribe(listener: Listener)
64-
65-
/**
66-
* Unsubscribe the given listener to all presence events.
67-
* @param listener listener to unsubscribe
68-
*/
69-
fun unsubscribe(listener: Listener)
63+
fun subscribe(listener: Listener): Cancellation
7064

7165
/**
7266
* An interface for listening to new presence event
@@ -162,19 +156,11 @@ internal class DefaultPresence(
162156
TODO("Not yet implemented")
163157
}
164158

165-
override fun subscribe(listener: Presence.Listener) {
166-
TODO("Not yet implemented")
167-
}
168-
169-
override fun unsubscribe(listener: Presence.Listener) {
170-
TODO("Not yet implemented")
171-
}
172-
173-
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) {
159+
override fun subscribe(listener: Presence.Listener): Cancellation {
174160
TODO("Not yet implemented")
175161
}
176162

177-
override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) {
163+
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Cancellation {
178164
TODO("Not yet implemented")
179165
}
180166
}

chat-android/src/main/java/com/ably/chat/RoomReactions.kt

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,7 @@ interface RoomReactions : EmitsDiscontinuities {
3838
* @param listener The listener function to be called when a reaction is received.
3939
* @returns A response object that allows you to control the subscription.
4040
*/
41-
fun subscribe(listener: Listener)
42-
43-
/**
44-
* Unsubscribe all listeners from receiving room-level reaction events.
45-
*/
46-
fun unsubscribe(listener: Listener)
41+
fun subscribe(listener: Listener): Cancellation
4742

4843
/**
4944
* An interface for listening to new reaction events
@@ -116,19 +111,11 @@ internal class DefaultRoomReactions(
116111
TODO("Not yet implemented")
117112
}
118113

119-
override fun subscribe(listener: RoomReactions.Listener) {
120-
TODO("Not yet implemented")
121-
}
122-
123-
override fun unsubscribe(listener: RoomReactions.Listener) {
124-
TODO("Not yet implemented")
125-
}
126-
127-
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) {
114+
override fun subscribe(listener: RoomReactions.Listener): Cancellation {
128115
TODO("Not yet implemented")
129116
}
130117

131-
override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) {
118+
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Cancellation {
132119
TODO("Not yet implemented")
133120
}
134121
}

chat-android/src/main/java/com/ably/chat/RoomStatus.kt

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,7 @@ interface RoomStatus {
2121
* @param listener The function to call when the status changes.
2222
* @returns An object that can be used to unregister the listener.
2323
*/
24-
fun on(listener: Listener)
25-
26-
/**
27-
* Removes all listeners that were added by the `onChange` method.
28-
*/
29-
fun off(listener: Listener)
24+
fun on(listener: Listener): Cancellation
3025

3126
/**
3227
* An interface for listening to changes for the room status

chat-android/src/main/java/com/ably/chat/Typing.kt

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,7 @@ interface Typing : EmitsDiscontinuities {
3737
*
3838
* @param listener A listener to be called when the typing state of a user in the room changes.
3939
*/
40-
fun subscribe(listener: Listener)
41-
42-
/**
43-
* Unsubscribe listeners from receiving typing events.
44-
*/
45-
fun unsubscribe(listener: Listener)
40+
fun subscribe(listener: Listener): Cancellation
4641

4742
/**
4843
* Get the current typers, a set of clientIds.
@@ -89,11 +84,7 @@ internal class DefaultTyping(
8984
override val channel: Channel
9085
get() = realtimeClient.channels.get(typingIndicatorsChannelName, ChatChannelOptions())
9186

92-
override fun subscribe(listener: Typing.Listener) {
93-
TODO("Not yet implemented")
94-
}
95-
96-
override fun unsubscribe(listener: Typing.Listener) {
87+
override fun subscribe(listener: Typing.Listener): Cancellation {
9788
TODO("Not yet implemented")
9889
}
9990

@@ -109,11 +100,7 @@ internal class DefaultTyping(
109100
TODO("Not yet implemented")
110101
}
111102

112-
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener) {
113-
TODO("Not yet implemented")
114-
}
115-
116-
override fun offDiscontinuity(listener: EmitsDiscontinuities.Listener) {
103+
override fun onDiscontinuity(listener: EmitsDiscontinuities.Listener): Cancellation {
117104
TODO("Not yet implemented")
118105
}
119106
}

0 commit comments

Comments
 (0)