1
+ package com .parse ;
2
+
3
+ import android .util .Log ;
4
+
5
+ import java .net .URI ;
6
+ import java .util .Locale ;
7
+
8
+ import okhttp3 .OkHttpClient ;
9
+ import okhttp3 .Request ;
10
+ import okhttp3 .Response ;
11
+ import okhttp3 .WebSocket ;
12
+ import okhttp3 .WebSocketListener ;
13
+ import okio .ByteString ;
14
+
15
+ /* package */
16
+
17
+ /* package */ public class OkHttp3SocketClientFactory implements WebSocketClientFactory {
18
+
19
+ OkHttpClient mClient ;
20
+
21
+ public OkHttp3SocketClientFactory (OkHttpClient client ) {
22
+ mClient = client ;
23
+ }
24
+
25
+ public OkHttp3SocketClientFactory () {
26
+ mClient = new OkHttpClient ();
27
+ }
28
+
29
+ @ Override
30
+ public WebSocketClient createInstance (WebSocketClient .WebSocketClientCallback webSocketClientCallback , URI hostUrl ) {
31
+ return new OkHttp3WebSocketClient (mClient , webSocketClientCallback , hostUrl );
32
+ }
33
+
34
+ public WebSocketClient createInstance (OkHttpClient client , WebSocketClient .WebSocketClientCallback webSocketClientCallback , URI hostUrl ) {
35
+ return new OkHttp3WebSocketClient (mClient , webSocketClientCallback , hostUrl );
36
+ }
37
+
38
+ class OkHttp3WebSocketClient implements WebSocketClient {
39
+
40
+ private static final String LOG_TAG = "OkHttpWebSocketClient" ;
41
+
42
+ private final WebSocketClientCallback webSocketClientCallback ;
43
+ private WebSocket webSocket ;
44
+ private State state = State .NONE ;
45
+ private final OkHttpClient client ;
46
+ private final String url ;
47
+ private final int STATUS_CODE = 200 ;
48
+ private final String CLOSING_MSG = "User invoked close" ;
49
+
50
+ private final WebSocketListener handler = new WebSocketListener () {
51
+ @ Override
52
+ public void onOpen (WebSocket webSocket , Response response ) {
53
+ setState (State .CONNECTED );
54
+ webSocketClientCallback .onOpen ();
55
+ }
56
+
57
+ @ Override
58
+ public void onMessage (WebSocket webSocket , String text ) {
59
+ webSocketClientCallback .onMessage (text );
60
+ }
61
+
62
+ @ Override
63
+ public void onMessage (WebSocket webSocket , ByteString bytes ) {
64
+ Log .w (LOG_TAG , String .format (Locale .US ,
65
+ "Socket got into inconsistent state and received %s instead." ,
66
+ bytes .toString ()));
67
+ }
68
+
69
+ @ Override
70
+ public void onClosed (WebSocket webSocket , int code , String reason ) {
71
+ setState (State .DISCONNECTED );
72
+ webSocketClientCallback .onClose ();
73
+ }
74
+
75
+ @ Override
76
+ public void onFailure (okhttp3 .WebSocket webSocket , Throwable t , Response response ) {
77
+ webSocketClientCallback .onError (t );
78
+ }
79
+ };
80
+
81
+ private OkHttp3WebSocketClient (OkHttpClient okHttpClient ,
82
+ WebSocketClientCallback webSocketClientCallback , URI hostUrl ) {
83
+ client = okHttpClient ;
84
+ this .webSocketClientCallback = webSocketClientCallback ;
85
+ url = hostUrl .toString ();
86
+ }
87
+
88
+ @ Override
89
+ public synchronized void open () {
90
+ if (State .NONE == state ) {
91
+ // OkHttp3 connects as soon as the socket is created so do it here.
92
+ Request request = new Request .Builder ()
93
+ .url (url )
94
+ .build ();
95
+
96
+ webSocket = client .newWebSocket (request , handler );
97
+ setState (State .CONNECTING );
98
+ }
99
+ }
100
+
101
+ @ Override
102
+ public synchronized void close () {
103
+ setState (State .DISCONNECTING );
104
+ webSocket .close (STATUS_CODE , CLOSING_MSG );
105
+ }
106
+
107
+ @ Override
108
+ public void send (String message ) {
109
+ if (state == State .CONNECTED ) {
110
+ webSocket .send (message );
111
+ }
112
+ }
113
+
114
+ @ Override
115
+ public State getState () {
116
+ return state ;
117
+ }
118
+
119
+ private synchronized void setState (State newState ) {
120
+ this .state = newState ;
121
+ this .webSocketClientCallback .stateChanged ();
122
+ }
123
+
124
+
125
+ }
126
+
127
+ }
0 commit comments