From b3b8c867f7d273c0562053a729e7b792d1154561 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Wed, 5 Jan 2022 15:31:42 +0100 Subject: [PATCH 1/8] fix typo Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/activities/CallActivity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index d5cc86ec7..900b47060 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -1625,13 +1625,13 @@ public class CallActivity extends CallBaseActivity { // The signaling session is the same as the Nextcloud session only when the MCU is not used. - String currentSessiondId = callSession; + String currentSessionId = callSession; if (hasMCU) { - currentSessiondId = webSocketClient.getSessionId(); + currentSessionId = webSocketClient.getSessionId(); } for (HashMap participant : users) { - if (!participant.get("sessionId").equals(currentSessiondId)) { + if (!participant.get("sessionId").equals(currentSessionId)) { Object inCallObject = participant.get("inCall"); boolean isNewSession; if (inCallObject instanceof Boolean) { From f70f94e6be18c07e64bdb1b6491b48407c98bee1 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Wed, 5 Jan 2022 21:10:54 +0100 Subject: [PATCH 2/8] hangup when currentSession has inCall flag = 0 Signed-off-by: Marcel Hibbe --- .../talk/activities/CallActivity.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 900b47060..85cdbd87d 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -1618,10 +1618,12 @@ public class CallActivity extends CallBaseActivity { } private void processUsersInRoom(List> users) { + Log.d(TAG, "processUsersInRoom"); List newSessions = new ArrayList<>(); Set oldSessions = new HashSet<>(); hasMCU = hasExternalSignalingServer && webSocketClient != null && webSocketClient.hasMCU(); + Log.d(TAG, " hasMCU is " + hasMCU); // The signaling session is the same as the Nextcloud session only when the MCU is not used. @@ -1630,13 +1632,18 @@ public class CallActivity extends CallBaseActivity { currentSessionId = webSocketClient.getSessionId(); } + Log.d(TAG, " currentSessionId is " + currentSessionId); + for (HashMap participant : users) { - if (!participant.get("sessionId").equals(currentSessionId)) { + if (!participant.get("sessionId").equals(currentSessionId)) { // own session is skipped Object inCallObject = participant.get("inCall"); boolean isNewSession; if (inCallObject instanceof Boolean) { isNewSession = (boolean) inCallObject; } else { + Log.d(TAG, + " inCallObject of participant " + participant.get("sessionId").toString().substring(0,4) + + " : " + inCallObject); isNewSession = ((long) inCallObject) != 0; } @@ -1645,6 +1652,13 @@ public class CallActivity extends CallBaseActivity { } else { oldSessions.add(participant.get("sessionId").toString()); } + } else { + Object inCallObject = participant.get("inCall"); + Log.d(TAG, " inCallObject of currentSessionId: " + inCallObject); + if(((long) inCallObject) == 0){ + Log.d(TAG, " hangup!!!!!!!!!!"); + hangup(true); + } } } @@ -1674,6 +1688,7 @@ public class CallActivity extends CallBaseActivity { } for (String sessionId : newSessions) { + Log.d(TAG, " newSession joined: " + sessionId); getPeerConnectionWrapperForSessionIdAndType(sessionId, "video", false); } @@ -1682,6 +1697,7 @@ public class CallActivity extends CallBaseActivity { } for (String sessionId : oldSessions) { + Log.d(TAG, " oldSession that will be removed is: " + sessionId); endPeerConnection(sessionId, false); } } From 76aaafb024044b320ef364c0ed1d022ce49376bc Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 6 Jan 2022 16:43:54 +0100 Subject: [PATCH 3/8] replace deprecated ParticipantFlags with InCallFlags Signed-off-by: Marcel Hibbe --- .../talk/activities/CallActivity.java | 6 +-- .../activities/CallNotificationActivity.java | 3 +- .../models/json/participants/Participant.java | 53 ------------------- 3 files changed, 4 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 85cdbd87d..be909fcff 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -1277,11 +1277,11 @@ public class CallActivity extends CallBaseActivity { } private void performCall() { - Integer inCallFlag; + int inCallFlag; if (isVoiceOnlyCall) { - inCallFlag = (int) Participant.ParticipantFlags.IN_CALL_WITH_AUDIO.getValue(); + inCallFlag = Participant.InCallFlags.WITH_AUDIO; } else { - inCallFlag = (int) Participant.ParticipantFlags.IN_CALL_WITH_AUDIO_AND_VIDEO.getValue(); + inCallFlag = Participant.InCallFlags.WITH_VIDEO; } int apiVersion = ApiUtils.getCallApiVersion(conversationUser, new int[]{ApiUtils.APIv4, 1}); diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java index 04be17291..ba5eac7f1 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java @@ -311,8 +311,7 @@ public class CallNotificationActivity extends CallBaseActivity { } private boolean isInCallWithVideo(int callFlag) { - return (Participant.ParticipantFlags.IN_CALL_WITH_VIDEO.getValue() == callFlag - || Participant.ParticipantFlags.IN_CALL_WITH_AUDIO_AND_VIDEO.getValue() == callFlag); + return (callFlag >= Participant.InCallFlags.WITH_VIDEO); } private void setUpAfterConversationIsKnown() { diff --git a/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java b/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java index adeb9a344..36dbaa482 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/participants/Participant.java @@ -82,23 +82,6 @@ public class Participant { public boolean selected; - public ParticipantFlags getParticipantFlags() { - ParticipantFlags participantFlags = ParticipantFlags.NOT_IN_CALL; - if (inCall != null) { - if (inCall instanceof Long) { - participantFlags = ParticipantFlags.fromValue((Long) inCall); - } else if (inCall instanceof Boolean) { - if ((boolean) inCall) { - participantFlags = ParticipantFlags.IN_CALL; - } else { - participantFlags = ParticipantFlags.NOT_IN_CALL; - } - } - } - - return participantFlags; - } - public Long getAttendeeId() { return attendeeId; } @@ -346,40 +329,4 @@ public class Participant { public static final int WITH_VIDEO = 4; public static final int WITH_PHONE = 8; } - - @Deprecated - public enum ParticipantFlags { - NOT_IN_CALL(0), - IN_CALL(1), - IN_CALL_WITH_AUDIO(3), - IN_CALL_WITH_VIDEO(5), - IN_CALL_WITH_AUDIO_AND_VIDEO(7); - - private long value; - - ParticipantFlags(long value) { - this.value = value; - } - - public static ParticipantFlags fromValue(long value) { - if (value == 0) { - return NOT_IN_CALL; - } else if (value == 1) { - return IN_CALL; - } else if (value == 3) { - return IN_CALL_WITH_AUDIO; - } else if (value == 5) { - return IN_CALL_WITH_VIDEO; - } else if (value == 7) { - return IN_CALL_WITH_AUDIO_AND_VIDEO; - } else { - return NOT_IN_CALL; - } - } - - public long getValue() { - return value; - } - - } } From 175f479d0f69469436d8b7a31438db32d55ce59e Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Thu, 6 Jan 2022 16:47:18 +0100 Subject: [PATCH 4/8] replace check for boolean variant of inCallFlag (boolean variant is deprecated since nc14) Signed-off-by: Marcel Hibbe --- .../talk/activities/CallActivity.java | 30 +++++++------------ .../activities/CallNotificationActivity.java | 2 +- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index be909fcff..796a0457f 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -1279,9 +1279,9 @@ public class CallActivity extends CallBaseActivity { private void performCall() { int inCallFlag; if (isVoiceOnlyCall) { - inCallFlag = Participant.InCallFlags.WITH_AUDIO; + inCallFlag = Participant.InCallFlags.IN_CALL + Participant.InCallFlags.WITH_AUDIO; } else { - inCallFlag = Participant.InCallFlags.WITH_VIDEO; + inCallFlag = Participant.InCallFlags.IN_CALL + Participant.InCallFlags.WITH_VIDEO; } int apiVersion = ApiUtils.getCallApiVersion(conversationUser, new int[]{ApiUtils.APIv4, 1}); @@ -1523,6 +1523,7 @@ public class CallActivity extends CallBaseActivity { } private void hangup(boolean shutDownView) { + Log.d(TAG, "hangup! shutDownView=" + shutDownView); stopCallingSound(); dispose(null); @@ -1538,9 +1539,7 @@ public class CallActivity extends CallBaseActivity { videoCapturer = null; } - if (binding.selfVideoRenderer != null) { - binding.selfVideoRenderer.release(); - } + binding.selfVideoRenderer.release(); if (audioSource != null) { audioSource.dispose(); @@ -1625,7 +1624,6 @@ public class CallActivity extends CallBaseActivity { hasMCU = hasExternalSignalingServer && webSocketClient != null && webSocketClient.hasMCU(); Log.d(TAG, " hasMCU is " + hasMCU); - // The signaling session is the same as the Nextcloud session only when the MCU is not used. String currentSessionId = callSession; if (hasMCU) { @@ -1635,17 +1633,11 @@ public class CallActivity extends CallBaseActivity { Log.d(TAG, " currentSessionId is " + currentSessionId); for (HashMap participant : users) { - if (!participant.get("sessionId").equals(currentSessionId)) { // own session is skipped - Object inCallObject = participant.get("inCall"); + long inCallFlag = (long)participant.get("inCall"); + if (!participant.get("sessionId").equals(currentSessionId)) { boolean isNewSession; - if (inCallObject instanceof Boolean) { - isNewSession = (boolean) inCallObject; - } else { - Log.d(TAG, - " inCallObject of participant " + participant.get("sessionId").toString().substring(0,4) + - " : " + inCallObject); - isNewSession = ((long) inCallObject) != 0; - } + Log.d(TAG, " inCallFlag of participant " + participant.get("sessionId").toString().substring(0,4) + " : " + inCallFlag); + isNewSession = inCallFlag != 0; if (isNewSession) { newSessions.add(participant.get("sessionId").toString()); @@ -1653,10 +1645,8 @@ public class CallActivity extends CallBaseActivity { oldSessions.add(participant.get("sessionId").toString()); } } else { - Object inCallObject = participant.get("inCall"); - Log.d(TAG, " inCallObject of currentSessionId: " + inCallObject); - if(((long) inCallObject) == 0){ - Log.d(TAG, " hangup!!!!!!!!!!"); + Log.d(TAG, " inCallFlag of currentSessionId: " + inCallFlag); + if (inCallFlag == 0){ hangup(true); } } diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java index ba5eac7f1..dc3dc0889 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallNotificationActivity.java @@ -311,7 +311,7 @@ public class CallNotificationActivity extends CallBaseActivity { } private boolean isInCallWithVideo(int callFlag) { - return (callFlag >= Participant.InCallFlags.WITH_VIDEO); + return (callFlag >= Participant.InCallFlags.IN_CALL + Participant.InCallFlags.WITH_VIDEO); } private void setUpAfterConversationIsKnown() { From d17a8e9dbd73354952cfec8a259a4cea61be167a Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Sun, 9 Jan 2022 12:39:02 +0100 Subject: [PATCH 5/8] ad some logging Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/activities/CallActivity.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 796a0457f..61a84f852 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -1393,6 +1393,7 @@ public class CallActivity extends CallBaseActivity { public void onMessageEvent(WebSocketCommunicationEvent webSocketCommunicationEvent) { switch (webSocketCommunicationEvent.getType()) { case "hello": + Log.d(TAG, "onMessageEvent 'hello'"); if (!webSocketCommunicationEvent.getHashMap().containsKey("oldResumeId")) { if (currentCallStatus.equals(CallStatus.RECONNECTING)) { hangup(false); @@ -1402,6 +1403,7 @@ public class CallActivity extends CallBaseActivity { } break; case "roomJoined": + Log.d(TAG, "onMessageEvent 'roomJoined'"); startSendingNick(); if (webSocketCommunicationEvent.getHashMap().get("roomToken").equals(roomToken)) { @@ -1409,6 +1411,7 @@ public class CallActivity extends CallBaseActivity { } break; case "participantsUpdate": + Log.d(TAG, "onMessageEvent 'participantsUpdate'"); if (webSocketCommunicationEvent.getHashMap().get("roomToken").equals(roomToken)) { processUsersInRoom( (List>) webSocketClient @@ -1417,10 +1420,12 @@ public class CallActivity extends CallBaseActivity { } break; case "signalingMessage": + Log.d(TAG, "onMessageEvent 'signalingMessage'"); processMessage((NCSignalingMessage) webSocketClient.getJobWithId( Integer.valueOf(webSocketCommunicationEvent.getHashMap().get("jobId")))); break; case "peerReadyForRequestingOffer": + Log.d(TAG, "onMessageEvent 'peerReadyForRequestingOffer'"); webSocketClient.requestOfferForSessionIdWithType( webSocketCommunicationEvent.getHashMap().get("sessionId"), "video"); break; @@ -1578,6 +1583,7 @@ public class CallActivity extends CallBaseActivity { } private void hangupNetworkCalls(boolean shutDownView) { + Log.d(TAG, "hangupNetworkCalls. shutDownView=" + shutDownView); int apiVersion = ApiUtils.getCallApiVersion(conversationUser, new int[]{ApiUtils.APIv4, 1}); ncApi.leaveCall(credentials, ApiUtils.getUrlForCall(apiVersion, baseUrl, roomToken)) @@ -1647,6 +1653,7 @@ public class CallActivity extends CallBaseActivity { } else { Log.d(TAG, " inCallFlag of currentSessionId: " + inCallFlag); if (inCallFlag == 0){ + Log.d(TAG, "Most probably a moderator ended the call for all."); hangup(true); } } From 5272d35f018cc471e15b27b8424d8527c6d065be Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Mon, 10 Jan 2022 22:06:10 +0100 Subject: [PATCH 6/8] fix to stop audio manager in ui thread Signed-off-by: Marcel Hibbe --- .../com/nextcloud/talk/activities/CallActivity.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java index 61a84f852..7bee5a77b 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.java @@ -1551,10 +1551,12 @@ public class CallActivity extends CallBaseActivity { audioSource = null; } - if (audioManager != null) { - audioManager.stop(); - audioManager = null; - } + runOnUiThread(() -> { + if (audioManager != null) { + audioManager.stop(); + audioManager = null; + } + }); if (videoSource != null) { videoSource = null; @@ -1755,7 +1757,8 @@ public class CallActivity extends CallBaseActivity { magicPeerConnectionWrapper = new MagicPeerConnectionWrapper(peerConnectionFactory, iceServers, sdpConstraintsForMCU, - sessionId, callSession, + sessionId, + callSession, localMediaStream, true, true, From 65e002fe98f998282e2c9fe8620e071cb53b3965 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Mon, 10 Jan 2022 22:31:56 +0100 Subject: [PATCH 7/8] render system message "call_ended_everyone" Signed-off-by: Marcel Hibbe --- .../java/com/nextcloud/talk/models/json/chat/ChatMessage.java | 1 + .../models/json/converters/EnumSystemMessageTypeConverter.kt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java index 247ea33b9..9dd6322b9 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/chat/ChatMessage.java @@ -621,6 +621,7 @@ public class ChatMessage implements MessageContentType, MessageContentType.Image CALL_JOINED, CALL_LEFT, CALL_ENDED, + CALL_ENDED_EVERYONE, CALL_MISSED, CALL_TRIED, READ_ONLY_OFF, diff --git a/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt b/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt index 8c1994c06..75521cd7c 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt +++ b/app/src/main/java/com/nextcloud/talk/models/json/converters/EnumSystemMessageTypeConverter.kt @@ -27,6 +27,7 @@ package com.nextcloud.talk.models.json.converters import com.bluelinelabs.logansquare.typeconverters.StringBasedTypeConverter import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CALL_ENDED +import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CALL_ENDED_EVERYONE import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CALL_JOINED import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CALL_LEFT import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.CALL_MISSED @@ -74,6 +75,7 @@ import com.nextcloud.talk.models.json.chat.ChatMessage.SystemMessageType.USER_RE * `call_joined` - {actor} joined the call * `call_left` - {actor} left the call * `call_ended` - Call with {user1}, {user2}, {user3}, {user4} and {user5} (Duration 30:23) +* `call_ended_everyone` - {user1} ended the call with {user2}, {user3}, {user4} and {user5} (Duration 30:23) * `call_missed` - You missed a call from {user} * `call_tried` - You tried to call {user} * `read_only_off` - {actor} unlocked the conversation @@ -115,6 +117,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter return CALL_JOINED "call_left" -> return CALL_LEFT "call_ended" -> return CALL_ENDED + "call_ended_everyone" -> return CALL_ENDED_EVERYONE "call_missed" -> return CALL_MISSED "call_tried" -> return CALL_TRIED "read_only_off" -> return READ_ONLY_OFF @@ -163,6 +166,7 @@ class EnumSystemMessageTypeConverter : StringBasedTypeConverter return "call_joined" CALL_LEFT -> return "call_left" CALL_ENDED -> return "call_ended" + CALL_ENDED_EVERYONE -> return "call_ended_everyone" CALL_MISSED -> return "call_missed" CALL_TRIED -> return "call_tried" READ_ONLY_OFF -> return "read_only_off" From 54552cdd87c0985e323e5497e66363dc5c6b6417 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Tue, 11 Jan 2022 11:46:18 +0100 Subject: [PATCH 8/8] restrict to start a call when permission is missing Signed-off-by: Marcel Hibbe --- .../talk/controllers/ChatController.kt | 12 +++++--- .../json/conversations/Conversation.java | 30 +++++++++++++++++++ app/src/main/res/layout/controller_chat.xml | 1 + app/src/main/res/values/strings.xml | 1 + 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index e6ca884d7..b47f38cbe 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -2298,10 +2298,14 @@ class ChatController(args: Bundle) : } private fun startACall(isVoiceOnlyCall: Boolean) { - ApplicationWideCurrentRoomHolder.getInstance().isDialing = true - val callIntent = getIntentForCall(isVoiceOnlyCall) - if (callIntent != null) { - startActivity(callIntent) + if (currentConversation?.canStartCall == false && currentConversation?.hasCall == false) { + Toast.makeText(context, R.string.startCallForbidden, Toast.LENGTH_LONG).show() + } else { + ApplicationWideCurrentRoomHolder.getInstance().isDialing = true + val callIntent = getIntentForCall(isVoiceOnlyCall) + if (callIntent != null) { + startActivity(callIntent) + } } } diff --git a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java index 1405de884..880c37bd1 100644 --- a/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java +++ b/app/src/main/java/com/nextcloud/talk/models/json/conversations/Conversation.java @@ -92,8 +92,12 @@ public class Conversation { public Long lobbyTimer; @JsonField(name = "lastReadMessage") public int lastReadMessage; + @JsonField(name = "hasCall") + public boolean hasCall; @JsonField(name = "callFlag") public int callFlag; + @JsonField(name = "canStartCall") + public boolean canStartCall; @JsonField(name = "canLeaveConversation") public Boolean canLeaveConversation; @@ -259,10 +263,18 @@ public class Conversation { return this.lastReadMessage; } + public boolean getHasCall() { + return hasCall; + } + public int getCallFlag() { return this.callFlag; } + public boolean getCanStartCall() { + return canStartCall; + } + public Boolean getUnreadMentionDirect() { return unreadMentionDirect; } @@ -370,10 +382,18 @@ public class Conversation { this.lastReadMessage = lastReadMessage; } + public void setHasCall(boolean hasCall) { + this.hasCall = hasCall; + } + public void setCallFlag(int callFlag) { this.callFlag = callFlag; } + public void setCanStartCall(boolean canStartCall) { + this.canStartCall = canStartCall; + } + public void setUnreadMentionDirect(Boolean unreadMentionDirect) { this.unreadMentionDirect = unreadMentionDirect; } @@ -411,9 +431,15 @@ public class Conversation { if (lastReadMessage != that.lastReadMessage) { return false; } + if (hasCall != that.hasCall) { + return false; + } if (callFlag != that.callFlag) { return false; } + if (canStartCall != that.canStartCall) { + return false; + } if (!Objects.equals(roomId, that.roomId)) { return false; } @@ -508,7 +534,9 @@ public class Conversation { result = 31 * result + (lobbyState != null ? lobbyState.hashCode() : 0); result = 31 * result + (lobbyTimer != null ? lobbyTimer.hashCode() : 0); result = 31 * result + lastReadMessage; + result = 31 * result + (hasCall ? 1 : 0); result = 31 * result + callFlag; + result = 31 * result + (canStartCall ? 1 : 0); result = 31 * result + (canLeaveConversation != null ? canLeaveConversation.hashCode() : 0); result = 31 * result + (canDeleteConversation != null ? canDeleteConversation.hashCode() : 0); result = 31 * result + (notificationCalls != null ? notificationCalls.hashCode() : 0); @@ -543,7 +571,9 @@ public class Conversation { ", lobbyState=" + lobbyState + ", lobbyTimer=" + lobbyTimer + ", lastReadMessage=" + lastReadMessage + + ", hasCall=" + hasCall + ", callFlag=" + callFlag + + ", canStartCall=" + canStartCall + ", canLeaveConversation=" + canLeaveConversation + ", canDeleteConversation=" + canDeleteConversation + ", notificationCalls=" + notificationCalls + diff --git a/app/src/main/res/layout/controller_chat.xml b/app/src/main/res/layout/controller_chat.xml index 413e56ffb..afa24a63c 100644 --- a/app/src/main/res/layout/controller_chat.xml +++ b/app/src/main/res/layout/controller_chat.xml @@ -23,6 +23,7 @@ Reply privately Delete Message deleted successfully, but it might have been leaked to other services + You are not allowed to start a call Share Send to