Search in sources :

Example 41 with Task

use of bolts.Task in project Rocket.Chat.Android by RocketChat.

the class RocketChatWebSocketThread method connectDDPClient.

private Single<Boolean> connectDDPClient() {
    return prepareDDPClient().flatMap(_val -> Single.fromEmitter(emitter -> {
        ServerInfo info = connectivityManager.getServerInfoForHost(hostname);
        RCLog.d("DDPClient#connect");
        ddpClient.connect(info.getSession(), info.isSecure()).onSuccessTask(task -> {
            final String newSession = task.getResult().session;
            connectivityManager.notifyConnectionEstablished(hostname, newSession);
            task.getResult().client.getOnCloseCallback().onSuccess(_task -> {
                if (listenersRegistered) {
                    terminate();
                }
                return null;
            });
            return realmHelper.executeTransaction(realm -> {
                RealmSession sessionObj = RealmSession.queryDefaultSession(realm).findFirst();
                if (sessionObj == null) {
                    realm.createOrUpdateObjectFromJson(RealmSession.class, new JSONObject().put(RealmSession.ID, RealmSession.DEFAULT_ID));
                } else {
                    if (!TextUtils.isEmpty(sessionObj.getToken()) && sessionObj.isTokenVerified()) {
                        sessionObj.setTokenVerified(false);
                        sessionObj.setError(null);
                    }
                }
                return null;
            });
        }).continueWith(task -> {
            if (task.isFaulted()) {
                emitter.onError(task.getError());
            } else {
                emitter.onSuccess(true);
            }
            return null;
        });
    }));
}
Also used : Context(android.content.Context) FileUploadingToUrlObserver(chat.rocket.android.service.observer.FileUploadingToUrlObserver) DDPClientWrapper(chat.rocket.android.api.DDPClientWrapper) Constructor(java.lang.reflect.Constructor) LogIfError(chat.rocket.android.helper.LogIfError) DebugLog(hugo.weaving.DebugLog) ArrayList(java.util.ArrayList) MethodCallHelper(chat.rocket.android.api.MethodCallHelper) MethodCallObserver(chat.rocket.android.service.observer.MethodCallObserver) NewMessageObserver(chat.rocket.android.service.observer.NewMessageObserver) Single(rx.Single) JSONObject(org.json.JSONObject) ServerInfo(chat.rocket.core.models.ServerInfo) LoginServiceConfigurationSubscriber(chat.rocket.android.service.ddp.base.LoginServiceConfigurationSubscriber) Handler(android.os.Handler) CurrentUserObserver(chat.rocket.android.service.observer.CurrentUserObserver) UserDataSubscriber(chat.rocket.android.service.ddp.base.UserDataSubscriber) Task(bolts.Task) TextUtils(chat.rocket.android.helper.TextUtils) SessionObserver(chat.rocket.android.service.observer.SessionObserver) Iterator(java.util.Iterator) RealmSession(chat.rocket.persistence.realm.models.internal.RealmSession) ActiveUsersSubscriber(chat.rocket.android.service.ddp.base.ActiveUsersSubscriber) RCLog(chat.rocket.android.log.RCLog) GcmPushRegistrationObserver(chat.rocket.android.service.observer.GcmPushRegistrationObserver) FileUploadingWithUfsObserver(chat.rocket.android.service.observer.FileUploadingWithUfsObserver) HandlerThread(android.os.HandlerThread) RealmHelper(chat.rocket.persistence.realm.RealmHelper) LoadMessageProcedureObserver(chat.rocket.android.service.observer.LoadMessageProcedureObserver) TokenLoginObserver(chat.rocket.android.service.observer.TokenLoginObserver) GetUsersOfRoomsProcedureObserver(chat.rocket.android.service.observer.GetUsersOfRoomsProcedureObserver) PushSettingsObserver(chat.rocket.android.service.observer.PushSettingsObserver) RealmStore(chat.rocket.persistence.realm.RealmStore) JSONObject(org.json.JSONObject) ServerInfo(chat.rocket.core.models.ServerInfo) RealmSession(chat.rocket.persistence.realm.models.internal.RealmSession)

Example 42 with Task

use of bolts.Task in project Rocket.Chat.Android by RocketChat.

the class DDPClientImpl method unsub.

