mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-20 12:09:45 +01:00
Send bye when deleting message
This commit is contained in:
parent
3332c66fd1
commit
269b879ee4
@ -1191,7 +1191,7 @@ public class CallController extends BaseController {
|
|||||||
webSocketConnectionHelper = new WebSocketConnectionHelper();
|
webSocketConnectionHelper = new WebSocketConnectionHelper();
|
||||||
webSocketClient = webSocketConnectionHelper.getExternalSignalingInstanceForServer(
|
webSocketClient = webSocketConnectionHelper.getExternalSignalingInstanceForServer(
|
||||||
externalSignalingServer.getExternalSignalingServer(),
|
externalSignalingServer.getExternalSignalingServer(),
|
||||||
conversationUser, externalSignalingServer.getExternalSignalingTicket(), false);
|
conversationUser, externalSignalingServer.getExternalSignalingTicket());
|
||||||
|
|
||||||
if (webSocketClient.isConnected()) {
|
if (webSocketClient.isConnected()) {
|
||||||
joinRoomAndCall();
|
joinRoomAndCall();
|
||||||
|
@ -36,6 +36,7 @@ import com.nextcloud.talk.models.json.generic.GenericOverall;
|
|||||||
import com.nextcloud.talk.models.json.push.PushConfigurationState;
|
import com.nextcloud.talk.models.json.push.PushConfigurationState;
|
||||||
import com.nextcloud.talk.utils.ApiUtils;
|
import com.nextcloud.talk.utils.ApiUtils;
|
||||||
import com.nextcloud.talk.utils.database.user.UserUtils;
|
import com.nextcloud.talk.utils.database.user.UserUtils;
|
||||||
|
import com.nextcloud.talk.webrtc.WebSocketConnectionHelper;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.CookieManager;
|
import java.net.CookieManager;
|
||||||
@ -135,6 +136,8 @@ public class AccountRemovalWorker extends Worker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WebSocketConnectionHelper.deleteExternalSignalingInstanceForUserEntity(userEntity.getId());
|
||||||
|
|
||||||
userUtils.deleteUser(userEntity.getId()).subscribe(new CompletableObserver() {
|
userUtils.deleteUser(userEntity.getId()).subscribe(new CompletableObserver() {
|
||||||
@Override
|
@Override
|
||||||
public void onSubscribe(Disposable d) {
|
public void onSubscribe(Disposable d) {
|
||||||
|
@ -67,7 +67,7 @@ public class WebsocketConnectionsWorker extends Worker {
|
|||||||
!TextUtils.isEmpty(externalSignalingServer.getExternalSignalingTicket())) {
|
!TextUtils.isEmpty(externalSignalingServer.getExternalSignalingTicket())) {
|
||||||
webSocketConnectionHelper.getExternalSignalingInstanceForServer(
|
webSocketConnectionHelper.getExternalSignalingInstanceForServer(
|
||||||
externalSignalingServer.getExternalSignalingServer(),
|
externalSignalingServer.getExternalSignalingServer(),
|
||||||
userEntity, externalSignalingServer.getExternalSignalingTicket(), false);
|
userEntity, externalSignalingServer.getExternalSignalingTicket());
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Failed to parse external signaling server");
|
Log.e(TAG, "Failed to parse external signaling server");
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Nextcloud Talk application
|
||||||
|
*
|
||||||
|
* @author Mario Danic
|
||||||
|
* Copyright (C) 2017-2018 Mario Danic <mario@lovelyhq.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.nextcloud.talk.models.json.websocket;
|
||||||
|
|
||||||
|
import com.bluelinelabs.logansquare.annotation.JsonField;
|
||||||
|
import com.bluelinelabs.logansquare.annotation.JsonObject;
|
||||||
|
|
||||||
|
import org.parceler.Parcel;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@JsonObject
|
||||||
|
@Parcel
|
||||||
|
@Data
|
||||||
|
public class ByeWebSocketMessage extends BaseWebSocketMessage {
|
||||||
|
@JsonField(name = "bye")
|
||||||
|
HashMap<String, Object> bye;
|
||||||
|
}
|
@ -29,6 +29,7 @@ import com.nextcloud.talk.events.WebSocketCommunicationEvent;
|
|||||||
import com.nextcloud.talk.models.database.UserEntity;
|
import com.nextcloud.talk.models.database.UserEntity;
|
||||||
import com.nextcloud.talk.models.json.signaling.NCMessageWrapper;
|
import com.nextcloud.talk.models.json.signaling.NCMessageWrapper;
|
||||||
import com.nextcloud.talk.models.json.websocket.BaseWebSocketMessage;
|
import com.nextcloud.talk.models.json.websocket.BaseWebSocketMessage;
|
||||||
|
import com.nextcloud.talk.models.json.websocket.ByeWebSocketMessage;
|
||||||
import com.nextcloud.talk.models.json.websocket.CallOverallWebSocketMessage;
|
import com.nextcloud.talk.models.json.websocket.CallOverallWebSocketMessage;
|
||||||
import com.nextcloud.talk.models.json.websocket.ErrorOverallWebSocketMessage;
|
import com.nextcloud.talk.models.json.websocket.ErrorOverallWebSocketMessage;
|
||||||
import com.nextcloud.talk.models.json.websocket.EventOverallWebSocketMessage;
|
import com.nextcloud.talk.models.json.websocket.EventOverallWebSocketMessage;
|
||||||
@ -75,8 +76,8 @@ public class MagicWebSocketInstance extends WebSocketListener {
|
|||||||
private String connectionUrl;
|
private String connectionUrl;
|
||||||
|
|
||||||
private String currentRoomToken;
|
private String currentRoomToken;
|
||||||
|
private boolean isPermanentlyClosed = false;
|
||||||
int restartCount = 0;
|
private int restartCount = 0;
|
||||||
|
|
||||||
MagicWebSocketInstance(UserEntity conversationUser, String connectionUrl, String webSocketTicket) {
|
MagicWebSocketInstance(UserEntity conversationUser, String connectionUrl, String webSocketTicket) {
|
||||||
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
||||||
@ -92,6 +93,7 @@ public class MagicWebSocketInstance extends WebSocketListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onOpen(WebSocket webSocket, Response response) {
|
public void onOpen(WebSocket webSocket, Response response) {
|
||||||
|
if (isConnected()) {
|
||||||
try {
|
try {
|
||||||
if (TextUtils.isEmpty(resumeId)) {
|
if (TextUtils.isEmpty(resumeId)) {
|
||||||
webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledHelloModel(conversationUser, webSocketTicket)));
|
webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledHelloModel(conversationUser, webSocketTicket)));
|
||||||
@ -102,6 +104,7 @@ public class MagicWebSocketInstance extends WebSocketListener {
|
|||||||
Log.e(TAG, "Failed to serialize hello model");
|
Log.e(TAG, "Failed to serialize hello model");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void restartWebSocket() {
|
private void restartWebSocket() {
|
||||||
Request request = new Request.Builder().url(connectionUrl).build();
|
Request request = new Request.Builder().url(connectionUrl).build();
|
||||||
@ -131,7 +134,9 @@ public class MagicWebSocketInstance extends WebSocketListener {
|
|||||||
resumeId = "";
|
resumeId = "";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
if (!isPermanentlyClosed) {
|
||||||
restartWebSocket();
|
restartWebSocket();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case "room":
|
case "room":
|
||||||
JoinedRoomOverallWebSocketMessage joinedRoomOverallWebSocketMessage = LoganSquare.parse(text, JoinedRoomOverallWebSocketMessage.class);
|
JoinedRoomOverallWebSocketMessage joinedRoomOverallWebSocketMessage = LoganSquare.parse(text, JoinedRoomOverallWebSocketMessage.class);
|
||||||
@ -186,6 +191,9 @@ public class MagicWebSocketInstance extends WebSocketListener {
|
|||||||
eventBus.post(new WebSocketCommunicationEvent("signalingMessage", messageHashMap));
|
eventBus.post(new WebSocketCommunicationEvent("signalingMessage", messageHashMap));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "bye":
|
||||||
|
connected = false;
|
||||||
|
isPermanentlyClosed = true;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -211,6 +219,8 @@ public class MagicWebSocketInstance extends WebSocketListener {
|
|||||||
connected = false;
|
connected = false;
|
||||||
if (restartCount < 4) {
|
if (restartCount < 4) {
|
||||||
restartWebSocket();
|
restartWebSocket();
|
||||||
|
} else {
|
||||||
|
isPermanentlyClosed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,11 +234,13 @@ public class MagicWebSocketInstance extends WebSocketListener {
|
|||||||
|
|
||||||
public void joinRoomWithRoomTokenAndSession(String roomToken, String normalBackendSession) {
|
public void joinRoomWithRoomTokenAndSession(String roomToken, String normalBackendSession) {
|
||||||
if (!roomToken.equals(currentRoomToken)) {
|
if (!roomToken.equals(currentRoomToken)) {
|
||||||
|
if (isConnected()) {
|
||||||
try {
|
try {
|
||||||
webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledJoinOrLeaveRoomModel(roomToken, normalBackendSession)));
|
webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledJoinOrLeaveRoomModel(roomToken, normalBackendSession)));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Failed to serialize room overall websocket message");
|
Log.e(TAG, "Failed to serialize room overall websocket message");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
HashMap<String, String> joinRoomHashMap = new HashMap<>();
|
HashMap<String, String> joinRoomHashMap = new HashMap<>();
|
||||||
joinRoomHashMap.put("roomToken", currentRoomToken);
|
joinRoomHashMap.put("roomToken", currentRoomToken);
|
||||||
@ -237,12 +249,14 @@ public class MagicWebSocketInstance extends WebSocketListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void sendCallMessage(NCMessageWrapper ncMessageWrapper) {
|
public void sendCallMessage(NCMessageWrapper ncMessageWrapper) {
|
||||||
|
if (isConnected()) {
|
||||||
try {
|
try {
|
||||||
webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledCallMessageModel(ncMessageWrapper)));
|
webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledCallMessageModel(ncMessageWrapper)));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Failed to serialize signaling message");
|
Log.e(TAG, "Failed to serialize signaling message");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Object getJobWithId(Integer id) {
|
public Object getJobWithId(Integer id) {
|
||||||
Object copyJob = magicMap.get(id);
|
Object copyJob = magicMap.get(id);
|
||||||
@ -251,14 +265,33 @@ public class MagicWebSocketInstance extends WebSocketListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void requestOfferForSessionIdWithType(String sessionIdParam, String roomType) {
|
public void requestOfferForSessionIdWithType(String sessionIdParam, String roomType) {
|
||||||
|
if (isConnected()) {
|
||||||
try {
|
try {
|
||||||
webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledRequestOfferModel(sessionIdParam, roomType)));
|
webSocket.send(LoganSquare.serialize(webSocketConnectionHelper.getAssembledRequestOfferModel(sessionIdParam, roomType)));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Failed to offer request");
|
Log.e(TAG, "Failed to offer request");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendBye() {
|
||||||
|
if (isConnected()) {
|
||||||
|
try {
|
||||||
|
ByeWebSocketMessage byeWebSocketMessage = new ByeWebSocketMessage();
|
||||||
|
byeWebSocketMessage.setType("bye");
|
||||||
|
byeWebSocketMessage.setBye(new HashMap<>());
|
||||||
|
webSocket.send(LoganSquare.serialize(byeWebSocketMessage);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "Failed to serialize bye message");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isConnected() {
|
public boolean isConnected() {
|
||||||
return connected;
|
return connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isPermanentlyClosed() {
|
||||||
|
return isPermanentlyClosed;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ import okhttp3.OkHttpClient;
|
|||||||
|
|
||||||
@AutoInjector(NextcloudTalkApplication.class)
|
@AutoInjector(NextcloudTalkApplication.class)
|
||||||
public class WebSocketConnectionHelper {
|
public class WebSocketConnectionHelper {
|
||||||
private static Map<String, MagicWebSocketInstance> magicWebSocketInstanceMap = new HashMap<>();
|
private static Map<Long, MagicWebSocketInstance> magicWebSocketInstanceMap = new HashMap<>();
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
OkHttpClient okHttpClient;
|
OkHttpClient okHttpClient;
|
||||||
@ -57,7 +57,7 @@ public class WebSocketConnectionHelper {
|
|||||||
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized MagicWebSocketInstance getExternalSignalingInstanceForServer(String url, UserEntity userEntity, String webSocketTicket, boolean forceReconnect) {
|
public static synchronized MagicWebSocketInstance getExternalSignalingInstanceForServer(String url, UserEntity userEntity, String webSocketTicket) {
|
||||||
String generatedURL = url.replace("https://", "wss://").replace("http://", "ws://");
|
String generatedURL = url.replace("https://", "wss://").replace("http://", "ws://");
|
||||||
|
|
||||||
if (generatedURL.endsWith("/")) {
|
if (generatedURL.endsWith("/")) {
|
||||||
@ -66,15 +66,25 @@ public class WebSocketConnectionHelper {
|
|||||||
generatedURL += "/spreed";
|
generatedURL += "/spreed";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (magicWebSocketInstanceMap.containsKey(userEntity.getUserId()) && !forceReconnect) {
|
MagicWebSocketInstance magicWebSocketInstance;
|
||||||
return magicWebSocketInstanceMap.get(userEntity.getUserId());
|
if ((magicWebSocketInstance = magicWebSocketInstanceMap.get(userEntity.getId())) != null && !magicWebSocketInstance.isPermanentlyClosed()) {
|
||||||
|
return magicWebSocketInstance;
|
||||||
} else {
|
} else {
|
||||||
MagicWebSocketInstance magicWebSocketInstance = new MagicWebSocketInstance(userEntity, generatedURL, webSocketTicket);
|
magicWebSocketInstance = new MagicWebSocketInstance(userEntity, generatedURL, webSocketTicket);
|
||||||
magicWebSocketInstanceMap.put(userEntity.getUserId(), magicWebSocketInstance);
|
magicWebSocketInstanceMap.put(userEntity.getId(), magicWebSocketInstance);
|
||||||
return magicWebSocketInstance;
|
return magicWebSocketInstance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static synchronized void deleteExternalSignalingInstanceForUserEntity(long id) {
|
||||||
|
MagicWebSocketInstance magicWebSocketInstance;
|
||||||
|
if ((magicWebSocketInstance = magicWebSocketInstanceMap.get(id)) != null) {
|
||||||
|
if (magicWebSocketInstance.isConnected()) {
|
||||||
|
magicWebSocketInstance.sendBye();
|
||||||
|
magicWebSocketInstanceMap.remove(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
HelloOverallWebSocketMessage getAssembledHelloModel(UserEntity userEntity, String ticket) {
|
HelloOverallWebSocketMessage getAssembledHelloModel(UserEntity userEntity, String ticket) {
|
||||||
HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage();
|
HelloOverallWebSocketMessage helloOverallWebSocketMessage = new HelloOverallWebSocketMessage();
|
||||||
helloOverallWebSocketMessage.setType("hello");
|
helloOverallWebSocketMessage.setType("hello");
|
||||||
|
Loading…
Reference in New Issue
Block a user