/* * Nextcloud Talk application * * @author Mario Danic * Copyright (C) 2017-2018 Mario Danic * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.nextcloud.talk.webrtc; import com.google.android.gms.common.api.Api; import com.nextcloud.talk.api.ExternalSignaling; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.json.rooms.Conversation; import com.nextcloud.talk.models.json.signaling.NCMessageWrapper; import com.nextcloud.talk.models.json.signaling.NCSignalingMessage; import com.nextcloud.talk.models.json.websocket.AuthParametersWebSocketMessage; import com.nextcloud.talk.models.json.websocket.AuthWebSocketMessage; import com.nextcloud.talk.models.json.websocket.CallOverallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.CallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.HelloOverallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.HelloWebSocketMessage; import com.nextcloud.talk.models.json.websocket.RecipientWebSocketMessage; import com.nextcloud.talk.models.json.websocket.RequestOfferOverallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.RequestOfferSignalingMessage; import com.nextcloud.talk.models.json.websocket.RoomOverallWebSocketMessage; import com.nextcloud.talk.models.json.websocket.RoomWebSocketMessage; import com.nextcloud.talk.models.json.websocket.SignalingDataWebSocketMessageForOffer; import com.nextcloud.talk.utils.ApiUtils; import com.tinder.scarlet.Scarlet; import com.tinder.scarlet.messageadapter.moshi.MoshiMessageAdapter; import com.tinder.scarlet.retry.LinearBackoffStrategy; import com.tinder.scarlet.streamadapter.rxjava2.RxJava2StreamAdapterFactory; import com.tinder.scarlet.websocket.okhttp.OkHttpClientUtils; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import autodagger.AutoInjector; import okhttp3.OkHttpClient; @AutoInjector(NextcloudTalkApplication.class) public class ScarletHelper { private Map externalSignalingMap = new HashMap<>(); @Inject OkHttpClient okHttpClient; public ScarletHelper() { NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); } private String getExternalSignalingServerUrlFromSettingsUrl(String url) { String generatedURL = url.replace("https://", "wss://").replace("http://", "ws://"); if (generatedURL.endsWith("/")) { generatedURL += "spreed"; } else { generatedURL += "/spreed"; } return generatedURL; } public ExternalSignaling getExternalSignalingInstanceForServer(String url, boolean forceReconnect) { String connectionUrl = getExternalSignalingServerUrlFromSettingsUrl(url); if (externalSignalingMap.containsKey(connectionUrl) && !forceReconnect) { return externalSignalingMap.get(connectionUrl); } else { Scarlet scarlet = new Scarlet.Builder() .backoffStrategy(new LinearBackoffStrategy(500)) .webSocketFactory(OkHttpClientUtils.newWebSocketFactory(okHttpClient, connectionUrl)) .addMessageAdapterFactory(new MoshiMessageAdapter.Factory()) .addStreamAdapterFactory(new RxJava2StreamAdapterFactory()) .build(); ExternalSignaling externalSignaling = scarlet.create(ExternalSignaling.class); externalSignalingMap.put(connectionUrl, externalSignaling); return externalSignaling; } } public HelloOverallWebSocketMessage getAssembledHelloModel(UserEntity userEntity, String ticket) { HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage(); helloOverallWebSocketMessage.setType("hello"); HelloWebSocketMessage helloWebSocketMessage = new HelloWebSocketMessage(); helloWebSocketMessage.setVersion("1.0"); AuthWebSocketMessage authWebSocketMessage = new AuthWebSocketMessage(); authWebSocketMessage.setUrl(ApiUtils.getUrlForExternalServerAuthBackend(userEntity.getBaseUrl())); AuthParametersWebSocketMessage authParametersWebSocketMessage = new AuthParametersWebSocketMessage(); authParametersWebSocketMessage.setTicket(ticket); authParametersWebSocketMessage.setUserid(userEntity.getUserId()); authWebSocketMessage.setAuthParametersWebSocketMessage(authParametersWebSocketMessage); helloWebSocketMessage.setAuthWebSocketMessage(authWebSocketMessage); return helloOverallWebSocketMessage; } public HelloOverallWebSocketMessage getAssembledHelloModelForResume(String resumeId) { HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage(); helloOverallWebSocketMessage.setType("hello"); HelloWebSocketMessage helloWebSocketMessage = new HelloWebSocketMessage(); helloWebSocketMessage.setVersion("1.0"); helloWebSocketMessage.setResumeid(resumeId); return helloOverallWebSocketMessage; } public RoomOverallWebSocketMessage getAssembledJoinOrLeaveRoomModel(String roomId, String sessionId) { RoomOverallWebSocketMessage roomOverallWebSocketMessage = new RoomOverallWebSocketMessage(); roomOverallWebSocketMessage.setType("room"); RoomWebSocketMessage roomWebSocketMessage = new RoomWebSocketMessage(); roomWebSocketMessage.setRoomId(roomId); roomWebSocketMessage.setSessiondId(sessionId); return roomOverallWebSocketMessage; } public RequestOfferOverallWebSocketMessage getAssembledRequestOfferModel(String sessionId, String roomType) { RequestOfferOverallWebSocketMessage requestOfferOverallWebSocketMessage = new RequestOfferOverallWebSocketMessage(); requestOfferOverallWebSocketMessage.setType("message"); RequestOfferSignalingMessage requestOfferSignalingMessage = new RequestOfferSignalingMessage(); RecipientWebSocketMessage recipientWebSocketMessage = new RecipientWebSocketMessage(); recipientWebSocketMessage.setType("session"); recipientWebSocketMessage.setSessionId(sessionId); requestOfferSignalingMessage.setRecipientWebSocketMessage(recipientWebSocketMessage); SignalingDataWebSocketMessageForOffer signalingDataWebSocketMessageForOffer = new SignalingDataWebSocketMessageForOffer(); signalingDataWebSocketMessageForOffer.setRoomType(roomType); signalingDataWebSocketMessageForOffer.setType("requestoffer"); requestOfferSignalingMessage.setSignalingDataWebSocketMessageForOffer(signalingDataWebSocketMessageForOffer); requestOfferOverallWebSocketMessage.setRequestOfferOverallWebSocketMessage(requestOfferSignalingMessage); return requestOfferOverallWebSocketMessage; } public CallOverallWebSocketMessage getAssembledCallMessageModel(NCMessageWrapper ncMessageWrapper) { CallOverallWebSocketMessage callOverallWebSocketMessage = new CallOverallWebSocketMessage(); callOverallWebSocketMessage.setType("message"); CallWebSocketMessage callWebSocketMessage = new CallWebSocketMessage(); RecipientWebSocketMessage recipientWebSocketMessage = new RecipientWebSocketMessage(); recipientWebSocketMessage.setType("session"); recipientWebSocketMessage.setSessionId(ncMessageWrapper.getSignalingMessage().getTo()); callWebSocketMessage.setRecipientWebSocketMessage(recipientWebSocketMessage); callWebSocketMessage.setNcMessageWrapper(ncMessageWrapper); callOverallWebSocketMessage.setCallWebSocketMessage(callWebSocketMessage); return callOverallWebSocketMessage; } }