public void unsub(final TaskCompletionSource<DDPSubscription.NoSub> task, @Nullable final String id) {
    final boolean requested = sendMessage("unsub", json -> json.put("id", id));
    if (requested) {
        CompositeDisposable subscriptions = new CompositeDisposable();
        subscriptions.add(flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message).map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString).map(DDPClientImpl::toJson).subscribe(response -> {
            String msg = extractMsg(response);
            if ("nosub".equals(msg) && response.isNull("error") && !response.isNull("id")) {
                String _id = response.optString("id");
                if (id.equals(_id)) {
                    task.setResult(new DDPSubscription.NoSub(client, id));
                    subscriptions.dispose();
                }
            }
        }, err -> {
        }));
        addErrorCallback(subscriptions, task);
    } else {
        task.trySetError(new DDPClientCallback.Closed(client));
    }
}
Also used : RxWebSocketCallback(chat.rocket.android_ddp.rx.RxWebSocketCallback) TimeoutException(java.util.concurrent.TimeoutException) TextUtils(android.text.TextUtils) NonNull(android.support.annotation.NonNull) RCLog(chat.rocket.android.log.RCLog) TaskCompletionSource(bolts.TaskCompletionSource) TimeUnit(java.util.concurrent.TimeUnit) CompositeDisposable(io.reactivex.disposables.CompositeDisposable) JSONException(org.json.JSONException) RxWebSocket(chat.rocket.android_ddp.rx.RxWebSocket) JSONObject(org.json.JSONObject) OkHttpClient(okhttp3.OkHttpClient) Flowable(io.reactivex.Flowable) Nullable(android.support.annotation.Nullable) Task(bolts.Task) JSONArray(org.json.JSONArray) RxWebSocketCallback(chat.rocket.android_ddp.rx.RxWebSocketCallback) CompositeDisposable(io.reactivex.disposables.CompositeDisposable)

Example 43 with Task

use of bolts.Task in project Rocket.Chat.Android by RocketChat.

the class DDPClientImpl method connect.

public void connect(final TaskCompletionSource<DDPClientCallback.Connect> task, final String url, String session) {
    try {
        flowable = websocket.connect(url).autoConnect();
        CompositeDisposable subscriptions = new CompositeDisposable();
        subscriptions.add(flowable.filter(callback -> callback instanceof RxWebSocketCallback.Open).subscribe(callback -> {
            sendMessage("connect", json -> (TextUtils.isEmpty(session) ? json : json.put("session", session)).put("version", "pre2").put("support", new JSONArray().put("pre2").put("pre1")), task);
        }, err -> {
        }));
        subscriptions.add(flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message).map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString).map(DDPClientImpl::toJson).timeout(7, TimeUnit.SECONDS).subscribe(response -> {
            String msg = extractMsg(response);
            if ("connected".equals(msg) && !response.isNull("session")) {
                task.trySetResult(new DDPClientCallback.Connect(client, response.optString("session")));
                subscriptions.dispose();
            } else if ("error".equals(msg) && "Already connected".equals(response.optString("reason"))) {
                task.trySetResult(new DDPClientCallback.Connect(client, null));
                subscriptions.dispose();
            } else if ("failed".equals(msg)) {
                task.trySetError(new DDPClientCallback.Connect.Failed(client, response.optString("version")));
                subscriptions.dispose();
            }
        }, err -> task.trySetError(new DDPClientCallback.Connect.Timeout(client))));
        addErrorCallback(subscriptions, task);
        subscribeBaseListeners();
    } catch (Exception e) {
        RCLog.e(e);
    }
}
Also used : RxWebSocketCallback(chat.rocket.android_ddp.rx.RxWebSocketCallback) TimeoutException(java.util.concurrent.TimeoutException) TextUtils(android.text.TextUtils) NonNull(android.support.annotation.NonNull) RCLog(chat.rocket.android.log.RCLog) TaskCompletionSource(bolts.TaskCompletionSource) TimeUnit(java.util.concurrent.TimeUnit) CompositeDisposable(io.reactivex.disposables.CompositeDisposable) JSONException(org.json.JSONException) RxWebSocket(chat.rocket.android_ddp.rx.RxWebSocket) JSONObject(org.json.JSONObject) OkHttpClient(okhttp3.OkHttpClient) Flowable(io.reactivex.Flowable) Nullable(android.support.annotation.Nullable) Task(bolts.Task) JSONArray(org.json.JSONArray) JSONArray(org.json.JSONArray) RxWebSocketCallback(chat.rocket.android_ddp.rx.RxWebSocketCallback) TimeoutException(java.util.concurrent.TimeoutException) JSONException(org.json.JSONException) CompositeDisposable(io.reactivex.disposables.CompositeDisposable)

Example 44 with Task

use of bolts.Task in project Rocket.Chat.Android by RocketChat.

the class DDPClientImpl method rpc.

