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