2
2
3
3
import java .util .ArrayList ;
4
4
import java .util .HashMap ;
5
- import java .util .Iterator ;
6
5
import java .util .List ;
7
6
import java .util .Map ;
8
7
15
14
import io .ably .lib .types .ErrorInfo ;
16
15
import io .ably .lib .types .ProtocolMessage ;
17
16
import io .ably .lib .types .ReadOnlyMap ;
17
+ import io .ably .lib .types .RecoveryKeyContext ;
18
18
import io .ably .lib .util .InternalMap ;
19
19
import io .ably .lib .util .Log ;
20
+ import io .ably .lib .util .StringUtils ;
20
21
21
22
/**
22
23
* A client that extends the functionality of the {@link AblyRest} and provides additional realtime-specific features.
@@ -71,6 +72,14 @@ public void onConnectionStateChanged(ConnectionStateListener.ConnectionStateChan
71
72
}
72
73
});
73
74
75
+ if (!StringUtils .isNullOrEmpty (options .recover )) {
76
+ RecoveryKeyContext recoveryKeyContext = RecoveryKeyContext .decode (options .recover );
77
+ if (recoveryKeyContext != null ) {
78
+ setChannelSerialsFromRecoverOption (recoveryKeyContext .getChannelSerials ()); // RTN16j
79
+ connection .connectionManager .msgSerial = recoveryKeyContext .getMsgSerial (); //RTN16f
80
+ }
81
+ }
82
+
74
83
if (options .autoConnect ) connection .connect ();
75
84
}
76
85
@@ -233,9 +242,8 @@ public void onMessage(ProtocolMessage msg) {
233
242
234
243
@ Override
235
244
public void suspendAll (ErrorInfo error , boolean notifyStateChange ) {
236
- for (Iterator <Map .Entry <String , Channel >> it = map .entrySet ().iterator (); it .hasNext (); ) {
237
- Map .Entry <String , Channel > entry = it .next ();
238
- entry .getValue ().setSuspended (error , notifyStateChange );
245
+ for (Channel channel : map .values ()) {
246
+ channel .setSuspended (error , notifyStateChange );
239
247
}
240
248
}
241
249
@@ -245,7 +253,7 @@ public void suspendAll(ErrorInfo error, boolean notifyStateChange) {
245
253
* @param queuedMessages Queued messages transferred from ConnectionManager
246
254
*/
247
255
@ Override
248
- public void transferToChannels (List <ConnectionManager .QueuedMessage > queuedMessages ) {
256
+ public void transferToChannelQueue (List <ConnectionManager .QueuedMessage > queuedMessages ) {
249
257
final Map <String , List <ConnectionManager .QueuedMessage >> channelQueueMap = new HashMap <>();
250
258
for (ConnectionManager .QueuedMessage queuedMessage : queuedMessages ) {
251
259
final String channelName = queuedMessage .msg .channel ;
@@ -255,16 +263,10 @@ public void transferToChannels(List<ConnectionManager.QueuedMessage> queuedMessa
255
263
channelQueueMap .get (channelName ).add (queuedMessage );
256
264
}
257
265
258
- for (Map .Entry <String , Channel > channelEntry : map .entrySet ()) {
259
- Channel channel = channelEntry .getValue ();
266
+ for (Channel channel : map .values ()) {
260
267
if (channel .state .isReattachable ()) {
261
268
Log .d (TAG , "reAttach(); channel = " + channel .name );
262
-
263
- if (channelQueueMap .containsKey (channel .name )){
264
- channel .transferQueuedPresenceMessages (channelQueueMap .get (channel .name ));
265
- }else {
266
- channel .transferQueuedPresenceMessages (null );
267
- }
269
+ channel .transferQueuedPresenceMessages (channelQueueMap .getOrDefault (channel .name , null ));
268
270
}
269
271
}
270
272
}
@@ -274,6 +276,27 @@ private void clear() {
274
276
}
275
277
}
276
278
279
+ protected void setChannelSerialsFromRecoverOption (Map <String , String > serials ) {
280
+ for (Map .Entry <String , String > entry : serials .entrySet ()) {
281
+ String channelName = entry .getKey ();
282
+ String channelSerial = entry .getValue ();
283
+ Channel channel = this .channels .get (channelName );
284
+ if (channel != null ) {
285
+ channel .properties .channelSerial = channelSerial ;
286
+ }
287
+ }
288
+ }
289
+
290
+ protected Map <String , String > getChannelSerials () {
291
+ Map <String , String > channelSerials = new HashMap <>();
292
+ for (Channel channel : this .channels .values ()) {
293
+ if (channel .state == ChannelState .attached ) {
294
+ channelSerials .put (channel .name , channel .properties .channelSerial );
295
+ }
296
+ }
297
+ return channelSerials ;
298
+ }
299
+
277
300
/********************
278
301
* internal
279
302
********************/
0 commit comments