public void rpc(final TaskCompletionSource<DDPClientCallback.RPC> task, String method, JSONArray params, String id, long timeoutMs) {
    final boolean requested = sendMessage("method", json -> json.put("method", method).put("params", params).put("id", id));
    if (requested) {
        CompositeDisposable subscriptions = new CompositeDisposable();
        subscriptions.add(flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message).map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString).map(DDPClientImpl::toJson).timeout(timeoutMs, TimeUnit.MILLISECONDS).subscribe(response -> {
            String msg = extractMsg(response);
            if ("result".equals(msg)) {
                String _id = response.optString("id");
                if (id.equals(_id)) {
                    if (!response.isNull("error")) {
                        task.setError(new DDPClientCallback.RPC.Error(client, id, response.optJSONObject("error")));
                    } else {
                        String result = response.optString("result");
                        task.setResult(new DDPClientCallback.RPC(client, id, result));
                    }
                    subscriptions.dispose();
                }
            }
        }, err -> {
            if (err instanceof TimeoutException) {
                task.setError(new DDPClientCallback.RPC.Timeout(client));
            }
        }));
        addErrorCallback(subscriptions, task);
    } else {
        task.trySetError(new DDPClientCallback.Closed(client));
    }
}
Also used : RxWebSocketCallback(chat.rocket.android_ddp.rx.RxWebSocketCallback) TimeoutException(java.util.concurrent.TimeoutException) TextUtils(android.text.TextUtils) NonNull(android.support.annotation.NonNull) RCLog(chat.rocket.android.log.RCLog) TaskCompletionSource(bolts.TaskCompletionSource) TimeUnit(java.util.concurrent.TimeUnit) CompositeDisposable(io.reactivex.disposables.CompositeDisposable) JSONException(org.json.JSONException) RxWebSocket(chat.rocket.android_ddp.rx.RxWebSocket) JSONObject(org.json.JSONObject) OkHttpClient(okhttp3.OkHttpClient) Flowable(io.reactivex.Flowable) Nullable(android.support.annotation.Nullable) Task(bolts.Task) JSONArray(org.json.JSONArray) RxWebSocketCallback(chat.rocket.android_ddp.rx.RxWebSocketCallback) CompositeDisposable(io.reactivex.disposables.CompositeDisposable) TimeoutException(java.util.concurrent.TimeoutException)

Example 45 with Task

use of bolts.Task in project Rocket.Chat.Android by RocketChat.

the class DDPClientImpl method ping.

public void ping(final TaskCompletionSource<DDPClientCallback.Ping> task, @Nullable final String id) {
    final boolean requested = (TextUtils.isEmpty(id)) ? sendMessage("ping", null) : sendMessage("ping", json -> json.put("id", id));
    if (requested) {
        CompositeDisposable subscriptions = new CompositeDisposable();
        subscriptions.add(flowable.filter(callback -> callback instanceof RxWebSocketCallback.Message).map(callback -> ((RxWebSocketCallback.Message) callback).responseBodyString).map(DDPClientImpl::toJson).timeout(4, TimeUnit.SECONDS).subscribe(response -> {
            String msg = extractMsg(response);
            if ("pong".equals(msg)) {
                if (response.isNull("id")) {
                    task.setResult(new DDPClientCallback.Ping(client, null));
                    subscriptions.dispose();
                } else {
                    String _id = response.optString("id");
                    if (id.equals(_id)) {
                        task.setResult(new DDPClientCallback.Ping(client, id));
                        subscriptions.dispose();
                    }
                }
            }
        }, err -> task.setError(new DDPClientCallback.Ping.Timeout(client))));
        addErrorCallback(subscriptions, task);
    } else {
        task.trySetError(new DDPClientCallback.Closed(client));
    }
}
Also used : RxWebSocketCallback(chat.rocket.android_ddp.rx.RxWebSocketCallback) TimeoutException(java.util.concurrent.TimeoutException) TextUtils(android.text.TextUtils) NonNull(android.support.annotation.NonNull) RCLog(chat.rocket.android.log.RCLog) TaskCompletionSource(bolts.TaskCompletionSource) TimeUnit(java.util.concurrent.TimeUnit) CompositeDisposable(io.reactivex.disposables.CompositeDisposable) JSONException(org.json.JSONException) RxWebSocket(chat.rocket.android_ddp.rx.RxWebSocket) JSONObject(org.json.JSONObject) OkHttpClient(okhttp3.OkHttpClient) Flowable(io.reactivex.Flowable) Nullable(android.support.annotation.Nullable) Task(bolts.Task) JSONArray(org.json.JSONArray) RxWebSocketCallback(chat.rocket.android_ddp.rx.RxWebSocketCallback) CompositeDisposable(io.reactivex.disposables.CompositeDisposable)

Aggregations

Task (bolts.Task)46 JSONObject (org.json.JSONObject)27 Continuation (bolts.Continuation)23 JSONException (org.json.JSONException)20 ArrayList (java.util.ArrayList)15 JSONArray (org.json.JSONArray)14 RCLog (chat.rocket.android.log.RCLog)11 TaskCompletionSource (bolts.TaskCompletionSource)10 List (java.util.List)8 Context (android.content.Context)7 Uri (android.net.Uri)7 RealmHelper (chat.rocket.persistence.realm.RealmHelper)7 CancellationException (java.util.concurrent.CancellationException)7 TextUtils (android.text.TextUtils)6 SyncState (chat.rocket.core.SyncState)6 IOException (java.io.IOException)6 NonNull (android.support.annotation.NonNull)5 Nullable (android.support.annotation.Nullable)5 AggregateException (bolts.AggregateException)5 AppLink (bolts.AppLink)5